From a316283a6d2af963c9efb4d27de081fa34b0b100 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Feb 2018 18:25:38 +0100 Subject: [PATCH 001/231] plan to eliminate xinclude use, move to single config file with includes. --- conf/e2/config.json | 4 +- scripts/eressea/xmlconf.lua | 4 +- src/jsonconf.c | 82 +++++++++++++++++++++++-------------- src/util/xml.c | 7 ++-- 4 files changed, 60 insertions(+), 37 deletions(-) diff --git a/conf/e2/config.json b/conf/e2/config.json index 5d29cd1f5..863a64c0a 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -3,7 +3,9 @@ "keywords.json", "calendar.json", "prefixes.json", - "e2/terrains.json" + "e2/terrains.json", + "e2/rules.xml", + "e2/locales.xml" ], "disabled": [ "jsreport" diff --git a/scripts/eressea/xmlconf.lua b/scripts/eressea/xmlconf.lua index 84f29eceb..1b70b0ccd 100644 --- a/scripts/eressea/xmlconf.lua +++ b/scripts/eressea/xmlconf.lua @@ -5,7 +5,7 @@ end if config.rules then local rules = config.rules .. '/' assert(0 == eressea.config.read(rules .. 'config.json', confdir), "could not read JSON data") - assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") - assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") +-- assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") +-- assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") end eressea.game.reset() diff --git a/src/jsonconf.c b/src/jsonconf.c index 3c5411b9d..15cc563b6 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -887,6 +887,53 @@ static void json_races(cJSON *json) { const char * json_relpath; +static void include_json(const char *filename) { + FILE *F; + if (json_relpath) { + char name[PATH_MAX]; + path_join(json_relpath, filename, name, sizeof(name)); + F = fopen(name, "r"); + } + else { + F = fopen(filename, "r"); + } + if (F) { + long pos; + fseek(F, 0, SEEK_END); + pos = ftell(F); + rewind(F); + if (pos > 0) { + cJSON *config; + char *data; + size_t sz; + + data = malloc(pos + 1); + sz = fread(data, 1, (size_t)pos, F); + data[sz] = 0; + config = cJSON_Parse(data); + free(data); + if (config) { + json_config(config); + cJSON_Delete(config); + } + else { + log_error("invalid JSON, could not parse %s", filename); + } + } + fclose(F); + } +} + +static void include_xml(const char *filename) { + char name[PATH_MAX]; + + if (json_relpath) { + path_join(json_relpath, filename, name, sizeof(name)); + filename = name; + } + read_xml(filename, NULL); +} + static void json_include(cJSON *json) { cJSON *child; if (json->type != cJSON_Array) { @@ -894,39 +941,12 @@ static void json_include(cJSON *json) { return; } for (child = json->child; child; child = child->next) { - FILE *F; - if (json_relpath) { - char name[PATH_MAX]; - path_join(json_relpath, child->valuestring, name, sizeof(name)); - F = fopen(name, "r"); + const char * filename = child->valuestring; + if (strstr(filename, ".xml") != NULL) { + include_xml(filename); } else { - F = fopen(child->valuestring, "r"); - } - if (F) { - long pos; - fseek(F, 0, SEEK_END); - pos = ftell(F); - rewind(F); - if (pos > 0) { - cJSON *config; - char *data; - size_t sz; - - data = malloc(pos + 1); - sz = fread(data, 1, (size_t)pos, F); - data[sz] = 0; - config = cJSON_Parse(data); - free(data); - if (config) { - json_config(config); - cJSON_Delete(config); - } - else { - log_error("invalid JSON, could not parse %s", child->valuestring); - } - } - fclose(F); + include_json(filename); } } } diff --git a/src/util/xml.c b/src/util/xml.c index ec72179c3..21480aece 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -112,7 +112,7 @@ int read_xml(const char *filename, const char *catalog) { xml_reader *reader = xmlReaders; xmlDocPtr doc; - int result; + int result = 0; if (catalog) { xmlLoadCatalog(catalog); @@ -122,8 +122,9 @@ int read_xml(const char *filename, const char *catalog) log_error("could not open '%s'\n", filename); return -1; } - - result = xmlXIncludeProcessFlags(doc, XML_PARSE_XINCLUDE | XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT); + if (catalog) { + result = xmlXIncludeProcessFlags(doc, XML_PARSE_XINCLUDE | XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT); + } if (result >= 0) { while (reader != NULL) { int i = reader->callback(doc); From 6ef8d1af3c4fdae39ecc44985d8354a2c2aa6e6e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 5 Feb 2018 03:44:26 +0100 Subject: [PATCH 002/231] Use custom URI schemes for config files. TODO: XML files need to be rebased, XIncludes replaced. --- conf/e2/config.json | 31 ++++++++++++++++---- conf/e2/rules.xml | 20 +------------ res/core/common/items.xml | 2 ++ scripts/eressea/xmlconf.lua | 11 ++++---- src/jsonconf.c | 56 ++++++++++++++++++++++++------------- 5 files changed, 69 insertions(+), 51 deletions(-) diff --git a/conf/e2/config.json b/conf/e2/config.json index 863a64c0a..beb582a97 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -1,11 +1,30 @@ { "include": [ - "keywords.json", - "calendar.json", - "prefixes.json", - "e2/terrains.json", - "e2/rules.xml", - "e2/locales.xml" + "config://keywords.json", + "config://calendar.json", + "config://prefixes.json", + "config://e2/terrains.json", + "config://e2/locales.xml", + "config://e2/rules.xml", + "rules://core/ships.xml", + "rules://core/spoils.xml", + "rules://core/common/buildings.xml", + "rules://core/common/items.xml", + "rules://core/common/resources.xml", + "rules://core/common/luxuries.xml", + "rules://core/common/herbs.xml", + "rules://core/common/potions.xml", + "rules://core/common/armor.xml", + "rules://core/common/weapons.xml", + "rules://eressea/races.xml", + "rules://eressea/artrewards.xml", + "rules://eressea/buildings.xml", + "rules://eressea/familiars.xml", + "rules://eressea/buildings.xml", + "rules://eressea/equipment.xml", + "rules://eressea/items.xml", + "rules://eressea/spells.xml", + "rules://adamantium.xml" ], "disabled": [ "jsreport" diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml index 22ff8109f..9e40910e0 100644 --- a/conf/e2/rules.xml +++ b/conf/e2/rules.xml @@ -1,24 +1,6 @@ - + - - - - - - - - - - - - - - - - - - diff --git a/res/core/common/items.xml b/res/core/common/items.xml index 564e9fafd..d04b6a252 100644 --- a/res/core/common/items.xml +++ b/res/core/common/items.xml @@ -1,4 +1,5 @@ + @@ -133,3 +134,4 @@ + diff --git a/scripts/eressea/xmlconf.lua b/scripts/eressea/xmlconf.lua index 1b70b0ccd..756d3c18a 100644 --- a/scripts/eressea/xmlconf.lua +++ b/scripts/eressea/xmlconf.lua @@ -1,11 +1,10 @@ -local confdir = 'conf/' -if config.install then - confdir = config.install .. '/' .. confdir -end +local rules = 'conf' + if config.rules then - local rules = config.rules .. '/' - assert(0 == eressea.config.read(rules .. 'config.json', confdir), "could not read JSON data") + rules = rules .. '/' .. config.rules + assert(0 == eressea.config.read(rules .. '/config.json', config.install), "could not read JSON data") -- assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") -- assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") end + eressea.game.reset() diff --git a/src/jsonconf.c b/src/jsonconf.c index 15cc563b6..56ff2e675 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -887,16 +887,32 @@ static void json_races(cJSON *json) { const char * json_relpath; -static void include_json(const char *filename) { +static const char * uri_to_file(const char * uri, char *name, size_t size) { + const char *pos, *path = json_relpath; + + pos = strstr(uri, "://"); + if (pos) { + size_t slen = pos - uri; + /* identify scheme */ + if (strncmp(uri, "config", slen) == 0) { + path = path_join(path, "conf", name, size); + } + else if (strncmp(uri, "rules", slen) == 0) { + path = path_join(path, "res", name, size); + } + if (path) { + return path_join(path, pos + 3, name, size); + } + } + return uri; +} + +static void include_json(const char *uri) { FILE *F; - if (json_relpath) { - char name[PATH_MAX]; - path_join(json_relpath, filename, name, sizeof(name)); - F = fopen(name, "r"); - } - else { - F = fopen(filename, "r"); - } + char name[PATH_MAX]; + const char *filename = uri_to_file(uri, name, sizeof(name)); + + F = fopen(filename, "r"); if (F) { long pos; fseek(F, 0, SEEK_END); @@ -917,21 +933,20 @@ static void include_json(const char *filename) { cJSON_Delete(config); } else { - log_error("invalid JSON, could not parse %s", filename); + log_error("could not parse JSON from %s", uri); } } fclose(F); } } -static void include_xml(const char *filename) { +static void include_xml(const char *uri) { char name[PATH_MAX]; - - if (json_relpath) { - path_join(json_relpath, filename, name, sizeof(name)); - filename = name; + const char *filename = uri_to_file(uri, name, sizeof(name)); + int err = read_xml(filename, NULL); + if (err != 0) { + log_error("could not parse XML from %s", uri); } - read_xml(filename, NULL); } static void json_include(cJSON *json) { @@ -941,12 +956,13 @@ static void json_include(cJSON *json) { return; } for (child = json->child; child; child = child->next) { - const char * filename = child->valuestring; - if (strstr(filename, ".xml") != NULL) { - include_xml(filename); + const char *uri = child->valuestring; + + if (strstr(uri, ".xml") != NULL) { + include_xml(uri); } else { - include_json(filename); + include_json(uri); } } } From 92f82c360852412ea7b348156c1f3d66657256e9 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Feb 2018 18:25:38 +0100 Subject: [PATCH 003/231] plan to eliminate xinclude use, move to single config file with includes. --- conf/e2/config.json | 4 +- scripts/eressea/xmlconf.lua | 4 +- src/jsonconf.c | 82 +++++++++++++++++++++++-------------- src/util/xml.c | 7 ++-- 4 files changed, 60 insertions(+), 37 deletions(-) diff --git a/conf/e2/config.json b/conf/e2/config.json index 5d29cd1f5..863a64c0a 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -3,7 +3,9 @@ "keywords.json", "calendar.json", "prefixes.json", - "e2/terrains.json" + "e2/terrains.json", + "e2/rules.xml", + "e2/locales.xml" ], "disabled": [ "jsreport" diff --git a/scripts/eressea/xmlconf.lua b/scripts/eressea/xmlconf.lua index 84f29eceb..1b70b0ccd 100644 --- a/scripts/eressea/xmlconf.lua +++ b/scripts/eressea/xmlconf.lua @@ -5,7 +5,7 @@ end if config.rules then local rules = config.rules .. '/' assert(0 == eressea.config.read(rules .. 'config.json', confdir), "could not read JSON data") - assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") - assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") +-- assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") +-- assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") end eressea.game.reset() diff --git a/src/jsonconf.c b/src/jsonconf.c index 3c5411b9d..15cc563b6 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -887,6 +887,53 @@ static void json_races(cJSON *json) { const char * json_relpath; +static void include_json(const char *filename) { + FILE *F; + if (json_relpath) { + char name[PATH_MAX]; + path_join(json_relpath, filename, name, sizeof(name)); + F = fopen(name, "r"); + } + else { + F = fopen(filename, "r"); + } + if (F) { + long pos; + fseek(F, 0, SEEK_END); + pos = ftell(F); + rewind(F); + if (pos > 0) { + cJSON *config; + char *data; + size_t sz; + + data = malloc(pos + 1); + sz = fread(data, 1, (size_t)pos, F); + data[sz] = 0; + config = cJSON_Parse(data); + free(data); + if (config) { + json_config(config); + cJSON_Delete(config); + } + else { + log_error("invalid JSON, could not parse %s", filename); + } + } + fclose(F); + } +} + +static void include_xml(const char *filename) { + char name[PATH_MAX]; + + if (json_relpath) { + path_join(json_relpath, filename, name, sizeof(name)); + filename = name; + } + read_xml(filename, NULL); +} + static void json_include(cJSON *json) { cJSON *child; if (json->type != cJSON_Array) { @@ -894,39 +941,12 @@ static void json_include(cJSON *json) { return; } for (child = json->child; child; child = child->next) { - FILE *F; - if (json_relpath) { - char name[PATH_MAX]; - path_join(json_relpath, child->valuestring, name, sizeof(name)); - F = fopen(name, "r"); + const char * filename = child->valuestring; + if (strstr(filename, ".xml") != NULL) { + include_xml(filename); } else { - F = fopen(child->valuestring, "r"); - } - if (F) { - long pos; - fseek(F, 0, SEEK_END); - pos = ftell(F); - rewind(F); - if (pos > 0) { - cJSON *config; - char *data; - size_t sz; - - data = malloc(pos + 1); - sz = fread(data, 1, (size_t)pos, F); - data[sz] = 0; - config = cJSON_Parse(data); - free(data); - if (config) { - json_config(config); - cJSON_Delete(config); - } - else { - log_error("invalid JSON, could not parse %s", child->valuestring); - } - } - fclose(F); + include_json(filename); } } } diff --git a/src/util/xml.c b/src/util/xml.c index ec72179c3..21480aece 100644 --- a/src/util/xml.c +++ b/src/util/xml.c @@ -112,7 +112,7 @@ int read_xml(const char *filename, const char *catalog) { xml_reader *reader = xmlReaders; xmlDocPtr doc; - int result; + int result = 0; if (catalog) { xmlLoadCatalog(catalog); @@ -122,8 +122,9 @@ int read_xml(const char *filename, const char *catalog) log_error("could not open '%s'\n", filename); return -1; } - - result = xmlXIncludeProcessFlags(doc, XML_PARSE_XINCLUDE | XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT); + if (catalog) { + result = xmlXIncludeProcessFlags(doc, XML_PARSE_XINCLUDE | XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT); + } if (result >= 0) { while (reader != NULL) { int i = reader->callback(doc); From da02c1b92efaa4af0c36460b2ae6799efbbc349d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 5 Feb 2018 03:44:26 +0100 Subject: [PATCH 004/231] Use custom URI schemes for config files. TODO: XML files need to be rebased, XIncludes replaced. --- conf/e2/config.json | 31 ++++++++++++++++---- conf/e2/rules.xml | 20 +------------ res/core/common/items.xml | 2 ++ scripts/eressea/xmlconf.lua | 11 ++++---- src/jsonconf.c | 56 ++++++++++++++++++++++++------------- 5 files changed, 69 insertions(+), 51 deletions(-) diff --git a/conf/e2/config.json b/conf/e2/config.json index 863a64c0a..beb582a97 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -1,11 +1,30 @@ { "include": [ - "keywords.json", - "calendar.json", - "prefixes.json", - "e2/terrains.json", - "e2/rules.xml", - "e2/locales.xml" + "config://keywords.json", + "config://calendar.json", + "config://prefixes.json", + "config://e2/terrains.json", + "config://e2/locales.xml", + "config://e2/rules.xml", + "rules://core/ships.xml", + "rules://core/spoils.xml", + "rules://core/common/buildings.xml", + "rules://core/common/items.xml", + "rules://core/common/resources.xml", + "rules://core/common/luxuries.xml", + "rules://core/common/herbs.xml", + "rules://core/common/potions.xml", + "rules://core/common/armor.xml", + "rules://core/common/weapons.xml", + "rules://eressea/races.xml", + "rules://eressea/artrewards.xml", + "rules://eressea/buildings.xml", + "rules://eressea/familiars.xml", + "rules://eressea/buildings.xml", + "rules://eressea/equipment.xml", + "rules://eressea/items.xml", + "rules://eressea/spells.xml", + "rules://adamantium.xml" ], "disabled": [ "jsreport" diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml index 22ff8109f..9e40910e0 100644 --- a/conf/e2/rules.xml +++ b/conf/e2/rules.xml @@ -1,24 +1,6 @@ - + - - - - - - - - - - - - - - - - - - diff --git a/res/core/common/items.xml b/res/core/common/items.xml index 564e9fafd..d04b6a252 100644 --- a/res/core/common/items.xml +++ b/res/core/common/items.xml @@ -1,4 +1,5 @@ + @@ -133,3 +134,4 @@ + diff --git a/scripts/eressea/xmlconf.lua b/scripts/eressea/xmlconf.lua index 1b70b0ccd..756d3c18a 100644 --- a/scripts/eressea/xmlconf.lua +++ b/scripts/eressea/xmlconf.lua @@ -1,11 +1,10 @@ -local confdir = 'conf/' -if config.install then - confdir = config.install .. '/' .. confdir -end +local rules = 'conf' + if config.rules then - local rules = config.rules .. '/' - assert(0 == eressea.config.read(rules .. 'config.json', confdir), "could not read JSON data") + rules = rules .. '/' .. config.rules + assert(0 == eressea.config.read(rules .. '/config.json', config.install), "could not read JSON data") -- assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") -- assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") end + eressea.game.reset() diff --git a/src/jsonconf.c b/src/jsonconf.c index 15cc563b6..56ff2e675 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -887,16 +887,32 @@ static void json_races(cJSON *json) { const char * json_relpath; -static void include_json(const char *filename) { +static const char * uri_to_file(const char * uri, char *name, size_t size) { + const char *pos, *path = json_relpath; + + pos = strstr(uri, "://"); + if (pos) { + size_t slen = pos - uri; + /* identify scheme */ + if (strncmp(uri, "config", slen) == 0) { + path = path_join(path, "conf", name, size); + } + else if (strncmp(uri, "rules", slen) == 0) { + path = path_join(path, "res", name, size); + } + if (path) { + return path_join(path, pos + 3, name, size); + } + } + return uri; +} + +static void include_json(const char *uri) { FILE *F; - if (json_relpath) { - char name[PATH_MAX]; - path_join(json_relpath, filename, name, sizeof(name)); - F = fopen(name, "r"); - } - else { - F = fopen(filename, "r"); - } + char name[PATH_MAX]; + const char *filename = uri_to_file(uri, name, sizeof(name)); + + F = fopen(filename, "r"); if (F) { long pos; fseek(F, 0, SEEK_END); @@ -917,21 +933,20 @@ static void include_json(const char *filename) { cJSON_Delete(config); } else { - log_error("invalid JSON, could not parse %s", filename); + log_error("could not parse JSON from %s", uri); } } fclose(F); } } -static void include_xml(const char *filename) { +static void include_xml(const char *uri) { char name[PATH_MAX]; - - if (json_relpath) { - path_join(json_relpath, filename, name, sizeof(name)); - filename = name; + const char *filename = uri_to_file(uri, name, sizeof(name)); + int err = read_xml(filename, NULL); + if (err != 0) { + log_error("could not parse XML from %s", uri); } - read_xml(filename, NULL); } static void json_include(cJSON *json) { @@ -941,12 +956,13 @@ static void json_include(cJSON *json) { return; } for (child = json->child; child; child = child->next) { - const char * filename = child->valuestring; - if (strstr(filename, ".xml") != NULL) { - include_xml(filename); + const char *uri = child->valuestring; + + if (strstr(uri, ".xml") != NULL) { + include_xml(uri); } else { - include_json(filename); + include_json(uri); } } } From 434b7ae29e6bbf7b0bce2a0787df753510d90974 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 5 Feb 2018 19:35:15 +0100 Subject: [PATCH 005/231] convert all of E2 to new config loading. --- conf/e2/config.json | 48 +++++++++++++-------------- conf/e2/items.json | 49 ++++++++++++++++++++++++++++ conf/e2/locales.json | 14 ++++++++ conf/e2/locales.xml | 13 -------- res/adamantium.xml | 2 ++ res/buildings/castle-2.xml | 2 ++ res/buildings/castle.xml | 4 +++ res/core/armor/chainmail.xml | 2 ++ res/core/armor/laenmail.xml | 2 ++ res/core/armor/laenshield.xml | 2 ++ res/core/armor/plate.xml | 2 ++ res/core/armor/rustychainmail.xml | 3 +- res/core/armor/rustyshield.xml | 2 ++ res/core/armor/shield.xml | 2 ++ res/core/common/armor.xml | 10 ------ res/core/common/buildings.xml | 3 +- res/core/common/construction.xml | 10 ------ res/core/common/herbs.xml | 2 ++ res/core/common/luxuries.xml | 2 ++ res/core/common/potions.xml | 2 ++ res/core/common/resources.xml | 19 ----------- res/core/common/weapons.xml | 24 -------------- res/core/resources/cart.xml | 4 +++ res/core/resources/horse.xml | 4 +++ res/core/resources/hp.xml | 4 +++ res/core/resources/iron.xml | 4 +++ res/core/resources/laen.xml | 4 +++ res/core/resources/log.xml | 4 +++ res/core/resources/mallorn.xml | 4 +++ res/core/resources/mallornseed.xml | 4 +++ res/core/resources/peasant.xml | 4 +++ res/core/resources/seed.xml | 4 +++ res/core/resources/stone.xml | 4 +++ res/core/ships.xml | 3 +- res/core/spoils.xml | 2 ++ res/core/weapons/axe.xml | 4 +++ res/core/weapons/bow.xml | 4 +++ res/core/weapons/catapult.xml | 4 +++ res/core/weapons/crossbow.xml | 4 +++ res/core/weapons/firesword.xml | 4 +++ res/core/weapons/greatbow.xml | 4 +++ res/core/weapons/greatsword.xml | 4 +++ res/core/weapons/halberd.xml | 4 +++ res/core/weapons/laensword.xml | 4 +++ res/core/weapons/lance.xml | 4 +++ res/core/weapons/mallornbow.xml | 4 +++ res/core/weapons/mallorncrossbow.xml | 4 +++ res/core/weapons/mallornlance.xml | 4 +++ res/core/weapons/mallornspear.xml | 4 +++ res/core/weapons/runesword.xml | 4 +++ res/core/weapons/rustyaxe.xml | 4 +++ res/core/weapons/rustygreatsword.xml | 4 +++ res/core/weapons/rustyhalberd.xml | 4 +++ res/core/weapons/rustysword.xml | 4 +++ res/core/weapons/spear.xml | 4 +++ res/core/weapons/sword.xml | 4 +++ res/eressea/artrewards.xml | 4 +-- res/eressea/buildings.xml | 3 +- res/eressea/equipment.xml | 4 ++- res/eressea/familiars.xml | 3 +- res/eressea/items.xml | 2 ++ res/eressea/races.xml | 2 ++ res/eressea/spells.xml | 12 +++---- src/jsonconf.c | 47 ++++++++++++++++++-------- 64 files changed, 299 insertions(+), 130 deletions(-) create mode 100644 conf/e2/items.json create mode 100644 conf/e2/locales.json delete mode 100644 conf/e2/locales.xml delete mode 100644 res/core/common/armor.xml delete mode 100644 res/core/common/construction.xml delete mode 100644 res/core/common/resources.xml delete mode 100644 res/core/common/weapons.xml diff --git a/conf/e2/config.json b/conf/e2/config.json index beb582a97..c2514706a 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -1,30 +1,28 @@ { "include": [ - "config://keywords.json", - "config://calendar.json", - "config://prefixes.json", - "config://e2/terrains.json", - "config://e2/locales.xml", - "config://e2/rules.xml", - "rules://core/ships.xml", - "rules://core/spoils.xml", - "rules://core/common/buildings.xml", - "rules://core/common/items.xml", - "rules://core/common/resources.xml", - "rules://core/common/luxuries.xml", - "rules://core/common/herbs.xml", - "rules://core/common/potions.xml", - "rules://core/common/armor.xml", - "rules://core/common/weapons.xml", - "rules://eressea/races.xml", - "rules://eressea/artrewards.xml", - "rules://eressea/buildings.xml", - "rules://eressea/familiars.xml", - "rules://eressea/buildings.xml", - "rules://eressea/equipment.xml", - "rules://eressea/items.xml", - "rules://eressea/spells.xml", - "rules://adamantium.xml" + "config://conf/keywords.json", + "config://conf/calendar.json", + "config://conf/prefixes.json", + "config://conf/e2/terrains.json", + "config://conf/e2/items.json", + "config://conf/e2/locales.json", + "config://conf/e2/rules.xml", + "config://res/core/ships.xml", + "config://res/core/spoils.xml", + "config://res/core/common/buildings.xml", + "config://res/eressea/buildings.xml", + "config://res/buildings/castle.xml", + "config://res/eressea/races.xml", + "config://res/eressea/artrewards.xml", + "config://res/eressea/familiars.xml", + "config://res/eressea/equipment.xml", + "config://res/eressea/spells.xml", + "config://res/eressea/spellbooks/gray.xml", + "config://res/eressea/spellbooks/gwyrrd.xml", + "config://res/eressea/spellbooks/draig.xml", + "config://res/eressea/spellbooks/illaun.xml", + "config://res/eressea/spellbooks/cerddor.xml", + "config://res/eressea/spellbooks/tybied.xml" ], "disabled": [ "jsreport" diff --git a/conf/e2/items.json b/conf/e2/items.json new file mode 100644 index 000000000..dc4664cdc --- /dev/null +++ b/conf/e2/items.json @@ -0,0 +1,49 @@ +{ + "include": [ + "config://res/core/common/items.xml", + "config://res/core/armor/chainmail.xml", + "config://res/core/armor/laenmail.xml", + "config://res/core/armor/laenshield.xml", + "config://res/core/armor/plate.xml", + "config://res/core/armor/rustychainmail.xml", + "config://res/core/armor/rustyshield.xml", + "config://res/core/armor/shield.xml", + "config://res/core/resources/cart.xml", + "config://res/core/resources/horse.xml", + "config://res/core/resources/hp.xml", + "config://res/core/resources/iron.xml", + "config://res/core/resources/laen.xml", + "config://res/core/resources/log.xml", + "config://res/core/resources/mallorn.xml", + "config://res/core/resources/mallornseed.xml", + "config://res/core/resources/seed.xml", + "config://res/core/resources/peasant.xml", + "config://res/core/resources/stone.xml", + "config://res/core/common/luxuries.xml", + "config://res/core/common/herbs.xml", + "config://res/core/common/potions.xml", + "config://res/core/weapons/axe.xml", + "config://res/core/weapons/bow.xml", + "config://res/core/weapons/catapult.xml", + "config://res/core/weapons/crossbow.xml", + "config://res/core/weapons/firesword.xml", + "config://res/core/weapons/greatbow.xml", + "config://res/core/weapons/greatsword.xml", + "config://res/core/weapons/halberd.xml", + "config://res/core/weapons/laensword.xml", + "config://res/core/weapons/lance.xml", + "config://res/core/weapons/mallornbow.xml", + "config://res/core/weapons/mallorncrossbow.xml", + "config://res/core/weapons/mallornlance.xml", + "config://res/core/weapons/mallornspear.xml", + "config://res/core/weapons/runesword.xml", + "config://res/core/weapons/rustyaxe.xml", + "config://res/core/weapons/rustygreatsword.xml", + "config://res/core/weapons/rustyhalberd.xml", + "config://res/core/weapons/rustysword.xml", + "config://res/core/weapons/spear.xml", + "config://res/core/weapons/sword.xml", + "config://res/eressea/items.xml", + "config://res/adamantium.xml" + ] +} diff --git a/conf/e2/locales.json b/conf/e2/locales.json new file mode 100644 index 000000000..4a3a100ef --- /dev/null +++ b/conf/e2/locales.json @@ -0,0 +1,14 @@ +{ + "include": [ + "config://res/core/messages.xml", + "config://res/core/de/strings.xml", + "config://res/core/en/strings.xml", + "config://res/eressea/strings.xml", + "config://res/eressea/spellinfo.xml", + "config://res/names-undead.xml", + "config://res/names-skeletons.xml", + "config://res/names-zombies.xml", + "config://res/names-ghouls.xml", + "config://res/names-dragons.xml" + ] +} diff --git a/conf/e2/locales.xml b/conf/e2/locales.xml deleted file mode 100644 index 7a31bbc17..000000000 --- a/conf/e2/locales.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/adamantium.xml b/res/adamantium.xml index e1f0643e2..563299e51 100644 --- a/res/adamantium.xml +++ b/res/adamantium.xml @@ -1,4 +1,5 @@ + @@ -32,3 +33,4 @@ + diff --git a/res/buildings/castle-2.xml b/res/buildings/castle-2.xml index accb92c08..8117524ff 100644 --- a/res/buildings/castle-2.xml +++ b/res/buildings/castle-2.xml @@ -1,4 +1,5 @@ + @@ -19,3 +20,4 @@ + diff --git a/res/buildings/castle.xml b/res/buildings/castle.xml index ce64e8030..14d959ed7 100644 --- a/res/buildings/castle.xml +++ b/res/buildings/castle.xml @@ -1,4 +1,6 @@ + + @@ -22,3 +24,5 @@ + + diff --git a/res/core/armor/chainmail.xml b/res/core/armor/chainmail.xml index b03221b35..048a94ae9 100644 --- a/res/core/armor/chainmail.xml +++ b/res/core/armor/chainmail.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/armor/laenmail.xml b/res/core/armor/laenmail.xml index 0e1411945..f26e5363b 100644 --- a/res/core/armor/laenmail.xml +++ b/res/core/armor/laenmail.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/armor/laenshield.xml b/res/core/armor/laenshield.xml index 8a9d6d5c3..03f9f479a 100644 --- a/res/core/armor/laenshield.xml +++ b/res/core/armor/laenshield.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/armor/plate.xml b/res/core/armor/plate.xml index 97d855a73..f43a704b8 100644 --- a/res/core/armor/plate.xml +++ b/res/core/armor/plate.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/armor/rustychainmail.xml b/res/core/armor/rustychainmail.xml index b46380634..f7947bbb1 100644 --- a/res/core/armor/rustychainmail.xml +++ b/res/core/armor/rustychainmail.xml @@ -1,4 +1,5 @@ + @@ -7,4 +8,4 @@ - + diff --git a/res/core/armor/rustyshield.xml b/res/core/armor/rustyshield.xml index 56a8abe5a..218b4fa6a 100644 --- a/res/core/armor/rustyshield.xml +++ b/res/core/armor/rustyshield.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/armor/shield.xml b/res/core/armor/shield.xml index b0ee7de3a..af099dc2e 100644 --- a/res/core/armor/shield.xml +++ b/res/core/armor/shield.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/core/common/armor.xml b/res/core/common/armor.xml deleted file mode 100644 index 58abae47f..000000000 --- a/res/core/common/armor.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/res/core/common/buildings.xml b/res/core/common/buildings.xml index 932326f1c..3b8719b3b 100644 --- a/res/core/common/buildings.xml +++ b/res/core/common/buildings.xml @@ -1,4 +1,5 @@ + @@ -167,4 +168,4 @@ - + diff --git a/res/core/common/construction.xml b/res/core/common/construction.xml deleted file mode 100644 index 089ddfe1c..000000000 --- a/res/core/common/construction.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/res/core/common/herbs.xml b/res/core/common/herbs.xml index d7d0ef2e6..9175b4a42 100644 --- a/res/core/common/herbs.xml +++ b/res/core/common/herbs.xml @@ -1,4 +1,5 @@  + @@ -87,3 +88,4 @@ + diff --git a/res/core/common/luxuries.xml b/res/core/common/luxuries.xml index bdf9c110b..05e125b33 100644 --- a/res/core/common/luxuries.xml +++ b/res/core/common/luxuries.xml @@ -1,4 +1,5 @@ + @@ -24,3 +25,4 @@ + diff --git a/res/core/common/potions.xml b/res/core/common/potions.xml index 4812727dd..bb4556eb7 100644 --- a/res/core/common/potions.xml +++ b/res/core/common/potions.xml @@ -1,4 +1,5 @@ + @@ -180,3 +181,4 @@ + diff --git a/res/core/common/resources.xml b/res/core/common/resources.xml deleted file mode 100644 index 91d0e8afc..000000000 --- a/res/core/common/resources.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/res/core/common/weapons.xml b/res/core/common/weapons.xml deleted file mode 100644 index e91b15e69..000000000 --- a/res/core/common/weapons.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/core/resources/cart.xml b/res/core/resources/cart.xml index 17dbdcb41..c98e202b0 100644 --- a/res/core/resources/cart.xml +++ b/res/core/resources/cart.xml @@ -1,4 +1,6 @@ + + @@ -6,3 +8,5 @@ + + diff --git a/res/core/resources/horse.xml b/res/core/resources/horse.xml index 608fca20a..6021692e0 100644 --- a/res/core/resources/horse.xml +++ b/res/core/resources/horse.xml @@ -1,6 +1,10 @@ + + + + diff --git a/res/core/resources/hp.xml b/res/core/resources/hp.xml index aa0ad4d29..5d038e7b2 100644 --- a/res/core/resources/hp.xml +++ b/res/core/resources/hp.xml @@ -1,4 +1,8 @@ + + + + diff --git a/res/core/resources/iron.xml b/res/core/resources/iron.xml index 1aff826fc..38ddb33c8 100644 --- a/res/core/resources/iron.xml +++ b/res/core/resources/iron.xml @@ -1,4 +1,6 @@ + + @@ -8,3 +10,5 @@ + + diff --git a/res/core/resources/laen.xml b/res/core/resources/laen.xml index e584fe485..1c14c2eff 100644 --- a/res/core/resources/laen.xml +++ b/res/core/resources/laen.xml @@ -1,4 +1,6 @@ + + @@ -6,3 +8,5 @@ + + diff --git a/res/core/resources/log.xml b/res/core/resources/log.xml index e3710d496..5720c2fd4 100644 --- a/res/core/resources/log.xml +++ b/res/core/resources/log.xml @@ -1,4 +1,6 @@ + + @@ -6,3 +8,5 @@ + + diff --git a/res/core/resources/mallorn.xml b/res/core/resources/mallorn.xml index 3dff091c6..8e50785ca 100644 --- a/res/core/resources/mallorn.xml +++ b/res/core/resources/mallorn.xml @@ -1,4 +1,6 @@ + + @@ -6,3 +8,5 @@ + + diff --git a/res/core/resources/mallornseed.xml b/res/core/resources/mallornseed.xml index 7a5a0310f..7a50c1233 100644 --- a/res/core/resources/mallornseed.xml +++ b/res/core/resources/mallornseed.xml @@ -1,6 +1,10 @@ + + + + diff --git a/res/core/resources/peasant.xml b/res/core/resources/peasant.xml index bce23430c..8c5b22c19 100644 --- a/res/core/resources/peasant.xml +++ b/res/core/resources/peasant.xml @@ -1,4 +1,8 @@ + + + + diff --git a/res/core/resources/seed.xml b/res/core/resources/seed.xml index 99f5f5804..6696b761f 100644 --- a/res/core/resources/seed.xml +++ b/res/core/resources/seed.xml @@ -1,6 +1,10 @@ + + + + diff --git a/res/core/resources/stone.xml b/res/core/resources/stone.xml index e1c5651ed..b8f91eadc 100644 --- a/res/core/resources/stone.xml +++ b/res/core/resources/stone.xml @@ -1,4 +1,6 @@ + + @@ -7,3 +9,5 @@ + + diff --git a/res/core/ships.xml b/res/core/ships.xml index 33d0dc52a..d26975285 100644 --- a/res/core/ships.xml +++ b/res/core/ships.xml @@ -1,4 +1,5 @@ + @@ -73,4 +74,4 @@ - + diff --git a/res/core/spoils.xml b/res/core/spoils.xml index 952971cab..8cd39a455 100644 --- a/res/core/spoils.xml +++ b/res/core/spoils.xml @@ -1,4 +1,5 @@ + @@ -57,3 +58,4 @@ + diff --git a/res/core/weapons/axe.xml b/res/core/weapons/axe.xml index 3f97a5b8a..07f511a62 100644 --- a/res/core/weapons/axe.xml +++ b/res/core/weapons/axe.xml @@ -1,4 +1,6 @@ + + @@ -11,3 +13,5 @@ + + diff --git a/res/core/weapons/bow.xml b/res/core/weapons/bow.xml index 4fb9b2000..a62f90b58 100644 --- a/res/core/weapons/bow.xml +++ b/res/core/weapons/bow.xml @@ -1,4 +1,6 @@ + + @@ -11,3 +13,5 @@ + + diff --git a/res/core/weapons/catapult.xml b/res/core/weapons/catapult.xml index e05c5a025..6312dd4d6 100644 --- a/res/core/weapons/catapult.xml +++ b/res/core/weapons/catapult.xml @@ -1,4 +1,6 @@ + + @@ -12,3 +14,5 @@ + + diff --git a/res/core/weapons/crossbow.xml b/res/core/weapons/crossbow.xml index c7bf4715d..c048e3dcd 100644 --- a/res/core/weapons/crossbow.xml +++ b/res/core/weapons/crossbow.xml @@ -1,4 +1,6 @@ + + @@ -11,3 +13,5 @@ + + diff --git a/res/core/weapons/firesword.xml b/res/core/weapons/firesword.xml index d716e6013..dc3b47af5 100644 --- a/res/core/weapons/firesword.xml +++ b/res/core/weapons/firesword.xml @@ -1,4 +1,6 @@ + + @@ -8,3 +10,5 @@ + + diff --git a/res/core/weapons/greatbow.xml b/res/core/weapons/greatbow.xml index 452ac0250..b30cae8c6 100644 --- a/res/core/weapons/greatbow.xml +++ b/res/core/weapons/greatbow.xml @@ -1,4 +1,6 @@ + + @@ -15,3 +17,5 @@ + + diff --git a/res/core/weapons/greatsword.xml b/res/core/weapons/greatsword.xml index 56285f6af..af2420700 100644 --- a/res/core/weapons/greatsword.xml +++ b/res/core/weapons/greatsword.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/halberd.xml b/res/core/weapons/halberd.xml index 7abc86902..8475d53e1 100644 --- a/res/core/weapons/halberd.xml +++ b/res/core/weapons/halberd.xml @@ -1,4 +1,6 @@ + + @@ -12,3 +14,5 @@ + + diff --git a/res/core/weapons/laensword.xml b/res/core/weapons/laensword.xml index 3053d5f1b..325d25d10 100644 --- a/res/core/weapons/laensword.xml +++ b/res/core/weapons/laensword.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/lance.xml b/res/core/weapons/lance.xml index 4a02bc06f..9325494fa 100644 --- a/res/core/weapons/lance.xml +++ b/res/core/weapons/lance.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/mallornbow.xml b/res/core/weapons/mallornbow.xml index abdcc4810..9164d2c4b 100644 --- a/res/core/weapons/mallornbow.xml +++ b/res/core/weapons/mallornbow.xml @@ -1,4 +1,6 @@ + + @@ -14,3 +16,5 @@ + + diff --git a/res/core/weapons/mallorncrossbow.xml b/res/core/weapons/mallorncrossbow.xml index 385720d8c..e5ec685c0 100644 --- a/res/core/weapons/mallorncrossbow.xml +++ b/res/core/weapons/mallorncrossbow.xml @@ -1,4 +1,6 @@ + + @@ -11,3 +13,5 @@ + + diff --git a/res/core/weapons/mallornlance.xml b/res/core/weapons/mallornlance.xml index 4024d4578..952839fda 100644 --- a/res/core/weapons/mallornlance.xml +++ b/res/core/weapons/mallornlance.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/mallornspear.xml b/res/core/weapons/mallornspear.xml index 516f59540..ee827c754 100644 --- a/res/core/weapons/mallornspear.xml +++ b/res/core/weapons/mallornspear.xml @@ -1,4 +1,6 @@ + + @@ -12,3 +14,5 @@ + + diff --git a/res/core/weapons/runesword.xml b/res/core/weapons/runesword.xml index 1bfae2544..6f23697f2 100644 --- a/res/core/weapons/runesword.xml +++ b/res/core/weapons/runesword.xml @@ -1,4 +1,6 @@ + + @@ -8,3 +10,5 @@ + + diff --git a/res/core/weapons/rustyaxe.xml b/res/core/weapons/rustyaxe.xml index fea6b8642..ff4172059 100644 --- a/res/core/weapons/rustyaxe.xml +++ b/res/core/weapons/rustyaxe.xml @@ -1,4 +1,6 @@ + + @@ -11,3 +13,5 @@ + + diff --git a/res/core/weapons/rustygreatsword.xml b/res/core/weapons/rustygreatsword.xml index 7f21cce17..b67e2cf4b 100644 --- a/res/core/weapons/rustygreatsword.xml +++ b/res/core/weapons/rustygreatsword.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/rustyhalberd.xml b/res/core/weapons/rustyhalberd.xml index 3f0bd93b7..9d3c4ae6b 100644 --- a/res/core/weapons/rustyhalberd.xml +++ b/res/core/weapons/rustyhalberd.xml @@ -1,4 +1,6 @@ + + @@ -12,3 +14,5 @@ + + diff --git a/res/core/weapons/rustysword.xml b/res/core/weapons/rustysword.xml index 2a76c109b..e5c9a9442 100644 --- a/res/core/weapons/rustysword.xml +++ b/res/core/weapons/rustysword.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/core/weapons/spear.xml b/res/core/weapons/spear.xml index 32a79b9a2..e81f608ab 100644 --- a/res/core/weapons/spear.xml +++ b/res/core/weapons/spear.xml @@ -1,4 +1,6 @@ + + @@ -12,3 +14,5 @@ + + diff --git a/res/core/weapons/sword.xml b/res/core/weapons/sword.xml index 4bd2ebdb1..21b481079 100644 --- a/res/core/weapons/sword.xml +++ b/res/core/weapons/sword.xml @@ -1,4 +1,6 @@ + + @@ -10,3 +12,5 @@ + + diff --git a/res/eressea/artrewards.xml b/res/eressea/artrewards.xml index b18fd5b20..9a144da07 100644 --- a/res/eressea/artrewards.xml +++ b/res/eressea/artrewards.xml @@ -1,5 +1,5 @@ - + @@ -11,4 +11,4 @@ - + diff --git a/res/eressea/buildings.xml b/res/eressea/buildings.xml index 1559fd987..b3ab4b6c0 100644 --- a/res/eressea/buildings.xml +++ b/res/eressea/buildings.xml @@ -1,8 +1,9 @@ + - + diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index e4d48aefe..94d0deb07 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -1,5 +1,5 @@ - + @@ -271,3 +271,5 @@ + + diff --git a/res/eressea/familiars.xml b/res/eressea/familiars.xml index 7e9bb75dc..112a82420 100644 --- a/res/eressea/familiars.xml +++ b/res/eressea/familiars.xml @@ -1,4 +1,5 @@ + @@ -129,4 +130,4 @@ - + diff --git a/res/eressea/items.xml b/res/eressea/items.xml index 3f5cc3d17..2cfa9e653 100644 --- a/res/eressea/items.xml +++ b/res/eressea/items.xml @@ -1,4 +1,5 @@ + @@ -128,3 +129,4 @@ + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index cdd483851..654a859bd 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -1,4 +1,5 @@ + + diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 6b2e43a15..089ec1a6c 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -1,12 +1,6 @@ - - - - - - - - + + @@ -616,3 +610,5 @@ + + diff --git a/src/jsonconf.c b/src/jsonconf.c index 56ff2e675..2fff42b83 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -887,24 +887,45 @@ static void json_races(cJSON *json) { const char * json_relpath; -static const char * uri_to_file(const char * uri, char *name, size_t size) { - const char *pos, *path = json_relpath; +/* TODO: much more configurable authority-to-file lookup */ +static const char * authority_to_path(const char *authority, char *name, size_t size) { + /* source and destination cannot share the same buffer */ + assert(authority < name || authority > name + size); - pos = strstr(uri, "://"); + return join_path(json_relpath, authority, name, size); +} + +static const char * uri_to_file(const char * uri, char *name, size_t size) { + const char *pos, *scheme, *path = uri; + + /* source and destination cannot share the same buffer */ + assert(uri < name || uri > name + size); + + /* identify scheme */ + scheme = uri; + pos = strstr(scheme, "://"); if (pos) { - size_t slen = pos - uri; - /* identify scheme */ - if (strncmp(uri, "config", slen) == 0) { - path = path_join(path, "conf", name, size); + size_t slen = pos - scheme; + if (strncmp(scheme, "config", slen) == 0) { + const char *authority = pos + 3; + /* authority */ + pos = strstr(authority, "/"); + if (pos) { + char buffer[16]; + size_t alen = pos - authority; + assert(alen < sizeof(buffer)); + memcpy(buffer, authority, alen); + buffer[alen] = 0; + + path = authority_to_path(buffer, name, size); + path = path_join(path, pos + 1, name, size); + } } - else if (strncmp(uri, "rules", slen) == 0) { - path = path_join(path, "res", name, size); - } - if (path) { - return path_join(path, pos + 3, name, size); + else { + log_fatal("unknown URI scheme: %s", uri); } } - return uri; + return path; } static void include_json(const char *uri) { From df255b886aed78bab86fbe46109d9b7886e6a466 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 6 Feb 2018 18:46:28 +0100 Subject: [PATCH 006/231] verify xml loading, fix remaining files for e2. --- res/core/de/strings.xml | 2 + res/core/en/strings.xml | 2 + res/core/messages.xml | 31 +- res/eressea/spellbooks/cerddor.xml | 2 + res/eressea/spellbooks/draig.xml | 2 + res/eressea/spellbooks/gray.xml | 2 + res/eressea/spellbooks/gwyrrd.xml | 2 + res/eressea/spellbooks/illaun.xml | 3 +- res/eressea/spellbooks/tybied.xml | 2 + res/eressea/spellinfo.xml | 2 + res/eressea/strings.xml | 2 + res/names-dragons.xml | 4 +- res/names-ghouls.xml | 3 +- res/names-skeletons.xml | 4 +- res/names-undead.xml | 2 + res/names-zombies.xml | 2 + scripts/run-tests-e2.lua | 7 + scripts/run-tests-e3.lua | 7 + src/bindings.c | 7 +- src/convert.c | 2 +- src/jsonconf.c | 19 +- src/laws.c | 5 + src/util/xml.c | 29 +- src/util/xml.h | 2 +- src/xmlreader.c | 616 +++++++++++++++-------------- 25 files changed, 397 insertions(+), 364 deletions(-) diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 6801cbb35..896a7e009 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -1,4 +1,5 @@ + diff --git a/res/e3a/armor.xml b/res/e3a/armor.xml index fe1d7fb45..d0d5138ef 100644 --- a/res/e3a/armor.xml +++ b/res/e3a/armor.xml @@ -1,12 +1,83 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/e3a/armor/chainmail.xml b/res/e3a/armor/chainmail.xml deleted file mode 100644 index 509df07e6..000000000 --- a/res/e3a/armor/chainmail.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/laenmail.xml b/res/e3a/armor/laenmail.xml deleted file mode 100644 index f03add574..000000000 --- a/res/e3a/armor/laenmail.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/laenshield.xml b/res/e3a/armor/laenshield.xml deleted file mode 100644 index 8d003bccc..000000000 --- a/res/e3a/armor/laenshield.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/plate.xml b/res/e3a/armor/plate.xml deleted file mode 100644 index 79391fbcb..000000000 --- a/res/e3a/armor/plate.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/rustychainmail.xml b/res/e3a/armor/rustychainmail.xml deleted file mode 100644 index 361564c76..000000000 --- a/res/e3a/armor/rustychainmail.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/rustyshield.xml b/res/e3a/armor/rustyshield.xml deleted file mode 100644 index d9d8a54ef..000000000 --- a/res/e3a/armor/rustyshield.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/scale.xml b/res/e3a/armor/scale.xml deleted file mode 100644 index 4d3e38e8a..000000000 --- a/res/e3a/armor/scale.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/res/e3a/armor/shield.xml b/res/e3a/armor/shield.xml deleted file mode 100644 index 5770711e2..000000000 --- a/res/e3a/armor/shield.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/armor/towershield.xml b/res/e3a/armor/towershield.xml deleted file mode 100644 index aebbfc682..000000000 --- a/res/e3a/armor/towershield.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/buildings.xml b/res/e3a/buildings.xml index 069a24150..6d3db765e 100644 --- a/res/e3a/buildings.xml +++ b/res/e3a/buildings.xml @@ -1,7 +1,6 @@ - - - + + @@ -24,4 +23,4 @@ - + diff --git a/res/e3a/equipment.xml b/res/e3a/equipment.xml index 62123766a..d8c529d8a 100644 --- a/res/e3a/equipment.xml +++ b/res/e3a/equipment.xml @@ -1,4 +1,5 @@ + @@ -7,3 +8,4 @@ + diff --git a/res/e3a/familiars.xml b/res/e3a/familiars.xml index 4a9fad6c8..b30c733ed 100644 --- a/res/e3a/familiars.xml +++ b/res/e3a/familiars.xml @@ -1,4 +1,5 @@ + @@ -101,4 +102,4 @@ - + diff --git a/res/e3a/items.xml b/res/e3a/items.xml index 0399043e5..1d403cfb4 100644 --- a/res/e3a/items.xml +++ b/res/e3a/items.xml @@ -1,6 +1,32 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76,3 +102,4 @@ + diff --git a/res/e3a/races.xml b/res/e3a/races.xml index ce0ce336a..feefb0ded 100644 --- a/res/e3a/races.xml +++ b/res/e3a/races.xml @@ -1,13 +1,9 @@ - + + - - - - - @@ -846,3 +842,4 @@ + diff --git a/res/e3a/resources.xml b/res/e3a/resources.xml deleted file mode 100644 index 32a79d52e..000000000 --- a/res/e3a/resources.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/res/e3a/resources/iron.xml b/res/e3a/resources/iron.xml deleted file mode 100644 index 55f63ca67..000000000 --- a/res/e3a/resources/iron.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/res/e3a/resources/mallornseed.xml b/res/e3a/resources/mallornseed.xml deleted file mode 100644 index 576035b34..000000000 --- a/res/e3a/resources/mallornseed.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/res/e3a/resources/seed.xml b/res/e3a/resources/seed.xml deleted file mode 100644 index 62c971540..000000000 --- a/res/e3a/resources/seed.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/res/e3a/resources/stone.xml b/res/e3a/resources/stone.xml deleted file mode 100644 index d8fd08573..000000000 --- a/res/e3a/resources/stone.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/res/e3a/shipnames.xml b/res/e3a/shipnames.xml index 15e261ef0..6d5c46b05 100644 --- a/res/e3a/shipnames.xml +++ b/res/e3a/shipnames.xml @@ -1,4 +1,5 @@  + ein Einbaum @@ -106,3 +107,4 @@ trireme + diff --git a/res/e3a/ships.xml b/res/e3a/ships.xml index 291900a3b..454c99169 100644 --- a/res/e3a/ships.xml +++ b/res/e3a/ships.xml @@ -1,4 +1,5 @@ + @@ -143,4 +144,4 @@ - + diff --git a/res/e3a/spellbooks/cerddor.xml b/res/e3a/spellbooks/cerddor.xml index 9b6e4cd8e..9e1a3f835 100644 --- a/res/e3a/spellbooks/cerddor.xml +++ b/res/e3a/spellbooks/cerddor.xml @@ -1,4 +1,5 @@ + @@ -35,3 +36,4 @@ + diff --git a/res/e3a/spellbooks/common.xml b/res/e3a/spellbooks/common.xml index 688a1b9ae..92f54e1d1 100644 --- a/res/e3a/spellbooks/common.xml +++ b/res/e3a/spellbooks/common.xml @@ -1,4 +1,5 @@ + @@ -42,3 +43,4 @@ + diff --git a/res/e3a/spellbooks/draig.xml b/res/e3a/spellbooks/draig.xml index d97a695b3..a0da7b449 100644 --- a/res/e3a/spellbooks/draig.xml +++ b/res/e3a/spellbooks/draig.xml @@ -1,4 +1,5 @@ + @@ -31,3 +32,4 @@ + diff --git a/res/e3a/spellbooks/gray.xml b/res/e3a/spellbooks/gray.xml index 78645f907..a807963c2 100644 --- a/res/e3a/spellbooks/gray.xml +++ b/res/e3a/spellbooks/gray.xml @@ -1,4 +1,5 @@ + @@ -142,3 +143,4 @@ + diff --git a/res/e3a/spellbooks/gwyrrd.xml b/res/e3a/spellbooks/gwyrrd.xml index 452100ace..83fd4e99c 100644 --- a/res/e3a/spellbooks/gwyrrd.xml +++ b/res/e3a/spellbooks/gwyrrd.xml @@ -1,4 +1,5 @@ + @@ -32,3 +33,4 @@ + diff --git a/res/e3a/spellbooks/illaun.xml b/res/e3a/spellbooks/illaun.xml index 6b89df8fa..02c9b34d8 100644 --- a/res/e3a/spellbooks/illaun.xml +++ b/res/e3a/spellbooks/illaun.xml @@ -1,4 +1,5 @@ + @@ -32,3 +33,4 @@ + diff --git a/res/e3a/spells.xml b/res/e3a/spells.xml index 80d9e6260..25d123d43 100644 --- a/res/e3a/spells.xml +++ b/res/e3a/spells.xml @@ -1,12 +1,6 @@ - - - - - - - - + + @@ -656,3 +650,4 @@ + diff --git a/res/e3a/strings.xml b/res/e3a/strings.xml index 253501f9f..2dd79abb6 100644 --- a/res/e3a/strings.xml +++ b/res/e3a/strings.xml @@ -1,4 +1,5 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/e3a/weapons/axe.xml b/res/e3a/weapons/axe.xml deleted file mode 100644 index 6066c4cfc..000000000 --- a/res/e3a/weapons/axe.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/crossbow.xml b/res/e3a/weapons/crossbow.xml deleted file mode 100644 index 7b2ed743c..000000000 --- a/res/e3a/weapons/crossbow.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/greatbow.xml b/res/e3a/weapons/greatbow.xml deleted file mode 100644 index 358a55f7d..000000000 --- a/res/e3a/weapons/greatbow.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/res/e3a/weapons/greatsword.xml b/res/e3a/weapons/greatsword.xml deleted file mode 100644 index 5a199321d..000000000 --- a/res/e3a/weapons/greatsword.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/halberd.xml b/res/e3a/weapons/halberd.xml deleted file mode 100644 index c22e020b4..000000000 --- a/res/e3a/weapons/halberd.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/res/e3a/weapons/laensword.xml b/res/e3a/weapons/laensword.xml deleted file mode 100644 index 50f824e8c..000000000 --- a/res/e3a/weapons/laensword.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/lance.xml b/res/e3a/weapons/lance.xml deleted file mode 100644 index 285862484..000000000 --- a/res/e3a/weapons/lance.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/res/e3a/weapons/mallorncrossbow.xml b/res/e3a/weapons/mallorncrossbow.xml deleted file mode 100644 index 86991bc10..000000000 --- a/res/e3a/weapons/mallorncrossbow.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/mallornlance.xml b/res/e3a/weapons/mallornlance.xml deleted file mode 100644 index 0c50d125a..000000000 --- a/res/e3a/weapons/mallornlance.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/res/e3a/weapons/rep_crossbow.xml b/res/e3a/weapons/rep_crossbow.xml deleted file mode 100644 index ffa1c0455..000000000 --- a/res/e3a/weapons/rep_crossbow.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/res/e3a/weapons/rustygreatsword.xml b/res/e3a/weapons/rustygreatsword.xml deleted file mode 100644 index 607f16a6a..000000000 --- a/res/e3a/weapons/rustygreatsword.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/res/e3a/weapons/rustyhalberd.xml b/res/e3a/weapons/rustyhalberd.xml deleted file mode 100644 index a53aec515..000000000 --- a/res/e3a/weapons/rustyhalberd.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - diff --git a/res/eressea/buildings.xml b/res/eressea/buildings.xml index b3ab4b6c0..d239907f1 100644 --- a/res/eressea/buildings.xml +++ b/res/eressea/buildings.xml @@ -1,6 +1,6 @@ - + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 654a859bd..21ff5b028 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -1,6 +1,6 @@ - + + - + + diff --git a/res/races/goblin-3.xml b/res/races/goblin-3.xml index a65d4c99a..636f8cc29 100644 --- a/res/races/goblin-3.xml +++ b/res/races/goblin-3.xml @@ -1,4 +1,6 @@ + + + + diff --git a/res/races/wyrm.xml b/res/races/wyrm.xml index dab1a9e1f..df2008a80 100644 --- a/res/races/wyrm.xml +++ b/res/races/wyrm.xml @@ -1,3 +1,6 @@ + + + + + diff --git a/res/races/youngdragon.xml b/res/races/youngdragon.xml index df10a44e9..d8b3d366f 100644 --- a/res/races/youngdragon.xml +++ b/res/races/youngdragon.xml @@ -1,3 +1,5 @@ + + - + + diff --git a/scripts/tests/e3/production.lua b/scripts/tests/e3/production.lua index 3469b06c4..be63158cf 100644 --- a/scripts/tests/e3/production.lua +++ b/scripts/tests/e3/production.lua @@ -53,6 +53,7 @@ function test_dwarf_no_mining_bonus() local r = region.create(0, 0, 'mountain') local f = create_faction('dwarf') local u = unit.create(f, r, 1) + u.name = 'Xolgrim' turn_begin() r:set_resource('iron', 100) From 907c5fc601cee13f5d1875d707bc0eaf7aa036ad Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 6 Feb 2018 21:39:52 +0100 Subject: [PATCH 008/231] unused variable. --- src/convert.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/convert.c b/src/convert.c index 8722cc8d5..6470c9e32 100644 --- a/src/convert.c +++ b/src/convert.c @@ -23,10 +23,9 @@ int main(int argc, char **argv) { if (argc < 2) return usage(); mode = argv[1]; if (strcmp(mode, "rules")==0) { - const char *xmlfile, *catalog; + const char *xmlfile; if (argc < 4) return usage(); xmlfile = argv[2]; - catalog = argv[3]; read_xml(xmlfile); write_rules("rules.dat"); return 0; From d1a393610c024232aeefad011fdeec68962fbd50 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 7 Feb 2018 17:57:24 +0100 Subject: [PATCH 009/231] begin work on 3.16 release --- src/kernel/version.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/version.c b/src/kernel/version.c index 7c5c2435f..4e1c49cf4 100644 --- a/src/kernel/version.c +++ b/src/kernel/version.c @@ -7,7 +7,7 @@ #ifndef ERESSEA_VERSION /* the version number, if it was not passed to make with -D */ -#define ERESSEA_VERSION "3.15.0" +#define ERESSEA_VERSION "3.16.0" #endif const char *eressea_version(void) { From 0884fb1f1bb4f6691b8621fc9cb5bb7e865ae763 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 7 Feb 2018 18:05:14 +0100 Subject: [PATCH 010/231] CID 182685 check for utf8 encoding errors. --- src/summary.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/summary.c b/src/summary.c index 79ffd1b6d..ee047bc8f 100644 --- a/src/summary.c +++ b/src/summary.c @@ -178,9 +178,14 @@ static int count_umlaut(const char *s) ucs4_t ucs = *cp; if (ucs & 0x80) { size_t size; - ++result; - unicode_utf8_to_ucs4(&ucs, cp, &size); + int err; + err = unicode_utf8_to_ucs4(&ucs, cp, &size); + if (err != 0) { + log_error("illegal utf8 encoding %s at %s", s, cp); + return result; + } cp += size; + ++result; } } return result; From 9ee84445ebbfaebe1ef1cae29aef23d97ee82539 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 7 Feb 2018 18:39:20 +0100 Subject: [PATCH 011/231] stop using MIN and MAX macros --- src/kernel/building.c | 31 +++++++++++++------- src/spells/combatspells.c | 61 ++++++++++++++++++++++----------------- 2 files changed, 56 insertions(+), 36 deletions(-) diff --git a/src/kernel/building.c b/src/kernel/building.c index 35efa8579..8c5fbeb14 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -16,7 +16,9 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ +#ifdef _MSC_VER #include +#endif #include #include "building.h" @@ -150,10 +152,11 @@ building_type *bt_get_or_create(const char *name) int buildingcapacity(const building * b) { if (b->type->capacity >= 0) { - if (b->type->maxcapacity >= 0) { - return MIN(b->type->maxcapacity, b->size * b->type->capacity); + int cap = b->size * b->type->capacity; + if (b->type->maxcapacity > 0 && b->type->maxcapacity < cap) { + cap = b->type->maxcapacity; } - return b->size * b->type->capacity; + return cap; } if (building_finished(b)) { if (b->type->maxcapacity >= 0) { @@ -313,9 +316,15 @@ int building_protection(const building_type * btype, int stage) { assert(btype->flags & BTF_FORTIFICATION); if (btype->maxsize < 0) { - return castle_bonus[MIN(stage, 5)]; + if (stage > 5) { + stage = 5; + } + return castle_bonus[stage]; } - return watch_bonus[MIN(stage, 2)]; + if (stage > 2) { + stage = 2; + } + return watch_bonus[stage]; } void write_building_reference(const struct building *b, struct storage *store) @@ -682,7 +691,7 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn) { building *b = largestbuilding(r, cmp_wage, false); int esize = 0; - double wage; + int wage; if (b != NULL) { /* TODO: this reveals imaginary castles */ @@ -715,25 +724,27 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn) if (r->attribs) { attrib *a; curse *c; + variant vm = frac_make(wage, 1); /* Godcurse: Income -10 */ c = get_curse(r->attribs, &ct_godcursezone); if (c && curse_active(c)) { - wage = MAX(0, wage - 10); + wage = (wage < 10) ? 0 : (wage - 10); } /* Bei einer D�rre verdient man nur noch ein Viertel */ c = get_curse(r->attribs, &ct_drought); if (c && curse_active(c)) { - wage /= curse_geteffect(c); + vm = frac_mul(vm, frac_make(1, curse_geteffect_int(c))); } a = a_find(r->attribs, &at_reduceproduction); if (a) { - wage = (wage * a->data.sa[0]) / 100; + vm = frac_mul(vm, frac_make(a->data.sa[0], 100)); } + wage = vm.sa[0] / vm.sa[1]; } - return (int)wage; + return wage; } static int diff --git a/src/spells/combatspells.c b/src/spells/combatspells.c index ce737f570..adaa832d9 100644 --- a/src/spells/combatspells.c +++ b/src/spells/combatspells.c @@ -9,7 +9,9 @@ This program may not be used, modified or distributed without prior permission by the authors of Eressea. */ +#ifdef _MSC_VER #include +#endif #include "combatspells.h" #include @@ -45,6 +47,7 @@ /* libc includes */ #include +#include #include #include @@ -131,8 +134,7 @@ int damage_spell(struct castorder * co, int dmg, int strength) enemies = count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW - 1, SELECT_ADVANCE); if (enemies == 0) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -171,8 +173,7 @@ int sp_petrify(struct castorder * co) enemies = count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE); if (!enemies) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -218,8 +219,7 @@ int sp_stun(struct castorder * co) enemies = count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE); if (!enemies) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -298,7 +298,8 @@ int sp_combatrosthauch(struct castorder * co) for (w = 0; df->weapons[w].type != NULL; ++w) { weapon *wp = df->weapons; - int n = MIN(force, wp->used); + int n = force; + if (n < wp->used) n = wp->used; if (n) { requirement *mat = wp->type->itype->construction->materials; bool iron = false; @@ -682,8 +683,7 @@ int sp_immolation(struct castorder * co) force = 99999; if (!count_enemies(b, fi, FIGHT_ROW, AVOID_ROW, SELECT_ADVANCE | SELECT_FIND)) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -791,7 +791,7 @@ int sp_shadowknights(struct castorder * co) region *r = b->region; unit *mage = fi->unit; attrib *a; - int force = MAX(1, (int)get_force(power, 3)); + int force = (int)fmax(1, get_force(power, 3)); message *msg; u = @@ -890,7 +890,6 @@ int sp_chaosrow(struct castorder * co) continue; if (power <= 0.0) break; - /* force sollte wegen des MAX(0,x) nicht unter 0 fallen k�nnen */ if (is_magic_resistant(mage, df->unit, 0)) continue; @@ -925,7 +924,7 @@ int sp_chaosrow(struct castorder * co) } k += df->alive; } - power = MAX(0, power - n); + power = fmax(0, power - n); } selist_free(fgs); @@ -1020,7 +1019,8 @@ int sp_hero(struct castorder * co) message *m; df_bonus = (int)(power / 5); - force = MAX(1, lovar(get_force(power, 4))); + force = lovar(get_force(power, 4)); + if (force < 1) force = 1; allies = count_allies(fi->side, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE, ALLY_ANY); @@ -1065,7 +1065,8 @@ int sp_berserk(struct castorder * co) int targets = 0; message *m; - at_bonus = MAX(1, level / 3); + at_bonus = level / 3; + if (at_bonus < 1) at_bonus = 1; df_malus = 2; force = (int)get_force(power, 2); @@ -1114,14 +1115,14 @@ int sp_frighten(struct castorder * co) int targets = 0; message *m; - at_malus = MAX(1, level - 4); + at_malus = level - 4; + if (at_malus < 1) at_malus = 1; df_malus = 2; force = (int)get_force(power, 2); enemies = count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW - 1, SELECT_ADVANCE); if (!enemies) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -1170,8 +1171,7 @@ int sp_tiredsoldiers(struct castorder * co) if (!count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW, SELECT_ADVANCE | SELECT_FIND)) { - message *m = - msg_message("spell_out_of_range", "mage spell", fi->unit, sp); + m = msg_message("spell_out_of_range", "mage spell", fi->unit, sp); message_all(b, m); msg_release(m); return 0; @@ -1367,7 +1367,8 @@ int sp_fumbleshield(struct castorder * co) /* der erste Zauber schl�gt mit 100% fehl */ duration = 100; - effect = MAX(1, 25 - level); + effect = 25 - level; + if (effect < 1) effect = 1; do_meffect(fi, SHIELD_BLOCK, effect, duration); return level; @@ -1403,7 +1404,7 @@ int sp_reanimate(struct castorder * co) unit *mage = fi->unit; int healable, j = 0; double c = 0.50 + 0.02 * power; - double k = EFFECT_HEALING_SPELL * power; + int k = (int)(EFFECT_HEALING_SPELL * power); bool use_item = has_ao_healing(mage); message *msg; @@ -1413,7 +1414,9 @@ int sp_reanimate(struct castorder * co) } healable = count_healable(b, fi); - healable = (int)MIN(k, healable); + if (healable > k) { + healable = k; + } while (healable--) { fighter *tf = select_corpse(b, fi); if (tf != NULL && tf->side->casualties > 0 @@ -1466,7 +1469,7 @@ int sp_keeploot(struct castorder * co) message_all(b, m); msg_release(m); - b->keeploot = (int)MAX(25, b->keeploot + 5 * power); + b->keeploot = (int)fmax(25, b->keeploot + 5 * power); return level; } @@ -1497,10 +1500,14 @@ static int heal_fighters(selist * fgs, int *power, bool heal_monsters) ++wound; if (wound > 0 && wound < hp) { - int heal = MIN(healhp, wound); + int heal = healhp; + if (heal > wound) { + heal = wound; + } assert(heal >= 0); df->person[n].hp += heal; - healhp = MAX(0, healhp - heal); + healhp -= heal; + if (healhp < 0) healhp = 0; ++healed; if (healhp <= 0) break; @@ -1653,7 +1660,9 @@ int sp_undeadhero(struct castorder * co) } selist_free(fgs); - level = MIN(level, undead); + if (level > undead) { + level = undead; + } if (undead == 0) { msg = msg_message("summonundead_effect_0", "mage region", mage, mage->region); From 5a3978566ae1d6b48fae65a90540feec021ebe65 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 7 Feb 2018 18:46:31 +0100 Subject: [PATCH 012/231] adamantium and laen weapons are magical. --- res/adamantium.xml | 2 +- res/core/weapons/laensword.xml | 2 +- res/e3a/weapons.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/adamantium.xml b/res/adamantium.xml index 563299e51..2e2311fcd 100644 --- a/res/adamantium.xml +++ b/res/adamantium.xml @@ -16,7 +16,7 @@ - + diff --git a/res/core/weapons/laensword.xml b/res/core/weapons/laensword.xml index 325d25d10..2746a6384 100644 --- a/res/core/weapons/laensword.xml +++ b/res/core/weapons/laensword.xml @@ -6,7 +6,7 @@ - + diff --git a/res/e3a/weapons.xml b/res/e3a/weapons.xml index 5b57cbed0..3a75fe350 100644 --- a/res/e3a/weapons.xml +++ b/res/e3a/weapons.xml @@ -86,7 +86,7 @@ - + From 4f63cf12b2ca11523f2ae11a4802438c3c06c8d6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 7 Feb 2018 19:35:24 +0100 Subject: [PATCH 013/231] firesword, magical damage --- res/core/weapons/firesword.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/core/weapons/firesword.xml b/res/core/weapons/firesword.xml index dc3b47af5..0285db7ea 100644 --- a/res/core/weapons/firesword.xml +++ b/res/core/weapons/firesword.xml @@ -3,7 +3,7 @@ - + From 87081a37bc531753f1a127abffa6961abba94f3d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 8 Feb 2018 08:33:27 +0100 Subject: [PATCH 014/231] CID 182717 call fclose, always --- src/jsonconf.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/jsonconf.c b/src/jsonconf.c index cd9d991aa..dcab0e9c6 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -932,6 +932,7 @@ static int include_json(const char *uri) { FILE *F; char name[PATH_MAX]; const char *filename = uri_to_file(uri, name, sizeof(name)); + int result = -1; F = fopen(filename, "r"); if (F) { @@ -952,15 +953,16 @@ static int include_json(const char *uri) { if (config) { json_config(config); cJSON_Delete(config); + result = 0; } else { log_error("could not parse JSON from %s", uri); - return -1; + result = -1; } } fclose(F); } - return 0; + return result; } static int include_xml(const char *uri) { From ec4801752041b8cdbff47ce937dfd7cab1a64a59 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 8 Feb 2018 18:33:58 +0100 Subject: [PATCH 015/231] move spell reporting attributes to a separate module. --- src/CMakeLists.txt | 2 +- src/attributes/CMakeLists.txt | 1 + src/attributes/attributes.c | 3 +- src/attributes/seenspell.c | 126 ++++++++++++++++++++++++++++++++++ src/attributes/seenspell.h | 13 ++++ src/creport.c | 1 + src/laws.c | 1 + src/magic.c | 88 ------------------------ src/magic.h | 2 - src/report.c | 1 + 10 files changed, 146 insertions(+), 92 deletions(-) create mode 100644 src/attributes/seenspell.c create mode 100644 src/attributes/seenspell.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a17a45e9..a74d1d732 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -93,6 +93,7 @@ set (ERESSEA_SRC battle.c alchemy.c academy.c + chaos.c upkeep.c names.c lighthouse.c @@ -121,7 +122,6 @@ set (ERESSEA_SRC randenc.c renumber.c volcano.c - chaos.c spy.c study.c summary.c diff --git a/src/attributes/CMakeLists.txt b/src/attributes/CMakeLists.txt index fb077cfe9..c76f2458a 100644 --- a/src/attributes/CMakeLists.txt +++ b/src/attributes/CMakeLists.txt @@ -20,6 +20,7 @@ racename.c raceprefix.c reduceproduction.c stealth.c +seenspell.c targetregion.c ) FOREACH(_FILE ${_FILES}) diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index a5911200c..cb6e335b5 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -22,6 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "laws.h" #include "move.h" +#include "magic.h" /* attributes includes */ #include "follow.h" @@ -29,7 +30,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "iceberg.h" #include "key.h" #include "stealth.h" -#include "magic.h" #include "moved.h" #include "movement.h" #include "dict.h" @@ -38,6 +38,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "racename.h" #include "raceprefix.h" #include "reduceproduction.h" +#include "seenspell.h" #include "targetregion.h" /* kernel includes */ diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c new file mode 100644 index 000000000..99ac84873 --- /dev/null +++ b/src/attributes/seenspell.c @@ -0,0 +1,126 @@ +/* +Copyright (c) 1998-2014, +Enno Rehling +Katja Zedel + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +**/ + +#ifdef _MSC_VER +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "seenspell.h" + +#include +#include + +#include + +/* ------------------------------------------------------------- */ +/* Ausgabe der Spruchbeschreibungen +* Anzeige des Spruchs nur, wenn die Stufe des besten Magiers vorher +* kleiner war (u->faction->seenspells). Ansonsten muss nur geprüft +* werden, ob dieser Magier den Spruch schon kennt, und andernfalls der +* Spruch zu seiner List-of-known-spells hinzugefügt werden. +*/ + +static int read_seenspell(attrib * a, void *owner, struct gamedata *data) +{ + storage *store = data->store; + spell *sp = 0; + char token[32]; + + UNUSED_ARG(owner); + READ_TOK(store, token, sizeof(token)); + if (data->version < UNIQUE_SPELLS_VERSION) { + READ_INT(store, 0); /* ignore mtype */ + } + sp = find_spell(token); + if (!sp) { + log_info("read_seenspell: could not find spell '%s'\n", token); + return AT_READ_FAIL; + } + a->data.v = sp; + return AT_READ_OK; +} + +static void +write_seenspell(const attrib * a, const void *owner, struct storage *store) +{ + const spell *sp = (const spell *)a->data.v; + UNUSED_ARG(owner); + WRITE_TOK(store, sp->sname); +} + +attrib_type at_seenspell = { + "seenspell", NULL, NULL, NULL, write_seenspell, read_seenspell +}; + +static bool already_seen(const faction * f, const spell * sp) +{ + attrib *a; + + for (a = a_find(f->attribs, &at_seenspell); a && a->type == &at_seenspell; + a = a->next) { + if (a->data.v == sp) + return true; + } + return false; +} + +static void a_init_reportspell(struct attrib *a) { + a->data.v = calloc(1, sizeof(spellbook_entry)); +} + +static void a_finalize_reportspell(struct attrib *a) { + free(a->data.v); +} + +attrib_type at_reportspell = { + "reportspell", + a_init_reportspell, + a_finalize_reportspell, + 0, NO_WRITE, NO_READ +}; + +void show_new_spells(faction * f, int level, const spellbook *book) +{ + if (book) { + selist *ql = book->spells; + int qi; + + for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { + spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); + if (sbe->level <= level) { + if (!already_seen(f, sbe->sp)) { + attrib * a = a_new(&at_reportspell); + spellbook_entry * entry = (spellbook_entry *)a->data.v; + entry->level = sbe->level; + entry->sp = sbe->sp; + a_add(&f->attribs, a); + a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; + } + } + } + } +} + diff --git a/src/attributes/seenspell.h b/src/attributes/seenspell.h new file mode 100644 index 000000000..488430575 --- /dev/null +++ b/src/attributes/seenspell.h @@ -0,0 +1,13 @@ +#ifndef H_SEENSPELL +#define H_SEENSPELL + +struct attrib_type; +struct spellbook; +struct faction; + +void show_new_spells(struct faction * f, int level, const struct spellbook *book); + +extern struct attrib_type at_reportspell; +extern struct attrib_type at_seenspell; + +#endif diff --git a/src/creport.c b/src/creport.c index fa17c426d..04f6c6bc4 100644 --- a/src/creport.c +++ b/src/creport.c @@ -30,6 +30,7 @@ without prior permission by the authors of Eressea. #include #include #include +#include #include /* gamecode includes */ diff --git a/src/laws.c b/src/laws.c index 85b820323..9e2eb9471 100644 --- a/src/laws.c +++ b/src/laws.c @@ -48,6 +48,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* attributes includes */ #include #include +#include #include #include diff --git a/src/magic.c b/src/magic.c index 6855c307f..4e9c87b4e 100644 --- a/src/magic.c +++ b/src/magic.c @@ -101,20 +101,6 @@ const char *magic_school[MAXMAGIETYP] = { "common" }; -static void a_init_reportspell(struct attrib *a) { - a->data.v = calloc(1, sizeof(spellbook_entry)); -} - -static void a_finalize_reportspell(struct attrib *a) { - free(a->data.v); -} - -attrib_type at_reportspell = { - "reportspell", - a_init_reportspell, - a_finalize_reportspell, - 0, NO_WRITE, NO_READ -}; /** ** at_icastle ** TODO: separate castle-appearance from illusion-effects @@ -354,82 +340,8 @@ sc_mage *get_mage_depr(const unit * u) return NULL; } -/* ------------------------------------------------------------- */ -/* Ausgabe der Spruchbeschreibungen -* Anzeige des Spruchs nur, wenn die Stufe des besten Magiers vorher -* kleiner war (u->faction->seenspells). Ansonsten muss nur geprüft -* werden, ob dieser Magier den Spruch schon kennt, und andernfalls der -* Spruch zu seiner List-of-known-spells hinzugefügt werden. -*/ - -static int read_seenspell(attrib * a, void *owner, struct gamedata *data) -{ - storage *store = data->store; - spell *sp = 0; - char token[32]; - - UNUSED_ARG(owner); - READ_TOK(store, token, sizeof(token)); - if (data->version < UNIQUE_SPELLS_VERSION) { - READ_INT(store, 0); /* ignore mtype */ - } - sp = find_spell(token); - if (!sp) { - log_info("read_seenspell: could not find spell '%s'\n", token); - return AT_READ_FAIL; - } - a->data.v = sp; - return AT_READ_OK; -} - -static void -write_seenspell(const attrib * a, const void *owner, struct storage *store) -{ - const spell *sp = (const spell *)a->data.v; - UNUSED_ARG(owner); - WRITE_TOK(store, sp->sname); -} - -attrib_type at_seenspell = { - "seenspell", NULL, NULL, NULL, write_seenspell, read_seenspell -}; - #define MAXSPELLS 256 -static bool already_seen(const faction * f, const spell * sp) -{ - attrib *a; - - for (a = a_find(f->attribs, &at_seenspell); a && a->type == &at_seenspell; - a = a->next) { - if (a->data.v == sp) - return true; - } - return false; -} - -void show_new_spells(faction * f, int level, const spellbook *book) -{ - if (book) { - selist *ql = book->spells; - int qi; - - for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { - spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - if (sbe->level <= level) { - if (!already_seen(f, sbe->sp)) { - attrib * a = a_new(&at_reportspell); - spellbook_entry * entry = (spellbook_entry *)a->data.v; - entry->level = sbe->level; - entry->sp = sbe->sp; - a_add(&f->attribs, a); - a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; - } - } - } - } -} - /** update the spellbook with a new level * Written for E3 */ diff --git a/src/magic.h b/src/magic.h index 403dafdc6..101ef5d38 100644 --- a/src/magic.h +++ b/src/magic.h @@ -191,13 +191,11 @@ extern "C" { void regenerate_aura(void); - extern struct attrib_type at_seenspell; extern struct attrib_type at_mage; extern struct attrib_type at_familiarmage; extern struct attrib_type at_familiar; extern struct attrib_type at_clonemage; extern struct attrib_type at_clone; - extern struct attrib_type at_reportspell; extern struct attrib_type at_icastle; void make_icastle(struct building *b, const struct building_type *btype, int timeout); diff --git a/src/report.c b/src/report.c index 6543b153b..30ea34fdf 100644 --- a/src/report.c +++ b/src/report.c @@ -39,6 +39,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include /* gamecode includes */ #include "alchemy.h" From cfc3171021a6317109fc375d9af5d4f2241b5e8b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 8 Feb 2018 19:37:47 +0100 Subject: [PATCH 016/231] constrict the seenspell module a bit more, move functionality inside. --- src/attributes/seenspell.c | 64 +++++++++++++++++--------------------- src/attributes/seenspell.h | 6 ++-- src/laws.c | 25 ++++++++++----- src/magic.h | 1 - 4 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 99ac84873..555d7925c 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -1,5 +1,5 @@ /* -Copyright (c) 1998-2014, +Copyright (c) 1998-2018, Enno Rehling Katja Zedel @@ -37,11 +37,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* ------------------------------------------------------------- */ /* Ausgabe der Spruchbeschreibungen -* Anzeige des Spruchs nur, wenn die Stufe des besten Magiers vorher -* kleiner war (u->faction->seenspells). Ansonsten muss nur geprüft -* werden, ob dieser Magier den Spruch schon kennt, und andernfalls der -* Spruch zu seiner List-of-known-spells hinzugefügt werden. -*/ + * Anzeige des Spruchs nur, wenn die Stufe des besten Magiers vorher + * kleiner war (u->faction->seenspells). Ansonsten muss nur geprüft + * werden, ob dieser Magier den Spruch schon kennt, und andernfalls der + * Spruch zu seiner List-of-known-spells hinzugefügt werden. + */ static int read_seenspell(attrib * a, void *owner, struct gamedata *data) { @@ -87,40 +87,32 @@ static bool already_seen(const faction * f, const spell * sp) return false; } -static void a_init_reportspell(struct attrib *a) { - a->data.v = calloc(1, sizeof(spellbook_entry)); -} - -static void a_finalize_reportspell(struct attrib *a) { - free(a->data.v); -} - attrib_type at_reportspell = { - "reportspell", - a_init_reportspell, - a_finalize_reportspell, - 0, NO_WRITE, NO_READ + "reportspell", NULL }; -void show_new_spells(faction * f, int level, const spellbook *book) +void show_spell(faction *f, const spellbook_entry *sbe) { - if (book) { - selist *ql = book->spells; - int qi; - - for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { - spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - if (sbe->level <= level) { - if (!already_seen(f, sbe->sp)) { - attrib * a = a_new(&at_reportspell); - spellbook_entry * entry = (spellbook_entry *)a->data.v; - entry->level = sbe->level; - entry->sp = sbe->sp; - a_add(&f->attribs, a); - a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; - } - } - } + if (!already_seen(f, sbe->sp)) { + attrib * a = a_new(&at_reportspell); + a->data.v = (void *)sbe; + a_add(&f->attribs, a); + a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; } } +void reset_seen_spells(faction *f, const struct spell *sp) +{ + if (sp) { + attrib *a = a_find(f->attribs, &at_seenspell); + while (a && a->type == &at_seenspell && a->data.v != sp) { + a = a->next; + } + if (a) { + a_remove(&f->attribs, a); + } + } + else { + a_removeall(&f->attribs, &at_seenspell); + } +} diff --git a/src/attributes/seenspell.h b/src/attributes/seenspell.h index 488430575..aada5ad0a 100644 --- a/src/attributes/seenspell.h +++ b/src/attributes/seenspell.h @@ -2,10 +2,12 @@ #define H_SEENSPELL struct attrib_type; -struct spellbook; +struct spellbook_entry; struct faction; +struct spell; -void show_new_spells(struct faction * f, int level, const struct spellbook *book); +void show_spell(struct faction * f, const struct spellbook_entry *sbe); +void reset_seen_spells(struct faction * f, const struct spell *sp); extern struct attrib_type at_reportspell; extern struct attrib_type at_seenspell; diff --git a/src/laws.c b/src/laws.c index 9e2eb9471..ac8b3d612 100644 --- a/src/laws.c +++ b/src/laws.c @@ -2307,13 +2307,7 @@ static void reshow_other(unit * u, struct order *ord, const char *s) { } if (sp) { - attrib *a = a_find(u->faction->attribs, &at_seenspell); - while (a != NULL && a->type == &at_seenspell && a->data.v != sp) { - a = a->next; - } - if (a != NULL) { - a_remove(&u->faction->attribs, a); - } + reset_seen_spells(u->faction, sp); found = true; } @@ -2331,7 +2325,7 @@ static void reshow(unit * u, struct order *ord, const char *s, param_t p) { switch (p) { case P_ZAUBER: - a_removeall(&u->faction->attribs, &at_seenspell); + reset_seen_spells(u->faction, NULL); break; case P_POTIONS: if (!display_potions(u)) { @@ -3304,6 +3298,21 @@ static void copy_spells(const spellbook * src, spellbook * dst, int maxlevel) } } +static void show_new_spells(faction * f, int level, const spellbook *book) +{ + if (book) { + selist *ql = book->spells; + int qi; + + for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { + spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); + if (sbe->level <= level) { + show_spell(f, sbe); + } + } + } +} + static void update_spells(void) { faction *f; diff --git a/src/magic.h b/src/magic.h index 101ef5d38..cbd508163 100644 --- a/src/magic.h +++ b/src/magic.h @@ -241,7 +241,6 @@ extern "C" { int u_hasspell(const struct unit *u, const struct spell *sp); /* prft, ob der Spruch in der Spruchliste der Einheit steht. */ void pick_random_spells(struct faction *f, int level, struct spellbook * book, int num_spells); - void show_new_spells(struct faction * f, int level, const struct spellbook *book); bool knowsspell(const struct region *r, const struct unit *u, const struct spell * sp); /* prft, ob die Einheit diesen Spruch gerade beherrscht, dh From 1035a98fd3049e7f7a71c3cbb3de2186a37095fe Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 9 Feb 2018 21:20:43 +0100 Subject: [PATCH 017/231] make attrib use a variant, not a custom union. change attrib_type methods to take a variant, not the entire attrib. --- src/alchemy.c | 29 ++++++---------- src/attributes/attributes.c | 30 +++++++++------- src/attributes/dict.c | 16 ++++----- src/attributes/follow.c | 2 +- src/attributes/hate.c | 8 ++--- src/attributes/key.c | 18 ++++------ src/attributes/moved.c | 10 +++--- src/attributes/movement.c | 14 +++----- src/attributes/otherfaction.c | 10 +++--- src/attributes/seenspell.c | 8 ++--- src/attributes/targetregion.c | 8 ++--- src/economy.c | 6 ++-- src/helpers.c | 4 +-- src/kernel/ally.c | 4 +-- src/kernel/curse.c | 16 ++++----- src/kernel/curse.h | 8 ++--- src/kernel/group.c | 8 ++--- src/kernel/region.c | 12 +++---- src/kernel/skills.c | 11 ++---- src/kernel/unit.c | 14 ++++---- src/magic.c | 51 +++++++++++++--------------- src/market.c | 6 ++-- src/modules/gmcmd.c | 9 +++-- src/modules/museum.c | 41 ++++++++++------------ src/move.c | 19 ++++------- src/piracy.c | 11 ++---- src/spells.c | 4 +-- src/spells/borders.c | 8 ++--- src/study.c | 10 +++--- src/travelthru.c | 5 ++- src/util/attrib.c | 64 +++++++++++++++++++---------------- src/util/attrib.h | 43 ++++++++++------------- src/util/attrib.test.c | 58 +++++++++++++++---------------- src/util/event.c | 16 ++++----- src/vortex.c | 16 ++++----- src/wormhole.c | 8 ++--- 36 files changed, 282 insertions(+), 323 deletions(-) diff --git a/src/alchemy.c b/src/alchemy.c index 75212e34a..3ec21159d 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -284,13 +284,9 @@ typedef struct potiondelay { int amount; } potiondelay; -static void init_potiondelay(attrib * a) +static void init_potiondelay(variant *var) { - a->data.v = malloc(sizeof(potiondelay)); -} - -static void free_potiondelay(attrib * a) { - free(a->data.v); + var->v = malloc(sizeof(potiondelay)); } static int age_potiondelay(attrib * a, void *owner) @@ -304,7 +300,7 @@ static int age_potiondelay(attrib * a, void *owner) attrib_type at_potiondelay = { "potiondelay", init_potiondelay, - free_potiondelay, + a_free_voidptr, age_potiondelay, 0, 0 }; @@ -337,31 +333,26 @@ struct order *ord) /* at_effect */ /*****************/ -static void a_initeffect(attrib * a) +static void a_initeffect(variant *var) { - a->data.v = calloc(sizeof(effect_data), 1); -} - -static void a_finalizeeffect(attrib * a) /*-V524 */ -{ - free(a->data.v); + var->v = calloc(sizeof(effect_data), 1); } static void -a_writeeffect(const attrib * a, const void *owner, struct storage *store) +a_writeeffect(const variant *var, const void *owner, struct storage *store) { - effect_data *edata = (effect_data *)a->data.v; + effect_data *edata = (effect_data *)var->v; UNUSED_ARG(owner); WRITE_TOK(store, resourcename(edata->type->rtype, 0)); WRITE_INT(store, edata->value); } -static int a_readeffect(attrib * a, void *owner, struct gamedata *data) +static int a_readeffect(variant *var, void *owner, struct gamedata *data) { struct storage *store = data->store; int power; const resource_type *rtype; - effect_data *edata = (effect_data *)a->data.v; + effect_data *edata = (effect_data *)var->v; char zText[32]; UNUSED_ARG(owner); @@ -386,7 +377,7 @@ static int a_readeffect(attrib * a, void *owner, struct gamedata *data) attrib_type at_effect = { "effect", a_initeffect, - a_finalizeeffect, + a_free_voidptr, DEFAULT_AGE, a_writeeffect, a_readeffect, diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index cb6e335b5..e6887a777 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -68,42 +68,45 @@ typedef struct obs_data { int timer; } obs_data; -static void obs_init(struct attrib *a) +static void obs_init(variant *var) { - a->data.v = malloc(sizeof(obs_data)); -} - -static void obs_done(struct attrib *a) -{ - free(a->data.v); + var->v = malloc(sizeof(obs_data)); } static int obs_age(struct attrib *a, void *owner) { obs_data *od = (obs_data *)a->data.v; + + UNUSED_ARG(owner); update_interval(od->f, (region *)owner); return --od->timer; } -static void obs_write(const struct attrib *a, const void *owner, struct storage *store) +static void obs_write(const variant *var, const void *owner, + struct storage *store) { - obs_data *od = (obs_data *)a->data.v; + obs_data *od = (obs_data *)var->v; + + UNUSED_ARG(owner); write_faction_reference(od->f, store); WRITE_INT(store, od->skill); WRITE_INT(store, od->timer); } -static int obs_read(struct attrib *a, void *owner, struct gamedata *data) +static int obs_read(variant *var, void *owner, struct gamedata *data) { - obs_data *od = (obs_data *)a->data.v; + obs_data *od = (obs_data *)var->v; + UNUSED_ARG(owner); read_faction_reference(data, &od->f, NULL); READ_INT(data->store, &od->skill); READ_INT(data->store, &od->timer); return AT_READ_OK; } -attrib_type at_observer = { "observer", obs_init, obs_done, obs_age, obs_write, obs_read }; +attrib_type at_observer = { + "observer", obs_init, a_free_voidptr, obs_age, obs_write, obs_read +}; static attrib *make_observer(faction *f, int perception) { @@ -154,10 +157,11 @@ attrib_type at_unitdissolve = { "unitdissolve", NULL, NULL, NULL, a_writechars, a_readchars }; -static int read_ext(attrib * a, void *owner, gamedata *data) +static int read_ext(variant *var, void *owner, gamedata *data) { int len; + UNUSED_ARG(var); READ_INT(data->store, &len); data->store->api->r_bin(data->store->handle, NULL, (size_t)len); return AT_READ_OK; diff --git a/src/attributes/dict.c b/src/attributes/dict.c index 83a53dbeb..d3c5ac329 100644 --- a/src/attributes/dict.c +++ b/src/attributes/dict.c @@ -62,11 +62,11 @@ typedef struct dict_data { } data; } dict_data; -static int dict_read(attrib * a, void *owner, gamedata *data) +static int dict_read(variant * var, void *owner, gamedata *data) { storage *store = data->store; char name[NAMESIZE]; - dict_data *dd = (dict_data *)a->data.v; + dict_data *dd = (dict_data *)var->v; int n; READ_STR(store, name, sizeof(name)); @@ -88,19 +88,19 @@ static int dict_read(attrib * a, void *owner, gamedata *data) return AT_READ_DEPR; } -static void dict_init(attrib * a) +static void dict_init(variant *var) { dict_data *dd; - a->data.v = malloc(sizeof(dict_data)); - dd = (dict_data *)a->data.v; + var->v = malloc(sizeof(dict_data)); + dd = (dict_data *)var->v; dd->type = TNONE; } -static void dict_done(attrib * a) +static void dict_done(variant *var) { - dict_data *dd = (dict_data *)a->data.v; + dict_data *dd = (dict_data *)var->v; free(dd->name); - free(a->data.v); + free(var->v); } static void upgrade_keyval(const dict_data *dd, int keyval[], int v) { diff --git a/src/attributes/follow.c b/src/attributes/follow.c index e0741646b..8c5e14526 100644 --- a/src/attributes/follow.c +++ b/src/attributes/follow.c @@ -28,7 +28,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include -static int read_follow(attrib * a, void *owner, gamedata *data) +static int read_follow(variant * var, void *owner, gamedata *data) { READ_INT(data->store, NULL); /* skip it */ return AT_READ_FAIL; diff --git a/src/attributes/hate.c b/src/attributes/hate.c index e6751bdfb..c260de335 100644 --- a/src/attributes/hate.c +++ b/src/attributes/hate.c @@ -39,14 +39,14 @@ static int verify_hate(attrib * a, void *owner) } static void -write_hate(const attrib * a, const void *owner, struct storage *store) +write_hate(const variant *var, const void *owner, struct storage *store) { - write_unit_reference((unit *)a->data.v, store); + write_unit_reference((unit *)var->v, store); } -static int read_hate(attrib * a, void *owner, gamedata *data) +static int read_hate(variant *var, void *owner, gamedata *data) { - if (read_unit_reference(data, (unit **)&a->data.v, NULL) <= 0) { + if (read_unit_reference(data, (unit **)&var->v, NULL) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; diff --git a/src/attributes/key.c b/src/attributes/key.c index 61bbb4599..75958a6fb 100644 --- a/src/attributes/key.c +++ b/src/attributes/key.c @@ -29,8 +29,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -static void a_writekeys(const attrib *a, const void *o, storage *store) { - int i, *keys = (int *)a->data.v; +static void a_writekeys(const variant *var, const void *o, storage *store) { + int i, *keys = (int *)var->v; int n = 0; if (keys) { assert(keys[0] < 4096 && keys[0]>0); @@ -76,7 +76,7 @@ static int keys_size(int n) { return 4096; } -static int a_readkeys(attrib * a, void *owner, gamedata *data) { +static int a_readkeys(variant *var, void *owner, gamedata *data) { int i, n, *keys; READ_INT(data->store, &n); @@ -135,26 +135,22 @@ static int a_readkeys(attrib * a, void *owner, gamedata *data) { } } } - a->data.v = keys; + var->v = keys; return AT_READ_OK; } -static int a_readkey(attrib *a, void *owner, struct gamedata *data) { - int res = a_readint(a, owner, data); +static int a_readkey(variant *var, void *owner, struct gamedata *data) { + int res = a_readint(var, owner, data); if (data->version >= KEYVAL_VERSION) { return AT_READ_FAIL; } return (res != AT_READ_FAIL) ? AT_READ_DEPR : res; } -static void a_freekeys(attrib *a) { - free(a->data.v); -} - attrib_type at_keys = { "keys", NULL, - a_freekeys, + a_free_voidptr, NULL, a_writekeys, a_readkeys, diff --git a/src/attributes/moved.c b/src/attributes/moved.c index e34b9c5e8..abff4ac73 100644 --- a/src/attributes/moved.c +++ b/src/attributes/moved.c @@ -34,15 +34,15 @@ static int age_moved(attrib * a, void *owner) } static void -write_moved(const attrib * a, const void *owner, struct storage *store) +write_moved(const variant *var, const void *owner, struct storage *store) { - WRITE_INT(store, a->data.i); + WRITE_INT(store, var->i); } -static int read_moved(attrib * a, void *owner, gamedata *data) +static int read_moved(variant *var, void *owner, gamedata *data) { - READ_INT(data->store, &a->data.i); - if (a->data.i != 0) + READ_INT(data->store, &var->i); + if (var->i != 0) return AT_READ_OK; else return AT_READ_FAIL; diff --git a/src/attributes/movement.c b/src/attributes/movement.c index 1b5ba3f94..7b49291c2 100644 --- a/src/attributes/movement.c +++ b/src/attributes/movement.c @@ -29,23 +29,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -static void -write_movement(const attrib * a, const void *owner, struct storage *store) +static int read_movement(variant *var, void *owner, gamedata *data) { - WRITE_INT(store, a->data.i); -} - -static int read_movement(attrib * a, void *owner, gamedata *data) -{ - READ_INT(data->store, &a->data.i); - if (a->data.i != 0) + READ_INT(data->store, &var->i); + if (var->i != 0) return AT_READ_OK; else return AT_READ_FAIL; } attrib_type at_movement = { - "movement", NULL, NULL, NULL, write_movement, read_movement + "movement", NULL, NULL, NULL, a_writeint, read_movement }; bool get_movement(attrib * const *alist, int type) diff --git a/src/attributes/otherfaction.c b/src/attributes/otherfaction.c index c9e56fe27..343460057 100644 --- a/src/attributes/otherfaction.c +++ b/src/attributes/otherfaction.c @@ -33,20 +33,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * simple attributes that do not yet have their own file */ -void write_of(const struct attrib *a, const void *owner, struct storage *store) +void write_of(const variant *var, const void *owner, struct storage *store) { - const faction *f = (faction *)a->data.v; + const faction *f = (faction *)var->v; WRITE_INT(store, f->no); } -int read_of(struct attrib *a, void *owner, gamedata *data) +int read_of(variant *var, void *owner, gamedata *data) { /* return 1 on success, 0 if attrib needs removal */ int of; READ_INT(data->store, &of); if (rule_stealth_other()) { - a->data.v = findfaction(of); - if (a->data.v) { + var->v = findfaction(of); + if (var->v) { return AT_READ_OK; } } diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 555d7925c..e7fd2e38a 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -43,7 +43,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * Spruch zu seiner List-of-known-spells hinzugefügt werden. */ -static int read_seenspell(attrib * a, void *owner, struct gamedata *data) +static int read_seenspell(variant *var, void *owner, struct gamedata *data) { storage *store = data->store; spell *sp = 0; @@ -59,14 +59,14 @@ static int read_seenspell(attrib * a, void *owner, struct gamedata *data) log_info("read_seenspell: could not find spell '%s'\n", token); return AT_READ_FAIL; } - a->data.v = sp; + var->v = sp; return AT_READ_OK; } static void -write_seenspell(const attrib * a, const void *owner, struct storage *store) +write_seenspell(const variant *var, const void *owner, struct storage *store) { - const spell *sp = (const spell *)a->data.v; + const spell *sp = (const spell *)var->v; UNUSED_ARG(owner); WRITE_TOK(store, sp->sname); } diff --git a/src/attributes/targetregion.c b/src/attributes/targetregion.c index 29e76f557..7ef1fe84a 100644 --- a/src/attributes/targetregion.c +++ b/src/attributes/targetregion.c @@ -29,14 +29,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include static void -write_targetregion(const attrib * a, const void *owner, struct storage *store) +write_targetregion(const variant *var, const void *owner, struct storage *store) { - write_region_reference((region *)a->data.v, store); + write_region_reference((region *)var->v, store); } -static int read_targetregion(attrib * a, void *owner, gamedata *data) +static int read_targetregion(variant *var, void *owner, gamedata *data) { - if (read_region_reference(data, (region **)&a->data.v, NULL) <= 0) { + if (read_region_reference(data, (region **)&var->v, NULL) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; diff --git a/src/economy.c b/src/economy.c index 82890888e..a992729f4 100644 --- a/src/economy.c +++ b/src/economy.c @@ -1432,10 +1432,10 @@ int make_cmd(unit * u, struct order *ord) /* ------------------------------------------------------------- */ -static void free_luxuries(struct attrib *a) +static void free_luxuries(variant *var) { - item *itm = (item *)a->data.v; - a->data.v = NULL; + item *itm = (item *)var->v; + var->v = NULL; i_freeall(&itm); } diff --git a/src/helpers.c b/src/helpers.c index b5c4c05ba..e6015488a 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -306,12 +306,12 @@ struct trigger_type tt_caldera = { }; -static int building_action_read(struct attrib *a, void *owner, gamedata *data) +static int building_action_read(variant *var, void *owner, gamedata *data) { struct storage *store = data->store; UNUSED_ARG(owner); - UNUSED_ARG(a); + UNUSED_ARG(var); if (data->version < ATTRIBOWNER_VERSION) { READ_INT(data->store, NULL); diff --git a/src/kernel/ally.c b/src/kernel/ally.c index dbb6aff3a..8f99f1f07 100644 --- a/src/kernel/ally.c +++ b/src/kernel/ally.c @@ -136,9 +136,9 @@ static int ally_mode(const ally * sf, int mode) return sf->status & mode; } -static void init_npcfaction(struct attrib *a) +static void init_npcfaction(variant *var) { - a->data.i = 1; + var->i = 1; } attrib_type at_npcfaction = { diff --git a/src/kernel/curse.c b/src/kernel/curse.c index 0f215dbee..d03ddb067 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -102,9 +102,9 @@ static void cunhash(curse * c) /* ------------------------------------------------------------- */ /* at_curse */ -void curse_init(attrib * a) +void curse_init(variant *var) { - a->data.v = calloc(1, sizeof(curse)); + var->v = calloc(1, sizeof(curse)); } int curse_age(attrib * a, void *owner) @@ -133,9 +133,9 @@ void destroy_curse(curse * c) free(c); } -void curse_done(attrib * a) +void curse_done(variant * var) { - destroy_curse((curse *)a->data.v); + destroy_curse((curse *)var->v); } /** reads curses that have been removed from the code */ @@ -177,10 +177,10 @@ static int read_ccompat(const char *cursename, struct storage *store) return -1; } -int curse_read(attrib * a, void *owner, gamedata *data) +int curse_read(variant *var, void *owner, gamedata *data) { storage *store = data->store; - curse *c = (curse *)a->data.v; + curse *c = (curse *)var->v; int ur; char cursename[64]; int n; @@ -238,9 +238,9 @@ int curse_read(attrib * a, void *owner, gamedata *data) return AT_READ_OK; } -void curse_write(const attrib * a, const void *owner, struct storage *store) +void curse_write(const variant * var, const void *owner, struct storage *store) { - curse *c = (curse *)a->data.v; + curse *c = (curse *)var->v; const curse_type *ct = c->type; unit *mage = (c->magician && c->magician->number) ? c->magician : NULL; diff --git a/src/kernel/curse.h b/src/kernel/curse.h index 054387d59..36ace2895 100644 --- a/src/kernel/curse.h +++ b/src/kernel/curse.h @@ -221,9 +221,9 @@ extern "C" { void curses_done(void); /* de-register all curse-types */ - void curse_write(const struct attrib *a, const void *owner, + void curse_write(const union variant *v, const void *owner, struct storage *store); - int curse_read(struct attrib *a, void *owner, struct gamedata *store); + int curse_read(union variant *v, void *owner, struct gamedata *store); /* ------------------------------------------------------------- */ /* Kommentare: @@ -291,8 +291,8 @@ extern "C" { curse *findcurse(int curseid); - void curse_init(struct attrib *a); - void curse_done(struct attrib *a); + void curse_init(union variant *a); + void curse_done(union variant *a); int curse_age(struct attrib *a, void *owner); double destr_curse(struct curse *c, int cast_level, double force); diff --git a/src/kernel/group.c b/src/kernel/group.c index 54cd965da..48434ff5a 100755 --- a/src/kernel/group.c +++ b/src/kernel/group.c @@ -96,14 +96,14 @@ static group *find_group(int gid) return g; } -static int read_group(attrib * a, void *owner, gamedata *data) +static int read_group(variant *var, void *owner, gamedata *data) { struct storage *store = data->store; group *g; int gid; READ_INT(store, &gid); - a->data.v = g = find_group(gid); + var->v = g = find_group(gid); if (g != 0) { g->members++; return AT_READ_OK; @@ -112,9 +112,9 @@ static int read_group(attrib * a, void *owner, gamedata *data) } static void -write_group(const attrib * a, const void *owner, struct storage *store) +write_group(const variant *var, const void *owner, struct storage *store) { - group *g = (group *)a->data.v; + group *g = (group *)var->v; WRITE_INT(store, g->gid); } diff --git a/src/kernel/region.c b/src/kernel/region.c index 3f25f156b..28d4e8bee 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -181,14 +181,14 @@ void deathcounts(region * r, int fallen) /********************/ /* at_moveblock */ /********************/ -void a_initmoveblock(attrib * a) +void a_initmoveblock(variant *var) { - a->data.v = calloc(1, sizeof(moveblock)); + var->v = calloc(1, sizeof(moveblock)); } -int a_readmoveblock(attrib * a, void *owner, gamedata *data) +int a_readmoveblock(variant *var, void *owner, gamedata *data) { - moveblock *m = (moveblock *)(a->data.v); + moveblock *m = (moveblock *)var->v; int i; READ_INT(data->store, &i); @@ -197,9 +197,9 @@ int a_readmoveblock(attrib * a, void *owner, gamedata *data) } void -a_writemoveblock(const attrib * a, const void *owner, struct storage *store) +a_writemoveblock(const variant *var, const void *owner, struct storage *store) { - moveblock *m = (moveblock *)(a->data.v); + moveblock *m = (moveblock *)var->v; WRITE_INT(store, (int)m->dir); } diff --git a/src/kernel/skills.c b/src/kernel/skills.c index 8c4b4d2a6..24981728f 100644 --- a/src/kernel/skills.c +++ b/src/kernel/skills.c @@ -40,21 +40,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /** skillmod attribut **/ -static void init_skillmod(attrib * a) +static void init_skillmod(variant *var) { - a->data.v = calloc(sizeof(skillmod_data), 1); -} - -static void finalize_skillmod(attrib * a) -{ - free(a->data.v); + var->v = calloc(sizeof(skillmod_data), 1); } /** temporary skill modification (NOT SAVED!). */ attrib_type at_skillmod = { "skillmod", init_skillmod, - finalize_skillmod, + a_free_voidptr, NULL, NULL, /* can't write function pointers */ NULL, /* can't read function pointers */ diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 367ea4d97..acc28fff3 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -506,13 +506,13 @@ int ualias(const unit * u) return a->data.i; } -int a_readprivate(attrib * a, void *owner, gamedata *data) +int a_readprivate(variant *var, void *owner, gamedata *data) { struct storage *store = data->store; char lbuf[DISPLAYSIZE]; READ_STR(store, lbuf, sizeof(lbuf)); - a->data.v = str_strdup(lbuf); - return (a->data.v) ? AT_READ_OK : AT_READ_FAIL; + var->v = str_strdup(lbuf); + return (var->v) ? AT_READ_OK : AT_READ_FAIL; } /*********************/ @@ -644,15 +644,15 @@ void usettarget(unit * u, const unit * t) /* at_siege */ /*********************/ -void a_writesiege(const attrib * a, const void *owner, struct storage *store) +void a_writesiege(const variant *var, const void *owner, struct storage *store) { - struct building *b = (struct building *)a->data.v; + struct building *b = (struct building *)var->v; write_building_reference(b, store); } -int a_readsiege(attrib * a, void *owner, gamedata *data) +int a_readsiege(variant *var, void *owner, gamedata *data) { - if (read_building_reference(data, (building **)&a->data.v, NULL) <= 0) { + if (read_building_reference(data, (building **)&var->v, NULL) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; diff --git a/src/magic.c b/src/magic.c index 4e9c87b4e..5cfd4d071 100644 --- a/src/magic.c +++ b/src/magic.c @@ -126,10 +126,10 @@ typedef struct icastle_data { int time; } icastle_data; -static int a_readicastle(attrib * a, void *owner, struct gamedata *data) +static int a_readicastle(variant *var, void *owner, struct gamedata *data) { storage *store = data->store; - icastle_data *idata = (icastle_data *)a->data.v; + icastle_data *idata = (icastle_data *)var->v; char token[32]; UNUSED_ARG(owner); @@ -143,9 +143,9 @@ static int a_readicastle(attrib * a, void *owner, struct gamedata *data) } static void -a_writeicastle(const attrib * a, const void *owner, struct storage *store) +a_writeicastle(const variant *var, const void *owner, struct storage *store) { - icastle_data *data = (icastle_data *)a->data.v; + icastle_data *data = (icastle_data *)var->v; UNUSED_ARG(owner); WRITE_TOK(store, data->type->_name); WRITE_INT(store, data->time); @@ -168,20 +168,15 @@ static int a_ageicastle(struct attrib *a, void *owner) return AT_AGE_KEEP; } -static void a_initicastle(struct attrib *a) +static void a_initicastle(variant *var) { - a->data.v = calloc(sizeof(icastle_data), 1); -} - -static void a_finalizeicastle(struct attrib *a) /*-V524 */ -{ - free(a->data.v); + var->v = calloc(sizeof(icastle_data), 1); } attrib_type at_icastle = { "zauber_icastle", a_initicastle, - a_finalizeicastle, + a_free_voidptr, a_ageicastle, a_writeicastle, a_readicastle @@ -207,14 +202,14 @@ extern int dice(int count, int value); * Umwandlung von alt nach neu gebraucht werden */ /* ------------------------------------------------------------- */ -static void init_mage(attrib * a) +static void init_mage(variant *var) { - a->data.v = calloc(sizeof(sc_mage), 1); + var->v = calloc(sizeof(sc_mage), 1); } -static void free_mage(attrib * a) +static void free_mage(variant *var) { - sc_mage *mage = (sc_mage *)a->data.v; + sc_mage *mage = (sc_mage *)var->v; if (mage->spellbook) { spellbook_clear(mage->spellbook); free(mage->spellbook); @@ -239,11 +234,11 @@ int get_spell_level_mage(const spell * sp, void * cbdata) return sbe ? sbe->level : 0; } -static int read_mage(attrib * a, void *owner, struct gamedata *data) +static int read_mage(variant *var, void *owner, struct gamedata *data) { storage *store = data->store; int i, mtype; - sc_mage *mage = (sc_mage *)a->data.v; + sc_mage *mage = (sc_mage *)var->v; char spname[64]; UNUSED_ARG(owner); @@ -287,10 +282,10 @@ static int read_mage(attrib * a, void *owner, struct gamedata *data) } static void -write_mage(const attrib * a, const void *owner, struct storage *store) +write_mage(const variant *var, const void *owner, struct storage *store) { int i; - sc_mage *mage = (sc_mage *)a->data.v; + sc_mage *mage = (sc_mage *)var->v; UNUSED_ARG(owner); WRITE_INT(store, mage->magietyp); @@ -2090,9 +2085,9 @@ bool is_familiar(const unit * u) } static void -a_write_unit(const attrib * a, const void *owner, struct storage *store) +a_write_unit(const variant *var, const void *owner, struct storage *store) { - unit *u = (unit *)a->data.v; + unit *u = (unit *)var->v; UNUSED_ARG(owner); write_unit_reference(u, store); } @@ -2208,10 +2203,10 @@ static void * resolve_familiar(int id, void *data) { return data; } -static int read_familiar(attrib * a, void *owner, struct gamedata *data) +static int read_familiar(variant *var, void *owner, struct gamedata *data) { UNUSED_ARG(owner); - if (read_unit_reference(data, (unit **)&a->data.v, resolve_familiar) <= 0) { + if (read_unit_reference(data, (unit **)&var->v, resolve_familiar) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; @@ -2289,10 +2284,10 @@ static void * resolve_clone(int id, void *data) { return data; } -static int read_clone(attrib * a, void *owner, struct gamedata *data) +static int read_clone(variant *var, void *owner, struct gamedata *data) { UNUSED_ARG(owner); - if (read_unit_reference(data, (unit **)&a->data.v, resolve_clone) <= 0) { + if (read_unit_reference(data, (unit **)&var->v, resolve_clone) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; @@ -2312,10 +2307,10 @@ static void * resolve_mage(int id, void *data) { return data; } -static int read_magician(attrib * a, void *owner, struct gamedata *data) +static int read_magician(variant *var, void *owner, struct gamedata *data) { UNUSED_ARG(owner); - if (read_unit_reference(data, (unit **)&a->data.v, resolve_mage) <= 0) { + if (read_unit_reference(data, (unit **)&var->v, resolve_mage) <= 0) { return AT_READ_FAIL; } return AT_READ_OK; diff --git a/src/market.c b/src/market.c index fd62ae353..87be18f95 100644 --- a/src/market.c +++ b/src/market.c @@ -53,11 +53,11 @@ static unsigned int get_markets(region * r, unit ** results, size_t size) return n; } -static void free_market(attrib * a) +static void free_market(variant *var) { - item *items = (item *)a->data.v; + item *items = (item *)var->v; i_freeall(&items); - a->data.v = 0; + var->v = NULL; } attrib_type at_market = { diff --git a/src/modules/gmcmd.c b/src/modules/gmcmd.c index c911e3de4..401879cd6 100644 --- a/src/modules/gmcmd.c +++ b/src/modules/gmcmd.c @@ -34,6 +34,7 @@ /* util includes */ #include #include +#include #include @@ -43,17 +44,19 @@ #include #include -static int read_permissions(attrib * a, void *owner, struct gamedata *data) +static int read_permissions(variant *var, void *owner, struct gamedata *data) { - assert(!a); + attrib *a; + UNUSED_ARG(var); read_attribs(data, &a, owner); a_remove(&a, a); return AT_READ_OK; } -static int read_gmcreate(attrib * a, void *owner, struct gamedata *data) +static int read_gmcreate(variant *var, void *owner, struct gamedata *data) { char zText[32]; + UNUSED_ARG(var); READ_TOK(data->store, zText, sizeof(zText)); return AT_READ_OK; } diff --git a/src/modules/museum.c b/src/modules/museum.c index 0f9fe9923..d854d1763 100644 --- a/src/modules/museum.c +++ b/src/modules/museum.c @@ -59,29 +59,22 @@ attrib_type at_museumexit = { "museumexit", NULL, NULL, NULL, a_writeshorts, a_readshorts }; -static void a_initmuseumgivebackcookie(attrib * a) +static void a_initmuseumgivebackcookie(variant *var) { - a->data.v = calloc(1, sizeof(museumgivebackcookie)); + var->v = calloc(1, sizeof(museumgivebackcookie)); } -static void a_finalizemuseumgivebackcookie(attrib * a) +static void a_writemuseumgivebackcookie(const variant *var, + const void *owner, struct storage *store) { - free(a->data.v); -} - -static void -a_writemuseumgivebackcookie(const attrib * a, const void *owner, -struct storage *store) -{ - museumgivebackcookie *gbc = (museumgivebackcookie *)a->data.v; + museumgivebackcookie *gbc = (museumgivebackcookie *)var->v; WRITE_INT(store, gbc->warden_no); WRITE_INT(store, gbc->cookie); } -static int -a_readmuseumgivebackcookie(attrib * a, void *owner, gamedata *data) +static int a_readmuseumgivebackcookie(variant *var, void *owner, gamedata *data) { - museumgivebackcookie *gbc = (museumgivebackcookie *)a->data.v; + museumgivebackcookie *gbc = (museumgivebackcookie *)var->v; READ_INT(data->store, &gbc->warden_no); READ_INT(data->store, &gbc->cookie); return AT_READ_OK; @@ -90,7 +83,7 @@ a_readmuseumgivebackcookie(attrib * a, void *owner, gamedata *data) attrib_type at_museumgivebackcookie = { "museumgivebackcookie", a_initmuseumgivebackcookie, - a_finalizemuseumgivebackcookie, + a_free_voidptr, NULL, a_writemuseumgivebackcookie, a_readmuseumgivebackcookie @@ -100,30 +93,30 @@ attrib_type at_warden = { "itemwarden", NULL, NULL, NULL, a_writeint, a_readint }; -static void a_initmuseumgiveback(attrib * a) +static void a_initmuseumgiveback(variant *var) { - a->data.v = calloc(1, sizeof(museumgiveback)); + var->v = calloc(1, sizeof(museumgiveback)); } -static void a_finalizemuseumgiveback(attrib * a) +static void a_finalizemuseumgiveback(variant *var) { - museumgiveback *gb = (museumgiveback *)a->data.v; + museumgiveback *gb = (museumgiveback *)var->v; i_freeall(&gb->items); - free(a->data.v); + free(gb); } static void -a_writemuseumgiveback(const attrib * a, const void *owner, +a_writemuseumgiveback(const variant *var, const void *owner, struct storage *store) { - museumgiveback *gb = (museumgiveback *)a->data.v; + museumgiveback *gb = (museumgiveback *)var->v; WRITE_INT(store, gb->cookie); write_items(store, gb->items); } -static int a_readmuseumgiveback(attrib * a, void *owner, struct gamedata *data) +static int a_readmuseumgiveback(variant *var, void *owner, struct gamedata *data) { - museumgiveback *gb = (museumgiveback *)a->data.v; + museumgiveback *gb = (museumgiveback *)var->v; READ_INT(data->store, &gb->cookie); read_items(data->store, &gb->items); return AT_READ_OK; diff --git a/src/move.c b/src/move.c index 069c6ff7d..3a007d26d 100644 --- a/src/move.c +++ b/src/move.c @@ -138,14 +138,9 @@ get_followers(unit * target, region * r, const region_list * route_end, } } -static void shiptrail_init(attrib * a) +static void shiptrail_init(variant *var) { - a->data.v = calloc(1, sizeof(traveldir)); -} - -static void shiptrail_finalize(attrib * a) -{ - free(a->data.v); + var->v = calloc(1, sizeof(traveldir)); } static int shiptrail_age(attrib * a, void *owner) @@ -157,11 +152,11 @@ static int shiptrail_age(attrib * a, void *owner) return (t->age > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; } -static int shiptrail_read(attrib * a, void *owner, struct gamedata *data) +static int shiptrail_read(variant *var, void *owner, struct gamedata *data) { storage *store = data->store; int n; - traveldir *t = (traveldir *)(a->data.v); + traveldir *t = (traveldir *)var->v; UNUSED_ARG(owner); READ_INT(store, &t->no); @@ -172,9 +167,9 @@ static int shiptrail_read(attrib * a, void *owner, struct gamedata *data) } static void -shiptrail_write(const attrib * a, const void *owner, struct storage *store) +shiptrail_write(const variant *var, const void *owner, struct storage *store) { - traveldir *t = (traveldir *)(a->data.v); + traveldir *t = (traveldir *)var->v; UNUSED_ARG(owner); WRITE_INT(store, t->no); @@ -185,7 +180,7 @@ shiptrail_write(const attrib * a, const void *owner, struct storage *store) attrib_type at_shiptrail = { "traveldir_new", shiptrail_init, - shiptrail_finalize, + a_free_voidptr, shiptrail_age, shiptrail_write, shiptrail_read diff --git a/src/piracy.c b/src/piracy.c index 888a7e53a..da0e4a3e1 100644 --- a/src/piracy.c +++ b/src/piracy.c @@ -34,20 +34,15 @@ typedef struct piracy_data { direction_t dir; } piracy_data; -static void piracy_init(struct attrib *a) +static void piracy_init(variant *var) { - a->data.v = calloc(1, sizeof(piracy_data)); -} - -static void piracy_done(struct attrib *a) -{ - free(a->data.v); + var->v = calloc(1, sizeof(piracy_data)); } static attrib_type at_piracy_direction = { "piracy_direction", piracy_init, - piracy_done, + a_free_voidptr, DEFAULT_AGE, NO_WRITE, NO_READ diff --git a/src/spells.c b/src/spells.c index 8334d19c0..12778e9d4 100644 --- a/src/spells.c +++ b/src/spells.c @@ -2857,12 +2857,12 @@ static curse *mk_deathcloud(unit * mage, region * r, double force, int duration) return c; } -static int dc_read_compat(struct attrib *a, void *target, gamedata *data) +static int dc_read_compat(variant *var, void *target, gamedata *data) /* return AT_READ_OK on success, AT_READ_FAIL if attrib needs removal */ { struct storage *store = data->store; - UNUSED_ARG(a); + UNUSED_ARG(var); UNUSED_ARG(target); READ_INT(store, NULL); READ_FLT(store, NULL); diff --git a/src/spells/borders.c b/src/spells/borders.c index 9ded973c8..c30726641 100644 --- a/src/spells/borders.c +++ b/src/spells/borders.c @@ -31,13 +31,13 @@ typedef struct wallcurse { connection *wall; } wallcurse; -static int cw_read_depr(attrib * a, void *target, gamedata *data) +static int cw_read_depr(variant *var, void *target, gamedata *data) { storage *store = data->store; - curse_init(a); - curse_read(a, store, target); - curse_done(a); + curse_init(var); + curse_read(var, store, target); + curse_done(var); READ_INT(store, NULL); return AT_READ_DEPR; } diff --git a/src/study.c b/src/study.c index 09f228f45..d9e66f1f9 100644 --- a/src/study.c +++ b/src/study.c @@ -173,16 +173,16 @@ int study_cost(struct unit *u, skill_t sk) /* ------------------------------------------------------------- */ -static void init_learning(struct attrib *a) +static void init_learning(variant *var) { - a->data.v = calloc(sizeof(teaching_info), 1); + var->v = calloc(sizeof(teaching_info), 1); } -static void done_learning(struct attrib *a) +static void done_learning(variant *var) { - teaching_info *teach = (teaching_info *)a->data.v; + teaching_info *teach = (teaching_info *)var->v; selist_free(teach->teachers); - free(a->data.v); + free(teach); } const attrib_type at_learning = { diff --git a/src/travelthru.c b/src/travelthru.c index 835d05024..fa6293f53 100644 --- a/src/travelthru.c +++ b/src/travelthru.c @@ -37,9 +37,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -static void travel_done(attrib *a) { - selist *ql = (selist *)a->data.v; - selist_free(ql); +static void travel_done(variant *var) { + selist_free((selist *)var->v); } /*********************/ diff --git a/src/util/attrib.c b/src/util/attrib.c index 8a90f3bca..f65972fc0 100644 --- a/src/util/attrib.c +++ b/src/util/attrib.c @@ -21,6 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "gamedata.h" #include "log.h" +#include "variant.h" #include "storage.h" #include "strings.h" @@ -61,57 +62,57 @@ void write_attribs(storage *store, attrib *alist, const void *owner) #endif } -int a_readint(attrib * a, void *owner, struct gamedata *data) +int a_readint(variant * var, void *owner, struct gamedata *data) { int n; READ_INT(data->store, &n); - if (a) a->data.i = n; + if (var) var->i = n; return AT_READ_OK; } -void a_writeint(const attrib * a, const void *owner, struct storage *store) +void a_writeint(const variant * var, const void *owner, struct storage *store) { - WRITE_INT(store, a->data.i); + WRITE_INT(store, var->i); } -int a_readshorts(attrib * a, void *owner, struct gamedata *data) +int a_readshorts(variant * var, void *owner, struct gamedata *data) { int n; READ_INT(data->store, &n); - a->data.sa[0] = (short)n; + var->sa[0] = (short)n; READ_INT(data->store, &n); - a->data.sa[1] = (short)n; + var->sa[1] = (short)n; return AT_READ_OK; } -void a_writeshorts(const attrib * a, const void *owner, struct storage *store) +void a_writeshorts(const variant * var, const void *owner, struct storage *store) { - WRITE_INT(store, a->data.sa[0]); - WRITE_INT(store, a->data.sa[1]); + WRITE_INT(store, var->sa[0]); + WRITE_INT(store, var->sa[1]); } -int a_readchars(attrib * a, void *owner, struct gamedata *data) +int a_readchars(variant * var, void *owner, struct gamedata *data) { int i; for (i = 0; i != 4; ++i) { int n; READ_INT(data->store, &n); - a->data.ca[i] = (char)n; + var->ca[i] = (char)n; } return AT_READ_OK; } -void a_writechars(const attrib * a, const void *owner, struct storage *store) +void a_writechars(const variant * var, const void *owner, struct storage *store) { int i; for (i = 0; i != 4; ++i) { - WRITE_INT(store, a->data.ca[i]); + WRITE_INT(store, var->ca[i]); } } #define DISPLAYSIZE 8192 -int a_readstring(attrib * a, void *owner, struct gamedata *data) +int a_readstring(variant * var, void *owner, struct gamedata *data) { char buf[DISPLAYSIZE]; char * result = 0; @@ -133,19 +134,19 @@ int a_readstring(attrib * a, void *owner, struct gamedata *data) result = str_strdup(buf); } } while (e == ENOMEM); - a->data.v = result; + var->v = result; return AT_READ_OK; } -void a_writestring(const attrib * a, const void *owner, struct storage *store) +void a_writestring(const variant * var, const void *owner, struct storage *store) { - assert(a->data.v); - WRITE_STR(store, (const char *)a->data.v); + assert(var && var->v); + WRITE_STR(store, (const char *)var->v); } -void a_finalizestring(attrib * a) +void a_finalizestring(variant * var) { - free(a->data.v); + free(var->v); } #define MAXATHASH 61 @@ -308,11 +309,16 @@ static int a_unlink(attrib ** pa, attrib * a) return 0; } +void a_free_voidptr(union variant *var) +{ + free(var->v); +} + static void a_free(attrib * a) { const attrib_type *at = a->type; if (at->finalize) - at->finalize(a); + at->finalize(&a->data); free(a); } @@ -376,7 +382,7 @@ attrib *a_new(const attrib_type * at) assert(at != NULL); a->type = at; if (at->initialize) - at->initialize(a); + at->initialize(&a->data); return a; } @@ -404,10 +410,10 @@ static critbit_tree cb_deprecated = { 0 }; typedef struct deprecated_s { unsigned int hash; - int(*reader)(attrib *, void *, struct gamedata *); + int(*reader)(variant *, void *, struct gamedata *); } deprecated_t; -void at_deprecate(const char * name, int(*reader)(attrib *, void *, struct gamedata *)) +void at_deprecate(const char * name, int(*reader)(variant *, void *, struct gamedata *)) { deprecated_t value; @@ -418,7 +424,7 @@ void at_deprecate(const char * name, int(*reader)(attrib *, void *, struct gamed static int a_read_i(gamedata *data, attrib ** attribs, void *owner, unsigned int key) { int retval = AT_READ_OK; - int(*reader)(attrib *, void *, struct gamedata *) = 0; + int(*reader)(variant *, void *, struct gamedata *) = 0; attrib_type *at = at_find_key(key); attrib * na = 0; @@ -438,7 +444,7 @@ static int a_read_i(gamedata *data, attrib ** attribs, void *owner, unsigned int } } if (reader) { - int ret = reader(na, owner, data); + int ret = reader(&na->data, owner, data); if (na) { switch (ret) { case AT_READ_DEPR: @@ -508,7 +514,7 @@ void a_write(struct storage *store, const attrib * attribs, const void *owner) { if (na->type->write) { assert(na->type->hashkey || !"attribute not registered"); WRITE_INT(store, na->type->hashkey); - na->type->write(na, owner, store); + na->type->write(&na->data, owner, store); na = na->next; } else { @@ -526,7 +532,7 @@ void a_write_orig(struct storage *store, const attrib * attribs, const void *own if (na->type->write) { assert(na->type->hashkey || !"attribute not registered"); WRITE_TOK(store, na->type->name); - na->type->write(na, owner, store); + na->type->write(&na->data, owner, store); na = na->next; } else { diff --git a/src/util/attrib.h b/src/util/attrib.h index 6043a960f..434c60013 100644 --- a/src/util/attrib.h +++ b/src/util/attrib.h @@ -20,27 +20,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define ATTRIB_H #include - +#include "variant.h" #ifdef __cplusplus extern "C" { #endif + union variant; struct gamedata; struct storage; typedef void(*afun) (void); typedef struct attrib { const struct attrib_type *type; - union { - afun f; - void *v; - int i; - float flt; - char c; - short s; - short sa[2]; - char ca[4]; - } data; + union variant data; /* internal data, do not modify: */ struct attrib *next; /* next attribute in the list */ struct attrib *nexttype; /* skip to attribute of a different type */ @@ -52,12 +44,12 @@ extern "C" { typedef struct attrib_type { const char *name; - void(*initialize) (struct attrib *); - void(*finalize) (struct attrib *); + void(*initialize) (union variant *); + void(*finalize) (union variant *); int(*age) (struct attrib *, void *owner); /* age returns 0 if the attribute needs to be removed, !=0 otherwise */ - void(*write) (const struct attrib *, const void *owner, struct storage *); - int(*read) (struct attrib *, void *owner, struct gamedata *); /* return AT_READ_OK on success, AT_READ_FAIL if attrib needs removal */ + void(*write) (const union variant *, const void *owner, struct storage *); + int(*read) (union variant *, void *owner, struct gamedata *); /* return AT_READ_OK on success, AT_READ_FAIL if attrib needs removal */ void(*upgrade) (struct attrib **alist, struct attrib *a); unsigned int flags; /* ---- internal data, do not modify: ---- */ @@ -66,7 +58,7 @@ extern "C" { } attrib_type; void at_register(attrib_type * at); - void at_deprecate(const char * name, int(*reader)(attrib *, void *, struct gamedata *)); + void at_deprecate(const char * name, int (*reader)(variant *, void *, struct gamedata *)); struct attrib_type *at_find(const char *name); void write_attribs(struct storage *store, struct attrib *alist, const void *owner); @@ -80,25 +72,26 @@ extern "C" { attrib *a_new(const attrib_type * at); int a_age(attrib ** attribs, void *owner); + void a_free_voidptr(union variant *v); int a_read_orig(struct gamedata *data, attrib ** attribs, void *owner); void a_write_orig(struct storage *store, const attrib * attribs, const void *owner); int a_read(struct gamedata *data, attrib ** attribs, void *owner); void a_write(struct storage *store, const attrib * attribs, const void *owner); - int a_readint(struct attrib *a, void *owner, struct gamedata *); - void a_writeint(const struct attrib *a, const void *owner, + int a_readint(union variant *v, void *owner, struct gamedata *); + void a_writeint(const union variant *v, const void *owner, struct storage *store); - int a_readshorts(struct attrib *a, void *owner, struct gamedata *); - void a_writeshorts(const struct attrib *a, const void *owner, + int a_readshorts(union variant *v, void *owner, struct gamedata *); + void a_writeshorts(const union variant *v, const void *owner, struct storage *store); - int a_readchars(struct attrib *a, void *owner, struct gamedata *); - void a_writechars(const struct attrib *a, const void *owner, + int a_readchars(union variant *v, void *owner, struct gamedata *); + void a_writechars(const union variant *v, const void *owner, struct storage *store); - int a_readstring(struct attrib *a, void *owner, struct gamedata *); - void a_writestring(const struct attrib *a, const void *owner, + int a_readstring(union variant *v, void *owner, struct gamedata *); + void a_writestring(const union variant *v, const void *owner, struct storage *); - void a_finalizestring(struct attrib *a); + void a_finalizestring(union variant *v); void attrib_done(void); diff --git a/src/util/attrib.test.c b/src/util/attrib.test.c index 34427385f..d266196e6 100644 --- a/src/util/attrib.test.c +++ b/src/util/attrib.test.c @@ -117,18 +117,18 @@ static void test_attrib_nexttype(CuTest * tc) static void test_attrib_rwstring(CuTest *tc) { gamedata data; storage store; - attrib a = { 0 }; + variant var = { 0 }; test_setup(); - a.data.v = str_strdup("Hello World"); + var.v = str_strdup("Hello World"); mstream_init(&data.strm); gamedata_init(&data, &store, RELEASE_VERSION); - a_writestring(&a, NULL, &store); - a_finalizestring(&a); + a_writestring(&var, NULL, &store); + a_finalizestring(&var); data.strm.api->rewind(data.strm.handle); - a_readstring(&a, NULL, &data); - CuAssertStrEquals(tc, "Hello World", (const char *)a.data.v); - a_finalizestring(&a); + a_readstring(&var, NULL, &data); + CuAssertStrEquals(tc, "Hello World", (const char *)var.v); + a_finalizestring(&var); mstream_done(&data.strm); gamedata_done(&data); test_teardown(); @@ -137,17 +137,17 @@ static void test_attrib_rwstring(CuTest *tc) { static void test_attrib_rwint(CuTest *tc) { gamedata data; storage store; - attrib a = { 0 }; + variant var = { 0 }; test_setup(); - a.data.i = 42; + var.i = 42; mstream_init(&data.strm); gamedata_init(&data, &store, RELEASE_VERSION); - a_writeint(&a, NULL, &store); - a.data.i = 0; + a_writeint(&var, NULL, &store); + var.i = 0; data.strm.api->rewind(data.strm.handle); - a_readint(&a, NULL, &data); - CuAssertIntEquals(tc, 42, a.data.i); + a_readint(&var, NULL, &data); + CuAssertIntEquals(tc, 42, var.i); mstream_done(&data.strm); gamedata_done(&data); test_teardown(); @@ -156,19 +156,19 @@ static void test_attrib_rwint(CuTest *tc) { static void test_attrib_rwchars(CuTest *tc) { gamedata data; storage store; - attrib a = { 0 }; + variant var = { 0 }; test_setup(); - a.data.ca[0] = 1; - a.data.ca[3] = 42; + var.ca[0] = 1; + var.ca[3] = 42; mstream_init(&data.strm); gamedata_init(&data, &store, RELEASE_VERSION); - a_writeint(&a, NULL, &store); - memset(a.data.ca, 0, 4); + a_writeint(&var, NULL, &store); + memset(var.ca, 0, 4); data.strm.api->rewind(data.strm.handle); - a_readint(&a, NULL, &data); - CuAssertIntEquals(tc, 1, a.data.ca[0]); - CuAssertIntEquals(tc, 42, a.data.ca[3]); + a_readint(&var, NULL, &data); + CuAssertIntEquals(tc, 1, var.ca[0]); + CuAssertIntEquals(tc, 42, var.ca[3]); mstream_done(&data.strm); gamedata_done(&data); test_teardown(); @@ -177,19 +177,19 @@ static void test_attrib_rwchars(CuTest *tc) { static void test_attrib_rwshorts(CuTest *tc) { gamedata data; storage store; - attrib a = { 0 }; - a.data.sa[0] = -4; - a.data.sa[1] = 42; + variant var = { 0 }; + var.sa[0] = -4; + var.sa[1] = 42; test_setup(); mstream_init(&data.strm); gamedata_init(&data, &store, RELEASE_VERSION); - a_writeint(&a, NULL, &store); - memset(a.data.ca, 0, 4); + a_writeint(&var, NULL, &store); + memset(var.ca, 0, 4); data.strm.api->rewind(data.strm.handle); - a_readint(&a, NULL, &data); - CuAssertIntEquals(tc, -4, a.data.sa[0]); - CuAssertIntEquals(tc, 42, a.data.sa[1]); + a_readint(&var, NULL, &data); + CuAssertIntEquals(tc, -4, var.sa[0]); + CuAssertIntEquals(tc, 42, var.sa[1]); mstream_done(&data.strm); gamedata_done(&data); test_teardown(); diff --git a/src/util/event.c b/src/util/event.c index 298f9d93e..d6aa6f338 100644 --- a/src/util/event.c +++ b/src/util/event.c @@ -127,32 +127,32 @@ typedef struct handler_info { trigger *triggers; } handler_info; -static void init_handler(attrib * a) +static void init_handler(variant *var) { - a->data.v = calloc(sizeof(handler_info), 1); + var->v = calloc(sizeof(handler_info), 1); } -static void free_handler(attrib * a) +static void free_handler(variant *var) { - handler_info *hi = (handler_info *)a->data.v; + handler_info *hi = (handler_info *)var->v; free_triggers(hi->triggers); free(hi->event); free(hi); } static void -write_handler(const attrib * a, const void *owner, struct storage *store) +write_handler(const variant *var, const void *owner, struct storage *store) { - handler_info *hi = (handler_info *)a->data.v; + handler_info *hi = (handler_info *)var->v; WRITE_TOK(store, hi->event); write_triggers(store, hi->triggers); } -static int read_handler(attrib * a, void *owner, gamedata *data) +static int read_handler(variant *var, void *owner, gamedata *data) { struct storage *store = data->store; char zText[128]; - handler_info *hi = (handler_info *)a->data.v; + handler_info *hi = (handler_info *)var->v; READ_TOK(store, zText, sizeof(zText)); hi->event = str_strdup(zText); diff --git a/src/vortex.c b/src/vortex.c index bb30524ef..69d767c1b 100644 --- a/src/vortex.c +++ b/src/vortex.c @@ -65,14 +65,14 @@ void register_special_direction(struct locale *lang, const char *name) /********************/ /* at_direction */ /********************/ -static void a_initdirection(attrib * a) +static void a_initdirection(variant * var) { - a->data.v = calloc(1, sizeof(spec_direction)); + var->v = calloc(1, sizeof(spec_direction)); } -static void a_freedirection(attrib * a) +static void a_freedirection(variant *var) { - spec_direction *d = (spec_direction *)(a->data.v); + spec_direction *d = (spec_direction *)(var->v); free(d->desc); free(d->keyword); free(d); @@ -86,10 +86,10 @@ static int a_agedirection(attrib * a, void *owner) return (d->duration > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; } -static int a_readdirection(attrib * a, void *owner, struct gamedata *data) +static int a_readdirection(variant *var, void *owner, struct gamedata *data) { struct storage *store = data->store; - spec_direction *d = (spec_direction *)(a->data.v); + spec_direction *d = (spec_direction *)(var->v); char lbuf[32]; (void)owner; @@ -105,9 +105,9 @@ static int a_readdirection(attrib * a, void *owner, struct gamedata *data) } static void -a_writedirection(const attrib * a, const void *owner, struct storage *store) +a_writedirection(const variant *var, const void *owner, struct storage *store) { - spec_direction *d = (spec_direction *)(a->data.v); + spec_direction *d = (spec_direction *)(var->v); (void)owner; WRITE_INT(store, d->x); diff --git a/src/wormhole.c b/src/wormhole.c index 2366a7e9c..197fc346d 100644 --- a/src/wormhole.c +++ b/src/wormhole.c @@ -91,20 +91,20 @@ static int wormhole_age(struct attrib *a, void *owner) return AT_AGE_KEEP; } -static void wormhole_write(const struct attrib *a, const void *owner, struct storage *store) +static void wormhole_write(const variant *var, const void *owner, struct storage *store) { - region *exit = (region *)a->data.v; + region *exit = (region *)var->v; write_region_reference(exit, store); } -static int wormhole_read(struct attrib *a, void *owner, struct gamedata *data) +static int wormhole_read(variant *var, void *owner, struct gamedata *data) { int id; if (data->version < ATTRIBOWNER_VERSION) { READ_INT(data->store, NULL); } - id = read_region_reference(data, (region **)&a->data.v, NULL); + id = read_region_reference(data, (region **)&var->v, NULL); return (id <= 0) ? AT_READ_FAIL : AT_READ_OK; } From c3fce574fbbe91da7283a47403a5ea04af9e7bec Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 11:26:39 +0100 Subject: [PATCH 018/231] fix reading old data files. --- src/util/attrib.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/util/attrib.c b/src/util/attrib.c index f65972fc0..9530e5154 100644 --- a/src/util/attrib.c +++ b/src/util/attrib.c @@ -42,12 +42,13 @@ int read_attribs(gamedata *data, attrib **alist, void *owner) { } if (result == AT_READ_DEPR) { /* handle deprecated attributes */ - attrib *a = *alist; - while (a) { + attrib **ap = alist; + while (*ap) { + attrib *a = *ap; if (a->type->upgrade) { a->type->upgrade(alist, a); } - a = a->nexttype; + ap = &a->nexttype; } } return result; @@ -66,7 +67,7 @@ int a_readint(variant * var, void *owner, struct gamedata *data) { int n; READ_INT(data->store, &n); - if (var) var->i = n; + var->i = n; return AT_READ_OK; } @@ -426,11 +427,13 @@ static int a_read_i(gamedata *data, attrib ** attribs, void *owner, unsigned int int retval = AT_READ_OK; int(*reader)(variant *, void *, struct gamedata *) = 0; attrib_type *at = at_find_key(key); - attrib * na = 0; + attrib * na = NULL; + variant var, *vp = &var; if (at) { reader = at->read; na = a_new(at); + vp = &na->data; } else { void *match; @@ -444,16 +447,20 @@ static int a_read_i(gamedata *data, attrib ** attribs, void *owner, unsigned int } } if (reader) { - int ret = reader(&na->data, owner, data); + int ret = reader(vp, owner, data); if (na) { switch (ret) { case AT_READ_DEPR: case AT_READ_OK: - a_add(attribs, na); + if (na) { + a_add(attribs, na); + } retval = ret; break; case AT_READ_FAIL: - a_free(na); + if (na) { + a_free(na); + } break; default: assert(!"invalid return value"); From fe29f2433ae4cdb2c2bf2e57b56c2dcfcd9c22ce Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 16:50:05 +0100 Subject: [PATCH 019/231] convert multiple seenspell attributes to single seenspells list. faster? maybe. --- src/attributes/attributes.c | 2 +- src/attributes/seenspell.c | 109 ++++++++++++++++++++++++++++-------- src/attributes/seenspell.h | 3 +- 3 files changed, 90 insertions(+), 24 deletions(-) diff --git a/src/attributes/attributes.c b/src/attributes/attributes.c index e6887a777..cfa99fcfd 100644 --- a/src/attributes/attributes.c +++ b/src/attributes/attributes.c @@ -179,8 +179,8 @@ void register_attributes(void) at_register(&at_mage); at_register(&at_countdown); at_register(&at_curse); - at_register(&at_seenspell); + at_register(&at_seenspells); /* neue REGION-Attribute */ at_register(&at_moveblock); diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index e7fd2e38a..3d813ee45 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -34,6 +34,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include +#include /* ------------------------------------------------------------- */ /* Ausgabe der Spruchbeschreibungen @@ -43,6 +44,43 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * Spruch zu seiner List-of-known-spells hinzugefügt werden. */ +static int read_seenspells(variant *var, void *owner, struct gamedata *data) +{ + selist *ql; + storage *store = data->store; + spell *sp = 0; + char token[32]; + + UNUSED_ARG(owner); + READ_TOK(store, token, sizeof(token)); + while (token[0]) { + sp = find_spell(token); + if (!sp) { + log_info("read_seenspells: could not find spell '%s'\n", token); + return AT_READ_FAIL; + } + selist_push(&ql, sp); + READ_TOK(store, token, sizeof(token)); + } + var->v = ql; + return AT_READ_OK; +} + +static bool cb_write_spell(const void *data, void *more) { + const spell *sp = (const spell *)data; + storage *store = (storage *)more; + WRITE_TOK(store, sp->sname); + return true; + +} +static void +write_seenspells(const variant *var, const void *owner, struct storage *store) +{ + UNUSED_ARG(owner); + selist_foreach_ex((selist *)var->v, cb_write_spell, store); + WRITE_TOK(store, ""); +} + static int read_seenspell(variant *var, void *owner, struct gamedata *data) { storage *store = data->store; @@ -60,7 +98,7 @@ static int read_seenspell(variant *var, void *owner, struct gamedata *data) return AT_READ_FAIL; } var->v = sp; - return AT_READ_OK; + return AT_READ_DEPR; } static void @@ -71,18 +109,53 @@ write_seenspell(const variant *var, const void *owner, struct storage *store) WRITE_TOK(store, sp->sname); } +static int cmp_spell(const void *a, const void *b) { + const spell *spa = (const spell *)a; + const spell *spb = (const spell *)b; + return strcmp(spa->sname, spb->sname); +} + +static bool set_seen(attrib **alist, struct spell *sp) { + attrib *a = a_find(*alist, &at_seenspells); + selist *sl; + if (!a) { + a = a_add(alist, a_new(&at_seenspells)); + } + sl = (selist *)a->data.v; + return selist_set_insert(&sl, sp, cmp_spell); +} + +static void upgrade_seenspell(attrib **alist, attrib *abegin) { + attrib *a, *ak; + + ak = a_find(*alist, &at_seenspells); + if (ak) alist = &ak; + for (a = abegin; a && a->type == abegin->type; a = a->next) { + set_seen(alist, (struct spell *)a->data.v); + } +} + +static void free_seenspells(variant *var) { + selist *sl = (selist *)var->v; + selist_free(sl); +} + +attrib_type at_seenspells = { + "seenspells", NULL, free_seenspells, NULL, write_seenspells, read_seenspells +}; + attrib_type at_seenspell = { - "seenspell", NULL, NULL, NULL, write_seenspell, read_seenspell + "seenspell", NULL, NULL, NULL, NULL, read_seenspell, upgrade_seenspell }; static bool already_seen(const faction * f, const spell * sp) { attrib *a; - for (a = a_find(f->attribs, &at_seenspell); a && a->type == &at_seenspell; - a = a->next) { - if (a->data.v == sp) - return true; + a = a_find(f->attribs, &at_seenspells); + if (a) { + selist *sl = (selist *)a->data.v; + return selist_set_find(&sl, NULL, sp, cmp_spell); } return false; } @@ -94,25 +167,17 @@ attrib_type at_reportspell = { void show_spell(faction *f, const spellbook_entry *sbe) { if (!already_seen(f, sbe->sp)) { - attrib * a = a_new(&at_reportspell); - a->data.v = (void *)sbe; - a_add(&f->attribs, a); - a_add(&f->attribs, a_new(&at_seenspell))->data.v = sbe->sp; + /* mark the spell as seen by this faction: */ + if (set_seen(&f->attribs, sbe->sp)) { + /* add the spell to the report: */ + attrib * a = a_new(&at_reportspell); + a->data.v = (void *)sbe; + a_add(&f->attribs, a); + } } } void reset_seen_spells(faction *f, const struct spell *sp) { - if (sp) { - attrib *a = a_find(f->attribs, &at_seenspell); - while (a && a->type == &at_seenspell && a->data.v != sp) { - a = a->next; - } - if (a) { - a_remove(&f->attribs, a); - } - } - else { - a_removeall(&f->attribs, &at_seenspell); - } + a_removeall(&f->attribs, &at_seenspells); } diff --git a/src/attributes/seenspell.h b/src/attributes/seenspell.h index aada5ad0a..cdfb36e48 100644 --- a/src/attributes/seenspell.h +++ b/src/attributes/seenspell.h @@ -10,6 +10,7 @@ void show_spell(struct faction * f, const struct spellbook_entry *sbe); void reset_seen_spells(struct faction * f, const struct spell *sp); extern struct attrib_type at_reportspell; -extern struct attrib_type at_seenspell; +extern struct attrib_type at_seenspells; +extern struct attrib_type at_seenspell; /* upgraded */ #endif From e300605e87b74bf11f55e1bf7c891499edbbf48f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 17:31:48 +0100 Subject: [PATCH 020/231] fix gcc build --- src/attributes/seenspell.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 3d813ee45..170cc33b4 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -66,7 +66,7 @@ static int read_seenspells(variant *var, void *owner, struct gamedata *data) return AT_READ_OK; } -static bool cb_write_spell(const void *data, void *more) { +static bool cb_write_spell(void *data, void *more) { const spell *sp = (const spell *)data; storage *store = (storage *)more; WRITE_TOK(store, sp->sname); @@ -101,14 +101,6 @@ static int read_seenspell(variant *var, void *owner, struct gamedata *data) return AT_READ_DEPR; } -static void -write_seenspell(const variant *var, const void *owner, struct storage *store) -{ - const spell *sp = (const spell *)var->v; - UNUSED_ARG(owner); - WRITE_TOK(store, sp->sname); -} - static int cmp_spell(const void *a, const void *b) { const spell *spa = (const spell *)a; const spell *spb = (const spell *)b; From eb6271bbb809cabacc9df484c02055b301562155 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 17:53:59 +0100 Subject: [PATCH 021/231] CID 182781 I broke the wage logic. --- scripts/tests/e2/e2features.lua | 3 ++- scripts/tests/economy.lua | 16 ++++++++++++++++ src/kernel/building.c | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 2c9c42e5b..d9a7da4f8 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -9,6 +9,7 @@ function setup() eressea.settings.set("rules.ship.storms", "0") eressea.settings.set("rules.encounters", "0") eressea.settings.set("study.produceexp", "0") + eressea.settings.set("rules.peasants.growth.factor", "0") end function test_calendar() @@ -19,7 +20,7 @@ end function test_herbalism() -- OBS: herbalism is currently an E2-only skill local r = region.create(0, 0, "plain") - local f = faction.create("human", "herbalism@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) eressea.settings.set("rules.grow.formula", 0) -- plants do not grow diff --git a/scripts/tests/economy.lua b/scripts/tests/economy.lua index 719b1f764..3379b2ab7 100644 --- a/scripts/tests/economy.lua +++ b/scripts/tests/economy.lua @@ -9,6 +9,22 @@ function setup() eressea.settings.set("nmr.timeout", "0") eressea.settings.set("rules.food.flags", "4") -- FOOD_IS_FREE eressea.settings.set("rules.encounters", "0") + eressea.settings.set("rules.peasants.growth.factor", "0") +end + +function test_work() + local r = region.create(0, 0, "plain") + r:set_resource('tree', 0) + r:set_resource('seed', 0) + r:set_resource('sapling', 0) + r:set_resource('peasant', 100) + r:set_resource('money', 0) + local f = faction.create("human") + local u = unit.create(f, r, 1) + u:add_order("ARBEITE") + process_orders() + assert_equal(10, u:get_item('money')) + assert_equal(100, r:get_resource('money')) end function test_bug_2361_forget_magic() diff --git a/src/kernel/building.c b/src/kernel/building.c index 8c5fbeb14..3bbd5891d 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -724,13 +724,14 @@ default_wage(const region * r, const faction * f, const race * rc, int in_turn) if (r->attribs) { attrib *a; curse *c; - variant vm = frac_make(wage, 1); + variant vm; /* Godcurse: Income -10 */ c = get_curse(r->attribs, &ct_godcursezone); if (c && curse_active(c)) { wage = (wage < 10) ? 0 : (wage - 10); } + vm = frac_make(wage, 1); /* Bei einer D�rre verdient man nur noch ein Viertel */ c = get_curse(r->attribs, &ct_drought); From c1c7da322dd38251e5c6faaaf1ba4e86e3fa4f65 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 18:06:02 +0100 Subject: [PATCH 022/231] Badges? We want them stinking badges! --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index efd1318d9..7d9c4424d 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,6 @@ This repository relies heavily on the use of submodules, and it pulls in most of ./s/build If you got this far and all went well, you have built a server (it is linked from the `game` subdirectory), and it will have passed some basic functionality tests. + +* [![Static Analysis](https://scan.coverity.com/projects/6742/badge.svg?flat=1)](https://scan.coverity.com/projects/6742/) +* [![Build Status](https://api.travis-ci.org/eressea/server.svg?branch=develop)](https://travis-ci.org/eressea/server) From 77a8c24ead10bb8cadf6c5d257c4629fc31d133b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 18:52:03 +0100 Subject: [PATCH 023/231] disable process test turn check (recent change). make all tests run from inside the tests directory --- s/runtests | 17 ++++++++--------- scripts/tests/process.lua | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/s/runtests b/s/runtests index 7a39670dd..b74a4b785 100755 --- a/s/runtests +++ b/s/runtests @@ -4,12 +4,12 @@ set -e ROOT=$(git rev-parse --show-toplevel) [ -z $BUILD ] && BUILD=Debug ; export BUILD -UNIT_TESTS=$BUILD/eressea/test_eressea -RUN_TESTS=$BUILD/eressea/eressea +UNIT_TESTS=$ROOT/$BUILD/eressea/test_eressea +RUN_TESTS=$ROOT/$BUILD/eressea/eressea if [ "$1" = "-V" ]; then VALGRIND=$(which valgrind) if [ -n "$VALGRIND" ]; then -SUPP=share/ubuntu-12_04.supp +SUPP=$ROOT/share/ubuntu-12_04.supp UNIT_TESTS="$VALGRIND --quiet --suppressions=$SUPP --error-exitcode=1 --leak-check=no $UNIT_TESTS" RUN_TESTS="$VALGRIND --quiet --suppressions=$SUPP --error-exitcode=1 --leak-check=no $RUN_TESTS" fi @@ -21,12 +21,11 @@ if [ ! -e $ROOT/$BUILD ]; then fi $UNIT_TESTS -cd $ROOT -[ -e eressea.ini ] || ln -sf conf/eressea.ini -$RUN_TESTS -v1 scripts/run-tests.lua -$RUN_TESTS -v1 scripts/run-tests-e2.lua -$RUN_TESTS -v1 scripts/run-tests-e3.lua +cd $ROOT/tests +$RUN_TESTS -v1 ../scripts/run-tests.lua +$RUN_TESTS -v1 ../scripts/run-tests-e2.lua +$RUN_TESTS -v1 ../scripts/run-tests-e3.lua $RUN_TESTS --version -rm -rf data reports orders.txt score score.alliances datum turn +rm -rf reports orders.txt score score.alliances datum turn cd $OLDWPD diff --git a/scripts/tests/process.lua b/scripts/tests/process.lua index f6ea63933..6288a8134 100644 --- a/scripts/tests/process.lua +++ b/scripts/tests/process.lua @@ -37,5 +37,5 @@ function test_process_turn() assert_file("reports/reports.txt") os.remove("reports") os.remove("data") - assert_equal(turn+1, get_turn()) +-- assert_equal(turn+1, get_turn()) end From c6ba91981c6ab07e3e8c13ffbc8ac69111a961c8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 21:13:09 +0100 Subject: [PATCH 024/231] fix turn processing check --- scripts/tests/process.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/tests/process.lua b/scripts/tests/process.lua index 6288a8134..0006fcd74 100644 --- a/scripts/tests/process.lua +++ b/scripts/tests/process.lua @@ -2,11 +2,10 @@ require "lunit" module("tests.process", package.seeall, lunit.testcase) -local u, r, f, turn +local u, r, f function setup() eressea.free_game() - turn = get_turn() r = region.create(0, 0, "plain") f = faction.create("human", "bernd@eressea.de", "de") u = unit.create(f, r, 1) @@ -25,8 +24,11 @@ local function assert_file(filename, exists) end function test_process_turn() + turn = get_turn() + turn_begin() + assert_equal(turn+1, get_turn()) u:add_order("NUMMER PARTEI 777") - process_orders() + turn_process() assert_equal(0, init_reports()) assert_equal(0, write_reports()) assert_equal(0, eressea.write_game("test.dat")) @@ -37,5 +39,6 @@ function test_process_turn() assert_file("reports/reports.txt") os.remove("reports") os.remove("data") --- assert_equal(turn+1, get_turn()) + turn_end() + assert_equal(turn+1, get_turn()) end From e06248cf1e290c375b45b61ccbbe7c4306cce488 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Feb 2018 21:24:38 +0100 Subject: [PATCH 025/231] remove residual data for an unfinished "city" feature. --- src/kernel/building.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/kernel/building.c b/src/kernel/building.c index 3bbd5891d..0e98cef7a 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -673,17 +673,16 @@ building *largestbuilding(const region * r, cmp_building_cb cmp_gt, } return best; } -/* Lohn bei den einzelnen Burgstufen f�r Normale Typen, Orks, Bauern, - * Modifikation f�r St�dter. */ +/* Lohn bei den einzelnen Burgstufen f�r Normale Typen, Orks, Bauern */ -static const int wagetable[7][4] = { - { 10, 10, 11, -7 }, /* Baustelle */ - { 10, 10, 11, -5 }, /* Handelsposten */ - { 11, 11, 12, -3 }, /* Befestigung */ - { 12, 11, 13, -1 }, /* Turm */ - { 13, 12, 14, 0 }, /* Burg */ - { 14, 12, 15, 1 }, /* Festung */ - { 15, 13, 16, 2 } /* Zitadelle */ +static const int wagetable[7][3] = { + { 10, 10, 11 }, /* Baustelle */ + { 10, 10, 11 }, /* Handelsposten */ + { 11, 11, 12 }, /* Befestigung */ + { 12, 11, 13 }, /* Turm */ + { 13, 12, 14 }, /* Burg */ + { 14, 12, 15 }, /* Festung */ + { 15, 13, 16 } /* Zitadelle */ }; static int From ff33073bd9a53f73fb9bdcaee11e569c7ad77ab9 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Feb 2018 09:43:40 +0100 Subject: [PATCH 026/231] unused function --- src/modules/autoseed.c | 52 ------------------------------------------ 1 file changed, 52 deletions(-) diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 17ea1084f..71aa6aae4 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -81,58 +81,6 @@ const terrain_type *random_terrain(const terrain_type * terrains[], return terrain; } -static int count_demand(const region * r) -{ - struct demand *dmd; - int c = 0; - if (r->land) { - for (dmd = r->land->demands; dmd; dmd = dmd->next) - c++; - } - return c; -} - -static int -recurse_regions(region * r, region_list ** rlist, - bool(*fun) (const region * r)) -{ - if (!fun(r)) - return 0; - else { - int len = 0; - direction_t d; - region_list *rl = calloc(sizeof(region_list), 1); - rl->next = *rlist; - rl->data = r; - (*rlist) = rl; - fset(r, RF_MARK); - for (d = 0; d != MAXDIRECTIONS; ++d) { - region *nr = rconnect(r, d); - if (nr && !fval(nr, RF_MARK)) - len += recurse_regions(nr, rlist, fun); - } - return len + 1; - } -} - -static bool f_nolux(const region * r) -{ - return (r->land && count_demand(r) != get_maxluxuries()); -} - -int fix_all_demand(region *rd) { - region_list *rl, *rlist = NULL; - recurse_regions(rd, &rlist, f_nolux); - for (rl = rlist; rl; rl = rl->next) { - region *r = rl->data; - freset(r, RF_MARK); /* undo recursive marker */ - if (!fix_demand(r)) { - return -1; - } - } - return 0; -} - /* nach 150 Runden ist Neustart erlaubt */ #define MINAGE_MULTI 150 newfaction *read_newfactions(const char *filename) From f67a4943e46bdcc3ed6a7bddd4ca744ce551955f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Feb 2018 15:43:24 +0100 Subject: [PATCH 027/231] fix some cppcheck warnings --- src/kernel/build.c | 5 ++--- src/kernel/config.c | 33 --------------------------------- src/kernel/connection.c | 4 +--- src/kernel/order.c | 2 +- src/kernel/terrain.c | 2 +- src/modules/autoseed.c | 2 +- src/modules/museum.c | 5 ++--- src/races/zombies.c | 4 +--- src/triggers/changerace.c | 2 +- src/util/language.c | 5 +++-- src/util/unicode.c | 3 --- 11 files changed, 13 insertions(+), 54 deletions(-) diff --git a/src/kernel/build.c b/src/kernel/build.c index 677cf96fc..60ac94e53 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -472,16 +472,15 @@ static int count_materials(unit *u, const construction *type, int n, int complet int c; for (c = 0; n > 0 && type->materials[c].number; c++) { const struct resource_type *rtype = type->materials[c].rtype; - int need, prebuilt; int canuse = get_pooled(u, rtype, GET_DEFAULT, INT_MAX); canuse = matmod(u, rtype, canuse); assert(canuse >= 0); if (type->reqsize > 1) { - prebuilt = + int prebuilt = required(completed, type->reqsize, type->materials[c].number); for (; n;) { - need = + int need = required(completed + n, type->reqsize, type->materials[c].number); if (need - prebuilt <= canuse) break; diff --git a/src/kernel/config.c b/src/kernel/config.c index 9a5ba0104..2895ed70a 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -147,39 +147,6 @@ const char *parameters[MAXPARAMS] = { "ALLIANZ" }; -FILE *debug; - -void -parse(keyword_t kword, int(*dofun) (unit *, struct order *), bool thisorder) -{ - region *r; - - for (r = regions; r; r = r->next) { - unit **up = &r->units; - while (*up) { - unit *u = *up; - order **ordp = &u->orders; - if (thisorder) - ordp = &u->thisorder; - while (*ordp) { - order *ord = *ordp; - if (getkeyword(ord) == kword) { - if (dofun(u, ord) != 0) - break; - if (u->orders == NULL) - break; - } - if (thisorder) - break; - if (*ordp == ord) - ordp = &ord->next; - } - if (*up == u) - up = &u->next; - } - } -} - int findoption(const char *s, const struct locale *lang) { void **tokens = get_translations(lang, UT_OPTIONS); diff --git a/src/kernel/connection.c b/src/kernel/connection.c index 516cb6ead..6f73c94f2 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -225,7 +225,7 @@ border_type *find_bordertype(const char *name) void b_read(connection * b, gamedata * data) { storage * store = data->store; - int n, result = 0; + int n; switch (b->type->datatype) { case VAR_NONE: case VAR_INT: @@ -240,9 +240,7 @@ void b_read(connection * b, gamedata * data) case VAR_VOIDPTR: default: assert(!"invalid variant type in connection"); - result = 0; } - assert(result >= 0 || "EOF encountered?"); } void b_write(const connection * b, storage * store) diff --git a/src/kernel/order.c b/src/kernel/order.c index 8defd05c9..807541ac1 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -242,10 +242,10 @@ order *create_order(keyword_t kwd, const struct locale * lang, va_start(marker, params); sbs_init(&sbs, zBuffer, sizeof(zBuffer)); while (*params) { - int i; const char *s; tok = strchr(params, '%'); if (tok) { + int i; if (tok != params) { sbs_strncat(&sbs, params, tok - params); } diff --git a/src/kernel/terrain.c b/src/kernel/terrain.c index 5a46b7fe7..6a5b4652d 100644 --- a/src/kernel/terrain.c +++ b/src/kernel/terrain.c @@ -71,12 +71,12 @@ bool terrain_changed(int *cache) { void free_terrains(void) { while (registered_terrains) { - int n; terrain_type * t = registered_terrains; registered_terrains = t->next; free(t->_name); free(t->herbs); if (t->production) { + int n; for (n = 0; t->production[n].type; ++n) { free(t->production[n].base); free(t->production[n].divisor); diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 71aa6aae4..374b6379c 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -807,9 +807,9 @@ static void smooth_island(region_list * island) region_list *rlist = NULL; for (rlist = island; rlist; rlist = rlist->next) { region *r = rlist->data; - int n, nland = 0; if (r->land) { + int n, nland = 0; get_neighbours(r, rn); for (n = 0; n != MAXDIRECTIONS && nland <= 1; ++n) { if (rn[n]->land) { diff --git a/src/modules/museum.c b/src/modules/museum.c index d854d1763..9daa623ef 100644 --- a/src/modules/museum.c +++ b/src/modules/museum.c @@ -301,7 +301,6 @@ order * ord) attrib *a; region *r; unit *warden = findunit(atoi36("mwar")); - int unit_cookie; UNUSED_ARG(amount); @@ -316,11 +315,11 @@ order * ord) r = findregion(a->data.sa[0], a->data.sa[1]); assert(r); a_remove(&u->attribs, a); - /* bergebene Gegenstnde zurckgeben */ + /* Übergebene Gegenstände zurückgeben */ a = a_find(u->attribs, &at_museumgivebackcookie); if (a) { - unit_cookie = a->data.i; + int unit_cookie = a->data.i; a_remove(&u->attribs, a); for (a = a_find(warden->attribs, &at_museumgiveback); diff --git a/src/races/zombies.c b/src/races/zombies.c index 74bf53a76..de3d81972 100644 --- a/src/races/zombies.c +++ b/src/races/zombies.c @@ -43,7 +43,6 @@ void make_undead_unit(unit * u) void age_undead(unit * u) { region *r = u->region; - int n = 0; /* untote, die einer partei angehoeren, koennen sich * absplitten, anstatt sich zu vermehren. monster @@ -51,10 +50,9 @@ void age_undead(unit * u) if (u->number > UNDEAD_MIN && !is_monsters(u->faction) && rng_int() % 100 < UNDEAD_BREAKUP) { - int m; + int m, n = 0; unit *u2; - n = 0; for (m = u->number; m; m--) { if (rng_int() % 100 < UNDEAD_BREAKUP_FRACTION) ++n; diff --git a/src/triggers/changerace.c b/src/triggers/changerace.c index 5ab56b346..0f644c47b 100644 --- a/src/triggers/changerace.c +++ b/src/triggers/changerace.c @@ -111,7 +111,7 @@ trigger *trigger_changerace(struct unit * u, const struct race * prace, trigger *t = t_new(&tt_changerace); changerace_data *td = (changerace_data *)t->data.v; - assert(u_race(u) == u_irace(u) || "!changerace-triggers cannot stack!"); + assert(u_race(u) == u_irace(u) || !"changerace-triggers cannot stack!"); td->u = u; td->race = prace; td->irace = irace; diff --git a/src/util/language.c b/src/util/language.c index 689ccfcd7..cf76dc4de 100644 --- a/src/util/language.c +++ b/src/util/language.c @@ -257,8 +257,9 @@ static lstr lstrs[MAXLOCALES]; void ** get_translations(const struct locale *lang, int index) { assert(lang); - assert(lang->index < MAXLOCALES - || "you have to increase MAXLOCALES and recompile"); + if (lang->index >= MAXLOCALES) { + log_fatal("you have to increase MAXLOCALES and recompile"); + } if (lang->index < MAXLOCALES) { return lstrs[lang->index].tokens + index; } diff --git a/src/util/unicode.c b/src/util/unicode.c index 10d43f947..85a341ddf 100644 --- a/src/util/unicode.c +++ b/src/util/unicode.c @@ -108,9 +108,6 @@ int unicode_utf8_tolower(utf8_t * op, size_t outlen, const utf8_t * ip) } } - if (outlen <= 0) { - return ENOMEM; - } *op = 0; return 0; } From 398a25865827914eea70c4ae5189756d12301da0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Feb 2018 15:57:31 +0100 Subject: [PATCH 028/231] cppcheck: variable scopes, etc. --- src/economy.c | 14 +++++++------- src/give.c | 10 +++------- src/gmtool.c | 13 +++++++------ src/jsonconf.c | 3 ++- src/laws.c | 2 +- src/magic.c | 4 ++-- src/move.c | 5 +++-- src/names.c | 21 ++++++++++----------- src/piracy.c | 2 +- src/prefix.c | 2 +- src/spells.c | 4 ++-- 11 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/economy.c b/src/economy.c index a992729f4..995705aa6 100644 --- a/src/economy.c +++ b/src/economy.c @@ -333,7 +333,7 @@ static int do_recruiting(recruitment * recruits, int available) for (req = rec->requests; req; req = req->next) { unit *u = req->unit; const race *rc = u_race(u); /* race is set in recruit() */ - int number, dec; + int number; double multi = 2.0 * rc->recruit_multi; number = (int)(get / multi); @@ -359,7 +359,7 @@ static int do_recruiting(recruitment * recruits, int available) } add_recruits(u, number, req->qty); if (number > 0) { - dec = (int)(number * multi); + int dec = (int)(number * multi); if ((rc->ec_flags & ECF_REC_ETHEREAL) == 0) { recruited += dec; } @@ -1006,7 +1006,7 @@ static void allocate_resource(unit * u, const resource_type * rtype, int want) } } - assert(sk != NOSKILL || "limited resource needs a required skill for making it"); + assert(sk != NOSKILL || !"limited resource needs a required skill for making it"); skill = effskill(u, sk, 0); if (skill == 0) { add_message(&u->faction->msgs, @@ -1075,13 +1075,12 @@ leveled_allocation(const resource_type * rtype, region * r, allocation * alist) { const item_type *itype = resource2item(rtype); rawmaterial *rm = rm_get(r, rtype); - int need; bool first = true; if (rm != NULL) { + int need; do { - int avail = rm->amount; - int nreq = 0; + int avail = rm->amount, nreq = 0; allocation *al; if (avail <= 0) { @@ -1093,7 +1092,7 @@ leveled_allocation(const resource_type * rtype, region * r, allocation * alist) assert(avail > 0); - for (al = alist; al; al = al->next) + for (al = alist; al; al = al->next) { if (!fval(al, AFL_DONE)) { int req = required(al->want - al->get, al->save); assert(al->get <= al->want && al->get >= 0); @@ -1112,6 +1111,7 @@ leveled_allocation(const resource_type * rtype, region * r, allocation * alist) fset(al, AFL_LOWSKILL); } } + } need = nreq; if (avail > nreq) avail = nreq; diff --git a/src/give.c b/src/give.c index 5d5673bd2..21e099394 100644 --- a/src/give.c +++ b/src/give.c @@ -158,18 +158,15 @@ static bool limited_give(const item_type * type) int give_quota(const unit * src, const unit * dst, const item_type * type, int n) { - double divisor; - if (!limited_give(type)) { return n; } if (dst && src && src->faction != dst->faction) { - divisor = config_get_flt("rules.items.give_divisor", 1); + int divisor = config_get_int("rules.items.give_divisor", 1); assert(divisor <= 0 || divisor >= 1); if (divisor >= 1) { /* predictable > correct: */ - int x = (int)(n / divisor); - return x; + return n / divisor; } } return n; @@ -306,7 +303,6 @@ static bool rule_transfermen(void) message * give_men(int n, unit * u, unit * u2, struct order *ord) { ship *sh; - int k = 0; int error = 0; message * msg; int maxt = max_transfers(); @@ -391,7 +387,7 @@ message * give_men(int n, unit * u, unit * u2, struct order *ord) } if (has_skill(u, SK_ALCHEMY) || has_skill(u2, SK_ALCHEMY)) { - k = count_skill(u2->faction, SK_ALCHEMY); + int k = count_skill(u2->faction, SK_ALCHEMY); /* Falls die Zieleinheit keine Alchemisten sind, werden sie nun * welche. */ diff --git a/src/gmtool.c b/src/gmtool.c index d74f1e46b..51a86e16c 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -137,10 +137,10 @@ int umvwaddnstr(WINDOW *w, int y, int x, const char * str, int len) { static void init_curses(void) { - int fg, bg; initscr(); if (has_colors() || force_color) { + int fg, bg; short bcol = COLOR_BLACK; short hcol = COLOR_MAGENTA; start_color(); @@ -316,11 +316,11 @@ static void paint_map(window * wnd, const state * st) int yp = (lines - vy - 1) * THEIGHT; for (vx = 0; vx != cols; ++vx) { map_region *mr = mr_get(&st->display, vx, vy); - int attr = 0; - int hl = 0; int xp = vx * TWIDTH + (vy & 1) * TWIDTH / 2; int nx, ny; if (mr) { + int attr = 0; + int hl = 0; cnormalize(&mr->coord, &nx, &ny); if (tagged_region(st->selected, nx, ny)) { attr |= A_REVERSE; @@ -336,9 +336,9 @@ static void paint_map(window * wnd, const state * st) map_region *cursor_region(const view * v, const coordinate * c) { coordinate relpos; - int cx, cy; if (c) { + int cx, cy; relpos.x = c->x - v->topleft.x; relpos.y = c->y - v->topleft.y; cy = relpos.y; @@ -426,13 +426,14 @@ static void paint_info_region(window * wnd, const state * st) { WINDOW *win = wnd->handle; int size = getmaxx(win) - 2; - int line = 0, maxline = getmaxy(win) - 2; + int maxline = getmaxy(win) - 2; map_region *mr = cursor_region(&st->display, &st->cursor); UNUSED_ARG(st); werase(win); wxborder(win); if (mr && mr->r) { + int line = 0; const region *r = mr->r; if (r->land) { umvwaddnstr(win, line++, 1, (char *)r->land->name, size); @@ -708,10 +709,10 @@ static void select_regions(state * st, int selectmode) doupdate(); findmode = getch(); if (findmode == 'n') { /* none */ - int i; sprintf(sbuffer, "%snone", status); statusline(st->wnd_status->handle, sbuffer); if (selectmode & MODE_SELECT) { + int i; for (i = 0; i != MAXTHASH; ++i) { tag **tp = &st->selected->tags[i]; while (*tp) { diff --git a/src/jsonconf.c b/src/jsonconf.c index dcab0e9c6..ed10f558f 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -124,7 +124,7 @@ static void json_maintenance_i(cJSON *json, maintenance *mt) { static void json_maintenance(cJSON *json, maintenance **mtp) { cJSON *child; maintenance *mt; - int i, size = 1; + int size = 1; if (json->type == cJSON_Array) { size = cJSON_GetArraySize(json); @@ -135,6 +135,7 @@ static void json_maintenance(cJSON *json, maintenance **mtp) { } *mtp = mt = (struct maintenance *) calloc(sizeof(struct maintenance), size + 1); if (json->type == cJSON_Array) { + int i; for (i = 0, child = json->child; child; child = child->next, ++i) { if (child->type == cJSON_Object) { json_maintenance_i(child, mt + i); diff --git a/src/laws.c b/src/laws.c index ac8b3d612..a31d67589 100644 --- a/src/laws.c +++ b/src/laws.c @@ -2720,10 +2720,10 @@ static void age_stonecircle(building *b) { curse *c = get_curse(rt->attribs, &ct_astralblock); if (!c) { int sk = effskill(mage, SK_MAGIC, 0); - float effect = 100; if (sk > 0) { int vig = sk; int dur = (sk + 1) / 2; + float effect = 100; /* the mage reactivates the circle */ c = create_curse(mage, &rt->attribs, &ct_astralblock, vig, dur, effect, 0); diff --git a/src/magic.c b/src/magic.c index 5cfd4d071..b64ec221a 100644 --- a/src/magic.c +++ b/src/magic.c @@ -499,13 +499,13 @@ void unset_combatspell(unit * u, spell * sp) { sc_mage *m; int nr = 0; - int i; m = get_mage_depr(u); if (!m) return; if (!sp) { + int i; for (i = 0; i < MAXCOMBATSPELLS; i++) { m->combatspells[i].sp = NULL; } @@ -1589,13 +1589,13 @@ verify_targets(castorder * co, int *invalid, int *resist, int *success) const spell *sp = co->sp; region *target_r = co_get_region(co); spellparameter *sa = co->par; - int i; *invalid = 0; *resist = 0; *success = 0; if (sa && sa->length) { + int i; /* zuerst versuchen wir vorher nicht gefundene Objekte zu finden. * Wurde ein Objekt durch globalsuche gefunden, obwohl der Zauber * gar nicht global hätte suchen dürften, setzen wir das Objekt diff --git a/src/move.c b/src/move.c index 3a007d26d..72d311395 100644 --- a/src/move.c +++ b/src/move.c @@ -284,7 +284,7 @@ static int ridingcapacity(const unit * u) int walkingcapacity(const struct unit *u) { int n, people, pferde_fuer_wagen, horses; - int wagen_ohne_pferde, wagen_mit_pferden, wagen_mit_trollen; + int wagen_mit_pferden; int vehicles = 0, vcap = 0; int animals = 0, acap = 0; const struct resource_type *rhorse = rt_find("horse"); @@ -312,6 +312,7 @@ int walkingcapacity(const struct unit *u) n = wagen_mit_pferden * vcap; if (u_race(u) == get_race(RC_TROLL)) { + int wagen_ohne_pferde, wagen_mit_trollen; /* 4 Trolle ziehen einen Wagen. */ /* Unbesetzte Wagen feststellen */ wagen_ohne_pferde = vehicles - wagen_mit_pferden; @@ -682,7 +683,6 @@ static bool is_freezing(const unit * u) int check_ship_allowed(struct ship *sh, const region * r) { - int c = 0; const building_type *bt_harbour = bt_find("harbour"); if (sh->region && r_insectstalled(r)) { @@ -708,6 +708,7 @@ int check_ship_allowed(struct ship *sh, const region * r) return SA_COAST; } if (sh->type->coasts) { + int c; for (c = 0; sh->type->coasts[c] != NULL; ++c) { if (sh->type->coasts[c] == r->terrain) { return SA_COAST; diff --git a/src/names.c b/src/names.c index d8abc077b..1bb6014a6 100644 --- a/src/names.c +++ b/src/names.c @@ -350,7 +350,6 @@ static void dracoid_name(unit * u) { static char name[NAMESIZE + 1]; int mid_syllabels; - size_t sz; /* ignore u */ UNUSED_ARG(u); @@ -358,14 +357,14 @@ static void dracoid_name(unit * u) mid_syllabels = rng_int() % 4; - sz = str_strlcpy(name, drac_pre[rng_int() % DRAC_PRE], sizeof(name)); + str_strlcpy(name, drac_pre[rng_int() % DRAC_PRE], sizeof(name)); while (mid_syllabels > 0) { mid_syllabels--; if (rng_int() % 10 < 4) str_strlcat(name, "'", sizeof(name)); - sz += str_strlcat(name, drac_mid[rng_int() % DRAC_MID], sizeof(name)); + str_strlcat(name, drac_mid[rng_int() % DRAC_MID], sizeof(name)); } - sz += str_strlcat(name, drac_suf[rng_int() % DRAC_SUF], sizeof(name)); + str_strlcat(name, drac_suf[rng_int() % DRAC_SUF], sizeof(name)); unit_setname(u, name); } @@ -392,13 +391,13 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) while (*p != 0) { result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); /* Leerzeichen �berspringen */ while (*p != 0 && !iswalnum((wint_t)ucs)) { p += size; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); } /* Counter erh�hen */ @@ -409,7 +408,7 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) while (*p != 0 && iswalnum((wint_t)ucs)) { p += size; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); } } @@ -423,7 +422,7 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) bufp = buf; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); while (*p != 0 && c < maxchars) { /* Leerzeichen �berspringen */ @@ -431,7 +430,7 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) while (*p != 0 && !iswalnum((wint_t)ucs)) { p += size; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); } /* alnums �bertragen */ @@ -443,7 +442,7 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) ++c; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); } /* Bis zum n�chsten Leerzeichen */ @@ -451,7 +450,7 @@ const char *abkz(const char *s, char *buf, size_t buflen, size_t maxchars) while (c < maxchars && *p != 0 && iswalnum((wint_t)ucs)) { p += size; result = unicode_utf8_to_ucs4(&ucs, p, &size); - assert(result == 0 || "damnit, we're not handling invalid input here!"); + assert(result == 0 || !"damnit, we're not handling invalid input here!"); } } diff --git a/src/piracy.c b/src/piracy.c index da0e4a3e1..46977c3d8 100644 --- a/src/piracy.c +++ b/src/piracy.c @@ -122,7 +122,6 @@ void piracy_cmd(unit * u) const faction *target; int value; } aff[MAXDIRECTIONS]; - int saff = 0; int *il; assert(u->thisorder); @@ -139,6 +138,7 @@ void piracy_cmd(unit * u) /* Wenn nicht, sehen wir, ob wir ein Ziel finden. */ if (target_dir == NODIRECTION) { + int saff = 0; direction_t dir; /* Einheit ist also Kapitn. Jetzt gucken, in wievielen * Nachbarregionen potentielle Opfer sind. */ diff --git a/src/prefix.c b/src/prefix.c index f40a08091..84c026625 100644 --- a/src/prefix.c +++ b/src/prefix.c @@ -37,8 +37,8 @@ int add_raceprefix(const char *prefix) } void free_prefixes(void) { - int i; if (race_prefixes) { + int i; for (i = 0; race_prefixes[i]; ++i) { free(race_prefixes[i]); } diff --git a/src/spells.c b/src/spells.c index 12778e9d4..cc7eed8b1 100644 --- a/src/spells.c +++ b/src/spells.c @@ -537,7 +537,6 @@ static int sp_summon_familiar(castorder * co) unit *mage = co->magician.u; int cast_level = co->level; const race *rc; - int dh; message *msg; char zText[2048]; @@ -553,7 +552,8 @@ static int sp_summon_familiar(castorder * co) if (fval(rc, RCF_SWIM) && !fval(rc, RCF_WALK)) { int coasts = is_coastregion(r); - int dir; + int dir, dh; + if (coasts == 0) { cmistake(mage, co->order, 229, MSG_MAGIC); return 0; From b5ea102372316a43882467875f24bcd2f2c4507f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Feb 2018 16:14:00 +0100 Subject: [PATCH 029/231] cppcheck: scope reductions and a false positive. --- src/economy.c | 15 ++++++--------- src/report.c | 2 +- src/reports.c | 8 ++++---- src/study.c | 8 +++++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/economy.c b/src/economy.c index 995705aa6..219d818f9 100644 --- a/src/economy.c +++ b/src/economy.c @@ -1190,15 +1190,13 @@ attrib_allocation(const resource_type * rtype, region * r, allocation * alist) assert(avail == 0 || nreq == 0); } -typedef void(*allocate_function) (const resource_type *, struct region *, - struct allocation *); - -static allocate_function get_allocator(const struct resource_type *rtype) -{ +static void allocate(const resource_type *rtype, region *r, allocation *data) { if (rtype->raw) { - return leveled_allocation; + leveled_allocation(rtype, r, data); + } + else { + attrib_allocation(rtype, r, data); } - return attrib_allocation; } void split_allocations(region * r) @@ -1207,11 +1205,10 @@ void split_allocations(region * r) while (*p_alist) { allocation_list *alist = *p_alist; const resource_type *rtype = alist->type; - allocate_function alloc = get_allocator(rtype); const item_type *itype = resource2item(rtype); allocation **p_al = &alist->data; - alloc(rtype, r, alist->data); + allocate(rtype, r, alist->data); while (*p_al) { allocation *al = *p_al; diff --git a/src/report.c b/src/report.c index 30ea34fdf..9e98e5162 100644 --- a/src/report.c +++ b/src/report.c @@ -304,7 +304,6 @@ void nr_spell_syntax(struct stream *out, spellbook_entry * sbe, const struct loc }; starget *targetp; char cp = *params++; - int i, maxparam = 0; const char *locp; const char *syntaxp = sp->syntax; @@ -359,6 +358,7 @@ void nr_spell_syntax(struct stream *out, spellbook_entry * sbe, const struct loc WARN_STATIC_BUFFER(); } else if (cp == 'k') { + int i, maxparam = 0; bool multi = false; if (params && *params == 'c') { /* skip over a potential id */ diff --git a/src/reports.c b/src/reports.c index 602edb83c..d4be5c8ce 100644 --- a/src/reports.c +++ b/src/reports.c @@ -575,7 +575,6 @@ report_resources(const region * r, resource_report * result, int size, if (see_unit) { rawmaterial *res = r->resources; while (res) { - int maxskill = 0; const item_type *itype = resource2item(res->rtype); int minskill = itype->construction->minskill; skill_t skill = itype->construction->skill; @@ -588,6 +587,7 @@ report_resources(const region * r, resource_report * result, int size, } else { const unit *u; + int maxskill = 0; for (u = r->units; visible != res->amount && u != NULL; u = u->next) { if (u->faction == viewer) { int s = effskill(u, skill, 0); @@ -923,7 +923,7 @@ spskill(char *buffer, size_t size, const struct locale * lang, const struct unit * u, struct skill * sv, int *dh, int days) { char *bufp = buffer; - int i, effsk; + int effsk; if (!u->number) return 0; @@ -953,7 +953,7 @@ spskill(char *buffer, size_t size, const struct locale * lang, } if (sv->id == SK_STEALTH && fval(u, UFL_STEALTH)) { - i = u_geteffstealth(u); + int i = u_geteffstealth(u); if (i >= 0) { if (wrptr(&bufp, &size, snprintf(bufp, size, "%d/", i)) != 0) WARN_STATIC_BUFFER(); @@ -2276,7 +2276,6 @@ static void eval_trail(struct opstack **stack, const void *userdata) { /* order -> string */ const faction *report = (const faction *)userdata; const struct locale *lang = report ? report->locale : default_locale; - int i, end = 0, begin = 0; const arg_regions *aregs = (const arg_regions *)opop(stack).v; char buf[512]; size_t size = sizeof(buf) - 1; @@ -2288,6 +2287,7 @@ static void eval_trail(struct opstack **stack, const void *userdata) #endif if (aregs != NULL) { + int i, end = 0, begin = 0; end = aregs->nregions; for (i = begin; i < end; ++i) { region *r = aregs->regions[i]; diff --git a/src/study.c b/src/study.c index d9e66f1f9..1dbc890ed 100644 --- a/src/study.c +++ b/src/study.c @@ -475,10 +475,10 @@ typedef enum study_rule_t { static double study_speedup(unit * u, skill_t s, study_rule_t rule) { #define MINTURN 16 - double learnweeks = 0; - int i; if (turn > MINTURN) { if (rule == STUDY_FASTER) { + double learnweeks = 0; + int i; for (i = 0; i != u->skill_size; ++i) { skill *sv = u->skills + i; if (sv->id == s) { @@ -491,6 +491,8 @@ static double study_speedup(unit * u, skill_t s, study_rule_t rule) return 2.0; /* If the skill was not found it is the first study. */ } if (rule == STUDY_AUTOTEACH) { + double learnweeks = 0; + int i; for (i = 0; i != u->skill_size; ++i) { skill *sv = u->skills + i; learnweeks += (sv->level * (sv->level + 1) / 2.0); @@ -547,7 +549,6 @@ int study_cmd(unit * u, order * ord) { region *r = u->region; int p; - magic_t mtyp; int l; int studycost, days; double multi = 1.0; @@ -621,6 +622,7 @@ int study_cmd(unit * u, order * ord) } if (sk == SK_MAGIC) { + magic_t mtyp; if (u->number > 1) { cmistake(u, ord, 106, MSG_MAGIC); return -1; From f4be3a1374e5128a766381c7cabb63cac1a0a031 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 14 Feb 2018 11:24:38 +0100 Subject: [PATCH 030/231] remove duplication setstatus -> unit_setstatus --- src/kernel/save.c | 2 +- src/kernel/unit.c | 10 +--------- src/kernel/unit.h | 1 - src/laws.c | 16 ++++++++-------- src/monsters.c | 4 ++-- src/spells.c | 6 +++--- src/spells/combatspells.c | 8 ++++---- 7 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/kernel/save.c b/src/kernel/save.c index a4bfdcbca..a88ae6fb8 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -495,7 +495,7 @@ unit *read_unit(gamedata *data) } READ_INT(data->store, &n); - setstatus(u, n); + unit_setstatus(u, n); READ_INT(data->store, &u->flags); u->flags &= UFL_SAVEMASK; if ((u->flags & UFL_ANON_FACTION) && !rule_stealth_anon()) { diff --git a/src/kernel/unit.c b/src/kernel/unit.c index acc28fff3..3519b43b0 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -1530,7 +1530,7 @@ unit *create_unit(region * r, faction * f, int number, const struct race *urace, attrib *a; /* erbt Kampfstatus */ - setstatus(u, creator->status); + unit_setstatus(u, creator->status); /* erbt Gebaeude/Schiff */ if (creator->region == r) { @@ -1985,14 +1985,6 @@ bool has_horses(const unit * u) return false; } -void setstatus(unit *u, int status) -{ - assert(status >= ST_AGGRO && status <= ST_FLEE); - if (u->status != status) { - u->status = (status_t)status; - } -} - #define MAINTENANCE 10 int maintenance_cost(const struct unit *u) { diff --git a/src/kernel/unit.h b/src/kernel/unit.h index 91a3ec930..e7bf6a9e4 100644 --- a/src/kernel/unit.h +++ b/src/kernel/unit.h @@ -267,7 +267,6 @@ extern "C" { int getunit(const struct region * r, const struct faction * f, struct unit **uresult); int read_unitid(const struct faction *f, const struct region *r); - void setstatus(struct unit *u, int status); /* !< sets combatstatus of a unit */ int besieged(const struct unit *u); bool has_horses(const struct unit *u); diff --git a/src/laws.c b/src/laws.c index a31d67589..d09236875 100644 --- a/src/laws.c +++ b/src/laws.c @@ -2438,22 +2438,22 @@ int status_cmd(unit * u, struct order *ord) s = gettoken(token, sizeof(token)); switch (findparam(s, u->faction->locale)) { case P_NOT: - setstatus(u, ST_AVOID); + unit_setstatus(u, ST_AVOID); break; case P_BEHIND: - setstatus(u, ST_BEHIND); + unit_setstatus(u, ST_BEHIND); break; case P_FLEE: - setstatus(u, ST_FLEE); + unit_setstatus(u, ST_FLEE); break; case P_CHICKEN: - setstatus(u, ST_CHICKEN); + unit_setstatus(u, ST_CHICKEN); break; case P_AGGRO: - setstatus(u, ST_AGGRO); + unit_setstatus(u, ST_AGGRO); break; case P_VORNE: - setstatus(u, ST_FIGHT); + unit_setstatus(u, ST_FIGHT); break; case P_HELP: if (getparam(u->faction->locale) == P_NOT) { @@ -2469,7 +2469,7 @@ int status_cmd(unit * u, struct order *ord) msg_feedback(u, ord, "unknown_status", "")); } else { - setstatus(u, ST_FIGHT); + unit_setstatus(u, ST_FIGHT); } } return 0; @@ -2940,7 +2940,7 @@ void maketemp_cmd(unit *u, order **olist) if (sh) { set_leftship(u2, sh); } - setstatus(u2, u->status); + unit_setstatus(u2, u->status); /* copy orders until K_END from u to u2 */ ordp = &makeord->next; diff --git a/src/monsters.c b/src/monsters.c index d1979414d..b68c5d576 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -615,11 +615,11 @@ static void recruit_dracoids(unit * dragon, int size) change_money(dragon, -un->number * 50); equip_unit(un, get_equipment("new_dracoid")); - setstatus(un, ST_FIGHT); + unit_setstatus(un, ST_FIGHT); for (weapon = un->items; weapon; weapon = weapon->next) { const weapon_type *wtype = weapon->type->rtype->wtype; if (wtype && wtype->flags & WTF_MISSILE) { - setstatus(un, ST_BEHIND); + unit_setstatus(un, ST_BEHIND); break; } } diff --git a/src/spells.c b/src/spells.c index cc7eed8b1..8612c92ef 100644 --- a/src/spells.c +++ b/src/spells.c @@ -518,7 +518,7 @@ static unit * make_familiar(unit * mage, region *r, const race *rc, const char * unit *fam; fam = create_unit(r, mage->faction, 1, rc, 0, name, mage); - setstatus(fam, ST_FLEE); + unit_setstatus(fam, ST_FLEE); fset(fam, UFL_LOCKED); /* triggers: */ @@ -2161,7 +2161,7 @@ static int sp_ironkeeper(castorder * co) create_unit(r, mage->faction, 1, get_race(RC_IRONKEEPER), 0, NULL, mage); /*keeper->age = cast_level + 2; */ - setstatus(keeper, ST_AVOID); /* kaempft nicht */ + unit_setstatus(keeper, ST_AVOID); /* kaempft nicht */ setguard(keeper, true); fset(keeper, UFL_ISNEW); /* Parteitarnen, damit man nicht sofort wei�, wer dahinter steckt */ @@ -4630,7 +4630,7 @@ int sp_clonecopy(castorder * co) clone = create_unit(target_region, mage->faction, 1, get_race(RC_CLONE), 0, name, mage); - setstatus(clone, ST_FLEE); + unit_setstatus(clone, ST_FLEE); fset(clone, UFL_LOCKED); create_newclone(mage, clone); diff --git a/src/spells/combatspells.c b/src/spells/combatspells.c index adaa832d9..4f7974018 100644 --- a/src/spells/combatspells.c +++ b/src/spells/combatspells.c @@ -731,7 +731,7 @@ static fighter *summon_allies(const fighter *fi, const race *rc, int number) { unit *u = create_unit(r, mage->faction, number, rc, 0, NULL, mage); leave(u, true); - setstatus(u, ST_FIGHT); + unit_setstatus(u, ST_FIGHT); u->hp = u->number * unit_max_hp(u); @@ -797,7 +797,7 @@ int sp_shadowknights(struct castorder * co) u = create_unit(r, mage->faction, force, get_race(RC_SHADOWKNIGHT), 0, NULL, mage); - setstatus(u, ST_FIGHT); + unit_setstatus(u, ST_FIGHT); u->hp = u->number * unit_max_hp(u); @@ -1280,7 +1280,7 @@ int sp_appeasement(struct castorder * co) } /* und bewachen nicht */ setguard(mage, false); - setstatus(mage, ST_FLEE); + unit_setstatus(mage, ST_FLEE); /* wir tun so, als w�re die Person geflohen */ fi->flags |= FIG_NOLOOT; @@ -1624,7 +1624,7 @@ int sp_undeadhero(struct castorder * co) else { unit_setinfo(u, NULL); } - setstatus(u, du->status); + unit_setstatus(u, du->status); setguard(u, false); for (ilist = &du->items; *ilist;) { item *itm = *ilist; From d15684a546645a92e590df78febc9f80131d4855 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 14 Feb 2018 20:00:48 +0100 Subject: [PATCH 031/231] fix test_process_turn failure. move turn global to calendar. promote calendar module to kernel. --- scripts/tests/process.lua | 24 ++++++++---- src/CMakeLists.txt | 2 - src/bind_region.c | 1 + src/bindings.c | 46 +++++++++++----------- src/creport.c | 39 ++++++++++--------- src/economy.c | 36 ++++++++--------- src/eressea.c | 39 +++++++++---------- src/gmtool.c | 26 ++++++------- src/jsonconf.c | 46 +++++++++++----------- src/jsonconf.test.c | 2 +- src/kernel/CMakeLists.txt | 2 + src/kernel/alliance.c | 21 +++++----- src/kernel/building.test.c | 1 + src/{ => kernel}/calendar.c | 1 + src/{ => kernel}/calendar.h | 1 + src/{ => kernel}/calendar.test.c | 0 src/kernel/config.c | 3 -- src/kernel/config.h | 2 - src/kernel/faction.c | 5 ++- src/kernel/faction.test.c | 1 + src/kernel/region.c | 3 +- src/kernel/save.c | 1 + src/kernel/unit.c | 1 + src/laws.c | 66 ++++++++++++++++---------------- src/laws.test.c | 1 + src/main.c | 1 + src/monsters.c | 50 ++++++++++++------------ src/morale.c | 17 ++++---- src/move.c | 43 +++++++++++---------- src/orderfile.c | 9 +++-- src/orderfile.test.c | 1 + src/report.c | 50 ++++++++++++------------ src/reports.c | 2 +- src/reports.test.c | 2 +- src/study.c | 2 + src/summary.c | 2 +- src/summary.test.c | 2 +- src/tests.c | 2 +- src/xmlreader.c | 2 +- 39 files changed, 290 insertions(+), 265 deletions(-) rename src/{ => kernel}/calendar.c (99%) rename src/{ => kernel}/calendar.h (97%) rename src/{ => kernel}/calendar.test.c (100%) diff --git a/scripts/tests/process.lua b/scripts/tests/process.lua index 0006fcd74..1fc9a64f5 100644 --- a/scripts/tests/process.lua +++ b/scripts/tests/process.lua @@ -24,21 +24,31 @@ local function assert_file(filename, exists) end function test_process_turn() + turn_begin() turn = get_turn() + turn_process() + turn_end() + assert_equal(turn, get_turn()) turn_begin() assert_equal(turn+1, get_turn()) + turn_process() + turn_end() +end + +function test_write_reports() + turn_begin() + turn = get_turn() u:add_order("NUMMER PARTEI 777") turn_process() assert_equal(0, init_reports()) assert_equal(0, write_reports()) - assert_equal(0, eressea.write_game("test.dat")) - assert_file("data/test.dat") - assert_file("reports/" .. get_turn() .. "-777.nr") - assert_file("reports/" .. get_turn() .. "-777.cr") - assert_file("reports/" .. get_turn() .. "-777.txt") + assert_file("reports/" .. turn .. "-777.nr") + assert_file("reports/" .. turn .. "-777.cr") + assert_file("reports/" .. turn .. "-777.txt") assert_file("reports/reports.txt") os.remove("reports") - os.remove("data") + assert_equal(0, eressea.write_game("test.dat")) + assert_file("data/test.dat") + os.remove("data/test.dat") turn_end() - assert_equal(turn+1, get_turn()) end diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a74d1d732..3c47385f1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -86,7 +86,6 @@ ENDIF() set (ERESSEA_SRC vortex.c - calendar.c move.c piracy.c spells.c @@ -198,7 +197,6 @@ set(TESTS_SRC academy.test.c alchemy.test.c battle.test.c - calendar.test.c creport.test.c direction.test.c donations.test.c diff --git a/src/bind_region.c b/src/bind_region.c index 8514bf639..a87b6f856 100644 --- a/src/bind_region.c +++ b/src/bind_region.c @@ -9,6 +9,7 @@ #include "chaos.h" +#include #include #include #include diff --git a/src/bindings.c b/src/bindings.c index 811c1853e..35657b5be 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -3,6 +3,28 @@ #endif #include "bindings.h" + +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/alliance.h" +#include "kernel/building.h" +#include "kernel/curse.h" +#include "kernel/equipment.h" +#include "kernel/unit.h" +#include "kernel/terrain.h" +#include "kernel/messages.h" +#include "kernel/region.h" +#include "kernel/building.h" +#include "kernel/plane.h" +#include "kernel/race.h" +#include "kernel/item.h" +#include "kernel/order.h" +#include "kernel/ship.h" +#include "kernel/faction.h" +#include "kernel/save.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" + #include "bind_unit.h" #include "bind_storage.h" #include "bind_building.h" @@ -13,33 +35,11 @@ #include "bind_ship.h" #include "bind_gmtool.h" #include "bind_region.h" + #include "helpers.h" #include "console.h" #include "reports.h" #include "study.h" -#include "calendar.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "economy.h" #include "summary.h" #include "teleport.h" diff --git a/src/creport.c b/src/creport.c index 04f6c6bc4..773628a82 100644 --- a/src/creport.c +++ b/src/creport.c @@ -42,25 +42,26 @@ without prior permission by the authors of Eressea. #include "teleport.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/alliance.h" +#include "kernel/ally.h" +#include "kernel/calendar.h" +#include "kernel/connection.h" +#include "kernel/building.h" +#include "kernel/curse.h" +#include "kernel/faction.h" +#include "kernel/group.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" +#include "kernel/terrain.h" +#include "kernel/unit.h" /* util includes */ #include diff --git a/src/economy.c b/src/economy.c index 219d818f9..9774ab3eb 100644 --- a/src/economy.c +++ b/src/economy.c @@ -36,7 +36,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "monsters.h" #include "morale.h" #include "reports.h" -#include "calendar.h" #include #include @@ -45,23 +44,24 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/ally.h" +#include "kernel/building.h" +#include "kernel/calendar.h" +#include "kernel/curse.h" +#include "kernel/equipment.h" +#include "kernel/faction.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/pool.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" /* util includes */ #include diff --git a/src/eressea.c b/src/eressea.c index 95d190d70..03f194238 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -1,29 +1,28 @@ #include -#include "settings.h" #include "eressea.h" -#include -#include +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/curse.h" +#include "kernel/building.h" +#include "kernel/equipment.h" +#include "kernel/item.h" +#include "kernel/database.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "util/functions.h" +#include "util/language.h" +#include "util/log.h" +#include "util/message.h" -#include -#include -#include +#include "modules/gmcmd.h" +#include "modules/xmas.h" +#include "modules/museum.h" +#include "triggers/triggers.h" +#include "items/xerewards.h" +#include "items/weapons.h" +#include "attributes/attributes.h" +#include "races/races.h" -#include "calendar.h" #include "chaos.h" #include "items.h" #include "creport.h" diff --git a/src/gmtool.c b/src/gmtool.c index 51a86e16c..ffe189611 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -23,18 +23,19 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/building.h" +#include "kernel/calendar.h" +#include "kernel/faction.h" +#include "kernel/item.h" +#include "kernel/plane.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" +#include "kernel/resources.h" +#include "kernel/save.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" #include #include @@ -53,7 +54,6 @@ #include "console.h" #include "listbox.h" #include "wormhole.h" -#include "calendar.h" #include "teleport.h" #include "xmlreader.h" diff --git a/src/jsonconf.c b/src/jsonconf.c index ed10f558f..c14ac9216 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -11,36 +11,36 @@ without prior permission by the authors of Eressea. */ #include -#include #include "jsonconf.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/building.h" +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/equipment.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" /* util includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "util/attrib.h" +#include "util/crmessage.h" +#include "util/functions.h" +#include "util/language.h" +#include "util/log.h" +#include "util/message.h" +#include "util/nrmessage.h" +#include "util/path.h" +#include "util/strings.h" +#include "util/xml.h" /* game modules */ -#include "calendar.h" #include "direction.h" #include "keyword.h" #include "move.h" diff --git a/src/jsonconf.test.c b/src/jsonconf.test.c index 29c68e600..88630c833 100644 --- a/src/jsonconf.test.c +++ b/src/jsonconf.test.c @@ -17,7 +17,7 @@ #include "util/language.h" -#include "calendar.h" +#include "kernel/calendar.h" #include "direction.h" #include "keyword.h" #include "move.h" diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index cb8373fa2..59b8cb806 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -7,6 +7,7 @@ ally.test.c build.test.c building.test.c # callbacks.test.c +calendar.test.c command.test.c config.test.c # connection.test.c @@ -49,6 +50,7 @@ ally.c build.c building.c callbacks.c +calendar.c command.c config.c connection.c diff --git a/src/kernel/alliance.c b/src/kernel/alliance.c index 1aa3edd95..d5dda0143 100644 --- a/src/kernel/alliance.c +++ b/src/kernel/alliance.c @@ -11,19 +11,20 @@ without prior permission by the authors of Eressea. */ #include -#include #include "alliance.h" -#include - /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include +#include "calendar.h" +#include "config.h" +#include "building.h" +#include "faction.h" +#include "messages.h" +#include "order.h" +#include "region.h" +#include "unit.h" +#include "command.h" + +#include /* util includes */ #include diff --git a/src/kernel/building.test.c b/src/kernel/building.test.c index 8d5b86dc9..9c7013db3 100644 --- a/src/kernel/building.test.c +++ b/src/kernel/building.test.c @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/src/calendar.c b/src/kernel/calendar.c similarity index 99% rename from src/calendar.c rename to src/kernel/calendar.c index 23562daa6..df9f6c204 100644 --- a/src/calendar.c +++ b/src/kernel/calendar.c @@ -10,6 +10,7 @@ #include #include +int turn = 0; int first_month = 0; int weeks_per_month = 3; int months_per_year = 12; diff --git a/src/calendar.h b/src/kernel/calendar.h similarity index 97% rename from src/calendar.h rename to src/kernel/calendar.h index af4bd6a4f..164a96bf4 100644 --- a/src/calendar.h +++ b/src/kernel/calendar.h @@ -17,6 +17,7 @@ extern "C" { extern int months_per_year; extern int *month_season; extern int first_month; + extern int turn; extern char **weeknames; extern char **weeknames2; diff --git a/src/calendar.test.c b/src/kernel/calendar.test.c similarity index 100% rename from src/calendar.test.c rename to src/kernel/calendar.test.c diff --git a/src/kernel/config.c b/src/kernel/config.c index 2895ed70a..05690e301 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -29,7 +29,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "curse.h" #include "connection.h" #include "building.h" -#include "calendar.h" #include "direction.h" #include "equipment.h" #include "faction.h" @@ -98,8 +97,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif struct settings global; -int turn = 0; - const char *parameters[MAXPARAMS] = { "LOCALE", "ALLES", diff --git a/src/kernel/config.h b/src/kernel/config.h index e0ad682c6..94abcb7f4 100644 --- a/src/kernel/config.h +++ b/src/kernel/config.h @@ -141,8 +141,6 @@ extern "C" { extern const char *parameters[]; extern settings global; - extern int turn; - #ifdef __cplusplus } #endif diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 90649600f..36f467c6e 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -17,8 +17,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ #include -#include + #include "faction.h" + +#include "calendar.h" +#include "config.h" #include "alliance.h" #include "ally.h" #include "curse.h" diff --git a/src/kernel/faction.test.c b/src/kernel/faction.test.c index 904609be5..18a64ee90 100644 --- a/src/kernel/faction.test.c +++ b/src/kernel/faction.test.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include diff --git a/src/kernel/region.c b/src/kernel/region.c index 28d4e8bee..40b6ad484 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -17,12 +17,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ #include -#include #include "region.h" /* kernel includes */ #include "alliance.h" #include "building.h" +#include "calendar.h" +#include "config.h" #include "connection.h" #include "curse.h" #include "equipment.h" diff --git a/src/kernel/save.c b/src/kernel/save.c index a4bfdcbca..3dce7185e 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -25,6 +25,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "alliance.h" #include "ally.h" #include "building.h" +#include "calendar.h" #include "connection.h" #include "equipment.h" #include "faction.h" diff --git a/src/kernel/unit.c b/src/kernel/unit.c index acc28fff3..037ca7c06 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -22,6 +22,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "ally.h" #include "building.h" +#include "calendar.h" #include "faction.h" #include "group.h" #include "connection.h" diff --git a/src/laws.c b/src/laws.c index a31d67589..739b6a0a4 100644 --- a/src/laws.c +++ b/src/laws.c @@ -41,43 +41,33 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "prefix.h" #include "reports.h" #include "teleport.h" -#include "calendar.h" #include "guard.h" #include "volcano.h" -/* attributes includes */ -#include -#include -#include -#include - -#include -#include -#include - /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/alliance.h" +#include "kernel/ally.h" +#include "kernel/calendar.h" +#include "kernel/callbacks.h" +#include "kernel/connection.h" +#include "kernel/curse.h" +#include "kernel/building.h" +#include "kernel/faction.h" +#include "kernel/group.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/pool.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" /* util includes */ #include @@ -98,10 +88,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include +/* attributes includes */ #include +#include +#include +#include +#include + +#include +#include +#include #include #include + /* libc includes */ #include #include diff --git a/src/laws.test.c b/src/laws.test.c index 5edde187d..888614a1a 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include diff --git a/src/main.c b/src/main.c index f50f65472..ae6d2158c 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #endif +#include #include #include #include diff --git a/src/monsters.c b/src/monsters.c index d1979414d..97b29d2cc 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -18,7 +18,6 @@ */ #include -#include #include "monsters.h" @@ -29,32 +28,27 @@ #include "laws.h" #include "keyword.h" #include "study.h" - -/* attributes includes */ -#include -#include - -#include +#include "move.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include +#include "kernel/build.h" +#include "kernel/building.h" +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/curse.h" +#include "kernel/equipment.h" +#include "kernel/faction.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/pathfinder.h" +#include "kernel/pool.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" /* util includes */ #include @@ -68,6 +62,12 @@ #include #include +/* attributes includes */ +#include +#include + +#include + #include /* libc includes */ diff --git a/src/morale.c b/src/morale.c index a8a7cc9d9..6155426ac 100644 --- a/src/morale.c +++ b/src/morale.c @@ -20,17 +20,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "morale.h" -#include - -#include -#include -#include -#include -#include -#include +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/curse.h" +#include "kernel/region.h" +#include "kernel/faction.h" +#include "kernel/race.h" +#include "kernel/building.h" #include +#include + #include static double popularity(void) diff --git a/src/move.c b/src/move.c index 72d311395..00a787cac 100644 --- a/src/move.c +++ b/src/move.c @@ -20,7 +20,28 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef _MSC_VER #include #endif -#include + +/* kernel includes */ +#include "kernel/ally.h" +#include "kernel/build.h" +#include "kernel/building.h" +#include "kernel/calendar.h" +#include "kernel/config.h" +#include "kernel/connection.h" +#include "kernel/curse.h" +#include "kernel/faction.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/render.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" + #include "move.h" #include "guard.h" #include "laws.h" @@ -44,28 +65,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -/* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "teleport.h" #include "direction.h" -#include "calendar.h" #include "skill.h" /* util includes */ diff --git a/src/orderfile.c b/src/orderfile.c index a82b599a0..ed4860d77 100644 --- a/src/orderfile.c +++ b/src/orderfile.c @@ -2,10 +2,11 @@ #include #include "orderfile.h" -#include -#include -#include -#include +#include "kernel/calendar.h" +#include "kernel/faction.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/unit.h" #include #include diff --git a/src/orderfile.test.c b/src/orderfile.test.c index 500c68fdf..f5d4997ae 100644 --- a/src/orderfile.test.c +++ b/src/orderfile.test.c @@ -3,6 +3,7 @@ #include "orderfile.h" +#include #include #include diff --git a/src/report.c b/src/report.c index 9e98e5162..44b1bd6ad 100644 --- a/src/report.c +++ b/src/report.c @@ -43,7 +43,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* gamecode includes */ #include "alchemy.h" -#include "calendar.h" #include "economy.h" #include "move.h" #include "upkeep.h" @@ -51,30 +50,31 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "teleport.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/ally.h" +#include "kernel/calendar.h" +#include "kernel/connection.h" +#include "kernel/build.h" +#include "kernel/building.h" +#include "kernel/curse.h" +#include "kernel/faction.h" +#include "kernel/group.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/objtypes.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/pool.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/render.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" +#include "kernel/alliance.h" /* util includes */ #include diff --git a/src/reports.c b/src/reports.c index d4be5c8ce..20f2068e8 100644 --- a/src/reports.c +++ b/src/reports.c @@ -21,7 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "reports.h" #include "battle.h" -#include "calendar.h" +#include "kernel/calendar.h" #include "guard.h" #include "laws.h" #include "spells.h" diff --git a/src/reports.test.c b/src/reports.test.c index ca0f98f57..cdc09c83c 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -1,7 +1,7 @@ #include #include "reports.h" -#include "calendar.h" +#include "kernel/calendar.h" #include "keyword.h" #include "lighthouse.h" #include "laws.h" diff --git a/src/study.c b/src/study.c index 1dbc890ed..46da90b74 100644 --- a/src/study.c +++ b/src/study.c @@ -21,11 +21,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif #include #include "study.h" + #include "laws.h" #include "move.h" #include "monsters.h" #include "alchemy.h" #include "academy.h" +#include "kernel/calendar.h" #include diff --git a/src/summary.c b/src/summary.c index ee047bc8f..64bb055b5 100644 --- a/src/summary.c +++ b/src/summary.c @@ -16,7 +16,7 @@ #include "summary.h" #include "laws.h" #include "monsters.h" -#include "calendar.h" +#include "kernel/calendar.h" #include #include diff --git a/src/summary.test.c b/src/summary.test.c index 5df4849c3..7b7df93b6 100644 --- a/src/summary.test.c +++ b/src/summary.test.c @@ -1,7 +1,7 @@ #include #include "summary.h" -#include "calendar.h" +#include "kernel/calendar.h" #include #include "tests.h" diff --git a/src/tests.c b/src/tests.c index 18ecdef34..4b764b23f 100644 --- a/src/tests.c +++ b/src/tests.c @@ -3,7 +3,7 @@ #include "keyword.h" #include "prefix.h" #include "reports.h" -#include "calendar.h" +#include "kernel/calendar.h" #include "vortex.h" #include diff --git a/src/xmlreader.c b/src/xmlreader.c index a711b7dbd..66b04e611 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -29,7 +29,7 @@ without prior permission by the authors of Eressea. #include "kernel/spellbook.h" #include "alchemy.h" -#include "calendar.h" +#include "kernel/calendar.h" #include "guard.h" #include "keyword.h" #include "move.h" From 4abc603d9db6c7aa5f1b0411f365a5dc3421ad40 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 14 Feb 2018 20:02:50 +0100 Subject: [PATCH 032/231] triggered a missing forward declaration. --- src/economy.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/economy.h b/src/economy.h index ec12ae0ca..6d58a1f9f 100644 --- a/src/economy.h +++ b/src/economy.h @@ -45,6 +45,7 @@ extern "C" { struct faction; struct order; struct message; + struct item_type; typedef struct econ_request { struct econ_request *next; From bf591ecec5cecd5c5350fad13670dd3d27728eb5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 15 Feb 2018 20:25:58 +0100 Subject: [PATCH 033/231] BUG 2415: eliminate at_potiondelay and WdL delay. BUG 2419: refactor ointment and healing, add tests for USE --- scripts/tests/e2/items.lua | 59 ++++++++++++++++++++++++++++----- scripts/tests/e3/production.lua | 1 - src/alchemy.c | 58 ++------------------------------ src/alchemy.h | 4 +-- src/battle.h | 1 + src/creport.h | 1 + src/items.c | 16 ++++----- src/kernel/building.h | 1 + src/kernel/region.test.c | 2 +- src/kernel/save.c | 2 +- src/kernel/types.h | 8 ++--- src/magic.h | 1 + src/volcano.h | 3 ++ 13 files changed, 74 insertions(+), 83 deletions(-) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index 2f2b13e88..fe3bca370 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -28,7 +28,7 @@ end function test_nestwarmth_insect() local r = region.create(0, 0, "plain") - local f = faction.create("insect", "noreply@eressea.de", "de") + local f = faction.create("insect") local u = unit.create(f, r, 1) local flags = u.flags u:add_item("nestwarmth", 2) @@ -44,7 +44,7 @@ end function test_nestwarmth_other() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) local flags = u.flags u:add_item("nestwarmth", 2) @@ -60,7 +60,7 @@ end function test_meow() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) u:add_item("aoc", 1) u:clear_orders() @@ -74,7 +74,7 @@ end function test_aurapotion50() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) u:add_item("aurapotion50", 1) u:set_skill('magic', 10); @@ -92,7 +92,7 @@ end function test_bagpipe() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) turn_begin() u:add_item("bagpipeoffear", 1) @@ -109,9 +109,52 @@ function test_bagpipe() assert_equal(0, r:get_curse('depression')) end +function test_monthly_healing() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 30) + assert_equal(600, u.hp) + u.hp = 100 + process_orders() + assert_equal(130, u.hp) +end + +function test_ointment() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 30) + assert_equal(600, u.hp) + u.hp = 100 + turn_begin() + u:add_item("ointment", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Wundsalbe") + turn_process() + assert_equal(530, u.hp) + assert_equal(0, u:get_item("ointment")) + turn_end() +end + +function test_use_healing_potion() + -- Heiltrank kann (auch) mit BENUTZE eingesetzt werden + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 30) + assert_equal(600, u.hp) + u.hp = 100 + turn_begin() + u:add_item("p14", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Heiltrank") + turn_process() + assert_equal(530, u.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + function test_speedsail() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) turn_begin() @@ -130,7 +173,7 @@ end function disable_test_foolpotion() local r = region.create(0, 0, "plain") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) turn_begin() u:add_item('p7', 2) @@ -159,7 +202,7 @@ end function test_snowman() local r = region.create(0, 0, "glacier") - local f = faction.create("human", "noreply@eressea.de", "de") + local f = faction.create("human") local u = unit.create(f, r, 1) u:add_item("snowman", 1) u:clear_orders() diff --git a/scripts/tests/e3/production.lua b/scripts/tests/e3/production.lua index be63158cf..3469b06c4 100644 --- a/scripts/tests/e3/production.lua +++ b/scripts/tests/e3/production.lua @@ -53,7 +53,6 @@ function test_dwarf_no_mining_bonus() local r = region.create(0, 0, 'mountain') local f = create_faction('dwarf') local u = unit.create(f, r, 1) - u.name = 'Xolgrim' turn_begin() r:set_resource('iron', 100) diff --git a/src/alchemy.c b/src/alchemy.c index 3ec21159d..b766278c6 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -211,7 +211,7 @@ void show_potions(faction *f, int sklevel) } } -static int potion_healing(unit * u, int amount) { +static int potion_ointment(unit * u, int amount) { int maxhp = unit_max_hp(u) * u->number; u->hp = u->hp + 400 * amount; if (u->hp > maxhp) u->hp = maxhp; @@ -244,8 +244,8 @@ static int do_potion(unit * u, region *r, const item_type * itype, int amount) if (itype == oldpotiontype[P_LIFE]) { return potion_water_of_life(u, r, amount); } - else if (itype == oldpotiontype[P_HEILWASSER]) { - return potion_healing(u, amount); + else if (itype == oldpotiontype[P_OINTMENT]) { + return potion_ointment(u, amount); } else if (itype == oldpotiontype[P_PEOPLE]) { return potion_luck(u, r, &at_peasantluck, amount); @@ -277,58 +277,6 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) return 0; } -typedef struct potiondelay { - unit *u; - region *r; - const item_type *itype; - int amount; -} potiondelay; - -static void init_potiondelay(variant *var) -{ - var->v = malloc(sizeof(potiondelay)); -} - -static int age_potiondelay(attrib * a, void *owner) -{ - potiondelay *pd = (potiondelay *)a->data.v; - UNUSED_ARG(owner); - pd->amount = do_potion(pd->u, pd->r, pd->itype, pd->amount); - return AT_AGE_REMOVE; -} - -attrib_type at_potiondelay = { - "potiondelay", - init_potiondelay, - a_free_voidptr, - age_potiondelay, 0, 0 -}; - -static attrib *make_potiondelay(unit * u, const item_type * itype, int amount) -{ - attrib *a = a_new(&at_potiondelay); - potiondelay *pd = (potiondelay *)a->data.v; - pd->u = u; - pd->r = u->region; - pd->itype = itype; - pd->amount = amount; - return a; -} - -int -use_potion_delayed(unit * u, const item_type * itype, int amount, -struct order *ord) -{ - int result = begin_potion(u, itype, ord); - if (result) - return result; - - a_add(&u->attribs, make_potiondelay(u, itype, amount)); - - end_potion(u, itype, amount); - return 0; -} - /*****************/ /* at_effect */ /*****************/ diff --git a/src/alchemy.h b/src/alchemy.h index d183cacd0..3ce6b9547 100644 --- a/src/alchemy.h +++ b/src/alchemy.h @@ -41,7 +41,7 @@ extern "C" { P_LIFE, /* Stufe 2 */ P_DOMORE, - P_HEILWASSER, + P_OINTMENT, P_BAUERNBLUT, /* Stufe 3 */ P_WISE, /* 6 */ @@ -64,8 +64,6 @@ extern "C" { void herbsearch(struct unit *u, int max); int use_potion(struct unit *u, const struct item_type *itype, int amount, struct order *); - int use_potion_delayed(struct unit *u, const struct item_type *itype, - int amount, struct order *); int get_effect(const struct unit *u, const struct item_type *effect); int change_effect(struct unit *u, const struct item_type *effect, diff --git a/src/battle.h b/src/battle.h index 6494a6e27..fd31a0284 100644 --- a/src/battle.h +++ b/src/battle.h @@ -28,6 +28,7 @@ extern "C" { struct message; struct selist; + union variant; /** more defines **/ #define FS_ENEMY 1 diff --git a/src/creport.h b/src/creport.h index ed8f3bfbd..f4e0cd4bd 100644 --- a/src/creport.h +++ b/src/creport.h @@ -13,6 +13,7 @@ #define H_GC_CREPORT #include +#include #ifdef __cplusplus extern "C" { diff --git a/src/items.c b/src/items.c index ba9f35388..f1940a644 100644 --- a/src/items.c +++ b/src/items.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -321,8 +322,8 @@ static int heal(unit * user, int effect) } static int -use_healingpotion(struct unit *user, const struct item_type *itype, int amount, -struct order *ord) +use_healingpotion(struct unit *user, const struct item_type *itype, + int amount, struct order *ord) { int effect = amount * 400; unit *u = user->region->units; @@ -400,8 +401,7 @@ static int use_warmthpotion(unit *u, const item_type *itype, cmistake(u, ord, 163, MSG_EVENT); return ECUSTOM; } - use_pooled(u, itype->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, - amount); + use_pooled(u, itype->rtype, GET_DEFAULT, amount); usetpotionuse(u, itype); ADDMSG(&u->faction->msgs, msg_message("usepotion", @@ -422,9 +422,9 @@ void register_itemfunctions(void) register_item_use(use_birthdayamulet, "use_aoc"); register_item_use(use_foolpotion, "use_p7"); register_item_use(use_bloodpotion, "use_peasantblood"); - register_item_use(use_healingpotion, "use_ointment"); + register_item_use(use_potion, "use_ointment"); + register_item_use(use_healingpotion, "use_p14"); register_item_use(use_warmthpotion, "use_nestwarmth"); - - /* ungetestet: Wasser des Lebens */ - register_item_use(use_potion_delayed, "use_p2"); + /* p2 = P_LIFE = Wasser des Lebens */ + register_item_use(use_potion, "use_p2"); } diff --git a/src/kernel/building.h b/src/kernel/building.h index e162e041f..5a83fd0ca 100644 --- a/src/kernel/building.h +++ b/src/kernel/building.h @@ -21,6 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include +#include #include #include diff --git a/src/kernel/region.test.c b/src/kernel/region.test.c index 4baa807c8..d54049b8e 100644 --- a/src/kernel/region.test.c +++ b/src/kernel/region.test.c @@ -16,7 +16,7 @@ void test_terraform(CuTest *tc) { item_type *itype; test_setup(); - itype = test_create_itemtype("ointment"); + itype = test_create_itemtype("oil"); itype->rtype->flags |= (RTF_ITEM | RTF_POOLED); new_luxurytype(itype, 0); diff --git a/src/kernel/save.c b/src/kernel/save.c index 1d415038d..4408ab909 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -496,7 +496,7 @@ unit *read_unit(gamedata *data) } READ_INT(data->store, &n); - unit_setstatus(u, n); + unit_setstatus(u, (status_t)n); READ_INT(data->store, &u->flags); u->flags &= UFL_SAVEMASK; if ((u->flags & UFL_ANON_FACTION) && !rule_stealth_anon()) { diff --git a/src/kernel/types.h b/src/kernel/types.h index 9e9ed3b66..61f1268cc 100644 --- a/src/kernel/types.h +++ b/src/kernel/types.h @@ -20,9 +20,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define ERESSEA_TYPES_H #include -#include - -typedef short item_t; struct attrib; struct attrib_type; @@ -77,15 +74,14 @@ typedef enum { /* ------------------ Status von Einheiten --------------------- */ -typedef unsigned char status_t; -enum { +typedef enum { ST_AGGRO, ST_FIGHT, ST_BEHIND, ST_CHICKEN, ST_AVOID, ST_FLEE -}; +} status_t; /* ----------------- Parameter --------------------------------- */ diff --git a/src/magic.h b/src/magic.h index cbd508163..98d2dabe8 100644 --- a/src/magic.h +++ b/src/magic.h @@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define H_KRNL_MAGIC #include +#include #include #ifdef __cplusplus diff --git a/src/volcano.h b/src/volcano.h index 225a76143..c72801cce 100644 --- a/src/volcano.h +++ b/src/volcano.h @@ -19,6 +19,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_GC_VOLCANO #define H_GC_VOLCANO + +#include + #ifdef __cplusplus extern "C" { #endif From a9375200e4c02282e321300dabf210fe3f2f2086 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 15 Feb 2018 20:35:38 +0100 Subject: [PATCH 034/231] use_potion has a lot of scaffolding that use_healingpotion was duplicating. --- src/alchemy.c | 74 ++++++++++++++++++++++++++++++++------------------- src/battle.c | 1 + src/items.c | 36 ++----------------------- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/src/alchemy.c b/src/alchemy.c index b766278c6..bfa371c8e 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -154,8 +154,6 @@ static int begin_potion(unit * u, const item_type * itype, struct order *ord) static void end_potion(unit * u, const item_type * itype, int amount) { - use_pooled(u, itype->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, - amount); usetpotionuse(u, itype); ADDMSG(&u->faction->msgs, msg_message("usepotion", @@ -173,12 +171,10 @@ static int potion_water_of_life(unit * u, region *r, int amount) { } /* mallorn is required to make mallorn forests, wood for regular ones */ if (fval(r, RF_MALLORN)) { - wood = use_pooled(u, rt_find("mallorn"), - GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, tree_count * amount); + wood = use_pooled(u, rt_find("mallorn"), GET_DEFAULT, tree_count * amount); } else { - wood = use_pooled(u, rt_find("log"), - GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, tree_count * amount); + wood = use_pooled(u, rt_find("log"), GET_DEFAULT, tree_count * amount); } if (r->land == 0) wood = 0; @@ -211,13 +207,6 @@ void show_potions(faction *f, int sklevel) } } -static int potion_ointment(unit * u, int amount) { - int maxhp = unit_max_hp(u) * u->number; - u->hp = u->hp + 400 * amount; - if (u->hp > maxhp) u->hp = maxhp; - return amount; -} - static int potion_luck(unit *u, region *r, attrib_type *atype, int amount) { attrib *a = (attrib *)a_find(r->attribs, atype); UNUSED_ARG(u); @@ -239,20 +228,56 @@ static int potion_power(unit *u, int amount) { return amount; } +static int heal(unit * user, int effect) +{ + int req = unit_max_hp(user) * user->number - user->hp; + if (req > 0) { + if (req > effect) req = effect; + effect -= req; + user->hp += req; + } + return effect; +} + +static int potion_ointment(unit * u, int amount) { + int effect = amount * 400; + effect = heal(u, effect); + return amount; +} + +static int potion_healing(struct unit *user, int amount) +{ + int effect = amount * 400; + unit *u = user->region->units; + effect = heal(user, effect); + while (effect > 0 && u != NULL) { + if (u->faction == user->faction) { + effect = heal(u, effect); + } + u = u->next; + } + return amount; +} + + static int do_potion(unit * u, region *r, const item_type * itype, int amount) { + /* TODO: why do some of these take a region argument? */ if (itype == oldpotiontype[P_LIFE]) { return potion_water_of_life(u, r, amount); } - else if (itype == oldpotiontype[P_OINTMENT]) { - return potion_ointment(u, amount); - } else if (itype == oldpotiontype[P_PEOPLE]) { return potion_luck(u, r, &at_peasantluck, amount); } else if (itype == oldpotiontype[P_HORSE]) { return potion_luck(u, r, &at_horseluck, amount); } + else if (itype == oldpotiontype[P_HEAL]) { + return potion_healing(u, amount); + } + else if (itype == oldpotiontype[P_OINTMENT]) { + return potion_ointment(u, amount); + } else if (itype == oldpotiontype[P_MACHT]) { return potion_power(u, amount); } @@ -264,17 +289,12 @@ static int do_potion(unit * u, region *r, const item_type * itype, int amount) int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { - if (oldpotiontype[P_HEAL] && itype == oldpotiontype[P_HEAL]) { - return EUNUSABLE; - } - else { - int result = begin_potion(u, itype, ord); - if (result) - return result; - amount = do_potion(u, u->region, itype, amount); - end_potion(u, itype, amount); - } - return 0; + int result = begin_potion(u, itype, ord); + if (result) + return result; + amount = do_potion(u, u->region, itype, amount); + end_potion(u, itype, amount); + return amount; } /*****************/ diff --git a/src/battle.c b/src/battle.c index b7482e48a..58e8cf9fc 100644 --- a/src/battle.c +++ b/src/battle.c @@ -1300,6 +1300,7 @@ terminate(troop dt, troop at, int type, const char *damage, bool missile) return false; } + /* healing potions can avert a killing blow */ if (oldpotiontype[P_HEAL] && !fval(&df->person[dt.index], FL_HEALING_USED)) { if (i_get(du->items, oldpotiontype[P_HEAL]) > 0) { message *m = msg_message("potionsave", "unit", du); diff --git a/src/items.c b/src/items.c index f1940a644..d4ceca78a 100644 --- a/src/items.c +++ b/src/items.c @@ -310,39 +310,6 @@ struct order *ord) return 0; } -static int heal(unit * user, int effect) -{ - int req = unit_max_hp(user) * user->number - user->hp; - if (req > 0) { - if (req > effect) req = effect; - effect -= req; - user->hp += req; - } - return effect; -} - -static int -use_healingpotion(struct unit *user, const struct item_type *itype, - int amount, struct order *ord) -{ - int effect = amount * 400; - unit *u = user->region->units; - effect = heal(user, effect); - while (effect > 0 && u != NULL) { - if (u->faction == user->faction) { - effect = heal(u, effect); - } - u = u->next; - } - use_pooled(user, itype->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, - amount); - usetpotionuse(user, itype); - - ADDMSG(&user->faction->msgs, msg_message("usepotion", - "unit potion", user, itype->rtype)); - return 0; -} - /* ------------------------------------------------------------- */ /* Kann auch von Nichtmagier benutzt werden, modifiziert Taktik fuer diese * Runde um -1 - 4 Punkte. */ @@ -412,6 +379,7 @@ static int use_warmthpotion(unit *u, const item_type *itype, void register_itemfunctions(void) { /* have tests: */ + /* TODO: potions should really use use_potion */ register_item_use(use_mistletoe, "use_mistletoe"); register_item_use(use_tacticcrystal, "use_dreameye"); register_item_use(use_studypotion, "use_studypotion"); @@ -423,7 +391,7 @@ void register_itemfunctions(void) register_item_use(use_foolpotion, "use_p7"); register_item_use(use_bloodpotion, "use_peasantblood"); register_item_use(use_potion, "use_ointment"); - register_item_use(use_healingpotion, "use_p14"); + register_item_use(use_potion, "use_p14"); register_item_use(use_warmthpotion, "use_nestwarmth"); /* p2 = P_LIFE = Wasser des Lebens */ register_item_use(use_potion, "use_p2"); From ad86e69e6b11b94cdff7cbcfc2ff7bf706de8710 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 15 Feb 2018 21:05:11 +0100 Subject: [PATCH 035/231] refactor the resurrection code. There is more work to be done here, too much duplicaton between battle and volcano. --- src/battle.c | 30 ++++++++++++++++++++---------- src/items.h | 7 ++++++- src/volcano.c | 49 +++++++++++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/battle.c b/src/battle.c index 58e8cf9fc..e82ba71a5 100644 --- a/src/battle.c +++ b/src/battle.c @@ -1130,6 +1130,21 @@ int calculate_armor(troop dt, const weapon_type *dwtype, const weapon_type *awty return ar; } +static bool resurrect_troop(troop dt) +{ + fighter *df = dt.fighter; + unit *du = df->unit; + if (oldpotiontype[P_HEAL] && !fval(&df->person[dt.index], FL_HEALING_USED)) { + if (i_get(du->items, oldpotiontype[P_HEAL]) > 0) { + fset(&df->person[dt.index], FL_HEALING_USED); + i_change(&du->items, oldpotiontype[P_HEAL], -1); + df->person[dt.index].hp = u_race(du)->hitpoints * 5; /* give the person a buffer */ + return true; + } + } + return false; +} + bool terminate(troop dt, troop at, int type, const char *damage, bool missile) { @@ -1301,16 +1316,11 @@ terminate(troop dt, troop at, int type, const char *damage, bool missile) } /* healing potions can avert a killing blow */ - if (oldpotiontype[P_HEAL] && !fval(&df->person[dt.index], FL_HEALING_USED)) { - if (i_get(du->items, oldpotiontype[P_HEAL]) > 0) { - message *m = msg_message("potionsave", "unit", du); - battle_message_faction(b, du->faction, m); - msg_release(m); - i_change(&du->items, oldpotiontype[P_HEAL], -1); - fset(&df->person[dt.index], FL_HEALING_USED); - df->person[dt.index].hp = u_race(du)->hitpoints * 5; /* give the person a buffer */ - return false; - } + if (resurrect_troop(dt)) { + message *m = msg_message("potionsave", "unit", du); + battle_message_faction(b, du->faction, m); + msg_release(m); + return false; } ++at.fighter->kills; diff --git a/src/items.h b/src/items.h index 2b839563d..f37444b74 100644 --- a/src/items.h +++ b/src/items.h @@ -12,11 +12,16 @@ without prior permission by the authors of Eressea. #ifndef H_KRNL_ITEMS #define H_KRNL_ITEMS + +#include + +struct unit; + #ifdef __cplusplus extern "C" { #endif - extern void register_itemfunctions(void); + void register_itemfunctions(void); #ifdef __cplusplus } diff --git a/src/volcano.c b/src/volcano.c index df70a864f..a1b2240e2 100644 --- a/src/volcano.c +++ b/src/volcano.c @@ -74,12 +74,31 @@ static int nb_armor(const unit * u, int index) return av; } +static bool resurrect_unit(unit *u) { + if (oldpotiontype[P_HEAL]) { + bool heiltrank = false; + if (get_effect(u, oldpotiontype[P_HEAL]) > 0) { + change_effect(u, oldpotiontype[P_HEAL], -1); + heiltrank = true; + } + else if (i_get(u->items, oldpotiontype[P_HEAL]) > 0) { + i_change(&u->items, oldpotiontype[P_HEAL], -1); + change_effect(u, oldpotiontype[P_HEAL], 3); + heiltrank = true; + } + if (heiltrank && chance(0.50)) { + return true; + } + } + return false; +} + static int damage_unit(unit * u, const char *dam, bool physical, bool magic) { int *hp, hpstack[20]; int h; - int i, dead = 0, hp_rem = 0, heiltrank; + int i, dead = 0, hp_rem = 0; assert(u->number); if (fval(u_race(u), RCF_ILLUSIONARY)) { @@ -118,33 +137,19 @@ damage_unit(unit * u, const char *dam, bool physical, bool magic) /* Auswirkungen */ for (i = 0; i < u->number; i++) { if (hp[i] <= 0) { - heiltrank = 0; - /* Sieben Leben */ if (u_race(u) == get_race(RC_CAT) && (chance(1.0 / 7))) { hp[i] = u->hp / u->number; hp_rem += hp[i]; - continue; } - - /* Heiltrank */ - if (oldpotiontype[P_HEAL]) { - if (get_effect(u, oldpotiontype[P_HEAL]) > 0) { - change_effect(u, oldpotiontype[P_HEAL], -1); - heiltrank = 1; - } - else if (i_get(u->items, oldpotiontype[P_HEAL]) > 0) { - i_change(&u->items, oldpotiontype[P_HEAL], -1); - change_effect(u, oldpotiontype[P_HEAL], 3); - heiltrank = 1; - } - if (heiltrank && (chance(0.50))) { - hp[i] = u->hp / u->number; - hp_rem += hp[i]; - continue; - } + else if (resurrect_unit(u)) { + /* Heiltrank */ + hp[i] = u->hp / u->number; + hp_rem += hp[i]; + } + else { + ++dead; } - dead++; } else { hp_rem += hp[i]; From e697a23f9d91fb08eac36ee4e582845173225220 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 16 Feb 2018 20:06:36 +0100 Subject: [PATCH 036/231] BUG 2419: fix and speed up volcano-survival through potions. --- src/volcano.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/volcano.c b/src/volcano.c index a1b2240e2..7bddd6097 100644 --- a/src/volcano.c +++ b/src/volcano.c @@ -86,18 +86,18 @@ static bool resurrect_unit(unit *u) { change_effect(u, oldpotiontype[P_HEAL], 3); heiltrank = true; } - if (heiltrank && chance(0.50)) { + if (heiltrank && (rng_int() % 2)) { return true; } } return false; } -static int -damage_unit(unit * u, const char *dam, bool physical, bool magic) +static int damage_unit(unit * u, const char *dam, bool physical, bool magic) { int *hp, hpstack[20]; int h; + int healings; int i, dead = 0, hp_rem = 0; assert(u->number); @@ -134,6 +134,9 @@ damage_unit(unit * u, const char *dam, bool physical, bool magic) hp[i] -= damage; } + /* does this unit have any healing potions or effects? */ + healings = i_get(u->items, oldpotiontype[P_HEAL]) * 4; + healings += get_effect(u, oldpotiontype[P_HEAL]); /* Auswirkungen */ for (i = 0; i < u->number; i++) { if (hp[i] <= 0) { @@ -142,10 +145,16 @@ damage_unit(unit * u, const char *dam, bool physical, bool magic) hp[i] = u->hp / u->number; hp_rem += hp[i]; } - else if (resurrect_unit(u)) { - /* Heiltrank */ - hp[i] = u->hp / u->number; - hp_rem += hp[i]; + else if (healings > 0) { + --healings; + if (resurrect_unit(u)) { + /* Heiltrank benutzen */ + hp[i] = u->hp / u->number; + hp_rem += hp[i]; + } + else { + ++dead; + } } else { ++dead; @@ -268,7 +277,7 @@ static bool stop_smoke_chance(void) { if (config_changed(&cache)) { percent = config_get_int("volcano.stop.percent", 12); } - return percent!=0 && (rng_int() % 100) < percent; + return percent != 0 && (rng_int() % 100) < percent; } static bool outbreak_chance(void) { @@ -276,12 +285,12 @@ static bool outbreak_chance(void) { if (config_changed(&cache)) { percent = config_get_int("volcano.outbreak.percent", 8); } - return percent!=0 && (rng_int() % 100) < percent; + return percent != 0 && (rng_int() % 100) < percent; } -void volcano_update(void) +void volcano_update(void) { - region *r; + region *r; const struct terrain_type *t_active, *t_volcano; t_volcano = get_terrain("volcano"); From 8a8bf489ae11e7c42d577df054ece272d6cb3f38 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 10:39:23 +0100 Subject: [PATCH 037/231] clarify use_potion responsibilities. move USE potion of life to items.c. fix some use_ function return values. --- scripts/eressea/xmasitems.lua | 8 +++-- src/alchemy.c | 38 ++------------------ src/helpers.c | 67 ++++++++++++++++++++++------------- src/items.c | 39 +++++++++++++++++++- 4 files changed, 88 insertions(+), 64 deletions(-) diff --git a/scripts/eressea/xmasitems.lua b/scripts/eressea/xmasitems.lua index dffea2675..9e22dea52 100644 --- a/scripts/eressea/xmasitems.lua +++ b/scripts/eressea/xmasitems.lua @@ -62,10 +62,11 @@ function use_snowglobe(u, amount, token, ord) end function use_snowman(u, amount) - if amount>0 and u.region.terrain == "glacier" then - local man = unit.create(u.faction, u.region, amount, "snowman") + if amount > 0 and u.region.terrain == "glacier" then + unit.create(u.faction, u.region, amount, "snowman") return amount end + -- print error76: return -4 end @@ -79,7 +80,8 @@ function use_xmastree(u, amount) msg:send_region(u.region) return amount end - return 0 + -- print error76: + return -4 end local self = {} diff --git a/src/alchemy.c b/src/alchemy.c index bfa371c8e..c6c550774 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -160,37 +160,6 @@ static void end_potion(unit * u, const item_type * itype, int amount) "unit potion", u, itype->rtype)); } -static int potion_water_of_life(unit * u, region *r, int amount) { - static int config; - static int tree_type, tree_count; - int wood = 0; - - if (config_changed(&config)) { - tree_type = config_get_int("rules.magic.wol_type", 1); - tree_count = config_get_int("rules.magic.wol_effect", 10); - } - /* mallorn is required to make mallorn forests, wood for regular ones */ - if (fval(r, RF_MALLORN)) { - wood = use_pooled(u, rt_find("mallorn"), GET_DEFAULT, tree_count * amount); - } - else { - wood = use_pooled(u, rt_find("log"), GET_DEFAULT, tree_count * amount); - } - if (r->land == 0) - wood = 0; - if (wood < tree_count * amount) { - int x = wood / tree_count; - if (wood % tree_count) - ++x; - if (x < amount) - amount = x; - } - rsettrees(r, tree_type, rtrees(r, tree_type) + wood); - ADDMSG(&u->faction->msgs, msg_message("growtree_effect", - "mage amount", u, wood)); - return amount; -} - void show_potions(faction *f, int sklevel) { const potion_type *ptype; @@ -262,11 +231,8 @@ static int potion_healing(struct unit *user, int amount) static int do_potion(unit * u, region *r, const item_type * itype, int amount) { - /* TODO: why do some of these take a region argument? */ - if (itype == oldpotiontype[P_LIFE]) { - return potion_water_of_life(u, r, amount); - } - else if (itype == oldpotiontype[P_PEOPLE]) { + /* TODO: this function should only be used for effect-changing potions */ + if (itype == oldpotiontype[P_PEOPLE]) { return potion_luck(u, r, &at_peasantluck, amount); } else if (itype == oldpotiontype[P_HORSE]) { diff --git a/src/helpers.c b/src/helpers.c index e6015488a..d3ff9870f 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -1,4 +1,4 @@ -/* +/* +-------------------+ | | Enno Rehling | Eressea PBEM host | Christian Schlittchen @@ -228,7 +228,7 @@ lua_changeresource(unit * u, const struct resource_type *rtype, int delta) if (lua_isfunction(L, -1)) { tolua_pushusertype(L, u, TOLUA_CAST "unit"); lua_pushinteger(L, delta); - + if (lua_pcall(L, 2, 1, 0) != 0) { const char *error = lua_tostring(L, -1); log_error("change(%s) calling '%s': %s.\n", unitname(u), fname, error); @@ -249,19 +249,9 @@ lua_changeresource(unit * u, const struct resource_type *rtype, int delta) /** callback for an item-use function written in lua. */ static int -use_item_lua(unit *u, const item_type *itype, int amount, struct order *ord) +lua_use_item(unit *u, const item_type *itype, const char * fname, int amount, struct order *ord) { lua_State *L = (lua_State *)global.vm_state; - int len, result = 0; - char fname[64]; - int (*callout)(unit *, const item_type *, int, struct order *); - - len = snprintf(fname, sizeof(fname), "use_%s", itype->rtype->_name); - if (len > 0 && (size_t)len < sizeof(fname)) { - callout = (int(*)(unit *, const item_type *, int, struct order *))get_function(fname); - if (callout) { - return callout(u, itype, amount, ord); - } lua_getglobal(L, fname); if (lua_isfunction(L, -1)) { @@ -272,23 +262,52 @@ use_item_lua(unit *u, const item_type *itype, int amount, struct order *ord) if (lua_pcall(L, 4, 1, 0) != 0) { const char *error = lua_tostring(L, -1); log_error("use(%s) calling '%s': %s.\n", unitname(u), fname, error); - lua_pop(L, 1); } else { - result = (int)lua_tonumber(L, -1); + int result = (int)lua_tonumber(L, -1); lua_pop(L, 1); + return result; } - return result; } lua_pop(L, 1); - if (itype->flags & ITF_POTION) { - return use_potion(u, itype, amount, ord); - } else { - log_error("no such callout: %s", fname); + return 0; +} + +static int +use_item_callback(unit *u, const item_type *itype, int amount, struct order *ord) +{ + int len; + char fname[64]; + int(*callout)(unit *, const item_type *, int, struct order *); + + len = snprintf(fname, sizeof(fname), "use_%s", itype->rtype->_name); + if (len > 0 && (size_t)len < sizeof(fname)) { + int result; + + /* check if we have a register_item_use function */ + callout = (int(*)(unit *, const item_type *, int, struct order *))get_function(fname); + if (callout) { + return callout(u, itype, amount, ord); + } + + /* check if we have a matching lua function */ + result = lua_use_item(u, itype, fname, amount, ord); + if (result != 0) { + return result; + } + + /* if the item is a potion, try use_potion, the generic function for + * potions that add an effect: */ + if (itype->flags & ITF_POTION) { + return use_potion(u, itype, amount, ord); + } + else { + log_error("no such callout: %s", fname); + } + log_error("use(%s) calling '%s': not a function.\n", unitname(u), fname); } - log_error("use(%s) calling '%s': not a function.\n", unitname(u), fname); - } - return result; + + return 0; } /* compat code for old data files */ @@ -328,7 +347,7 @@ void register_tolua_helpers(void) at_deprecate("lcbuilding", building_action_read); callbacks.cast_spell = lua_callspell; - callbacks.use_item = use_item_lua; + callbacks.use_item = use_item_callback; callbacks.produce_resource = produce_resource_lua; callbacks.limit_resource = limit_resource_lua; diff --git a/src/items.c b/src/items.c index d4ceca78a..5986675c6 100644 --- a/src/items.c +++ b/src/items.c @@ -376,10 +376,47 @@ static int use_warmthpotion(unit *u, const item_type *itype, return 0; } +static int potion_water_of_life(unit * u, region *r, int amount) { + static int config; + static int tree_type, tree_count; + int wood = 0; + + if (config_changed(&config)) { + tree_type = config_get_int("rules.magic.wol_type", 1); + tree_count = config_get_int("rules.magic.wol_effect", 10); + } + /* mallorn is required to make mallorn forests, wood for regular ones */ + if (fval(r, RF_MALLORN)) { + wood = use_pooled(u, rt_find("mallorn"), GET_DEFAULT, tree_count * amount); + } + else { + wood = use_pooled(u, rt_find("log"), GET_DEFAULT, tree_count * amount); + } + if (r->land == 0) + wood = 0; + if (wood < tree_count * amount) { + int x = wood / tree_count; + if (wood % tree_count) + ++x; + if (x < amount) + amount = x; + } + rsettrees(r, tree_type, rtrees(r, tree_type) + wood); + ADDMSG(&u->faction->msgs, msg_message("growtree_effect", + "mage amount", u, wood)); + return amount; +} + +static int use_water_of_life(unit *u, const item_type *itype, + int amount, struct order *ord) +{ + return potion_water_of_life(u, u->region, amount); +} + void register_itemfunctions(void) { /* have tests: */ - /* TODO: potions should really use use_potion */ + register_item_use(use_water_of_life, "use_p2"); register_item_use(use_mistletoe, "use_mistletoe"); register_item_use(use_tacticcrystal, "use_dreameye"); register_item_use(use_studypotion, "use_studypotion"); From 96062f6f85e72805d1381a780d75791f6e24c608 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 10:45:56 +0100 Subject: [PATCH 038/231] rename p2->lifepotion (WdL) --- conf/e2/rules.xml | 2 +- res/core/common/potions.xml | 2 +- res/core/de/strings.xml | 4 ++-- res/core/en/strings.xml | 2 +- res/core/fr/strings.xml | 2 +- res/core/spells.xml | 2 +- res/e3a/items.xml | 2 +- res/e3a/strings.xml | 2 +- res/eressea/spells.xml | 14 +++++++------- scripts/eressea/spells.lua | 2 +- scripts/tests/e3/rules.lua | 6 +++--- src/items.c | 4 +--- src/kernel/item.c | 5 +++-- 13 files changed, 24 insertions(+), 25 deletions(-) diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml index 9e40910e0..002c34960 100644 --- a/conf/e2/rules.xml +++ b/conf/e2/rules.xml @@ -15,7 +15,7 @@ - + diff --git a/res/core/common/potions.xml b/res/core/common/potions.xml index bb4556eb7..ab2b8c951 100644 --- a/res/core/common/potions.xml +++ b/res/core/common/potions.xml @@ -34,7 +34,7 @@ - + diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 896a7e009..28e524b38 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -1863,7 +1863,7 @@ Goliathwasser - + Wasser des Lebens @@ -3592,7 +3592,7 @@ 'First roast the Gurgelkraut quickly and add some Fjordwuchs to spice it up. Let it all boil slowly until almost all liquid has evaporated. Leave the mash overnight and finally squeeze it the next morning until a thick fluid drips out.' The liquid thus produced, 'Goliath Water' as we call it, is enough for 10 men and gives each man the carrying capacity of a horse for one week. Zuerst brate man das Gurgelkraut leicht an und würze das Zeug mit ein wenig Fjordwuchs. Man lasse alles so lange kochen, bis fast alle Flüssigkeit verdampft ist. Diesen Brei stelle man über Nacht raus. Am nächsten Morgen presse man den Brei aus. Die so gewonnene Flüssigkeit, Goliathwasser genannt, verleiht bis zu zehn Männern die Tragkraft eines Pferdes. - + The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood. Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme. diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml index f818a3931..5324b165d 100644 --- a/res/core/en/strings.xml +++ b/res/core/en/strings.xml @@ -1078,7 +1078,7 @@ goliath waters - + water of life diff --git a/res/core/fr/strings.xml b/res/core/fr/strings.xml index 13e6beb25..f81b5fc96 100644 --- a/res/core/fr/strings.xml +++ b/res/core/fr/strings.xml @@ -1085,7 +1085,7 @@ breuvage de Goliath - + élixir de vie diff --git a/res/core/spells.xml b/res/core/spells.xml index c4df3e429..fba087855 100644 --- a/res/core/spells.xml +++ b/res/core/spells.xml @@ -39,7 +39,7 @@ - + diff --git a/res/e3a/items.xml b/res/e3a/items.xml index 1d403cfb4..8f84796be 100644 --- a/res/e3a/items.xml +++ b/res/e3a/items.xml @@ -66,7 +66,7 @@ - + diff --git a/res/e3a/strings.xml b/res/e3a/strings.xml index 2dd79abb6..f68720e6a 100644 --- a/res/e3a/strings.xml +++ b/res/e3a/strings.xml @@ -284,7 +284,7 @@ - + The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs. Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen. diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 089ec1a6c..7680f2f3b 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -32,7 +32,7 @@ - + @@ -101,12 +101,12 @@ - + - + @@ -433,7 +433,7 @@ - + @@ -455,7 +455,7 @@ - + @@ -466,7 +466,7 @@ - + @@ -515,7 +515,7 @@ - + diff --git a/scripts/eressea/spells.lua b/scripts/eressea/spells.lua index 5e04c4ed1..5f1507d41 100644 --- a/scripts/eressea/spells.lua +++ b/scripts/eressea/spells.lua @@ -26,7 +26,7 @@ end -- Wasser des Lebens function create_potion_p2(r, mage, level, force) - return create_potion(mage, level, "p2", force) + return create_potion(mage, level, "lifepotion", force) end -- Siebenmeilentee diff --git a/scripts/tests/e3/rules.lua b/scripts/tests/e3/rules.lua index 0888aa0b9..5120fb747 100644 --- a/scripts/tests/e3/rules.lua +++ b/scripts/tests/e3/rules.lua @@ -783,12 +783,12 @@ function test_p2() r:set_resource("tree", 0) u:clear_orders() u:add_order("BENUTZE 'Wasser des Lebens'") - u:add_item("p2", 1) + u:add_item("lifepotion", 1) u:add_item("log", 10) u:add_item("mallorn", 10) process_orders() assert_equal(5, r:get_resource("tree")) - assert_equal(0, u:get_item("p2")) + assert_equal(0, u:get_item("lifepotion")) assert_equal(15, u:get_item("log") + u:get_item("mallorn")) end @@ -803,7 +803,7 @@ function test_p2_move() u:add_order("BENUTZE 'Wasser des Lebens'") u:add_order("NACH OST") u:add_item("horse", 1) - u:add_item("p2", 1) + u:add_item("lifepotion", 1) u:add_item("log", 1) u:add_item("mallorn", 1) process_orders() diff --git a/src/items.c b/src/items.c index 5986675c6..5132b31cb 100644 --- a/src/items.c +++ b/src/items.c @@ -416,7 +416,7 @@ static int use_water_of_life(unit *u, const item_type *itype, void register_itemfunctions(void) { /* have tests: */ - register_item_use(use_water_of_life, "use_p2"); + register_item_use(use_water_of_life, "use_lifepotion"); register_item_use(use_mistletoe, "use_mistletoe"); register_item_use(use_tacticcrystal, "use_dreameye"); register_item_use(use_studypotion, "use_studypotion"); @@ -430,6 +430,4 @@ void register_itemfunctions(void) register_item_use(use_potion, "use_ointment"); register_item_use(use_potion, "use_p14"); register_item_use(use_warmthpotion, "use_nestwarmth"); - /* p2 = P_LIFE = Wasser des Lebens */ - register_item_use(use_potion, "use_p2"); } diff --git a/src/kernel/item.c b/src/kernel/item.c index 74951895a..db551bed3 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -208,6 +208,7 @@ static const char *it_aliases[][2] = { { "Runenschwert", "runesword" }, { "p12", "truthpotion" }, { "p1", "goliathwater" }, + { "p2", "lifepotion" }, { "p4", "ointment" }, { "p5", "peasantblood" }, { "p8", "nestwarmth" }, @@ -555,7 +556,7 @@ static const char *resourcenames[MAX_RESOURCES] = { "laen", "fairyboot", "aoc", "pegasus", "elvenhorse", "charger", "dolphin", "roqf", "trollbelt", "aurafocus", "sphereofinv", "magicbag", - "magicherbbag", "dreameye", "p2" + "magicherbbag", "dreameye", "lifepotion" }; const resource_type *get_resourcetype(resource_t type) { @@ -636,7 +637,7 @@ struct order *), const char *name) static void init_oldpotions(void) { const char *potionnames[MAX_POTIONS] = { - "p0", "goliathwater", "p2", "p3", "ointment", "peasantblood", "p6", + "p0", "goliathwater", "lifepotion", "p3", "ointment", "peasantblood", "p6", "p7", "nestwarmth", "p9", "p10", "p11", "truthpotion", "p13", "p14" }; int p; From a2d23d01faaf83fc3bd71bd1706cad0a78ad72dc Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 12:52:58 +0100 Subject: [PATCH 039/231] Test: Heiltrank heilt mehrere Einheiten. --- scripts/tests/e2/items.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index fe3bca370..c66d08bfa 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -152,6 +152,27 @@ function test_use_healing_potion() turn_end() end +function test_use_healing_potion_multi_units() + -- Heiltrank kann mehrere Einheiten heilen + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u1 = unit.create(f, r, 30) + local u = unit.create(f, r, 30) + assert_equal(600, u1.hp) + assert_equal(600, u.hp) + u.hp = 400 + u1.hp = 400 + turn_begin() + u:add_item("p14", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Heiltrank") + turn_process() + assert_equal(600, u.hp) + assert_equal(600, u1.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + function test_speedsail() local r = region.create(0, 0, "plain") local f = faction.create("human") From 438ae6f905b1a63246c78e6edc8c5bd9f68ba1ba Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 15:17:05 +0100 Subject: [PATCH 040/231] Eliminate rules.magic.multipotion, it's too much code. --- conf/e3/config.json | 1 - scripts/tests/e2/items.lua | 35 +++++++++++++++++++++++++++++ src/alchemy.c | 45 +++----------------------------------- src/items.c | 2 -- src/kernel/unit.c | 29 ------------------------ src/kernel/unit.h | 3 --- 6 files changed, 38 insertions(+), 77 deletions(-) diff --git a/conf/e3/config.json b/conf/e3/config.json index 528d0a7f2..b5f9aed5c 100644 --- a/conf/e3/config.json +++ b/conf/e3/config.json @@ -93,7 +93,6 @@ "rules.region_owners": true, "rules.cavalry.skill": 2, "rules.cavalry.mode": 1, - "rules.magic.multipotion": true, "rules.magic.wol_effect": 5, "rules.magic.factionlist": true, "rules.magic.wol_type": 2, diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index c66d08bfa..85ec40e19 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -173,6 +173,41 @@ function test_use_healing_potion_multi_units() turn_end() end +function test_use_multiple_healing_potions() + -- Einheit kann mehr als einen Heiltrank benutzen + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 60) + assert_equal(1200, u.hp) + u.hp = 400 + turn_begin() + u:add_item("p14", 2) + u:clear_orders() + u:add_order("BENUTZEN 2 Heiltrank") + turn_process() + assert_equal(1200, u.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + +function test_use_healing_potions_twice() + -- Einheit kann mehr als einen BENUTZE Heiltrank Befehl haben + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 60) + assert_equal(1200, u.hp) + u.hp = 400 + turn_begin() + u:add_item("p14", 2) + u:clear_orders() + u:add_order("BENUTZEN 1 Heiltrank") + u:add_order("BENUTZEN 1 Heiltrank") + turn_process() + assert_equal(1200, u.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + function test_speedsail() local r = region.create(0, 0, "plain") local f = faction.create("human") diff --git a/src/alchemy.c b/src/alchemy.c index c6c550774..ec5c3dc7a 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -129,37 +129,6 @@ void herbsearch(unit * u, int max_take) } } -static int begin_potion(unit * u, const item_type * itype, struct order *ord) -{ - static int config; - static bool rule_multipotion; - - assert(itype); - if (config_changed(&config)) { - /* should we allow multiple different potions to be used the same turn? */ - rule_multipotion = config_get_int("rules.magic.multipotion", 0) != 0; - } - - if (!rule_multipotion) { - const item_type *use = ugetpotionuse(u); - if (use != NULL && use != itype) { - ADDMSG(&u->faction->msgs, - msg_message("errusingpotion", "unit using command", - u, use->rtype, ord)); - return ECUSTOM; - } - } - return 0; -} - -static void end_potion(unit * u, const item_type * itype, int amount) -{ - usetpotionuse(u, itype); - - ADDMSG(&u->faction->msgs, msg_message("usepotion", - "unit potion", u, itype->rtype)); -} - void show_potions(faction *f, int sklevel) { const potion_type *ptype; @@ -229,8 +198,10 @@ static int potion_healing(struct unit *user, int amount) } -static int do_potion(unit * u, region *r, const item_type * itype, int amount) +int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { + region *r = u->region; + /* TODO: this function should only be used for effect-changing potions */ if (itype == oldpotiontype[P_PEOPLE]) { return potion_luck(u, r, &at_peasantluck, amount); @@ -253,16 +224,6 @@ static int do_potion(unit * u, region *r, const item_type * itype, int amount) return amount; } -int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) -{ - int result = begin_potion(u, itype, ord); - if (result) - return result; - amount = do_potion(u, u->region, itype, amount); - end_potion(u, itype, amount); - return amount; -} - /*****************/ /* at_effect */ /*****************/ diff --git a/src/items.c b/src/items.c index 5132b31cb..18c2d7b0f 100644 --- a/src/items.c +++ b/src/items.c @@ -303,7 +303,6 @@ struct order *ord) } use_pooled(u, itype->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, amount); - usetpotionuse(u, itype); ADDMSG(&u->faction->msgs, msg_message("usepotion", "unit potion", u, itype->rtype)); @@ -369,7 +368,6 @@ static int use_warmthpotion(unit *u, const item_type *itype, return ECUSTOM; } use_pooled(u, itype->rtype, GET_DEFAULT, amount); - usetpotionuse(u, itype); ADDMSG(&u->faction->msgs, msg_message("usepotion", "unit potion", u, itype->rtype)); diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 356e73354..9af46b28c 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -573,35 +573,6 @@ void usetprivate(unit * u, const char *str) a->data.v = str_strdup(str); } -/*********************/ -/* at_potionuser */ -/*********************/ -/* Einheit BENUTZT einen Trank */ -attrib_type at_potionuser = { - "potionuser", - DEFAULT_INIT, - DEFAULT_FINALIZE, - DEFAULT_AGE, - NO_WRITE, - NO_READ -}; - -void usetpotionuse(unit * u, const item_type * ptype) -{ - attrib *a = a_find(u->attribs, &at_potionuser); - if (!a) - a = a_add(&u->attribs, a_new(&at_potionuser)); - a->data.v = (void *)ptype; -} - -const item_type *ugetpotionuse(const unit * u) -{ - attrib *a = a_find(u->attribs, &at_potionuser); - if (!a) - return NULL; - return (const item_type *)a->data.v; -} - /*********************/ /* at_target */ /*********************/ diff --git a/src/kernel/unit.h b/src/kernel/unit.h index e7bf6a9e4..4d1cc4362 100644 --- a/src/kernel/unit.h +++ b/src/kernel/unit.h @@ -150,9 +150,6 @@ extern "C" { const char *uprivate(const struct unit *u); void usetprivate(struct unit *u, const char *c); - const struct item_type *ugetpotionuse(const struct unit *u); /* benutzt u einein trank? */ - void usetpotionuse(struct unit *u, const struct item_type *p); /* u benutzt trank p (es darf halt nur einer pro runde) */ - bool ucontact(const struct unit *u, const struct unit *u2); void usetcontact(struct unit *u, const struct unit *c); From 4a3ad7ac8425e1c1d6777fd773ecdb0ce8923b8e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 15:22:44 +0100 Subject: [PATCH 041/231] fix potion tests, re-enable foolpotion test --- scripts/tests/e2/items.lua | 91 +------------------------------------- scripts/tests/items.lua | 65 ++++++++++++++++++++++++--- src/alchemy.c | 4 +- 3 files changed, 64 insertions(+), 96 deletions(-) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index 85ec40e19..cefffd967 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -119,95 +119,6 @@ function test_monthly_healing() assert_equal(130, u.hp) end -function test_ointment() - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u = unit.create(f, r, 30) - assert_equal(600, u.hp) - u.hp = 100 - turn_begin() - u:add_item("ointment", 1) - u:clear_orders() - u:add_order("BENUTZEN 1 Wundsalbe") - turn_process() - assert_equal(530, u.hp) - assert_equal(0, u:get_item("ointment")) - turn_end() -end - -function test_use_healing_potion() - -- Heiltrank kann (auch) mit BENUTZE eingesetzt werden - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u = unit.create(f, r, 30) - assert_equal(600, u.hp) - u.hp = 100 - turn_begin() - u:add_item("p14", 1) - u:clear_orders() - u:add_order("BENUTZEN 1 Heiltrank") - turn_process() - assert_equal(530, u.hp) - assert_equal(0, u:get_item("p14")) - turn_end() -end - -function test_use_healing_potion_multi_units() - -- Heiltrank kann mehrere Einheiten heilen - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u1 = unit.create(f, r, 30) - local u = unit.create(f, r, 30) - assert_equal(600, u1.hp) - assert_equal(600, u.hp) - u.hp = 400 - u1.hp = 400 - turn_begin() - u:add_item("p14", 1) - u:clear_orders() - u:add_order("BENUTZEN 1 Heiltrank") - turn_process() - assert_equal(600, u.hp) - assert_equal(600, u1.hp) - assert_equal(0, u:get_item("p14")) - turn_end() -end - -function test_use_multiple_healing_potions() - -- Einheit kann mehr als einen Heiltrank benutzen - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u = unit.create(f, r, 60) - assert_equal(1200, u.hp) - u.hp = 400 - turn_begin() - u:add_item("p14", 2) - u:clear_orders() - u:add_order("BENUTZEN 2 Heiltrank") - turn_process() - assert_equal(1200, u.hp) - assert_equal(0, u:get_item("p14")) - turn_end() -end - -function test_use_healing_potions_twice() - -- Einheit kann mehr als einen BENUTZE Heiltrank Befehl haben - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u = unit.create(f, r, 60) - assert_equal(1200, u.hp) - u.hp = 400 - turn_begin() - u:add_item("p14", 2) - u:clear_orders() - u:add_order("BENUTZEN 1 Heiltrank") - u:add_order("BENUTZEN 1 Heiltrank") - turn_process() - assert_equal(1200, u.hp) - assert_equal(0, u:get_item("p14")) - turn_end() -end - function test_speedsail() local r = region.create(0, 0, "plain") local f = faction.create("human") @@ -227,7 +138,7 @@ function test_speedsail() assert_equal(1, u.ship:get_curse('shipspeed')) -- effect stays forever end -function disable_test_foolpotion() +function test_use_foolpotion() local r = region.create(0, 0, "plain") local f = faction.create("human") local u = unit.create(f, r, 1) diff --git a/scripts/tests/items.lua b/scripts/tests/items.lua index 153bfb803..bb910bc70 100644 --- a/scripts/tests/items.lua +++ b/scripts/tests/items.lua @@ -121,19 +121,74 @@ function test_antimagic() assert_equal(nil, r:get_curse('antimagiczone')) end -function test_ointment() +function test_use_healing_potion() + -- Heiltrank kann (auch) mit BENUTZE eingesetzt werden local r = region.create(0, 0, "plain") local f = faction.create("human") - local u = unit.create(f, r, 1) - local hp = u.hp - u.hp = 1 + local u = unit.create(f, r, 30) + assert_equal(600, u.hp) + u.hp = 100 + turn_begin() + u:add_item("p14", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Heiltrank") + turn_process() + assert_equal(530, u.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + +function test_use_healing_potion_multi_units() + -- Heiltrank kann mehrere Einheiten heilen + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u1 = unit.create(f, r, 30) + local u = unit.create(f, r, 30) + assert_equal(600, u1.hp) + assert_equal(600, u.hp) + u.hp = 400 + u1.hp = 400 + turn_begin() + u:add_item("p14", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Heiltrank") + turn_process() + assert_equal(600, u.hp) + assert_equal(600, u1.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + +function test_use_multiple_healing_potions() + -- Einheit kann mehr als einen Heiltrank benutzen + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 60) + assert_equal(1200, u.hp) + u.hp = 400 + turn_begin() + u:add_item("p14", 2) + u:clear_orders() + u:add_order("BENUTZEN 2 Heiltrank") + turn_process() + assert_equal(1200, u.hp) + assert_equal(0, u:get_item("p14")) + turn_end() +end + +function test_use_ointment() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 30) + assert_equal(600, u.hp) + u.hp = 100 u:add_item("ointment", 1) u:clear_orders() u:add_order("BENUTZEN 1 Wundsalbe") process_orders() + assert_equal(530, u.hp) assert_equal(0, u:get_item("ointment")) assert_equal(1, f:count_msg_type('usepotion')) - assert_equal(hp, u.hp) end function test_use_domore() diff --git a/src/alchemy.c b/src/alchemy.c index ec5c3dc7a..b6a86057e 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -202,7 +202,9 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { region *r = u->region; - /* TODO: this function should only be used for effect-changing potions */ + ADDMSG(&u->faction->msgs, msg_message("usepotion", + "unit potion", u, itype->rtype)); + if (itype == oldpotiontype[P_PEOPLE]) { return potion_luck(u, r, &at_peasantluck, amount); } From d065cbfca7019d3e72c685ba872c0040121ed308 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 15:30:38 +0100 Subject: [PATCH 042/231] use_item message with amount instead of usepotion without. --- res/core/messages.xml | 16 ++++++++-------- scripts/tests/e2/items.lua | 2 +- scripts/tests/items.lua | 9 +++++---- src/alchemy.c | 17 +++++++++-------- src/items.c | 8 ++++---- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index 0c1ea60d9..4159969ee 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -6783,6 +6783,14 @@ "$unit($unit) in $region($region): '$order($command)' - ${error}." "$unit($unit) in $region($region): '$order($command)' - ${error}." + + + + + + "$unit($unit) benutzt $resource($potion,1)." + "$unit($unit) uses $resource($potion,1)." + @@ -6974,14 +6982,6 @@ "$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber." "$unit($unit) collected $int($amount) silver trade tax in $region($region)." - - - - - - "$unit($unit) benutzt $resource($potion,1)." - "$unit($unit) uses $resource($potion,1)." - diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index cefffd967..ce7b76b40 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -38,7 +38,7 @@ function test_nestwarmth_insect() turn_process() assert_equal(flags+64, u.flags) -- UFL_WARMTH assert_equal(1, u:get_item("nestwarmth")) - assert_equal(1, f:count_msg_type('usepotion')) + assert_equal(1, f:count_msg_type('use_item')) turn_end() end diff --git a/scripts/tests/items.lua b/scripts/tests/items.lua index bb910bc70..9f1df3323 100644 --- a/scripts/tests/items.lua +++ b/scripts/tests/items.lua @@ -135,6 +135,7 @@ function test_use_healing_potion() turn_process() assert_equal(530, u.hp) assert_equal(0, u:get_item("p14")) + assert_equal(1, f:count_msg_type('use_item')) turn_end() end @@ -188,7 +189,7 @@ function test_use_ointment() process_orders() assert_equal(530, u.hp) assert_equal(0, u:get_item("ointment")) - assert_equal(1, f:count_msg_type('usepotion')) + assert_equal(1, f:count_msg_type('use_item')) end function test_use_domore() @@ -200,7 +201,7 @@ function test_use_domore() process_orders() assert_equal(10, u:effect("p3")) assert_equal(0, u:get_item("p3")) - assert_equal(1, f:count_msg_type('usepotion')) + assert_equal(1, f:count_msg_type('use_item')) u:clear_orders() u:set_skill('weaponsmithing', 3) u:add_item("iron", 2) @@ -221,7 +222,7 @@ function test_bloodpotion_demon() process_orders() assert_equal(100, u:effect('peasantblood')) assert_equal(0, u:get_item("peasantblood")) - assert_equal(1, f:count_msg_type('usepotion')) + assert_equal(1, f:count_msg_type('use_item')) assert_equal("demon", u.race) end @@ -235,6 +236,6 @@ function test_bloodpotion_other() process_orders() assert_equal(0, u:effect('peasantblood')) assert_equal(0, u:get_item("peasantblood")) - assert_equal(1, f:count_msg_type('usepotion')) + assert_equal(1, f:count_msg_type('use_item')) assert_equal("smurf", u.race) end diff --git a/src/alchemy.c b/src/alchemy.c index b6a86057e..2973c3748 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -202,27 +202,28 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { region *r = u->region; - ADDMSG(&u->faction->msgs, msg_message("usepotion", - "unit potion", u, itype->rtype)); - if (itype == oldpotiontype[P_PEOPLE]) { - return potion_luck(u, r, &at_peasantluck, amount); + amount = potion_luck(u, r, &at_peasantluck, amount); } else if (itype == oldpotiontype[P_HORSE]) { - return potion_luck(u, r, &at_horseluck, amount); + amount = potion_luck(u, r, &at_horseluck, amount); } else if (itype == oldpotiontype[P_HEAL]) { - return potion_healing(u, amount); + amount = potion_healing(u, amount); } else if (itype == oldpotiontype[P_OINTMENT]) { - return potion_ointment(u, amount); + amount = potion_ointment(u, amount); } else if (itype == oldpotiontype[P_MACHT]) { - return potion_power(u, amount); + amount = potion_power(u, amount); } else { change_effect(u, itype, 10 * amount); } + if (amount > 0) { + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); + } return amount; } diff --git a/src/items.c b/src/items.c index 18c2d7b0f..9376fe1c5 100644 --- a/src/items.c +++ b/src/items.c @@ -304,8 +304,8 @@ struct order *ord) use_pooled(u, itype->rtype, GET_SLACK | GET_RESERVE | GET_POOLED_SLACK, amount); - ADDMSG(&u->faction->msgs, msg_message("usepotion", - "unit potion", u, itype->rtype)); + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); return 0; } @@ -369,8 +369,8 @@ static int use_warmthpotion(unit *u, const item_type *itype, } use_pooled(u, itype->rtype, GET_DEFAULT, amount); - ADDMSG(&u->faction->msgs, msg_message("usepotion", - "unit potion", u, itype->rtype)); + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); return 0; } From ef7d0c40ed1d7f59ca4713bff9c1a582db868d04 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 18:51:11 +0100 Subject: [PATCH 043/231] remove the two helaing special cases from use_potion --- src/alchemy.c | 38 ------------------------------------ src/items.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++-- src/laws.test.c | 2 +- 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/src/alchemy.c b/src/alchemy.c index 2973c3748..b51437967 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -166,38 +166,6 @@ static int potion_power(unit *u, int amount) { return amount; } -static int heal(unit * user, int effect) -{ - int req = unit_max_hp(user) * user->number - user->hp; - if (req > 0) { - if (req > effect) req = effect; - effect -= req; - user->hp += req; - } - return effect; -} - -static int potion_ointment(unit * u, int amount) { - int effect = amount * 400; - effect = heal(u, effect); - return amount; -} - -static int potion_healing(struct unit *user, int amount) -{ - int effect = amount * 400; - unit *u = user->region->units; - effect = heal(user, effect); - while (effect > 0 && u != NULL) { - if (u->faction == user->faction) { - effect = heal(u, effect); - } - u = u->next; - } - return amount; -} - - int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { region *r = u->region; @@ -208,12 +176,6 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) else if (itype == oldpotiontype[P_HORSE]) { amount = potion_luck(u, r, &at_horseluck, amount); } - else if (itype == oldpotiontype[P_HEAL]) { - amount = potion_healing(u, amount); - } - else if (itype == oldpotiontype[P_OINTMENT]) { - amount = potion_ointment(u, amount); - } else if (itype == oldpotiontype[P_MACHT]) { amount = potion_power(u, amount); } diff --git a/src/items.c b/src/items.c index 9376fe1c5..6f1981a08 100644 --- a/src/items.c +++ b/src/items.c @@ -411,6 +411,53 @@ static int use_water_of_life(unit *u, const item_type *itype, return potion_water_of_life(u, u->region, amount); } +static int heal(unit * user, int effect) +{ + int req = unit_max_hp(user) * user->number - user->hp; + if (req > 0) { + if (req > effect) req = effect; + effect -= req; + user->hp += req; + } + return effect; +} + +static int potion_healing(struct unit *user, int amount) +{ + int effect = amount * 400; + unit *u = user->region->units; + effect = heal(u, effect); + while (effect > 0 && u != NULL) { + if (u->faction == user->faction) { + effect = heal(u, effect); + } + u = u->next; + } + return amount; +} + +static int use_healing_potion(unit *u, const item_type *itype, + int amount, struct order *ord) +{ + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); + return potion_healing(u, amount); +} + +static int potion_ointment(unit * u, int amount) { + int effect = amount * 400; + effect = heal(u, effect); + return amount; +} + +static int use_ointment(unit *u, const item_type *itype, + int amount, struct order *ord) +{ + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); + return potion_ointment(u, amount); +} + void register_itemfunctions(void) { /* have tests: */ @@ -425,7 +472,7 @@ void register_itemfunctions(void) register_item_use(use_birthdayamulet, "use_aoc"); register_item_use(use_foolpotion, "use_p7"); register_item_use(use_bloodpotion, "use_peasantblood"); - register_item_use(use_potion, "use_ointment"); - register_item_use(use_potion, "use_p14"); + register_item_use(use_ointment, "use_ointment"); + register_item_use(use_healing_potion, "use_p14"); register_item_use(use_warmthpotion, "use_nestwarmth"); } diff --git a/src/laws.test.c b/src/laws.test.c index 888614a1a..4d641cc52 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -883,7 +883,7 @@ static void test_luck_message(CuTest *tc) { demographics(); - CuAssertPtrEquals_Msg(tc, "unexpected message", (void *)NULL, r->msgs); + CuAssertPtrEquals_Msg(tc, "unexpected message", NULL, r->msgs); a = (attrib *)a_find(r->attribs, &at_peasantluck); if (!a) From afe1cf34f3bb1f6910ba287b7326f4aa2b381d07 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 18:59:43 +0100 Subject: [PATCH 044/231] rough acceptance test for elixir of power (p13) --- scripts/tests/items.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/scripts/tests/items.lua b/scripts/tests/items.lua index 9f1df3323..9d63b875d 100644 --- a/scripts/tests/items.lua +++ b/scripts/tests/items.lua @@ -177,6 +177,21 @@ function test_use_multiple_healing_potions() turn_end() end +function test_use_elixir() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u = unit.create(f, r, 10) + assert_equal(200, u.hp) + u:add_item("p13", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Elixier~der~Macht") + process_orders() + -- potion makes hp 1000, monthly_healing takes away 400: + assert_equal(600, u.hp) + assert_equal(0, u:get_item("p13")) + assert_equal(1, f:count_msg_type('use_item')) +end + function test_use_ointment() local r = region.create(0, 0, "plain") local f = faction.create("human") From b602ac5f1a5578e98ae45c6a4524fcbd440cc722 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 19:02:02 +0100 Subject: [PATCH 045/231] remove P_POWER from use_potion --- src/alchemy.c | 14 -------------- src/items.c | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/alchemy.c b/src/alchemy.c index b51437967..4b7e961a6 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -155,17 +155,6 @@ static int potion_luck(unit *u, region *r, attrib_type *atype, int amount) { return amount; } -static int potion_power(unit *u, int amount) { - int hp = 10 * amount; - - if (hp > u->number) { - hp = u->number; - amount = (hp + 9) % 10; - } - u->hp += hp * unit_max_hp(u) * 4; - return amount; -} - int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) { region *r = u->region; @@ -176,9 +165,6 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord) else if (itype == oldpotiontype[P_HORSE]) { amount = potion_luck(u, r, &at_horseluck, amount); } - else if (itype == oldpotiontype[P_MACHT]) { - amount = potion_power(u, amount); - } else { change_effect(u, itype, 10 * amount); } diff --git a/src/items.c b/src/items.c index 6f1981a08..41617c0d0 100644 --- a/src/items.c +++ b/src/items.c @@ -458,6 +458,25 @@ static int use_ointment(unit *u, const item_type *itype, return potion_ointment(u, amount); } +static int potion_power(unit *u, int amount) { + int hp = 10 * amount; + + if (hp > u->number) { + hp = u->number; + amount = (hp + 9) % 10; + } + u->hp += hp * unit_max_hp(u) * 4; + return amount; +} + +static int use_power_elixir(unit *u, const item_type *itype, + int amount, struct order *ord) +{ + ADDMSG(&u->faction->msgs, msg_message("use_item", + "unit amount item", u, amount, itype->rtype)); + return potion_power(u, amount); +} + void register_itemfunctions(void) { /* have tests: */ @@ -474,5 +493,6 @@ void register_itemfunctions(void) register_item_use(use_bloodpotion, "use_peasantblood"); register_item_use(use_ointment, "use_ointment"); register_item_use(use_healing_potion, "use_p14"); + register_item_use(use_power_elixir, "use_p13"); register_item_use(use_warmthpotion, "use_nestwarmth"); } From 6c572c6287f53f3261176329b83eead7911478ea Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 20:35:00 +0100 Subject: [PATCH 046/231] rename potion: p14 to healing fix use_item message crash --- res/core/common/potions.xml | 2 +- res/core/de/strings.xml | 6 +++--- res/core/en/strings.xml | 4 ++-- res/core/fr/strings.xml | 4 ++-- res/core/messages.xml | 6 +++--- res/e3a/items.xml | 2 +- res/e3a/spellbooks/cerddor.xml | 2 +- res/e3a/spellbooks/draig.xml | 2 +- res/e3a/spellbooks/gray.xml | 2 +- res/e3a/spellbooks/gwyrrd.xml | 2 +- res/e3a/spellbooks/illaun.xml | 2 +- res/e3a/spells.xml | 2 +- res/e3a/strings.xml | 4 ++-- scripts/eressea/spells.lua | 4 ++-- scripts/tests/items.lua | 12 ++++++------ src/alchemy.h | 1 - src/items.c | 2 +- src/kernel/item.c | 16 +++++++++++----- 18 files changed, 40 insertions(+), 35 deletions(-) diff --git a/res/core/common/potions.xml b/res/core/common/potions.xml index ab2b8c951..fa3ce3478 100644 --- a/res/core/common/potions.xml +++ b/res/core/common/potions.xml @@ -167,7 +167,7 @@ - + diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 28e524b38..21383e1af 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -1899,7 +1899,7 @@ Elixier der Macht - + Heiltrank @@ -1945,7 +1945,7 @@ Elixiere der Macht - + Heiltränke @@ -3640,7 +3640,7 @@ One of the most rare and prized of all alchemist elixers, this potion grants the user a dragon's power for a few weeks. The potion increases the life-energy of a maximum of ten people fivefold. The effect is strongest right after drinking and slowly decreases over time. To brew this potion the alchemist needs an elvendear, a windbag, a piece of waterfinder and a spider ivy. Finally he dusts it with some minced bubblemorel and stirrs the powder into some dragon's blood. Eines der seltensten und wertvollsten alchemistischen Elixiere, verleiht dieser Trank dem Anwender für einige Wochen die Kraft eines Drachen. Der Trank erhöht die Lebensenergie von maximal zehn Personen auf das fünffache. Die Wirkung ist direkt nach der Einnahme am stärksten und klingt danach langsam ab. Zur Herstellung benötigt der Alchemist ein Elfenlieb, einen Windbeutel, ein Stück Wasserfinder und einen Grünen Spinnerich. Über dieses Mischung streue er schließlich einen zerriebenen Blasenmorchel und rühre dieses Pulver unter etwas Drachenblut. - + For a healing potion one takes the peel of a windbag and some bugleweed, stirr in some chopped elvendear and sprinkle it with the blossoms of an ice begonia. This has to cook through for four days, while a gapgrowth has to be added on the second day. Then one carefully scoops off the top layer of liquid. One such potion gives four men (or one man four times) a 50% chance to survive otherwise lethal wounds. The potion is automatically used in case of injury. Für einen Heiltrank nehme man die Schale eines Windbeutels und etwas Gurgelkraut, rühre eine kleingehacktes Elfenlieb dazu und bestreue alles mit den Blüten einer Eisblume. Dies muß vier Tage lang gären, wobei man am zweiten Tag einen Spaltwachs dazutun muß. Dann ziehe man vorsichtig den oben schwimmenden Saft ab. Ein solcher Trank gibt vier Männern (oder einem Mann vier mal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt. diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml index 5324b165d..0347e92b5 100644 --- a/res/core/en/strings.xml +++ b/res/core/en/strings.xml @@ -1150,10 +1150,10 @@ elixirs of power - + healing potion - + healing potions diff --git a/res/core/fr/strings.xml b/res/core/fr/strings.xml index f81b5fc96..37877b57b 100644 --- a/res/core/fr/strings.xml +++ b/res/core/fr/strings.xml @@ -1157,10 +1157,10 @@ elixir d'endurance - + potion de survie - + potions de survie diff --git a/res/core/messages.xml b/res/core/messages.xml index 4159969ee..b810b8a43 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -2800,7 +2800,7 @@ "$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),""," von $int($wanted)") $resource($resource,$wanted)." "$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),""," of $int($wanted)") $resource($resource,$amount)." - + @@ -6797,8 +6797,8 @@ - "$unit($unit) benutzt $amount $resource($item,$amount)." - "$unit($unit) uses $amount $resource($item,$amount)." + "$unit($unit) benutzt $int($amount) $resource($item,$amount)." + "$unit($unit) uses $int($amount) $resource($item,$amount)." diff --git a/res/e3a/items.xml b/res/e3a/items.xml index 8f84796be..42d425b24 100644 --- a/res/e3a/items.xml +++ b/res/e3a/items.xml @@ -52,7 +52,7 @@ - + diff --git a/res/e3a/spellbooks/cerddor.xml b/res/e3a/spellbooks/cerddor.xml index 9e1a3f835..b52fe5d6f 100644 --- a/res/e3a/spellbooks/cerddor.xml +++ b/res/e3a/spellbooks/cerddor.xml @@ -7,7 +7,7 @@ - + diff --git a/res/e3a/spellbooks/draig.xml b/res/e3a/spellbooks/draig.xml index a0da7b449..2d29b44ca 100644 --- a/res/e3a/spellbooks/draig.xml +++ b/res/e3a/spellbooks/draig.xml @@ -7,7 +7,7 @@ - + diff --git a/res/e3a/spellbooks/gray.xml b/res/e3a/spellbooks/gray.xml index a807963c2..998405b03 100644 --- a/res/e3a/spellbooks/gray.xml +++ b/res/e3a/spellbooks/gray.xml @@ -38,7 +38,7 @@ - + diff --git a/res/e3a/spellbooks/gwyrrd.xml b/res/e3a/spellbooks/gwyrrd.xml index 83fd4e99c..76cf7a154 100644 --- a/res/e3a/spellbooks/gwyrrd.xml +++ b/res/e3a/spellbooks/gwyrrd.xml @@ -7,7 +7,7 @@ - + diff --git a/res/e3a/spellbooks/illaun.xml b/res/e3a/spellbooks/illaun.xml index 02c9b34d8..0392842c2 100644 --- a/res/e3a/spellbooks/illaun.xml +++ b/res/e3a/spellbooks/illaun.xml @@ -7,7 +7,7 @@ - + diff --git a/res/e3a/spells.xml b/res/e3a/spells.xml index 25d123d43..f3edbd9f6 100644 --- a/res/e3a/spells.xml +++ b/res/e3a/spells.xml @@ -421,7 +421,7 @@ - + diff --git a/res/e3a/strings.xml b/res/e3a/strings.xml index f68720e6a..4a089cb50 100644 --- a/res/e3a/strings.xml +++ b/res/e3a/strings.xml @@ -197,7 +197,7 @@ Braue Elixier der Macht brew elixir of power - + Braue Heiltrank brew healing potion @@ -264,7 +264,7 @@ Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde. - + Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom. Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt. diff --git a/scripts/eressea/spells.lua b/scripts/eressea/spells.lua index 5f1507d41..eb33dd95f 100644 --- a/scripts/eressea/spells.lua +++ b/scripts/eressea/spells.lua @@ -55,8 +55,8 @@ function create_potion_p3(r, mage, level, force) end -- Heiltrank -function create_potion_p14(r, mage, level, force) - return create_potion(mage, level, "p14", force) +function create_potion_healing(r, mage, level, force) + return create_potion(mage, level, "healing", force) end -- Elixier der Macht diff --git a/scripts/tests/items.lua b/scripts/tests/items.lua index 9d63b875d..60bbf100f 100644 --- a/scripts/tests/items.lua +++ b/scripts/tests/items.lua @@ -129,12 +129,12 @@ function test_use_healing_potion() assert_equal(600, u.hp) u.hp = 100 turn_begin() - u:add_item("p14", 1) + u:add_item("healing", 1) u:clear_orders() u:add_order("BENUTZEN 1 Heiltrank") turn_process() assert_equal(530, u.hp) - assert_equal(0, u:get_item("p14")) + assert_equal(0, u:get_item("healing")) assert_equal(1, f:count_msg_type('use_item')) turn_end() end @@ -150,13 +150,13 @@ function test_use_healing_potion_multi_units() u.hp = 400 u1.hp = 400 turn_begin() - u:add_item("p14", 1) + u:add_item("healing", 1) u:clear_orders() u:add_order("BENUTZEN 1 Heiltrank") turn_process() assert_equal(600, u.hp) assert_equal(600, u1.hp) - assert_equal(0, u:get_item("p14")) + assert_equal(0, u:get_item("healing")) turn_end() end @@ -168,12 +168,12 @@ function test_use_multiple_healing_potions() assert_equal(1200, u.hp) u.hp = 400 turn_begin() - u:add_item("p14", 2) + u:add_item("healing", 2) u:clear_orders() u:add_order("BENUTZEN 2 Heiltrank") turn_process() assert_equal(1200, u.hp) - assert_equal(0, u:get_item("p14")) + assert_equal(0, u:get_item("healing")) turn_end() end diff --git a/src/alchemy.h b/src/alchemy.h index 3ce6b9547..b1dde1c44 100644 --- a/src/alchemy.h +++ b/src/alchemy.h @@ -52,7 +52,6 @@ extern "C" { /* Stufe 4 */ P_PEOPLE, P_WAHRHEIT, - P_MACHT, P_HEAL, MAX_POTIONS }; diff --git a/src/items.c b/src/items.c index 41617c0d0..e162d8fe2 100644 --- a/src/items.c +++ b/src/items.c @@ -492,7 +492,7 @@ void register_itemfunctions(void) register_item_use(use_foolpotion, "use_p7"); register_item_use(use_bloodpotion, "use_peasantblood"); register_item_use(use_ointment, "use_ointment"); - register_item_use(use_healing_potion, "use_p14"); + register_item_use(use_healing_potion, "use_healing"); register_item_use(use_power_elixir, "use_p13"); register_item_use(use_warmthpotion, "use_nestwarmth"); } diff --git a/src/kernel/item.c b/src/kernel/item.c index db551bed3..4483c51f0 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -206,12 +206,13 @@ resource_type *rt_get_or_create(const char *name) { static const char *it_aliases[][2] = { { "Runenschwert", "runesword" }, - { "p12", "truthpotion" }, { "p1", "goliathwater" }, { "p2", "lifepotion" }, { "p4", "ointment" }, { "p5", "peasantblood" }, { "p8", "nestwarmth" }, + { "p14", "healing" }, + { "p12", "truthpotion" }, { "diamond", "adamantium" }, { "diamondaxe", "adamantiumaxe" }, { "diamondplate", "adamantiumplate" }, @@ -226,13 +227,18 @@ static const char *it_alias(const char *zname) if (strcmp(it_aliases[i][0], zname) == 0) return it_aliases[i][1]; } - return zname; + return NULL; } item_type *it_find(const char *zname) { - const char *name = it_alias(zname); - resource_type *result = rt_find(name); + resource_type *result = rt_find(zname); + if (!result) { + const char *name = it_alias(zname); + if (name) { + result = rt_find(name); + } + } return result ? result->itype : 0; } @@ -638,7 +644,7 @@ static void init_oldpotions(void) { const char *potionnames[MAX_POTIONS] = { "p0", "goliathwater", "lifepotion", "p3", "ointment", "peasantblood", "p6", - "p7", "nestwarmth", "p9", "p10", "p11", "truthpotion", "p13", "p14" + "p7", "nestwarmth", "p9", "p10", "p11", "truthpotion", "healing" }; int p; From 06f3e337b6e96b57bb565f5d010b9260c8920f11 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 20:56:40 +0100 Subject: [PATCH 047/231] missing plural for lifepotion --- res/core/de/strings.xml | 2 +- res/core/fr/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 21383e1af..98f047a39 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -1909,7 +1909,7 @@ Goliathwasser - + Wasser des Lebens diff --git a/res/core/fr/strings.xml b/res/core/fr/strings.xml index 37877b57b..d6c61e00c 100644 --- a/res/core/fr/strings.xml +++ b/res/core/fr/strings.xml @@ -1088,7 +1088,7 @@ élixir de vie - + élixir de vie From cb537b1a9316516567d3fa47283ad4b866265bff Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 21:08:58 +0100 Subject: [PATCH 048/231] missing translations are the worst. --- res/core/en/strings.xml | 2 +- src/reports.c | 8 ++++++-- src/util/language.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml index 0347e92b5..096dace78 100644 --- a/res/core/en/strings.xml +++ b/res/core/en/strings.xml @@ -1081,7 +1081,7 @@ water of life - + waters of life diff --git a/src/reports.c b/src/reports.c index 20f2068e8..992e6de9f 100644 --- a/src/reports.c +++ b/src/reports.c @@ -2114,10 +2114,14 @@ static void eval_resource(struct opstack **stack, const void *userdata) int j = opop(stack).i; const struct resource_type *res = (const struct resource_type *)opop(stack).v; const char *c = LOC(lang, resourcename(res, j != 1)); - size_t len = strlen(c); variant var; + if (c) { + size_t len = strlen(c); - var.v = strcpy(balloc(len + 1), c); + var.v = strcpy(balloc(len + 1), c); + } else { + var.v = NULL; + } opush(stack, var); } diff --git a/src/util/language.c b/src/util/language.c index cf76dc4de..b2447b695 100644 --- a/src/util/language.c +++ b/src/util/language.c @@ -186,7 +186,7 @@ const char *locale_string(const locale * lang, const char *key, bool warn) return value; } } - return 0; + return NULL; } void locale_setstring(locale * lang, const char *key, const char *value) From f9fcc0182982af75c389d29411a1d3331ea32640 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Feb 2018 21:14:47 +0100 Subject: [PATCH 049/231] print more debug information when a name is missing. --- src/reports.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/reports.c b/src/reports.c index 992e6de9f..69e7a3555 100644 --- a/src/reports.c +++ b/src/reports.c @@ -2113,13 +2113,15 @@ static void eval_resource(struct opstack **stack, const void *userdata) const struct locale *lang = report ? report->locale : default_locale; int j = opop(stack).i; const struct resource_type *res = (const struct resource_type *)opop(stack).v; - const char *c = LOC(lang, resourcename(res, j != 1)); + const char *name = resourcename(res, j != 1); + const char *c = LOC(lang, name); variant var; if (c) { size_t len = strlen(c); var.v = strcpy(balloc(len + 1), c); } else { + log_error("missing translation for %s in eval_resource", name); var.v = NULL; } opush(stack, var); @@ -2131,11 +2133,17 @@ static void eval_race(struct opstack **stack, const void *userdata) const struct locale *lang = report ? report->locale : default_locale; int j = opop(stack).i; const race *r = (const race *)opop(stack).v; - const char *c = LOC(lang, rc_name_s(r, (j == 1) ? NAME_SINGULAR : NAME_PLURAL)); - size_t len = strlen(c); + const char *name = rc_name_s(r, (j == 1) ? NAME_SINGULAR : NAME_PLURAL); + const char *c = LOC(lang, name); variant var; - - var.v = strcpy(balloc(len + 1), c); + if (c) { + size_t len = strlen(c); + var.v = strcpy(balloc(len + 1), c); + } + else { + log_error("missing translation for %s in eval_race", name); + var.v = NULL; + } opush(stack, var); } From 7c3e0a522536ca982f7b3ea2b809d9636124832b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 18 Feb 2018 10:31:57 +0100 Subject: [PATCH 050/231] BUG 2416: Prefer sqlite over db backend --- s/cmake-init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/s/cmake-init b/s/cmake-init index 5da7e985f..75e3fd7ac 100755 --- a/s/cmake-init +++ b/s/cmake-init @@ -1,8 +1,8 @@ #!/bin/sh -ERESSEA_DB=sqlite -if [ -e /usr/include/db.h ] ; then ERESSEA_DB=db +if [ -e /usr/include/sqlite3.h ] ; then +ERESSEA_DB=sqlite fi # Parse command line arguments From e841177e6f08cad9dd2adea4ae606a1c5506cdb6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 18 Feb 2018 10:37:13 +0100 Subject: [PATCH 051/231] fix types for CMakeCache --- s/build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/s/build b/s/build index 636777541..709c92510 100755 --- a/s/build +++ b/s/build @@ -37,10 +37,10 @@ BRANCH=$(git status -s -b | head -1 | cut -d\ -f 2 | sed 's/\..*//') if [ "$BRANCH" = "master" ] ; then VERSION=$(git describe --match 'v*.*.*' --tags | sed 's/^v//') echo "$BRANCH $VERSION" -CMAKE_ARGS="-DERESSEA_VERSION=$VERSION ${CMAKE_ARGS}" +CMAKE_ARGS="-DERESSEA_VERSION:STRING=$VERSION ${CMAKE_ARGS}" else REV=$(git rev-parse --short HEAD) -CMAKE_ARGS="-DERESSEA_BUILDNO=$REV $CMAKE_ARGS" +CMAKE_ARGS="-DERESSEA_BUILDNO:STRING=$REV $CMAKE_ARGS" fi cmake ${CMAKE_ARGS} From de52d8d669ebe9a0a7fad14aa252f5c772b7167c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 18 Feb 2018 11:46:05 +0100 Subject: [PATCH 052/231] BUG 2419: add a spell alias. --- src/attributes/seenspell.c | 2 +- src/kernel/spell.c | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 170cc33b4..6c78d19f4 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -94,7 +94,7 @@ static int read_seenspell(variant *var, void *owner, struct gamedata *data) } sp = find_spell(token); if (!sp) { - log_info("read_seenspell: could not find spell '%s'\n", token); + log_error("read_seenspell: could not find spell '%s'\n", token); return AT_READ_FAIL; } var->v = sp; diff --git a/src/kernel/spell.c b/src/kernel/spell.c index ca97bf1f0..785f270b3 100644 --- a/src/kernel/spell.c +++ b/src/kernel/spell.c @@ -135,6 +135,7 @@ spell * create_spell(const char * name) } static const char *sp_aliases[][2] = { + { "create_potion_p14", "create_potion_healing" }, { "gwyrrdfamiliar", "summon_familiar" }, { "illaunfamiliar", "summon_familiar" }, { "draigfamiliar", "summon_familiar" }, @@ -150,16 +151,20 @@ static const char *sp_alias(const char *zname) if (strcmp(sp_aliases[i][0], zname) == 0) return sp_aliases[i][1]; } - return zname; + return NULL; } spell *find_spell(const char *name) { const char * match; spell * sp = 0; - const char * alias = sp_alias(name); - - match = cb_find_str(&cb_spells, alias); + match = cb_find_str(&cb_spells, name); + if (!match) { + const char * alias = sp_alias(name); + if (alias) { + match = cb_find_str(&cb_spells, alias); + } + } if (match) { cb_get_kv(match, &sp, sizeof(sp)); } From fa1e81f6ac62d9bed24602f60058c2f9555f36cc Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 23 Feb 2018 21:24:15 +0100 Subject: [PATCH 053/231] write a log of dead factions. --- src/eressea.c | 19 ++++++++----------- src/kernel/config.c | 2 +- src/kernel/faction.c | 22 +++++++++++++++++++++- src/kernel/faction.h | 1 + src/main.c | 1 + 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/eressea.c b/src/eressea.c index 03f194238..81f19b5a6 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -4,6 +4,7 @@ #include "kernel/calendar.h" #include "kernel/config.h" #include "kernel/curse.h" +#include "kernel/faction.h" #include "kernel/building.h" #include "kernel/equipment.h" #include "kernel/item.h" @@ -37,22 +38,17 @@ #include #include +/* manually free() everything at exit? */ +#undef CLEANUP_CODE + void game_done(void) { -#undef CLEANUP_CODE + log_dead_factions(); + #ifdef CLEANUP_CODE - /* Diese Routine enfernt allen allokierten Speicher wieder. Das ist nur - * zum Debugging interessant, wenn man Leak Detection hat, und nach - * nicht freigegebenem Speicher sucht, der nicht bis zum Ende benoetigt - * wird (temporaere Hilsstrukturen) */ - - free_game(); - + free_gamedata(); creport_cleanup(); -#ifdef REPORT_FORMAT_NR report_cleanup(); -#endif -#endif calendar_cleanup(); free_functions(); free_config(); @@ -60,6 +56,7 @@ void game_done(void) free_locales(); kernel_done(); dblib_close(); +#endif } void game_init(void) diff --git a/src/kernel/config.c b/src/kernel/config.c index 05690e301..8c7e64afe 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -778,8 +778,8 @@ void free_gamedata(void) free(forbidden_ids); forbidden_ids = NULL; - free_donations(); free_factions(); + free_donations(); free_units(); free_regions(); free_borders(); diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 36f467c6e..165551f8f 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -738,7 +738,6 @@ void remove_empty_factions(void) faction *f = *fp; if (!(f->_alive && f->units!=NULL) && !fval(f, FFL_NOIDLEOUT)) { - log_debug("dead: %s", factionname(f)); destroyfaction(fp); } else { @@ -876,6 +875,27 @@ int writepasswd(void) return 1; } +void log_dead_factions(void) +{ + if (dead_factions) { + const char *logname = config_get("game.deadlog"); + if (logname) { + FILE *F; + char path[PATH_MAX]; + + join_path(basepath(), logname, path, sizeof(path)); + F = fopen(path, "at"); + if (F) { + faction *f; + for (f = dead_factions; f; f = f->next) { + fprintf(F, "%d\t%d\t%d\t%s\t%s\t%s\n", turn, f->lastorders, f->age, itoa36(f->no), f->email, f->name); + } + fclose(F); + } + } + } +} + void free_factions(void) { #ifdef DMAXHASH int i; diff --git a/src/kernel/faction.h b/src/kernel/faction.h index 25913e73d..8d13f64d1 100644 --- a/src/kernel/faction.h +++ b/src/kernel/faction.h @@ -133,6 +133,7 @@ extern "C" { void renumber_faction(faction * f, int no); void free_factions(void); + void log_dead_factions(void); void remove_empty_factions(void); void update_interval(struct faction *f, struct region *r); diff --git a/src/main.c b/src/main.c index ae6d2158c..489d0d868 100644 --- a/src/main.c +++ b/src/main.c @@ -82,6 +82,7 @@ static void load_inifile(void) static const char * valid_keys[] = { "game.id", + "game.deadlog", "game.name", "game.start", "game.locale", From 1f7a25b4c57a5fb4332c393c49e83d4b722546fd Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 24 Feb 2018 16:48:39 +0100 Subject: [PATCH 054/231] disable an intermittent check. --- scripts/tests/e2/items.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index ce7b76b40..2a84fcd54 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -162,7 +162,8 @@ function test_use_foolpotion() turn_process() assert_equal(0, u:get_item('p7')) assert_equal(0, u2:effect('p7')) - assert_equal(0, u2:get_skill('crossbow')) +-- disabled, intermittent: +-- assert_equal(0, u2:get_skill('crossbow')) assert_equal(1, f:count_msg_type('givedumb')) turn_end() end From 8a00cc3b965bf8c5e3b9dba524d1e27d3b4fd89a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 24 Feb 2018 18:58:50 +0100 Subject: [PATCH 055/231] foolpotion test is not intermittent if we disable study.random_progress --- scripts/tests/e2/items.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index 2a84fcd54..e444a9c73 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -9,6 +9,7 @@ function setup() eressea.settings.set("rules.ship.storms", "0") eressea.settings.set("rules.encounters", "0") eressea.settings.set("magic.regeneration.enable", "0") + eressea.settings.set("study.random_progress", "0") end function test_water_of_life() @@ -162,8 +163,7 @@ function test_use_foolpotion() turn_process() assert_equal(0, u:get_item('p7')) assert_equal(0, u2:effect('p7')) --- disabled, intermittent: --- assert_equal(0, u2:get_skill('crossbow')) + assert_equal(0, u2:get_skill('crossbow')) assert_equal(1, f:count_msg_type('givedumb')) turn_end() end From 42c86d122e8764cd138e86436e57ab5e959b73e4 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 24 Feb 2018 19:41:36 +0100 Subject: [PATCH 056/231] stop using MINMAX macros. --- src/bindings.c | 3 +- src/economy.h | 3 + src/kernel/pool.c | 18 ++-- src/monsters.c | 31 +++++-- src/randenc.c | 70 ++++++++------- src/reports.c | 222 +++++++++++++++++++++++----------------------- src/reports.h | 3 +- 7 files changed, 189 insertions(+), 161 deletions(-) diff --git a/src/bindings.c b/src/bindings.c index 35657b5be..2364775fb 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -458,8 +458,7 @@ static int tolua_write_report(lua_State * L) { faction *f = (faction *)tolua_tousertype(L, 1, 0); if (f) { - time_t ltime = time(0); - int result = write_reports(f, ltime); + int result = write_reports(f); lua_pushinteger(L, result); } else { diff --git a/src/economy.h b/src/economy.h index 6d58a1f9f..8d022ebbc 100644 --- a/src/economy.h +++ b/src/economy.h @@ -18,6 +18,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_GC_ECONOMY #define H_GC_ECONOMY + +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/src/kernel/pool.c b/src/kernel/pool.c index e58bc131e..52e445c94 100644 --- a/src/kernel/pool.c +++ b/src/kernel/pool.c @@ -16,11 +16,14 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ +#ifdef _MSC_VER #include -#include +#endif + #include "pool.h" #include "ally.h" +#include "config.h" #include "faction.h" #include "item.h" #include "order.h" @@ -168,7 +171,8 @@ int count) use = have; else if (rtype->itype && mode & (GET_SLACK | GET_RESERVE)) { int reserve = get_reservation(u, rtype->itype); - int slack = MAX(0, have - reserve); + int slack = have - reserve; + if (slack < 0) slack = 0; if (mode & GET_RESERVE) use = have - slack; else if (mode & GET_SLACK) @@ -206,18 +210,20 @@ use_pooled(unit * u, const resource_type * rtype, unsigned int mode, int count) } if ((mode & GET_SLACK) && (mode & GET_RESERVE)) { - n = MIN(use, have); + n = (use < have) ? use : have; } else if (rtype->itype) { int reserve = get_reservation(u, rtype->itype); - int slack = MAX(0, have - reserve); + int slack = have - reserve; + if (slack < 0) slack = 0; if (mode & GET_RESERVE) { n = have - slack; - n = MIN(use, n); + if (n > use) n = use; change_reservation(u, rtype->itype, -n); } else if (mode & GET_SLACK) { - n = MIN(use, slack); + n = slack; + if (n > use) n = use; } } if (n > 0) { diff --git a/src/monsters.c b/src/monsters.c index 99f32cedb..59664480a 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -17,7 +17,9 @@ * permission from the authors. */ +#ifdef _MSC_VER #include +#endif #include "monsters.h" @@ -132,7 +134,10 @@ static void reduce_weight(unit * u) if (itype->weight >= 10 && itype->rtype->wtype == 0 && itype->rtype->atype == 0) { if (itype->capacity < itype->weight) { - int reduce = MIN(itm->number, -((capacity - weight) / itype->weight)); + int reduce = (weight - capacity) / itype->weight; + if (reduce > itm->number) { + reduce = itm->number; + } give_peasants(u, itm->type, reduce); weight -= reduce * itype->weight; } @@ -147,7 +152,10 @@ static void reduce_weight(unit * u) const item_type *itype = itm->type; weight += itm->number * itype->weight; if (itype->capacity < itype->weight) { - int reduce = MIN(itm->number, -((capacity - weight) / itype->weight)); + int reduce = (weight - capacity) / itype->weight; + if (reduce > itm->number) { + reduce = itm->number; + } give_peasants(u, itm->type, reduce); weight -= reduce * itype->weight; } @@ -1027,10 +1035,12 @@ static void eaten_by_monster(unit * u) n = (int)(n * multi); if (n > 0) { + n = lovar(n); - n = MIN(rpeasants(u->region), n); if (n > 0) { + int p = rpeasants(u->region); + if (p < n) n = p; deathcounts(u->region, n); rsetpeasants(u->region, rpeasants(u->region) - n); ADDMSG(&u->region->msgs, msg_message("eatpeasants", "unit amount", u, n)); @@ -1048,8 +1058,9 @@ static void absorbed_by_monster(unit * u) if (n > 0) { n = lovar(n); - n = MIN(rpeasants(u->region), n); if (n > 0) { + int p = rpeasants(u->region); + if (p < n) n = p; rsetpeasants(u->region, rpeasants(u->region) - n); scale_number(u, u->number + n); ADDMSG(&u->region->msgs, msg_message("absorbpeasants", @@ -1063,7 +1074,10 @@ static int scareaway(region * r, int anzahl) int n, p, diff = 0, emigrants[MAXDIRECTIONS]; direction_t d; - anzahl = MIN(MAX(1, anzahl), rpeasants(r)); + p = rpeasants(r); + if (anzahl < 1) anzahl = 1; + if (anzahl > p) anzahl = p; + assert(p >= 0 && anzahl >= 0); /* Wandern am Ende der Woche (normal) oder wegen Monster. Die * Wanderung wird erst am Ende von demographics () ausgefuehrt. @@ -1073,9 +1087,7 @@ static int scareaway(region * r, int anzahl) for (d = 0; d != MAXDIRECTIONS; d++) emigrants[d] = 0; - p = rpeasants(r); - assert(p >= 0 && anzahl >= 0); - for (n = MIN(p, anzahl); n; n--) { + for (n = anzahl; n; n--) { direction_t dir = (direction_t)(rng_int() % MAXDIRECTIONS); region *rc = rconnect(r, dir); @@ -1104,8 +1116,9 @@ static void scared_by_monster(unit * u) } if (n > 0) { n = lovar(n); - n = MIN(rpeasants(u->region), n); if (n > 0) { + int p = rpeasants(u->region); + if (p < n) n = p; n = scareaway(u->region, n); if (n > 0) { ADDMSG(&u->region->msgs, msg_message("fleescared", diff --git a/src/randenc.c b/src/randenc.c index 499591294..7a65ce378 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -16,49 +16,52 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ +#ifdef _MSC_VER #include -#include +#endif + #include "randenc.h" -#include "volcano.h" +#include "chaos.h" #include "economy.h" #include "monsters.h" #include "move.h" -#include "chaos.h" #include "study.h" +#include "volcano.h" -#include -#include +#include "spells/unitcurse.h" +#include "spells/regioncurse.h" /* attributes includes */ -#include -#include +#include "attributes/racename.h" +#include "attributes/reduceproduction.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/building.h" +#include "kernel/config.h" +#include "kernel/curse.h" +#include "kernel/equipment.h" +#include "kernel/faction.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/pool.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" +#include "kernel/terrainid.h" +#include "kernel/unit.h" /* util includes */ -#include -#include -#include -#include -#include -#include -#include +#include "util/attrib.h" +#include "util/language.h" +#include "util/lists.h" +#include "util/log.h" +#include "util/rand.h" +#include "util/message.h" +#include "util/rng.h" /* libc includes */ #include @@ -785,9 +788,8 @@ static void rotting_herbs(void) int n = itm->number; double k = n * rot_chance / 100.0; if (fval(itm->type, ITF_HERB)) { - double nv = normalvariate(k, k / 4); - int inv = (int)nv; - int delta = MIN(n, inv); + int delta = (int)normalvariate(k, k / 4); + if (n < delta) delta = n; if (!i_change(itmp, itm->type, -delta)) { continue; } @@ -823,7 +825,9 @@ void randomevents(void) while (*blist) { building *b = *blist; if (fval(b->type, BTF_DECAY) && !building_owner(b)) { - b->size -= MAX(1, (b->size * 20) / 100); + int delta = (b->size * 20) / 100; + if (delta < 1) delta = 1; + b->size -= delta; if (b->size == 0) { remove_building(blist, r->buildings); } diff --git a/src/reports.c b/src/reports.c index 69e7a3555..862dd165a 100644 --- a/src/reports.c +++ b/src/reports.c @@ -16,12 +16,12 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. **/ +#ifdef _MSC_VER #include -#include +#endif #include "reports.h" #include "battle.h" -#include "kernel/calendar.h" #include "guard.h" #include "laws.h" #include "spells.h" @@ -30,48 +30,50 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "donations.h" /* attributes includes */ -#include -#include -#include -#include -#include +#include "attributes/attributes.h" +#include "attributes/follow.h" +#include "attributes/otherfaction.h" +#include "attributes/racename.h" +#include "attributes/stealth.h" -#include +#include "spells/unitcurse.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "kernel/config.h" +#include "kernel/calendar.h" +#include "kernel/ally.h" +#include "kernel/alliance.h" +#include "kernel/connection.h" +#include "kernel/building.h" +#include "kernel/curse.h" +#include "kernel/faction.h" +#include "kernel/group.h" +#include "kernel/item.h" +#include "kernel/messages.h" +#include "kernel/order.h" +#include "kernel/plane.h" +#include "kernel/race.h" +#include "kernel/region.h" +#include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/spell.h" +#include "kernel/spellbook.h" +#include "kernel/terrain.h" +#include "kernel/unit.h" /* util includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "util/attrib.h" +#include "util/base36.h" +#include "util/bsdstring.h" +#include "util/functions.h" +#include "util/goodies.h" +#include "util/language.h" +#include "util/lists.h" +#include "util/log.h" +#include "util/macros.h" +#include "util/path.h" +#include "util/strings.h" +#include "util/translation.h" #include #include @@ -610,6 +612,70 @@ report_resources(const region * r, resource_report * result, int size, return n; } +static size_t spskill(char *buffer, size_t size, const struct locale * lang, + const struct unit * u, struct skill * sv, int *dh) +{ + char *bufp = buffer; + int effsk; + + if (!u->number) + return 0; + if (sv->level <= 0) { + if (sv->old <= 0 || (u->faction->options & WANT_OPTION(O_SHOWSKCHANGE)) == 0) { + return 0; + } + } + + bufp = STRLCPY(bufp, ", ", size); + + if (!*dh) { + bufp = STRLCPY(bufp, LOC(lang, "nr_skills"), size); + bufp = STRLCPY(bufp, ": ", size); + *dh = 1; + } + bufp = STRLCPY(bufp, skillname(sv->id, lang), size); + bufp = STRLCPY(bufp, " ", size); + + if (sv->id == SK_MAGIC) { + sc_mage *mage = get_mage(u); + if (mage && mage->magietyp != M_GRAY) { + bufp = STRLCPY(bufp, LOC(lang, mkname("school", + magic_school[mage->magietyp])), size); + bufp = STRLCPY(bufp, " ", size); + } + } + + if (sv->id == SK_STEALTH && fval(u, UFL_STEALTH)) { + int i = u_geteffstealth(u); + if (i >= 0) { + if (wrptr(&bufp, &size, snprintf(bufp, size, "%d/", i)) != 0) + WARN_STATIC_BUFFER(); + } + } + + effsk = eff_skill(u, sv, 0); + if (wrptr(&bufp, &size, snprintf(bufp, size, "%d", effsk)) != 0) + WARN_STATIC_BUFFER(); + + if (u->faction->options & WANT_OPTION(O_SHOWSKCHANGE)) { + int oldeff = 0; + int diff; + + if (sv->old > 0) { + oldeff = sv->old + get_modifier(u, sv->id, sv->old, u->region, false); + if (oldeff < 0) oldeff = 0; + } + + diff = effsk - oldeff; + + if (diff != 0) { + if (wrptr(&bufp, &size, snprintf(bufp, size, " (%s%d)", (diff > 0) ? "+" : "", diff)) != 0) + WARN_STATIC_BUFFER(); + } + } + return bufp - buffer; +} + int bufunit(const faction * f, const unit * u, unsigned int indent, seen_mode mode, char *buf, size_t size) @@ -750,7 +816,7 @@ bufunit(const faction * f, const unit * u, unsigned int indent, seen_mode mode, if (u->faction == f) { skill *sv; for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { - size_t bytes = spskill(bufp, size, lang, u, sv, &dh, 1); + size_t bytes = spskill(bufp, size, lang, u, sv, &dh); assert(bytes <= INT_MAX); if (wrptr(&bufp, &size, (int)bytes) != 0) WARN_STATIC_BUFFER(); @@ -918,71 +984,6 @@ bufunit(const faction * f, const unit * u, unsigned int indent, seen_mode mode, return dh; } -size_t -spskill(char *buffer, size_t size, const struct locale * lang, - const struct unit * u, struct skill * sv, int *dh, int days) -{ - char *bufp = buffer; - int effsk; - - if (!u->number) - return 0; - if (sv->level <= 0) { - if (sv->old <= 0 || (u->faction->options & WANT_OPTION(O_SHOWSKCHANGE)) == 0) { - return 0; - } - } - - bufp = STRLCPY(bufp, ", ", size); - - if (!*dh) { - bufp = STRLCPY(bufp, LOC(lang, "nr_skills"), size); - bufp = STRLCPY(bufp, ": ", size); - *dh = 1; - } - bufp = STRLCPY(bufp, skillname(sv->id, lang), size); - bufp = STRLCPY(bufp, " ", size); - - if (sv->id == SK_MAGIC) { - sc_mage *mage = get_mage(u); - if (mage && mage->magietyp != M_GRAY) { - bufp = STRLCPY(bufp, LOC(lang, mkname("school", - magic_school[mage->magietyp])), size); - bufp = STRLCPY(bufp, " ", size); - } - } - - if (sv->id == SK_STEALTH && fval(u, UFL_STEALTH)) { - int i = u_geteffstealth(u); - if (i >= 0) { - if (wrptr(&bufp, &size, snprintf(bufp, size, "%d/", i)) != 0) - WARN_STATIC_BUFFER(); - } - } - - effsk = eff_skill(u, sv, 0); - if (wrptr(&bufp, &size, snprintf(bufp, size, "%d", effsk)) != 0) - WARN_STATIC_BUFFER(); - - if (u->faction->options & WANT_OPTION(O_SHOWSKCHANGE)) { - int oldeff = 0; - int diff; - - if (sv->old > 0) { - oldeff = sv->old + get_modifier(u, sv->id, sv->old, u->region, false); - } - - oldeff = MAX(0, oldeff); - diff = effsk - oldeff; - - if (diff != 0) { - if (wrptr(&bufp, &size, snprintf(bufp, size, " (%s%d)", (diff > 0) ? "+" : "", diff)) != 0) - WARN_STATIC_BUFFER(); - } - } - return bufp - buffer; -} - void split_paragraph(strlist ** SP, const char *s, unsigned int indent, unsigned int width, char mark) { bool firstline; @@ -1013,7 +1014,7 @@ void split_paragraph(strlist ** SP, const char *s, unsigned int indent, unsigned firstline = false; } if (!cut) { - cut = s + MIN(len, REPORTWIDTH); + cut = s + ((len < REPORTWIDTH) ? len : REPORTWIDTH); } memcpy(buf + indent, s, cut - s); buf[indent + (cut - s)] = 0; @@ -1669,7 +1670,7 @@ void finish_reports(report_context *ctx) { } } -int write_reports(faction * f, time_t ltime) +int write_reports(faction * f) { bool gotit = false; struct report_context ctx; @@ -1758,7 +1759,6 @@ int reports(void) { faction *f; FILE *mailit; - time_t ltime = time(NULL); int retval = 0; char path[4096]; const char * rpath = reportpath(); @@ -1775,7 +1775,7 @@ int reports(void) for (f = factions; f; f = f->next) { if (f->email && !fval(f, FFL_NPC)) { - int error = write_reports(f, ltime); + int error = write_reports(f); if (error) retval = error; if (mailit) @@ -1998,6 +1998,7 @@ static void eval_unitsize(struct opstack **stack, const void *userdata) const struct unit *u = (const struct unit *)opop(stack).v; variant var; + UNUSED_ARG(userdata); var.i = u->number; opush(stack, var); } @@ -2009,6 +2010,7 @@ static void eval_faction(struct opstack **stack, const void *userdata) size_t len = strlen(c); variant var; + UNUSED_ARG(userdata); var.v = strcpy(balloc(len + 1), c); opush(stack, var); } @@ -2018,6 +2020,8 @@ static void eval_alliance(struct opstack **stack, const void *userdata) const struct alliance *al = (const struct alliance *)opop(stack).v; const char *c = alliancename(al); variant var; + + UNUSED_ARG(userdata); if (c != NULL) { size_t len = strlen(c); var.v = strcpy(balloc(len + 1), c); diff --git a/src/reports.h b/src/reports.h index 0c285257e..d09cce992 100644 --- a/src/reports.h +++ b/src/reports.h @@ -60,12 +60,11 @@ extern "C" { void sparagraph(struct strlist **SP, const char *s, unsigned int indent, char mark); void lparagraph(struct strlist **SP, char *s, unsigned int indent, char mark); const char *hp_status(const struct unit *u); - size_t spskill(char *pbuf, size_t siz, const struct locale *lang, const struct unit *u, struct skill *sv, int *dh, int days); /* mapper */ void spunit(struct strlist **SP, const struct faction *f, const struct unit *u, unsigned int indent, seen_mode mode); int reports(void); - int write_reports(struct faction *f, time_t ltime); + int write_reports(struct faction *f); int init_reports(void); void reorder_units(struct region * r); From cf46acdc6a91543e6c55a367d16abd27ead21233 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 24 Feb 2018 19:46:34 +0100 Subject: [PATCH 057/231] bufunit does not write an indent, doe not need the parameter. --- src/bind_unit.c | 2 +- src/bindings.c | 2 +- src/report.c | 2 +- src/reports.c | 4 ++-- src/reports.h | 4 ++-- src/reports.test.c | 28 ++++++++++++++-------------- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/bind_unit.c b/src/bind_unit.c index 4dd6313d8..2ae39bf20 100644 --- a/src/bind_unit.c +++ b/src/bind_unit.c @@ -55,7 +55,7 @@ static int tolua_bufunit(lua_State * L) { if (f) { char buf[8192]; int mode = (int)tolua_tonumber(L, 3, (int)seen_unit); - bufunit(f, u, 0, mode, buf, sizeof(buf)); + bufunit(f, u, mode, buf, sizeof(buf)); tolua_pushstring(L, buf); return 1; } diff --git a/src/bindings.c b/src/bindings.c index 2364775fb..90f734fd9 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -923,7 +923,7 @@ static int tolua_report_unit(lua_State * L) char buffer[512]; unit *u = (unit *)tolua_tousertype(L, 1, 0); faction *f = (faction *)tolua_tousertype(L, 2, 0); - bufunit(f, u, 0, seen_unit, buffer, sizeof(buffer)); + bufunit(f, u, seen_unit, buffer, sizeof(buffer)); tolua_pushstring(L, buffer); return 1; } diff --git a/src/report.c b/src/report.c index 44b1bd6ad..1bcec6de8 100644 --- a/src/report.c +++ b/src/report.c @@ -695,7 +695,7 @@ nr_unit(struct stream *out, const faction * f, const unit * u, int indent, seen_ return; newline(out); - dh = bufunit(f, u, indent, mode, buf, sizeof(buf)); + dh = bufunit(f, u, mode, buf, sizeof(buf)); if (u->faction == f) { marker = '*'; diff --git a/src/reports.c b/src/reports.c index 862dd165a..20879a191 100644 --- a/src/reports.c +++ b/src/reports.c @@ -677,7 +677,7 @@ static size_t spskill(char *buffer, size_t size, const struct locale * lang, } int -bufunit(const faction * f, const unit * u, unsigned int indent, seen_mode mode, char *buf, +bufunit(const faction * f, const unit * u, seen_mode mode, char *buf, size_t size) { int i, dh; @@ -1055,7 +1055,7 @@ spunit(struct strlist **SP, const struct faction *f, const unit * u, unsigned in seen_mode mode) { char buf[DISPLAYSIZE]; - int dh = bufunit(f, u, indent, mode, buf, sizeof(buf)); + int dh = bufunit(f, u, mode, buf, sizeof(buf)); lparagraph(SP, buf, indent, (char)((u->faction == f) ? '*' : (dh ? '+' : '-'))); } diff --git a/src/reports.h b/src/reports.h index d09cce992..d631f6f38 100644 --- a/src/reports.h +++ b/src/reports.h @@ -90,8 +90,8 @@ extern "C" { void register_reporttype(const char *extension, report_fun write, int flag); - int bufunit(const struct faction *f, const struct unit *u, unsigned int indent, - seen_mode mode, char *buf, size_t size); + int bufunit(const struct faction *f, const struct unit *u, seen_mode mode, + char *buf, size_t size); const char *trailinto(const struct region *r, const struct locale *lang); diff --git a/src/reports.test.c b/src/reports.test.c index cdc09c83c..e86fbbbf8 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -199,56 +199,56 @@ static void test_bufunit_fstealth(CuTest *tc) { key_set(&u->attribs, 42, 42); /* report to ourselves */ - bufunit(f1, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f1, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), 1 human, aggressive.", buf); /* ... also when we are anonymous */ u->flags |= UFL_ANON_FACTION; - bufunit(f1, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f1, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), anonymous, 1 human, aggressive.", buf); u->flags &= ~UFL_ANON_FACTION; /* we see that our unit is cloaked */ set_factionstealth(u, f2); CuAssertPtrNotNull(tc, u->attribs); - bufunit(f1, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f1, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), TWW (2), 1 human, aggressive.", buf); /* ... also when we are anonymous */ u->flags |= UFL_ANON_FACTION; - bufunit(f1, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f1, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), anonymous, 1 human, aggressive.", buf); u->flags &= ~UFL_ANON_FACTION; /* we can see that someone is presenting as us */ - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), TWW (2), 1 human.", buf); /* ... but not if they are anonymous */ u->flags |= UFL_ANON_FACTION; - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), anonymous, 1 human.", buf); u->flags &= ~UFL_ANON_FACTION; /* we see the same thing as them when we are an ally */ al = ally_add(&f1->allies, f2); al->status = HELP_FSTEALTH; - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), TWW (2) (UFO (1)), 1 human.", buf); /* ... also when they are anonymous */ u->flags |= UFL_ANON_FACTION; - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), anonymous, 1 human.", buf); u->flags &= ~UFL_ANON_FACTION; /* fstealth has no influence when we are allies, same results again */ set_factionstealth(u, NULL); - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), UFO (1), 1 human.", buf); u->flags |= UFL_ANON_FACTION; - bufunit(f2, u, 0, seen_unit, buf, sizeof(buf)); + bufunit(f2, u, seen_unit, buf, sizeof(buf)); CuAssertStrEquals(tc, "Hodor (1), anonymous, 1 human.", buf); u->flags &= ~UFL_ANON_FACTION; @@ -278,20 +278,20 @@ static void test_bufunit(CuTest *tc) { unit_setname(u, "Hodor"); unit_setid(u, 1); - bufunit(u->faction, u, 0, 0, buffer, sizeof(buffer)); + bufunit(u->faction, u, 0, buffer, sizeof(buffer)); CuAssertStrEquals(tc, "Hodor (1), 1 human, aggressiv.", buffer); set_level(u, SK_ALCHEMY, 1); - bufunit(u->faction, u, 0, 0, buffer, sizeof(buffer)); + bufunit(u->faction, u, 0, buffer, sizeof(buffer)); CuAssertStrEquals(tc, "Hodor (1), 1 human, aggressiv, Talente: Alchemie 2.", buffer); set_level(u, SK_SAILING, 1); - bufunit(u->faction, u, 0, 0, buffer, sizeof(buffer)); + bufunit(u->faction, u, 0, buffer, sizeof(buffer)); CuAssertStrEquals(tc, "Hodor (1), 1 human, aggressiv, Talente: Alchemie 2, Segeln 1.", buffer); f = test_create_faction(NULL); f->locale = get_or_create_locale("de"); - bufunit(f, u, 0, 0, buffer, sizeof(buffer)); + bufunit(f, u, 0, buffer, sizeof(buffer)); CuAssertStrEquals(tc, "Hodor (1), UFO (1), 1 human.", buffer); test_teardown(); From db83140753ac29280e9533b6a7ae4c614a822f38 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 25 Feb 2018 20:49:33 +0100 Subject: [PATCH 058/231] merge conflict nightmare fix. --- src/eressea.c | 2 -- src/give.c | 4 ++-- src/helpers.c | 3 --- src/kernel/connection.c | 1 - src/util/base36.c | 2 +- 5 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/eressea.c b/src/eressea.c index 3e59b4490..81f19b5a6 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -49,8 +49,6 @@ void game_done(void) free_gamedata(); creport_cleanup(); report_cleanup(); -#endif -#endif calendar_cleanup(); free_functions(); free_config(); diff --git a/src/give.c b/src/give.c index d013ea5a4..c47f9b9e2 100644 --- a/src/give.c +++ b/src/give.c @@ -163,9 +163,9 @@ int give_quota(const unit * src, const unit * dst, const item_type * type, } if (dst && src && src->faction != dst->faction) { static int config; - static double divisor = 1.0; + static int divisor = 1; if (config_changed(&config)) { - divisor = config_get_flt("rules.items.give_divisor", divisor); + divisor = config_get_int("rules.items.give_divisor", divisor); } assert(divisor <= 0 || divisor >= 1); if (divisor >= 1) { diff --git a/src/helpers.c b/src/helpers.c index 9d370a6e2..3b966785b 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -252,9 +252,6 @@ static int lua_use_item(unit *u, const item_type *itype, const char * fname, int amount, struct order *ord) { lua_State *L = (lua_State *)global.vm_state; - int len, result = 0; - char fname[64]; - int (*callout)(unit *, const item_type *, int, struct order *); lua_getglobal(L, fname); if (lua_isfunction(L, -1)) { diff --git a/src/kernel/connection.c b/src/kernel/connection.c index 636c49bd0..9cfe9c140 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -242,7 +242,6 @@ void b_read(connection * b, gamedata * data) default: assert(!"invalid variant type in connection"); } - assert(result >= 0 || !"EOF encountered?"); } void b_write(const connection * b, storage * store) diff --git a/src/util/base36.c b/src/util/base36.c index 30020de30..3b5543e88 100644 --- a/src/util/base36.c +++ b/src/util/base36.c @@ -103,7 +103,7 @@ const char *itoa36_r(int i, char *result, size_t len) { return itoab_r(i, 36, result, len); } - + const char *itoab(int i, int base) { static char sstr[80]; From fca684cf8154c4ebf52a7dd2702fa8fbf4e39db0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Mar 2018 11:49:02 +0100 Subject: [PATCH 059/231] preview game 4 again --- process/cron/preview.cron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/cron/preview.cron b/process/cron/preview.cron index 389601702..71ebd0571 100755 --- a/process/cron/preview.cron +++ b/process/cron/preview.cron @@ -9,7 +9,7 @@ if [ -e ${ERESSEA}/build/.preview ]; then fi SRC=${ERESSEA}/git ${SRC}/s/preview build ${branch} || exit $? -for game in 2 3 ; do +for game in 2 3 4 ; do ${SRC}/s/preview -g ${game} run && \ ${SRC}/s/preview -g ${game} send done From f997ff7e592f108c76c136d441945bff52999390 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Mar 2018 18:21:00 +0100 Subject: [PATCH 060/231] build problems. this looks like a merge conflict. --- src/modules/museum.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/museum.h b/src/modules/museum.h index de2b73c76..696b512d1 100644 --- a/src/modules/museum.h +++ b/src/modules/museum.h @@ -18,6 +18,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef HEADER_MUSEUM_H #define HEADER_MUSEUM_H + #ifdef __cplusplus extern "C" { #endif From db253ea6a16be7674c3ba9a6bd499e785d8d42ef Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Mar 2018 20:03:13 +0100 Subject: [PATCH 061/231] newterrain was unfit for unit testing. bad test: insects cannot trade in deserts without castle. --- src/economy.test.c | 1 + src/kernel/region.c | 7 ++++++- src/kernel/terrain.c | 27 +++++++++++++++++++-------- src/kernel/terrain.h | 2 ++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/economy.test.c b/src/economy.test.c index 943ac2090..282318191 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -254,6 +254,7 @@ static void test_trade_insect(CuTest *tc) { CuAssertPtrEquals(tc, r, u->region); CuAssertPtrEquals(tc, (void *)it_luxury, (void *)r_luxury(u->region)); produce(u->region); + CuAssertPtrEquals(tc, NULL, test_find_messagetype(u->faction->msgs, "error119")); CuAssertIntEquals(tc, 1, get_item(u, it_luxury)); CuAssertIntEquals(tc, 5, get_item(u, it_silver)); diff --git a/src/kernel/region.c b/src/kernel/region.c index b44ce3ec2..790a8341c 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -1202,12 +1202,17 @@ void terraform_region(region * r, const terrain_type * terrain) } if (oldterrain == NULL || terrain->size != oldterrain->size) { + static int changed; + static const terrain_type *t_plain; int horses = 0, trees = 0; + if (terrain_changed(&changed)) { + t_plain = get_terrain(terrainnames[T_PLAIN]); + } if (terrain->size>0) { horses = rng_int() % (terrain->size / 50); trees = terrain->size * (30 + rng_int() % 40) / 1000; } - if (terrain == newterrain(T_PLAIN)) { + if (t_plain && terrain == t_plain) { rsethorses(r, horses); if (chance(0.4)) { rsettrees(r, 2, trees); diff --git a/src/kernel/terrain.c b/src/kernel/terrain.c index 6a5b4652d..c7e007891 100644 --- a/src/kernel/terrain.c +++ b/src/kernel/terrain.c @@ -38,7 +38,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -static const char *terrainnames[MAXTERRAINS] = { +const char *terrainnames[MAXTERRAINS] = { "ocean", "plain", "swamp", @@ -114,10 +114,14 @@ static terrain_type *terrain_find_i(const char *name) return terrain; } -const terrain_type *get_terrain(const char *name) { +static terrain_type *get_terrain_i(const char *name) { return terrain_find_i(name); } +const terrain_type *get_terrain(const char *name) { + return get_terrain_i(name); +} + terrain_type * get_or_create_terrain(const char *name) { terrain_type *terrain = terrain_find_i(name); if (!terrain) { @@ -127,7 +131,7 @@ terrain_type * get_or_create_terrain(const char *name) { terrain->_name = str_strdup(name); terrain->next = registered_terrains; registered_terrains = terrain; - if (strcmp("plain", name) == 0) { + if (strcmp(terrainnames[T_PLAIN], name) == 0) { /* TODO: this is awful, it belongs in config */ terrain->name = &plain_name; } @@ -136,19 +140,26 @@ terrain_type * get_or_create_terrain(const char *name) { return terrain; } -static const terrain_type *newterrains[MAXTERRAINS]; +static terrain_type *newterrains[MAXTERRAINS]; const struct terrain_type *newterrain(terrain_t t) { + static int changed; const struct terrain_type *result; if (t == NOTERRAIN) { return NULL; } assert(t >= 0); assert(t < MAXTERRAINS); - result = newterrains[t]; + if (terrain_changed(&changed)) { + memset(newterrains, 0, sizeof(newterrains)); + result = NULL; + } + else { + result = newterrains[t]; + } if (!result) { - result = newterrains[t] = get_terrain(terrainnames[t]); + result = newterrains[t] = get_terrain_i(terrainnames[t]); } if (!result) { log_error("no such terrain: %s.", terrainnames[t]); @@ -194,11 +205,11 @@ void init_terrains(void) { terrain_t t; for (t = 0; t != MAXTERRAINS; ++t) { - const terrain_type *newterrain = newterrains[t]; + terrain_type *newterrain = newterrains[t]; if (newterrain != NULL) continue; if (terrainnames[t] != NULL) { - newterrain = get_terrain(terrainnames[t]); + newterrain = get_terrain_i(terrainnames[t]); if (newterrain != NULL) { newterrains[t] = newterrain; } diff --git a/src/kernel/terrain.h b/src/kernel/terrain.h index 26c509f75..d49d04054 100644 --- a/src/kernel/terrain.h +++ b/src/kernel/terrain.h @@ -36,6 +36,8 @@ extern "C" { #define SWIM_INTO (1<<8) /* man darf hierhin schwimmen */ #define WALK_INTO (1<<9) /* man darf hierhin laufen */ + extern const char *terrainnames[]; + typedef struct production_rule { char *name; const struct resource_type *rtype; From 7e33b2a94d57bf8eb6fe92e2b7bdcfb78c156681 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Mar 2018 20:15:03 +0100 Subject: [PATCH 062/231] BUG 2379: Test war kaputt (newterrain), getesteter Code auch. --- src/economy.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/economy.c b/src/economy.c index 67d8c34af..18ca23b8e 100644 --- a/src/economy.c +++ b/src/economy.c @@ -1554,6 +1554,20 @@ attrib_type at_trades = { NO_READ }; +static bool trade_needs_castle(const region *r, const race *rc) { + static int rc_change, terrain_change; + static const race *rc_insect; + static const terrain_type *t_desert, *t_swamp; + if (rc_changed(&rc_change)) { + rc_insect = get_race(RC_INSECT); + } + if (terrain_changed(&terrain_change)) { + t_swamp = newterrain(T_SWAMP); + t_desert = newterrain(T_DESERT); + } + return rc != rc_insect && (r->terrain == t_swamp || r->terrain == t_desert); +} + static void buy(unit * u, econ_request ** buyorders, struct order *ord) { char token[128]; @@ -1592,7 +1606,7 @@ static void buy(unit * u, econ_request ** buyorders, struct order *ord) /* Entweder man ist Insekt in Sumpf/Wueste, oder es muss * einen Handelsposten in der Region geben: */ - if (u_race(u) != get_race(RC_INSECT) || (r->terrain == newterrain(T_SWAMP) || r->terrain == newterrain(T_DESERT))) { + if (trade_needs_castle(r, u_race(u))) { building *b = NULL; if (r->buildings) { static int cache; From ef3b72ceb77625d5e485df2b6c831ed5aa79f3ee Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 4 Mar 2018 20:30:29 +0100 Subject: [PATCH 063/231] BUG 2423: only apply other skill modifiers if race-modifier doesn't drop skill below 1. --- src/kernel/skills.c | 60 +----------------------------- src/kernel/skills.h | 1 - src/kernel/unit.c | 83 ++++++++++++++++++++++++++++++++++++------ src/kernel/unit.test.c | 32 ++++++++++++++++ src/tests.c | 7 +++- src/tests.h | 2 +- 6 files changed, 111 insertions(+), 74 deletions(-) diff --git a/src/kernel/skills.c b/src/kernel/skills.c index 24981728f..a15fb4463 100644 --- a/src/kernel/skills.c +++ b/src/kernel/skills.c @@ -21,10 +21,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "skill.h" #include "curse.h" -#include "race.h" #include "region.h" -#include "terrain.h" -#include "terrainid.h" #include "unit.h" #include @@ -91,64 +88,9 @@ skillmod(const unit * u, const region * r, skill_t sk, int value) return value; } -int skill_mod(const race * rc, skill_t sk, const struct terrain_type *terrain) -{ - int result = 0; - static int rc_cache; - static const race *rc_dwarf, *rc_insect; - - if (rc_changed(&rc_cache)) { - rc_dwarf = get_race(RC_DWARF); - rc_insect = get_race(RC_INSECT); - } - result = rc->bonus[sk]; - - if (rc == rc_dwarf) { - if (sk == SK_TACTICS) { - if (terrain == newterrain(T_MOUNTAIN) || fval(terrain, ARCTIC_REGION)) - ++result; - } - } - else if (rc == rc_insect) { - if (terrain == newterrain(T_MOUNTAIN) || fval(terrain, ARCTIC_REGION)) - --result; - else if (terrain == newterrain(T_DESERT) || terrain == newterrain(T_SWAMP)) - ++result; - } - - return result; -} - -int rc_skillmod(const struct race *rc, const region * r, skill_t sk) -{ - int mods = 0; - if (!skill_enabled(sk)) { - return 0; - } - if (r) { - mods = skill_mod(rc, sk, r->terrain); - } - if (r && r_isforest(r)) { - static int rc_cache; - static const race * rc_elf; - if (rc_changed(&rc_cache)) { - rc_elf = get_race(RC_ELF); - } - if (rc == rc_elf) { - if (sk == SK_PERCEPTION || sk == SK_STEALTH) { - ++mods; - } - else if (sk == SK_TACTICS) { - mods += 2; - } - } - } - return mods; -} - int level_days(int level) { - /* FIXME STUDYDAYS * ((level + 1) * level / 2); */ + /* FIXME STUDYDAYS * ((level + 1) * level / 2); */ return 30 * ((level + 1) * level / 2); } diff --git a/src/kernel/skills.h b/src/kernel/skills.h index 649fa92cf..94576295c 100644 --- a/src/kernel/skills.h +++ b/src/kernel/skills.h @@ -44,7 +44,6 @@ extern "C" { extern struct attrib_type at_skillmod; - int rc_skillmod(const struct race *rc, const struct region *r, skill_t sk); int skillmod(const struct unit *u, const struct region *r, skill_t sk, int value); struct attrib *make_skillmod(skill_t sk, skillmod_fun special, double multiplier, int bonus); diff --git a/src/kernel/unit.c b/src/kernel/unit.c index ea06c38d4..d189d8728 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -38,6 +38,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "ship.h" #include "skill.h" #include "terrain.h" +#include "terrainid.h" #include #include @@ -641,7 +642,7 @@ bool ucontact(const unit * u, const unit * u2) /* Explizites KONTAKTIERE */ for (ru = a_find(u->attribs, &at_contact); ru && ru->type == &at_contact; - ru = ru->next) { + ru = ru->next) { if (((unit *)ru->data.v) == u2) { return true; } @@ -1132,8 +1133,8 @@ skill *add_skill(unit * u, skill_t sk) skill *sv; int i; - for (i=0; i != u->skill_size; ++i) { - sv = u->skills+i; + for (i = 0; i != u->skill_size; ++i) { + sv = u->skills + i; if (sv->id >= sk) break; } u->skills = realloc(u->skills, (1 + u->skill_size) * sizeof(skill)); @@ -1235,8 +1236,62 @@ static int att_modification(const unit * u, skill_t sk) return (int)result; } +static int terrain_mod(const race * rc, skill_t sk, const region *r) +{ + static int rc_cache, t_cache; + static const race *rc_dwarf, *rc_insect, *rc_elf; + static const terrain_type *t_mountain, *t_desert, *t_swamp; + const struct terrain_type *terrain = r->terrain; + + if (terrain_changed(&t_cache)) { + t_mountain = get_terrain(terrainnames[T_MOUNTAIN]); + t_desert = get_terrain(terrainnames[T_DESERT]); + t_swamp = get_terrain(terrainnames[T_SWAMP]); + } + if (rc_changed(&rc_cache)) { + rc_elf = get_race(RC_ELF); + rc_dwarf = get_race(RC_DWARF); + rc_insect = get_race(RC_INSECT); + } + + if (rc == rc_dwarf) { + if (sk == SK_TACTICS) { + if (terrain == t_mountain || fval(terrain, ARCTIC_REGION)) + return 1; + } + } + else if (rc == rc_insect) { + if (terrain == t_mountain || fval(terrain, ARCTIC_REGION)) { + return -1; + } + else if (terrain == t_desert || terrain == t_swamp) { + return 1; + } + } + else if (rc == rc_elf) { + if (r_isforest(r)) { + if (sk == SK_PERCEPTION || sk == SK_STEALTH) { + return 1; + } + else if (sk == SK_TACTICS) { + return 2; + } + } + } + return 0; +} + +static int rc_skillmod(const struct race *rc, skill_t sk) +{ + if (!skill_enabled(sk)) { + return 0; + } + return rc->bonus[sk]; +} + int get_modifier(const unit * u, skill_t sk, int level, const region * r, bool noitem) { + const struct race *rc = u_race(u); int bskill = level; int skill = bskill; @@ -1247,12 +1302,16 @@ int get_modifier(const unit * u, skill_t sk, int level, const region * r, bool n } } - skill += rc_skillmod(u_race(u), r, sk); - skill += att_modification(u, sk); - if (u->attribs) { - skill = skillmod(u, r, sk, skill); + skill += rc_skillmod(rc, sk); + if (skill > 0) { + if (r) { + skill += terrain_mod(rc, sk, r); + } + skill += att_modification(u, sk); + if (u->attribs) { + skill = skillmod(u, r, sk, skill); + } } - if (fval(u, UFL_HUNGER)) { if (sk == SK_SAILING && skill > 2) { skill = skill - 1; @@ -1374,7 +1433,7 @@ void default_name(const unit *u, char name[], int len) { const char * prefix; prefix = LOC(lang, "unitdefault"); if (!prefix) { - prefix= parameters[P_UNIT]; + prefix = parameters[P_UNIT]; } result = prefix; } @@ -1631,7 +1690,7 @@ int unit_max_hp(const unit * u) h = u_race(u)->hitpoints; if (config_changed(&config)) { - rule_stamina = config_get_int("rules.stamina", 1)!=0; + rule_stamina = config_get_int("rules.stamina", 1) != 0; } if (rule_stamina) { double p = pow(effskill(u, SK_STAMINA, u->region) / 2.0, 1.5) * 0.2; @@ -1654,7 +1713,7 @@ void scale_number(unit * u, int n) return; } if (u->number > 0) { - if (n>0) { + if (n > 0) { const attrib *a = a_find(u->attribs, &at_effect); u->hp = (long long)u->hp * n / u->number; @@ -1928,7 +1987,7 @@ bool has_limited_skills(const struct unit * u) double u_heal_factor(const unit * u) { const race * rc = u_race(u); - if (rc->healing>0) { + if (rc->healing > 0) { return rc->healing / 100.0; } if (r_isforest(u->region)) { diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 20d23e7a8..4b0ba2af6 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -622,6 +622,37 @@ static void test_transfermen(CuTest *tc) { test_teardown(); } +static void test_get_modifier(CuTest *tc) { + race * rc; + region *r; + unit *u; + terrain_type *t_plain, *t_desert; + + test_setup(); + t_desert = test_create_terrain("desert", -1); + t_plain = test_create_terrain("plain", -1); + rc = test_create_race("insect"); + rc->bonus[SK_ARMORER] = 1; + rc->bonus[SK_TAXING] = 0; + rc->bonus[SK_TRADE] = -1; + u = test_create_unit(test_create_faction(rc), r = test_create_region(0, 0, t_plain)); + + /* no effects for insects in plains: */ + CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 0, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 1, r, true)); + CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 7, r, true)); + + r = test_create_region(1, 0, t_desert); + /* terrain effect: +1 for insects in deserts: */ + CuAssertIntEquals(tc, 1, get_modifier(u, SK_TAXING, 1, r, true)); + /* no terrain effects if no region is given: */ + CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 1, NULL, true)); + /* only get terrain effect if they have at least level 1: */ + CuAssertIntEquals(tc, 0, get_modifier(u, SK_TAXING, 0, r, true)); + + test_teardown(); +} + CuSuite *get_unit_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -652,5 +683,6 @@ CuSuite *get_unit_suite(void) SUITE_ADD_TEST(suite, test_renumber_unit); SUITE_ADD_TEST(suite, test_name_unit); SUITE_ADD_TEST(suite, test_heal_factor); + SUITE_ADD_TEST(suite, test_get_modifier); return suite; } diff --git a/src/tests.c b/src/tests.c index d0660994b..2affead5f 100644 --- a/src/tests.c +++ b/src/tests.c @@ -266,9 +266,14 @@ void test_teardown(void) } terrain_type * -test_create_terrain(const char * name, unsigned int flags) +test_create_terrain(const char * name, int flags) { terrain_type * t = get_or_create_terrain(name); + + if (flags < 0) { + /* sensible defaults for most terrains */ + flags = LAND_REGION | WALK_INTO | FLY_INTO; + } if (flags & LAND_REGION) { t->size = 1000; } diff --git a/src/tests.h b/src/tests.h index 54764fd94..c3eb6bae3 100644 --- a/src/tests.h +++ b/src/tests.h @@ -41,7 +41,7 @@ extern "C" { void test_log_stop(struct log_t *log, struct strlist *slist); struct locale * test_create_locale(void); - struct terrain_type * test_create_terrain(const char * name, unsigned int flags); + struct terrain_type * test_create_terrain(const char * name, int flags); struct race *test_create_race(const char *name); struct region *test_create_region(int x, int y, const struct terrain_type *terrain); struct region *test_create_ocean(int x, int y); From 54ee7c04dc830b3b3a263365d44b2e7ebcb184f6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Mar 2018 17:46:48 +0100 Subject: [PATCH 064/231] seenspell conversion bugfix --- src/attributes/seenspell.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index 6c78d19f4..b6edd3d98 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -109,12 +109,12 @@ static int cmp_spell(const void *a, const void *b) { static bool set_seen(attrib **alist, struct spell *sp) { attrib *a = a_find(*alist, &at_seenspells); - selist *sl; + selist **sl; if (!a) { a = a_add(alist, a_new(&at_seenspells)); } - sl = (selist *)a->data.v; - return selist_set_insert(&sl, sp, cmp_spell); + sl = (selist **)&a->data.v; + return selist_set_insert(sl, sp, cmp_spell); } static void upgrade_seenspell(attrib **alist, attrib *abegin) { From b0840f83efd7097b5895ca2a678e27a869a5204c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 10 Mar 2018 18:26:56 +0100 Subject: [PATCH 065/231] detect missing lua library --- s/cmake-init | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/s/cmake-init b/s/cmake-init index 75e3fd7ac..5b73ebe37 100755 --- a/s/cmake-init +++ b/s/cmake-init @@ -47,12 +47,20 @@ DEST=$(dirname $ROOT)/server git submodule update --init LUA_VERSION="5.2" +LUA_INCLUDE=/usr/include LUA_DIR=/usr if [ -d /usr/include/lua5.1 ]; then LUA_VERSION="5.1" + LUA_INCLUDE=/usr/include/lua5.1 elif [ -d /usr/local/include/lua5.1 ]; then export LUA_DIR=/usr/local LUA_VERSION="5.1" + LUA_INCLUDE=/usr/local/include/lua5.1 +fi + +if [ ! -e ${LUA_INCLUDE}/lua.h ]; then + echo "no compatible version of lua is installed." + exit 1 fi cat >| $BUILD/config.cmake < Date: Sat, 10 Mar 2018 18:26:56 +0100 Subject: [PATCH 066/231] detect missing lua library --- s/cmake-init | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/s/cmake-init b/s/cmake-init index 5b73ebe37..337490f07 100755 --- a/s/cmake-init +++ b/s/cmake-init @@ -52,6 +52,10 @@ LUA_DIR=/usr if [ -d /usr/include/lua5.1 ]; then LUA_VERSION="5.1" LUA_INCLUDE=/usr/include/lua5.1 +elif [ -d /usr/include/lua5.2 ]; then + export LUA_DIR=/usr + LUA_VERSION="5.2" + LUA_INCLUDE=/usr/include/lua5.2 elif [ -d /usr/local/include/lua5.1 ]; then export LUA_DIR=/usr/local LUA_VERSION="5.1" @@ -59,7 +63,7 @@ elif [ -d /usr/local/include/lua5.1 ]; then fi if [ ! -e ${LUA_INCLUDE}/lua.h ]; then - echo "no compatible version of lua is installed." + echo "no compatible version of lua is installed in $LUA_INCLUDE." exit 1 fi From 6d98a5dc4f024eaac071e2bce807354e2bfd1e72 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Mar 2018 11:39:57 +0100 Subject: [PATCH 067/231] BUG 2424 remove invlaid assertion --- src/triggers/changerace.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/triggers/changerace.c b/src/triggers/changerace.c index 2e010eed5..abc605c35 100644 --- a/src/triggers/changerace.c +++ b/src/triggers/changerace.c @@ -105,13 +105,11 @@ trigger_type tt_changerace = { changerace_read }; -trigger *trigger_changerace(struct unit * u, const struct race * prace, - const struct race * irace) +trigger *trigger_changerace(unit * u, const race * prace, const race * irace) { trigger *t = t_new(&tt_changerace); changerace_data *td = (changerace_data *)t->data.v; -/* assert(u_race(u) == u_irace(u) || !"changerace-triggers cannot stack!"); */ td->u = u; td->race = prace; td->irace = irace; From da984b58802dcfd0bec68f72ea2452925c2fe3c2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Mar 2018 14:40:38 +0100 Subject: [PATCH 068/231] BUG 2425: lighthouses can see units. --- src/creport.c | 3 +-- src/report.c | 10 +++++++--- src/reports.c | 7 ++++++- src/reports.h | 1 + src/reports.test.c | 20 ++++++++++++++++++-- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/creport.c b/src/creport.c index 9b97d8920..bba824538 100644 --- a/src/creport.c +++ b/src/creport.c @@ -1471,7 +1471,7 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r) } cr_output_travelthru(F, r, f); - if (r->seen.mode >= seen_travel) { + if (see_region_details(r)) { message_list *mlist = r_getmessages(r, f); cr_output_messages(F, r->msgs, f); if (mlist) { @@ -1503,7 +1503,6 @@ static void cr_output_region(FILE * F, report_context * ctx, region * r) /* visible units */ for (u = r->units; u; u = u->next) { - if (visible_unit(u, f, stealthmod, r->seen.mode)) { cr_output_unit_compat(F, f, u, r->seen.mode); } diff --git a/src/report.c b/src/report.c index f84f4a3c8..319203e3b 100644 --- a/src/report.c +++ b/src/report.c @@ -688,7 +688,7 @@ nr_unit(struct stream *out, const faction * f, const unit * u, int indent, seen_ { char marker; int dh; - bool isbattle = (bool)(mode == seen_battle); + bool isbattle = (mode == seen_battle); char buf[8192]; if (fval(u_race(u), RCF_INVISIBLE)) @@ -2332,7 +2332,9 @@ report_plaintext(const char *filename, report_context * ctx, if (b) { nr_building(out, r, b, f); while (u && u->building == b) { - nr_unit(out, f, u, 6, r->seen.mode); + if (visible_unit(u, f, stealthmod, r->seen.mode)) { + nr_unit(out, f, u, 6, r->seen.mode); + } u = u->next; } b = b->next; @@ -2353,7 +2355,9 @@ report_plaintext(const char *filename, report_context * ctx, if (sh) { nr_ship(out, r, sh, f, u); while (u && u->ship == sh) { - nr_unit(out, f, u, 6, r->seen.mode); + if (visible_unit(u, f, stealthmod, r->seen.mode)) { + nr_unit(out, f, u, 6, r->seen.mode); + } u = u->next; } sh = sh->next; diff --git a/src/reports.c b/src/reports.c index 208934adb..f5b7f5531 100644 --- a/src/reports.c +++ b/src/reports.c @@ -2445,13 +2445,18 @@ bool visible_unit(const unit *u, const faction *f, int stealthmod, seen_mode mod return true; } else { - if (stealthmod > INT_MIN && mode >= seen_unit) { + if (stealthmod > INT_MIN && (mode == seen_lighthouse || mode >= seen_unit)) { return cansee(f, u->region, u, stealthmod); } } return false; } +bool see_region_details(const region *r) +{ + return r->seen.mode >= seen_travel; +} + void register_reports(void) { /* register datatypes for the different message objects */ diff --git a/src/reports.h b/src/reports.h index 473ac661c..0bdaf7d8c 100644 --- a/src/reports.h +++ b/src/reports.h @@ -135,6 +135,7 @@ extern "C" { const char *get_mailcmd(const struct locale *loc); bool visible_unit(const struct unit *u, const struct faction *f, int stealthmod, seen_mode mode); + bool see_region_details(const struct region *r); #define GR_PLURAL 0x01 /* grammar: plural */ #define MAX_INVENTORY 128 /* maimum number of different items in an inventory */ diff --git a/src/reports.test.c b/src/reports.test.c index e86fbbbf8..2b22782ae 100644 --- a/src/reports.test.c +++ b/src/reports.test.c @@ -823,21 +823,37 @@ static void test_newbie_warning(CuTest *tc) { test_teardown(); } -static void test_cansee_spell(CuTest *tc) { +static void test_visible_unit(CuTest *tc) { unit *u2; faction *f; + ship *sh; test_setup(); f = test_create_faction(NULL); u2 = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); + sh = test_create_ship(u2->region, NULL); CuAssertTrue(tc, cansee(f, u2->region, u2, 0)); + CuAssertTrue(tc, visible_unit(u2, f, 0, seen_unit)); CuAssertTrue(tc, visible_unit(u2, f, 0, seen_spell)); CuAssertTrue(tc, visible_unit(u2, f, 0, seen_battle)); + CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_travel)); + CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_none)); + CuAssertTrue(tc, !visible_unit(u2, f, 0, seen_neighbour)); + + CuAssertTrue(tc, visible_unit(u2, f, 0, seen_lighthouse)); + CuAssertTrue(tc, !visible_unit(u2, f, -2, seen_lighthouse)); + u2->ship = sh; + CuAssertTrue(tc, visible_unit(u2, f, -2, seen_lighthouse)); + u2->ship = NULL; set_level(u2, SK_STEALTH, 1); CuAssertTrue(tc, !cansee(f, u2->region, u2, 0)); CuAssertTrue(tc, cansee(f, u2->region, u2, 1)); + + u2->ship = sh; + CuAssertTrue(tc, visible_unit(u2, f, -2, seen_lighthouse)); + u2->ship = NULL; CuAssertTrue(tc, visible_unit(u2, f, 1, seen_spell)); CuAssertTrue(tc, visible_unit(u2, f, 1, seen_battle)); @@ -873,6 +889,6 @@ CuSuite *get_reports_suite(void) SUITE_ADD_TEST(suite, test_arg_resources); SUITE_ADD_TEST(suite, test_insect_warnings); SUITE_ADD_TEST(suite, test_newbie_warning); - SUITE_ADD_TEST(suite, test_cansee_spell); + SUITE_ADD_TEST(suite, test_visible_unit); return suite; } From ed46a24f582f22f2e1f4e621d119acddc8d398f3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Mar 2018 16:52:07 +0100 Subject: [PATCH 069/231] re-enable backtraces on linux. --- CMakeLists.txt | 4 ++++ src/CMakeLists.txt | 4 ++++ src/main.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b14e2cf1f..19e49c9c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,9 +13,13 @@ include(MSVC) set (HAVE_STRDUP 0) set (HAVE_STRLCAT 0) set (HAVE_LIBBSD 0) +set (HAVE_SIGNAL_H 0) +set (HAVE_EXECINFO_H 0) else (MSVC) INCLUDE (CheckIncludeFile) +CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H) +CHECK_INCLUDE_FILE(execinfo.h HAVE_EXECINFO_H) CHECK_INCLUDE_FILE(bsd/string.h HAVE_LIBBSD) INCLUDE (CheckFunctionExists) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 653e036bd..bdf0465d2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -261,6 +261,10 @@ add_test(server test_eressea) install(TARGETS eressea DESTINATION "bin") +if (HAVE_EXECINFO_H AND HAVE_SIGNAL_H) + add_definitions(-DHAVE_BACKTRACE) +endif () + if (HAVE_LIBBSD) add_definitions(-DHAVE_LIBBSD) endif (HAVE_LIBBSD) diff --git a/src/main.c b/src/main.c index 489d0d868..b2fb23a96 100644 --- a/src/main.c +++ b/src/main.c @@ -257,7 +257,7 @@ static int parse_args(int argc, char **argv) return 0; } -#if defined(HAVE_SIGACTION) && defined(HAVE_EXECINFO) +#if defined(HAVE_BACKTRACE) #include #include From 9ba255e269a57156ac90dd2c587e4491571200a6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Mar 2018 19:07:05 +0100 Subject: [PATCH 070/231] allow a maxnmr setting in eressea.ini to override the nmr.timeout rule. --- src/laws.c | 10 +++++++++- src/laws.test.c | 15 +++++++++++++++ src/main.c | 3 ++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/laws.c b/src/laws.c index f4f0f24ee..cf8f2668f 100644 --- a/src/laws.c +++ b/src/laws.c @@ -141,7 +141,15 @@ bool IsImmune(const faction * f) int NMRTimeout(void) { - return config_get_int("nmr.timeout", 0); + int nmr_timeout = config_get_int("nmr.timeout", 0); + int ini_timeout = config_get_int("game.maxnmr", 0); + if (nmr_timeout > 0) { + if (ini_timeout > nmr_timeout) { + return nmr_timeout; + } + return (ini_timeout > 0) ? ini_timeout : nmr_timeout; + } + return ini_timeout; } bool LongHunger(const struct unit *u) diff --git a/src/laws.test.c b/src/laws.test.c index edfdd6f4c..f9b4cfcf3 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -1745,6 +1745,20 @@ static void test_cansee_sphere(CuTest *tc) { test_teardown(); } +static void test_nmr_timeout(CuTest *tc) { + test_setup(); + CuAssertIntEquals(tc, 0, NMRTimeout()); + config_set_int("nmr.timeout", 5); + CuAssertIntEquals(tc, 5, NMRTimeout()); + config_set_int("game.maxnmr", 4); + CuAssertIntEquals(tc, 4, NMRTimeout()); + config_set("nmr.timeout", NULL); + CuAssertIntEquals(tc, 4, NMRTimeout()); + config_set("game.maxnmr", NULL); + CuAssertIntEquals(tc, 0, NMRTimeout()); + test_teardown(); +} + CuSuite *get_laws_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -1816,6 +1830,7 @@ CuSuite *get_laws_suite(void) SUITE_ADD_TEST(suite, test_cansee); SUITE_ADD_TEST(suite, test_cansee_ring); SUITE_ADD_TEST(suite, test_cansee_sphere); + SUITE_ADD_TEST(suite, test_nmr_timeout); return suite; } diff --git a/src/main.c b/src/main.c index b2fb23a96..d337c29fc 100644 --- a/src/main.c +++ b/src/main.c @@ -83,6 +83,7 @@ static void load_inifile(void) static const char * valid_keys[] = { "game.id", "game.deadlog", + "game.maxnmr", "game.name", "game.start", "game.locale", @@ -257,7 +258,7 @@ static int parse_args(int argc, char **argv) return 0; } -#if defined(HAVE_BACKTRACE) +#ifdef HAVE_BACKTRACE #include #include From ac8ae18588279b9cd2e594240fb65a0c5c406008 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Mar 2018 19:10:08 +0100 Subject: [PATCH 071/231] allow a per-game seed in eressea.ini --- src/kernel/save.c | 2 +- src/main.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kernel/save.c b/src/kernel/save.c index fe1bb525a..858cd7040 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -1418,7 +1418,7 @@ int read_game(gamedata *data) read_attribs(data, &global.attribs, NULL); READ_INT(store, &turn); log_debug(" - reading turn %d", turn); - rng_init(turn); + rng_init(turn + config_get_int("game.seed", 0)); READ_INT(store, NULL); /* max_unique_id = ignore */ READ_INT(store, &nextborder); diff --git a/src/main.c b/src/main.c index d337c29fc..41206f90a 100644 --- a/src/main.c +++ b/src/main.c @@ -86,6 +86,7 @@ static const char * valid_keys[] = { "game.maxnmr", "game.name", "game.start", + "game.seed", "game.locale", "game.verbose", "game.report", From fa1056a69630ad3400d3e5acee45636b51b4f0bf Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 16 Mar 2018 16:21:33 +0100 Subject: [PATCH 072/231] fix sigaction code for macos --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 41206f90a..bb353fc2f 100644 --- a/src/main.c +++ b/src/main.c @@ -280,7 +280,7 @@ static int setup_signal_handler(void) { struct sigaction act; - act.sa_flags = SA_ONESHOT | SA_SIGINFO; + act.sa_flags = SA_RESETHAND | SA_SIGINFO; act.sa_sigaction = report_segfault; sigfillset(&act.sa_mask); return sigaction(SIGSEGV, &act, NULL); From ef96ec9de075404319eaa3298528cb5252bf8ae0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 17 Mar 2018 12:55:26 +0100 Subject: [PATCH 073/231] additional testing --- src/kernel/order.test.c | 90 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index acba56f0f..585b16798 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -365,6 +365,35 @@ static void test_study_order(CuTest *tc) { test_teardown(); } +static void test_study_order_unknown(CuTest *tc) { + char token[32]; + stream out; + unit *u; + struct locale *lang; + + test_setup(); + lang = get_or_create_locale("de"); + locale_setstring(lang, "keyword::study", "LERNE"); + init_keywords(lang); + init_skills(lang); + u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + u->thisorder = create_order(K_STUDY, lang, "Schiffsbau"); + CuAssertIntEquals(tc, K_STUDY, init_order(u->thisorder, lang)); + CuAssertStrEquals(tc, "Schiffsbau", gettoken(token, sizeof(token))); + + CuAssertStrEquals(tc, "LERNE Schiffsbau", get_command(u->thisorder, lang, token, sizeof(token))); + + mstream_init(&out); + stream_order(&out, u->thisorder, lang, true); + swrite("\n", 1, 1, &out); + out.api->rewind(out.handle); + out.api->readln(out.handle, token, sizeof(token)); + CuAssertStrEquals(tc, "LERNE Schiffsbau", token); + mstream_done(&out); + + test_teardown(); +} + static void test_study_order_quoted(CuTest *tc) { char token[32]; stream out; @@ -395,12 +424,73 @@ static void test_study_order_quoted(CuTest *tc) { test_teardown(); } +static void test_study_order_unknown_tilde(CuTest *tc) { + char token[32]; + stream out; + unit *u; + struct locale *lang; + + test_setup(); + lang = get_or_create_locale("de"); + locale_setstring(lang, "keyword::study", "LERNE"); + init_keywords(lang); + init_skills(lang); + u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + u->thisorder = create_order(K_STUDY, lang, "Waffenloser~Mampf"); + CuAssertIntEquals(tc, K_STUDY, init_order(u->thisorder, lang)); + CuAssertStrEquals(tc, "Waffenloser Mampf", gettoken(token, sizeof(token))); + + CuAssertStrEquals(tc, "LERNE Waffenloser~Mampf", get_command(u->thisorder, lang, token, sizeof(token))); + + mstream_init(&out); + stream_order(&out, u->thisorder, lang, true); + swrite("\n", 1, 1, &out); + out.api->rewind(out.handle); + out.api->readln(out.handle, token, sizeof(token)); + CuAssertStrEquals(tc, "LERNE Waffenloser~Mampf", token); + mstream_done(&out); + + test_teardown(); +} + +static void test_study_order_unknown_quoted(CuTest *tc) { + char token[32]; + stream out; + unit *u; + struct locale *lang; + + test_setup(); + lang = get_or_create_locale("de"); + locale_setstring(lang, "keyword::study", "LERNE"); + init_keywords(lang); + init_skills(lang); + u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + u->thisorder = create_order(K_STUDY, lang, "'Waffenloser Dampf'"); + CuAssertIntEquals(tc, K_STUDY, init_order(u->thisorder, lang)); + CuAssertStrEquals(tc, "Waffenloser Dampf", gettoken(token, sizeof(token))); + + CuAssertStrEquals(tc, "LERNE 'Waffenloser Dampf'", get_command(u->thisorder, lang, token, sizeof(token))); + + mstream_init(&out); + stream_order(&out, u->thisorder, lang, true); + swrite("\n", 1, 1, &out); + out.api->rewind(out.handle); + out.api->readln(out.handle, token, sizeof(token)); + CuAssertStrEquals(tc, "LERNE 'Waffenloser Dampf'", token); + mstream_done(&out); + + test_teardown(); +} + CuSuite *get_order_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_create_order); SUITE_ADD_TEST(suite, test_study_orders); SUITE_ADD_TEST(suite, test_study_order); + SUITE_ADD_TEST(suite, test_study_order_unknown); + SUITE_ADD_TEST(suite, test_study_order_unknown_tilde); + SUITE_ADD_TEST(suite, test_study_order_unknown_quoted); SUITE_ADD_TEST(suite, test_study_order_quoted); SUITE_ADD_TEST(suite, test_parse_order); SUITE_ADD_TEST(suite, test_parse_make); From 915706d6f8af9ec7e4361f6efb575bc8d7f53b6e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 21 Apr 2018 23:18:35 +0100 Subject: [PATCH 074/231] BUG: at_hate stores a unit, never an int. https://bugs.eressea.de/view.php?id=2432 --- src/keyword.h | 2 +- src/monsters.c | 23 ++++++++++++++++------- src/skill.h | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/keyword.h b/src/keyword.h index ebdd4d5e7..a9273c3f5 100644 --- a/src/keyword.h +++ b/src/keyword.h @@ -11,7 +11,7 @@ extern "C" struct locale; - typedef enum { + typedef enum keyword_t { K_KOMMENTAR, K_BANNER, K_WORK, diff --git a/src/monsters.c b/src/monsters.c index a41fce517..4d70f5840 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -173,6 +173,9 @@ static order *monster_attack(unit * u, const unit * target) if (monster_is_waiting(u)) return NULL; + if (u->region->land) { + assert(u->region->flags & RF_GUARDED); + } return create_order(K_ATTACK, u->faction->locale, "%i", target->no); } @@ -747,7 +750,14 @@ void plan_monsters(faction * f) for (r = regions; r; r = r->next) { unit *u; - bool attacking = chance(attack_chance); + bool attacking = false; + /* Tiny optimization: Monsters on land only attack randomly when + * they are guarding. If nobody is guarding this region (RF_GUARDED), + * there can't be any random attacks. + */ + if (!r->land || r->flags & RF_GUARDED) { + attacking = chance(attack_chance); + } for (u = r->units; u; u = u->next) { const race *rc = u_race(u); @@ -768,8 +778,7 @@ void plan_monsters(faction * f) if (attacking && (!r->land || is_guard(u))) { monster_attacks(u, false); } - - /* units with a plan to kill get ATTACK orders: */ + /* units with a plan to kill get ATTACK orders (even if they don't guard): */ ta = a_find(u->attribs, &at_hate); if (ta && !monster_is_waiting(u)) { unit *tu = (unit *)ta->data.v; @@ -780,15 +789,15 @@ void plan_monsters(faction * f) } } else if (tu) { - tu = findunit(ta->data.i); - if (tu != NULL) { - long_order = make_movement_order(u, tu->region, 2, allowed_walk); + bool(*allowed)(const struct region * src, const struct region * r) = allowed_walk; + if (canfly(u)) { + allowed = allowed_fly; } + long_order = make_movement_order(u, tu->region, 2, allowed); } else a_remove(&u->attribs, ta); } - /* All monsters guard the region: */ if (u->status < ST_FLEE && !monster_is_waiting(u) && r->land) { addlist(&u->orders, create_order(K_GUARD, u->faction->locale, NULL)); diff --git a/src/skill.h b/src/skill.h index 24f96a844..3c88be725 100644 --- a/src/skill.h +++ b/src/skill.h @@ -6,7 +6,7 @@ #include struct locale; -typedef enum { +typedef enum skill_t { SK_ALCHEMY, SK_CROSSBOW, SK_MINING, From fc4b7ba73d541d5041386aaa5acf8999db89381d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 22 Apr 2018 11:00:58 +0100 Subject: [PATCH 075/231] refactor: extract cycle_route and test it (with PAUSE). --- src/attributes/dict.c | 2 +- src/direction.h | 2 +- src/laws.c | 2 +- src/move.c | 22 ++++++++++++---------- src/move.h | 9 ++++++--- src/move.test.c | 25 +++++++++++++++++++++++++ 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/attributes/dict.c b/src/attributes/dict.c index 24ca8afab..bc5e94204 100644 --- a/src/attributes/dict.c +++ b/src/attributes/dict.c @@ -43,7 +43,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -typedef enum { +typedef enum dict_type { TNONE = 0, TINTEGER = 1, TREAL = 2 } dict_type; diff --git a/src/direction.h b/src/direction.h index 724878663..0b720aae8 100644 --- a/src/direction.h +++ b/src/direction.h @@ -8,7 +8,7 @@ extern "C" struct locale; - typedef enum { + typedef enum direction_t { D_NORTHWEST, D_NORTHEAST, D_EAST, diff --git a/src/laws.c b/src/laws.c index cf8f2668f..1887d8657 100644 --- a/src/laws.c +++ b/src/laws.c @@ -3548,7 +3548,7 @@ enum { PROC_LONGORDER = 1 << 1 }; -typedef enum { PR_GLOBAL, PR_REGION_PRE, PR_UNIT, PR_ORDER, PR_REGION_POST } processor_t; +typedef enum processor_t { PR_GLOBAL, PR_REGION_PRE, PR_UNIT, PR_ORDER, PR_REGION_POST } processor_t; typedef struct processor { struct processor *next; diff --git a/src/move.c b/src/move.c index 04d61de1f..dae2f6018 100644 --- a/src/move.c +++ b/src/move.c @@ -1052,7 +1052,7 @@ int movewhere(const unit * u, const char *token, region * r, region ** resultp) return E_MOVE_OK; } -static void cycle_route(order * ord, unit * u, int gereist) +order * cycle_route(order * ord, const struct locale *lang, int gereist) { int cm = 0; char tail[1024], *bufp = tail; @@ -1067,11 +1067,10 @@ static void cycle_route(order * ord, unit * u, int gereist) assert(getkeyword(ord) == K_ROUTE); tail[0] = '\0'; neworder[0] = '\0'; - init_order(ord, u->faction->locale); + init_order(ord, lang); for (cm = 0;; ++cm) { const char *s; - const struct locale *lang = u->faction->locale; pause = false; s = gettoken(token, sizeof(token)); if (s && *s) { @@ -1087,7 +1086,7 @@ static void cycle_route(order * ord, unit * u, int gereist) break; } if (cm < gereist) { - /* hier sollte keine PAUSE auftreten */ + /* TODO: hier sollte keine PAUSE auftreten */ assert(!pause); if (!pause) { const char *loc = LOC(lang, shortdirections[d]); @@ -1124,13 +1123,12 @@ static void cycle_route(order * ord, unit * u, int gereist) } if (neworder[0]) { - norder = create_order(K_ROUTE, u->faction->locale, "%s %s", neworder, tail); + norder = create_order(K_ROUTE, lang, "%s %s", neworder, tail); } else { - norder = create_order(K_ROUTE, u->faction->locale, "%s", tail); + norder = create_order(K_ROUTE, lang, "%s", tail); } - replace_order(&u->orders, ord, norder); - free_order(norder); + return norder; } static bool transport(unit * ut, unit * u) @@ -1605,7 +1603,9 @@ static const region_list *travel_route(unit * u, setguard(u, false); if (getkeyword(ord) == K_ROUTE) { - cycle_route(ord, u, steps); + order * norder = cycle_route(ord, u->faction->locale, steps); + replace_order(&u->orders, ord, norder); + free_order(norder); } if (mode == TRAVEL_RUNNING) { @@ -1937,7 +1937,9 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting) /* nachdem alle Richtungen abgearbeitet wurden, und alle Einheiten * transferiert wurden, kann der aktuelle Befehl gelöscht werden. */ if (getkeyword(ord) == K_ROUTE) { - cycle_route(ord, u, step); + order * norder = cycle_route(ord, u->faction->locale, step); + replace_order(&u->orders, ord, norder); + free_order(norder); } set_order(&u->thisorder, NULL); set_coast(sh, last_point, current_point); diff --git a/src/move.h b/src/move.h index 84a4cdb4f..72da11fca 100644 --- a/src/move.h +++ b/src/move.h @@ -26,12 +26,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. extern "C" { #endif - struct unit; + struct attrib_type; + struct building_type; + struct locale; + struct order; struct region; struct region_list; struct ship; - struct building_type; - struct order; + struct unit; extern struct attrib_type at_shiptrail; extern int *storms; @@ -95,6 +97,7 @@ extern "C" { int check_ship_allowed(struct ship *sh, const struct region * r); direction_t drift_target(struct ship *sh); + struct order * cycle_route(struct order * ord, const struct locale *lang, int gereist); #ifdef __cplusplus } #endif diff --git a/src/move.test.c b/src/move.test.c index 3c8dccf32..58dbc496b 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -593,6 +593,30 @@ static void test_route_cycle(CuTest *tc) { test_teardown(); } +static void test_cycle_route(CuTest *tc) { + struct locale *lang; + char buffer[32]; + order *ord, *onew; + + test_setup(); + lang = test_create_locale(); + CuAssertPtrNotNull(tc, LOC(lang, shortdirections[D_WEST])); + + ord = create_order(K_ROUTE, lang, "WEST EAST PAUSE NW"); + CuAssertStrEquals(tc, "route WEST EAST PAUSE NW", get_command(ord, lang, buffer, sizeof(buffer))); + + onew = cycle_route(ord, lang, 1); + CuAssertStrEquals(tc, "route east PAUSE nw west", get_command(onew, lang, buffer, sizeof(buffer))); + free_order(onew); + + onew = cycle_route(ord, lang, 2); + CuAssertStrEquals(tc, "route nw west east PAUSE", get_command(onew, lang, buffer, sizeof(buffer))); + free_order(onew); + + free_order(ord); + test_teardown(); +} + static void test_route_pause(CuTest *tc) { unit *u; region *r; @@ -658,6 +682,7 @@ CuSuite *get_move_suite(void) SUITE_ADD_TEST(suite, test_follow_ship_msg); SUITE_ADD_TEST(suite, test_drifting_ships); SUITE_ADD_TEST(suite, test_route_cycle); + SUITE_ADD_TEST(suite, test_cycle_route); SUITE_ADD_TEST(suite, test_route_pause); return suite; } From 0171c74e19ea5a79f910b758fe959db22bf20103 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 22 Apr 2018 18:04:09 +0100 Subject: [PATCH 076/231] refactor monster movement planning, test at_hate. --- src/monsters.c | 36 ++++++++++++------------------------ src/monsters.h | 2 ++ src/monsters.test.c | 28 ++++++++++++++++++++++++++++ src/move.c | 24 ++++++++++++++++++++++++ src/move.h | 1 + 5 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/monsters.c b/src/monsters.c index 4d70f5840..9d113c0e9 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -55,7 +55,6 @@ /* util includes */ #include #include -#include #include #include #include @@ -502,41 +501,30 @@ static attrib *set_new_dragon_target(unit * u, region * r, int range) return NULL; } -static order *make_movement_order(unit * u, const region * target, int moves, +static order *plan_move_to_target(unit * u, const region * target, int moves, bool(*allowed) (const region *, const region *)) { region *r = u->region; region **plan; - int position = 0; - char zOrder[128], *bufp = zOrder; - size_t size = sizeof(zOrder) - 1; + direction_t steps[DRAGON_RANGE]; + int position; if (monster_is_waiting(u)) return NULL; - plan = path_find(r, target, DRAGON_RANGE * 5, allowed); + plan = path_find(r, target, DRAGON_RANGE, allowed); if (plan == NULL) return NULL; - while (position != moves && plan[position + 1]) { - int bytes; + for (position = 0; position != moves && plan[position + 1]; ++position) { region *prev = plan[position]; - region *next = plan[++position]; + region *next = plan[position + 1]; direction_t dir = reldirection(prev, next); assert(dir != NODIRECTION && dir != D_SPECIAL); - if (size > 1 && bufp != zOrder) { - *bufp++ = ' '; - --size; - } - bytes = - (int)str_strlcpy(bufp, - (const char *)LOC(u->faction->locale, directions[dir]), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + steps[position] = dir; } - *bufp = 0; - return create_order(K_MOVE, u->faction->locale, zOrder); + return make_movement_order(u->faction->locale, steps, position); } void random_growl(const unit *u, region *target, int rand) @@ -689,15 +677,15 @@ static order *plan_dragon(unit * u) assert(long_order == NULL); /* TODO: per-race planning functions? */ if (rc == rc_wyrm) { - long_order = make_movement_order(u, tr, 1, allowed_dragon); + long_order = plan_move_to_target(u, tr, 1, allowed_dragon); } else { switch (old_race(rc)) { case RC_FIREDRAGON: - long_order = make_movement_order(u, tr, 4, allowed_dragon); + long_order = plan_move_to_target(u, tr, 4, allowed_dragon); break; case RC_DRAGON: - long_order = make_movement_order(u, tr, 3, allowed_dragon); + long_order = plan_move_to_target(u, tr, 3, allowed_dragon); break; default: break; @@ -793,7 +781,7 @@ void plan_monsters(faction * f) if (canfly(u)) { allowed = allowed_fly; } - long_order = make_movement_order(u, tu->region, 2, allowed); + long_order = plan_move_to_target(u, tu->region, 2, allowed); } else a_remove(&u->attribs, ta); diff --git a/src/monsters.h b/src/monsters.h index f3ea2d362..56f527d0a 100644 --- a/src/monsters.h +++ b/src/monsters.h @@ -28,6 +28,8 @@ extern "C" { struct unit; struct region; struct faction; + struct order; + struct locale; struct unit *spawn_seaserpent(struct region *r, struct faction *f); void spawn_dragons(void); diff --git a/src/monsters.test.c b/src/monsters.test.c index 47ae526f4..409b86dfe 100644 --- a/src/monsters.test.c +++ b/src/monsters.test.c @@ -18,10 +18,13 @@ #include "skill.h" #include "study.h" +#include #include #include #include +#include + #include #include #include @@ -267,10 +270,35 @@ static void test_spawn_seaserpent(CuTest *tc) { test_teardown(); } +static void test_monsters_hate(CuTest *tc) { + unit *mu, *tu; + order *ord; + char buffer[32]; + const struct locale *lang; + + test_setup(); + tu = test_create_unit(test_create_faction(NULL), test_create_plain(1, 0)); + mu = test_create_unit(get_monsters(), test_create_plain(0, 0)); + lang = mu->faction->locale; + a_add(&mu->attribs, make_hate(tu)); + plan_monsters(mu->faction); + CuAssertPtrNotNull(tc, mu->orders); + for (ord = mu->orders; ord; ord = ord->next) { + if (K_MOVE == getkeyword(ord)) { + break; + } + } + CuAssertPtrNotNull(tc, ord); + CuAssertIntEquals(tc, K_MOVE, getkeyword(ord)); + CuAssertStrEquals(tc, "move east", get_command(ord, lang, buffer, sizeof(buffer))); + test_teardown(); +} + CuSuite *get_monsters_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_monsters_attack); + SUITE_ADD_TEST(suite, test_monsters_hate); SUITE_ADD_TEST(suite, test_spawn_seaserpent); SUITE_ADD_TEST(suite, test_monsters_attack_ocean); SUITE_ADD_TEST(suite, test_seaserpent_piracy); diff --git a/src/move.c b/src/move.c index dae2f6018..5eb46598d 100644 --- a/src/move.c +++ b/src/move.c @@ -1131,6 +1131,30 @@ order * cycle_route(order * ord, const struct locale *lang, int gereist) return norder; } +order * make_movement_order(const struct locale *lang, direction_t steps[], int length) +{ + char zOrder[128], *bufp = zOrder; + size_t size = sizeof(zOrder) - 1; + int i; + + for (i = 0; i != length; ++i) { + int bytes; + direction_t dir = steps[i]; + if (size > 1 && bufp != zOrder) { + *bufp++ = ' '; + --size; + } + bytes = + (int)str_strlcpy(bufp, + (const char *)LOC(lang, directions[dir]), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + + *bufp = 0; + return create_order(K_MOVE, lang, zOrder); +} + static bool transport(unit * ut, unit * u) { order *ord; diff --git a/src/move.h b/src/move.h index 72da11fca..ceab50aa3 100644 --- a/src/move.h +++ b/src/move.h @@ -98,6 +98,7 @@ extern "C" { int check_ship_allowed(struct ship *sh, const struct region * r); direction_t drift_target(struct ship *sh); struct order * cycle_route(struct order * ord, const struct locale *lang, int gereist); + struct order * make_movement_order(const struct locale *lang, direction_t steps[], int length); #ifdef __cplusplus } #endif From 2f7637f953662ffebed58e9f53a01aebdc6eda0d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 22 Apr 2018 18:08:56 +0100 Subject: [PATCH 077/231] add a unit test for make_movement_order, too. --- src/move.test.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/move.test.c b/src/move.test.c index 58dbc496b..07fde591c 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -654,6 +654,26 @@ static void test_movement_speed_dragon(CuTest *tc) { test_teardown(); } +static void test_make_movement_order(CuTest *tc) { + order *ord; + char buffer[32]; + struct locale *lang; + direction_t steps[] = { D_EAST, D_WEST, D_EAST, D_WEST }; + + test_setup(); + lang = test_create_locale(); + + ord = make_movement_order(lang, steps, 2); + CuAssertStrEquals(tc, "move east west", get_command(ord, lang, buffer, sizeof(buffer))); + free_order(ord); + + ord = make_movement_order(lang, steps, 4); + CuAssertStrEquals(tc, "move east west east west", get_command(ord, lang, buffer, sizeof(buffer))); + free_order(ord); + + test_teardown(); +} + CuSuite *get_move_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -684,5 +704,6 @@ CuSuite *get_move_suite(void) SUITE_ADD_TEST(suite, test_route_cycle); SUITE_ADD_TEST(suite, test_cycle_route); SUITE_ADD_TEST(suite, test_route_pause); + SUITE_ADD_TEST(suite, test_make_movement_order); return suite; } From b868a54f0b30713ddfc85552136b99efcc78a8a1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 22 Apr 2018 18:12:55 +0100 Subject: [PATCH 078/231] use sbstring for make_movement_order. --- src/move.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/move.c b/src/move.c index 5eb46598d..bb6b9d212 100644 --- a/src/move.c +++ b/src/move.c @@ -1133,25 +1133,19 @@ order * cycle_route(order * ord, const struct locale *lang, int gereist) order * make_movement_order(const struct locale *lang, direction_t steps[], int length) { - char zOrder[128], *bufp = zOrder; - size_t size = sizeof(zOrder) - 1; + sbstring sbs; + char zOrder[128]; int i; + sbs_init(&sbs, zOrder, sizeof(zOrder)); for (i = 0; i != length; ++i) { - int bytes; direction_t dir = steps[i]; - if (size > 1 && bufp != zOrder) { - *bufp++ = ' '; - --size; + if (i > 0) { + sbs_strcat(&sbs, " "); } - bytes = - (int)str_strlcpy(bufp, - (const char *)LOC(lang, directions[dir]), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + sbs_strcat(&sbs, LOC(lang, directions[dir])); } - *bufp = 0; return create_order(K_MOVE, lang, zOrder); } From 6207211ba989b502f43501a7b08f5b6c84a6c72e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 24 Apr 2018 21:50:49 +0200 Subject: [PATCH 079/231] add skeleton for expat suport --- CMakeLists.txt | 1 + src/CMakeLists.txt | 13 +++++++++++++ src/exparse.c | 7 +++++++ src/exparse.h | 3 +++ src/jsonconf.c | 15 +++++++++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/exparse.c create mode 100644 src/exparse.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 19e49c9c6..f73ba04a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ else() find_package (SQLite3 REQUIRED QUIET) endif() +find_package(EXPAT) find_package (LibXml2 REQUIRED) find_package (ToLua REQUIRED) if (TOLUA_FOUND) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bdf0465d2..21d07e9b2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,6 +139,11 @@ set (ERESSEA_SRC ${UTIL_SRC} ) +IF(EXPAT_FOUND) +set (ERESSEA_SRC ${ERESSEA_SRC} exparse.c) +ENDIF(EXPAT_FOUND) + + set(SERVER_SRC main.c console.c @@ -309,6 +314,14 @@ target_link_libraries(eressea ${CURSES_LIBRARIES}) add_definitions(-DUSE_CURSES) endif(CURSES_FOUND) +if (EXPAT_FOUND) +include_directories (${EXPAT_INCLUDE_DIRS}) +target_link_libraries(eressea ${EXPAT_LIBRARIES}) +target_link_libraries(convert ${EXPAT_LIBRARIES}) +target_link_libraries(test_eressea ${EXPAT_LIBRARIES}) +add_definitions(-DUSE_EXPAT) +endif (EXPAT_FOUND) + if (LIBXML2_FOUND) include_directories (${LIBXML2_INCLUDE_DIR}) target_link_libraries(eressea ${LIBXML2_LIBRARIES}) diff --git a/src/exparse.c b/src/exparse.c new file mode 100644 index 000000000..0a9722344 --- /dev/null +++ b/src/exparse.c @@ -0,0 +1,7 @@ +#include "exparse.h" + +#include + +int exparse_readfile(const char * filename) { + return 1; +} diff --git a/src/exparse.h b/src/exparse.h new file mode 100644 index 000000000..9401addc0 --- /dev/null +++ b/src/exparse.h @@ -0,0 +1,3 @@ +#pragma once + +int exparse_readfile(const char * filename); diff --git a/src/jsonconf.c b/src/jsonconf.c index c14ac9216..4d84fc1ca 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -46,6 +46,9 @@ without prior permission by the authors of Eressea. #include "move.h" #include "prefix.h" #include "skill.h" +#ifdef USE_EXPAT +#include "exparse.h" +#endif /* external libraries */ #include @@ -969,8 +972,16 @@ static int include_json(const char *uri) { static int include_xml(const char *uri) { char name[PATH_MAX]; const char *filename = uri_to_file(uri, name, sizeof(name)); - int err = read_xml(filename); - if (err < 0) { + int err; +#ifdef USE_EXPAT + err = exparse_readfile(filename); + if (err != 0) { + err = read_xml(filename); + } +#else + err = read_xml(filename); +#endif + if (err != 0) { log_error("could not parse XML from %s", uri); } return err; From b28cbd606d45b6c4ba2079ce8cd5a8075516ff84 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 24 Apr 2018 22:04:23 +0200 Subject: [PATCH 080/231] minimal expat parsing code --- src/exparse.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/exparse.c b/src/exparse.c index 0a9722344..70328e0ae 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -1,7 +1,41 @@ #include "exparse.h" +#include "util/log.h" + #include int exparse_readfile(const char * filename) { - return 1; + XML_Parser xp; + FILE *F; + int err = 1; + char buf[4096]; + + F = fopen(filename, "r"); + if (!F) { + return 2; + } + xp = XML_ParserCreate("UTF-8"); + for (;;) { + size_t len = (int) fread(buf, 1, sizeof(buf), F); + int done; + + if (ferror(F)) { + log_error("read error in %s", filename); + return -1; + } + done = feof(F); + if (XML_Parse(xp, buf, len, done) == XML_STATUS_ERROR) { + log_error("parse error at line %u of %s: %s", + XML_GetCurrentLineNumber(xp), + filename, + XML_ErrorString(XML_GetErrorCode(xp))); + return -1; + } + if (done) { + break; + } + } + XML_ParserFree(xp); + fclose(F); + return err; } From c3b25328d35ece6ee82f4802f91725bb8a8aa2f6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 24 Apr 2018 21:16:56 +0100 Subject: [PATCH 081/231] don't exist with a leak, fix MSVC compilation. --- src/exparse.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 70328e0ae..011212831 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -1,3 +1,6 @@ +#ifdef _MSC_VER +#include +#endif #include "exparse.h" #include "util/log.h" @@ -21,7 +24,8 @@ int exparse_readfile(const char * filename) { if (ferror(F)) { log_error("read error in %s", filename); - return -1; + err = -2; + break; } done = feof(F); if (XML_Parse(xp, buf, len, done) == XML_STATUS_ERROR) { @@ -29,7 +33,8 @@ int exparse_readfile(const char * filename) { XML_GetCurrentLineNumber(xp), filename, XML_ErrorString(XML_GetErrorCode(xp))); - return -1; + err = -1; + break; } if (done) { break; From 0b22b500139c4fc6d933fc8d61cd9ddad0eb62d5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 11:38:11 +0200 Subject: [PATCH 082/231] the presspass is cursed, attribute needs to be on item, not resource. --- res/core/common/items.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/core/common/items.xml b/res/core/common/items.xml index d04b6a252..67f2c1119 100644 --- a/res/core/common/items.xml +++ b/res/core/common/items.xml @@ -34,8 +34,8 @@ - - + + From 08663b6eb5c47b76f2c684699bc73c5189030079 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 15:57:51 +0200 Subject: [PATCH 083/231] fix last commit. refactoring with the MSVC IDE is prone to errors. --- src/kernel/pathfinder.c | 36 ++++++++++++++++++------------------ src/kernel/pathfinder.h | 4 ++-- src/laws.c | 6 +++--- src/magic.c | 6 +++--- src/magic.h | 2 +- src/monsters.c | 8 ++++---- src/report.c | 34 +++++++++++++++++----------------- src/reports.c | 22 +++++++++++----------- src/util/filereader.c | 18 +++++++++--------- src/util/strings.c | 8 ++++---- src/util/translation.c | 6 +++--- 11 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/kernel/pathfinder.c b/src/kernel/pathfinder.c index 3c06fc3d7..61cead5fd 100644 --- a/src/kernel/pathfinder.c +++ b/src/kernel/pathfinder.c @@ -95,12 +95,12 @@ static void free_nodes(node * root) } } -struct selist *regions_in_range(struct region *start, int maxdist, +struct selist *regions_in_range(struct region *handle_start, int maxdist, bool(*allowed) (const struct region *, const struct region *)) { selist * rlist = NULL; - node *root = new_node(start, 0, NULL); - node **end = &root->next; + node *root = new_node(handle_start, 0, NULL); + node **handle_end = &root->next; node *n = root; while (n != NULL) { @@ -125,8 +125,8 @@ struct selist *regions_in_range(struct region *start, int maxdist, /* make sure we don't go here again, and put the region into the set for further BFS'ing */ fset(rn, RF_MARK); - *end = new_node(rn, depth, n); - end = &(*end)->next; + *handle_end = new_node(rn, depth, n); + handle_end = &(*handle_end)->next; } n = n->next; } @@ -135,17 +135,17 @@ struct selist *regions_in_range(struct region *start, int maxdist, return rlist; } -static region **internal_path_find(region * start, const region * target, +static region **internal_path_find(region * handle_start, const region * target, int maxlen, bool(*allowed) (const region *, const region *)) { static region *path[MAXDEPTH + 2]; /* STATIC_RETURN: used for return, not across calls */ direction_t d; - node *root = new_node(start, 0, NULL); - node **end = &root->next; + node *root = new_node(handle_start, 0, NULL); + node **handle_end = &root->next; node *n = root; bool found = false; assert(maxlen <= MAXDEPTH); - fset(start, RF_MARK); + fset(handle_start, RF_MARK); while (n != NULL) { region *r = n->r; @@ -173,8 +173,8 @@ static region **internal_path_find(region * start, const region * target, } else { fset(rn, RF_MARK); - *end = new_node(rn, depth, n); - end = &(*end)->next; + *handle_end = new_node(rn, depth, n); + handle_end = &(*handle_end)->next; } } if (found) @@ -188,22 +188,22 @@ static region **internal_path_find(region * start, const region * target, } bool -path_exists(region * start, const region * target, int maxlen, +path_exists(region * handle_start, const region * target, int maxlen, bool(*allowed) (const region *, const region *)) { - assert((!fval(start, RF_MARK) && !fval(target, RF_MARK)) + assert((!fval(handle_start, RF_MARK) && !fval(target, RF_MARK)) || !"Some Algorithm did not clear its RF_MARKs!"); - if (start == target) + if (handle_start == target) return true; - if (internal_path_find(start, target, maxlen, allowed) != NULL) + if (internal_path_find(handle_start, target, maxlen, allowed) != NULL) return true; return false; } -region **path_find(region * start, const region * target, int maxlen, +region **path_find(region * handle_start, const region * target, int maxlen, bool(*allowed) (const region *, const region *)) { - assert((!fval(start, RF_MARK) && !fval(target, RF_MARK)) + assert((!fval(handle_start, RF_MARK) && !fval(target, RF_MARK)) || !"Did you call path_init()?"); - return internal_path_find(start, target, maxlen, allowed); + return internal_path_find(handle_start, target, maxlen, allowed); } diff --git a/src/kernel/pathfinder.h b/src/kernel/pathfinder.h index 682fa4d25..a6c583139 100644 --- a/src/kernel/pathfinder.h +++ b/src/kernel/pathfinder.h @@ -22,10 +22,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. extern "C" { #endif - extern struct region **path_find(struct region *start, + extern struct region **path_find(struct region *handle_start, const struct region *target, int maxlen, bool(*allowed) (const struct region *, const struct region *)); - extern bool path_exists(struct region *start, const struct region *target, + extern bool path_exists(struct region *handle_start, const struct region *target, int maxlen, bool(*allowed) (const struct region *, const struct region *)); extern bool allowed_swim(const struct region *src, diff --git a/src/laws.c b/src/laws.c index 1887d8657..15487ab47 100644 --- a/src/laws.c +++ b/src/laws.c @@ -4103,11 +4103,11 @@ static void reset_game(void) void turn_begin(void) { - int start = first_turn(); + int handle_start = first_turn(); assert(turn >= 0); - if (turn < start) { + if (turn < handle_start) { /* this should only happen during tests */ - turn = start; + turn = handle_start; } ++turn; reset_game(); diff --git a/src/magic.c b/src/magic.c index 1865b4f9e..0accc008d 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2056,11 +2056,11 @@ void free_castorder(struct castorder *co) void add_castorder(spellrank * cll, castorder * co) { if (cll->begin == NULL) { - cll->end = &cll->begin; + cll->handle_end = &cll->begin; } - *cll->end = co; - cll->end = &co->next; + *cll->handle_end = co; + cll->handle_end = &co->next; return; } diff --git a/src/magic.h b/src/magic.h index ae43fd5af..4a00a7b13 100644 --- a/src/magic.h +++ b/src/magic.h @@ -272,7 +272,7 @@ extern "C" { typedef struct spellrank { struct castorder *begin; - struct castorder **end; + struct castorder **handle_end; } spellrank; struct castorder *create_castorder(struct castorder * co, struct unit *caster, diff --git a/src/monsters.c b/src/monsters.c index 9d113c0e9..46f63a92d 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -848,15 +848,15 @@ static double chaosfactor(region * r) return fval(r, RF_CHAOTIC) ? ((double)(1 + get_chaoscount(r)) / 1000.0) : 0.0; } -static int nrand(int start, int sub) +static int nrand(int handle_start, int sub) { int res = 0; do { - if (rng_int() % 100 < start) + if (rng_int() % 100 < handle_start) res++; - start -= sub; - } while (start > 0); + handle_start -= sub; + } while (handle_start > 0); return res; } diff --git a/src/report.c b/src/report.c index 319203e3b..9568d640a 100644 --- a/src/report.c +++ b/src/report.c @@ -181,7 +181,7 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind char marker) { size_t length = REPORTWIDTH; - const char *end, *begin, *mark = 0; + const char *handle_end, *begin, *mark = 0; if (!str) return; /* find out if there's a mark + indent already encoded in the string. */ @@ -200,7 +200,7 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind else { mark = ▮ } - begin = end = str; + begin = handle_end = str; do { const char *last_space = begin; @@ -217,25 +217,25 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind else { write_spaces(out, indent + hanging_indent); } - while (*end && end <= begin + length - indent) { - if (*end == ' ') { - last_space = end; + while (*handle_end && handle_end <= begin + length - indent) { + if (*handle_end == ' ') { + last_space = handle_end; } - ++end; + ++handle_end; } - if (*end == 0) - last_space = end; + if (*handle_end == 0) + last_space = handle_end; if (last_space == begin) { /* there was no space in this line. clip it */ - last_space = end; + last_space = handle_end; } swrite(begin, sizeof(char), last_space - begin, out); begin = last_space; while (*begin == ' ') { ++begin; } - if (begin > end) - begin = end; + if (begin > handle_end) + begin = handle_end; sputs("", out); } while (*begin); } @@ -1939,7 +1939,7 @@ static void nr_paragraph(struct stream *out, message * m, faction * f) typedef struct cb_data { struct stream *out; - char *start, *writep; + char *handle_start, *writep; size_t size; const faction *f; int maxtravel, counter; @@ -1948,7 +1948,7 @@ typedef struct cb_data { static void init_cb(cb_data *data, struct stream *out, char *buffer, size_t size, const faction *f) { data->out = out; data->writep = buffer; - data->start = buffer; + data->handle_start = buffer; data->size = size; data->f = f; data->maxtravel = 0; @@ -1965,7 +1965,7 @@ static void cb_write_travelthru(region *r, unit *u, void *cbdata) { if (travelthru_cansee(r, f, u)) { ++data->counter; do { - size_t len, size = data->size - (data->writep - data->start); + size_t len, size = data->size - (data->writep - data->handle_start); const char *str; char *writep = data->writep; @@ -2000,13 +2000,13 @@ static void cb_write_travelthru(region *r, unit *u, void *cbdata) { if (len >= size || data->counter == data->maxtravel) { /* buffer is full */ *writep = 0; - paragraph(data->out, data->start, 0, 0, 0); - data->writep = data->start; + paragraph(data->out, data->handle_start, 0, 0, 0); + data->writep = data->handle_start; if (data->counter == data->maxtravel) { break; } } - } while (data->writep == data->start); + } while (data->writep == data->handle_start); } } diff --git a/src/reports.c b/src/reports.c index f5b7f5531..568c66183 100644 --- a/src/reports.c +++ b/src/reports.c @@ -2242,7 +2242,7 @@ static void eval_regions(struct opstack **stack, const void *userdata) { /* order -> string */ const faction *report = (const faction *)userdata; int i = opop(stack).i; - int end, begin = opop(stack).i; + int handle_end, begin = opop(stack).i; const arg_regions *aregs = (const arg_regions *)opop(stack).v; char buf[256]; size_t size = sizeof(buf) - 1; @@ -2250,19 +2250,19 @@ static void eval_regions(struct opstack **stack, const void *userdata) char *bufp = buf; if (aregs == NULL) { - end = begin; + handle_end = begin; } else { if (i >= 0) - end = begin + i; + handle_end = begin + i; else - end = aregs->nregions + i; + handle_end = aregs->nregions + i; } - for (i = begin; i < end; ++i) { + for (i = begin; i < handle_end; ++i) { const char *rname = (const char *)regionname(aregs->regions[i], report); bufp = STRLCPY(bufp, rname, size); - if (i + 1 < end && size > 2) { + if (i + 1 < handle_end && size > 2) { strcat(bufp, ", "); bufp += 2; size -= 2; @@ -2295,9 +2295,9 @@ static void eval_trail(struct opstack **stack, const void *userdata) #endif if (aregs != NULL) { - int i, end = 0, begin = 0; - end = aregs->nregions; - for (i = begin; i < end; ++i) { + int i, handle_end = 0, begin = 0; + handle_end = aregs->nregions; + for (i = begin; i < handle_end; ++i) { region *r = aregs->regions[i]; const char *trail = trailinto(r, lang); const char *rn = f_regionid_s(r, report); @@ -2305,10 +2305,10 @@ static void eval_trail(struct opstack **stack, const void *userdata) if (wrptr(&bufp, &size, snprintf(bufp, size, trail, rn)) != 0) WARN_STATIC_BUFFER(); - if (i + 2 < end) { + if (i + 2 < handle_end) { bufp = STRLCPY(bufp, ", ", size); } - else if (i + 1 < end) { + else if (i + 1 < handle_end) { bufp = STRLCPY(bufp, LOC(lang, "list_and"), size); } } diff --git a/src/util/filereader.c b/src/util/filereader.c index d36d3ca71..e477b445c 100644 --- a/src/util/filereader.c +++ b/src/util/filereader.c @@ -136,11 +136,11 @@ static const char *getbuf_latin1(FILE * F) continue; } else if (c == CONTINUE_CHAR) { - const char *end = ++bp; - while (*end && isspace(*(unsigned char *)end)) - ++end; /* eatwhite */ - if (*end == '\0') { - bp = end; + const char *handle_end = ++bp; + while (*handle_end && isspace(*(unsigned char *)handle_end)) + ++handle_end; /* eatwhite */ + if (*handle_end == '\0') { + bp = handle_end; cont = true; continue; } @@ -303,11 +303,11 @@ static const char *getbuf_utf8(FILE * F) } else { if (*bp == CONTINUE_CHAR) { - const char *end; + const char *handle_end; eatwhite(bp + 1, &white); - end = bp + 1 + white; - if (*end == '\0') { - bp = end; + handle_end = bp + 1 + white; + if (*handle_end == '\0') { + bp = handle_end; cont = true; continue; } diff --git a/src/util/strings.c b/src/util/strings.c index 4959fba6c..81fdc3713 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -157,13 +157,13 @@ unsigned int str_hash(const char *s) const char *str_escape(const char *str, char *buffer, size_t len) { - const char *start = strchr(str, '\"'); - if (!start) start = strchr(str, '\\'); + const char *handle_start = strchr(str, '\"'); + if (!handle_start) handle_start = strchr(str, '\\'); assert(buffer); - if (start) { + if (handle_start) { const char *p; char *o; - size_t skip = start - str; + size_t skip = handle_start - str; if (skip > len) { skip = len; diff --git a/src/util/translation.c b/src/util/translation.c index da26806fe..4d032911e 100644 --- a/src/util/translation.c +++ b/src/util/translation.c @@ -77,7 +77,7 @@ void opstack_push(opstack ** stackp, variant data) #define BBUFSIZE 0x10000 static struct { char *begin; - char *end; + char *handle_end; char *last; char *current; } buffer; @@ -88,9 +88,9 @@ char *balloc(size_t size) if (!init) { init = 1; buffer.current = buffer.begin = malloc(BBUFSIZE * sizeof(char)); - buffer.end = buffer.begin + BBUFSIZE; + buffer.handle_end = buffer.begin + BBUFSIZE; } - assert(buffer.current + size <= buffer.end || !"balloc is out of memory"); + assert(buffer.current + size <= buffer.handle_end || !"balloc is out of memory"); buffer.last = buffer.current; buffer.current += size; return buffer.last; From edadf2cbabef1432f064e423499a985cf55ab97c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 15:58:14 +0200 Subject: [PATCH 084/231] exparse: parse (most of) the resource data. --- src/exparse.c | 317 ++++++++++++++++++++++++++++++++++++++++- src/kernel/item.c | 10 +- src/kernel/item.h | 3 +- src/kernel/region.c | 12 +- src/kernel/resources.c | 18 +-- src/spells/unitcurse.c | 18 +-- src/xmlreader.c | 31 +++- 7 files changed, 374 insertions(+), 35 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 011212831..44593f3cf 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -3,21 +3,330 @@ #endif #include "exparse.h" +#include "kernel/build.h" +#include "kernel/item.h" +#include "kernel/resources.h" + #include "util/log.h" #include +#include +#include + +#ifdef XML_LARGE_SIZE +# if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 +# define XML_FMT_INT_MOD "I64" +# else +# define XML_FMT_INT_MOD "ll" +# endif +#else +# define XML_FMT_INT_MOD "l" +#endif + +#ifdef XML_UNICODE_WCHAR_T +# define XML_FMT_STR "ls" +#else +# define XML_FMT_STR "s" +#endif + +enum { + EXP_UNKNOWN, + + EXP_RESOURCES, + EXP_BUILDINGS, + EXP_SHIPS, + EXP_MESSAGES, + EXP_STRINGS, +}; + +typedef struct userdata { + int type; + int depth; + int errors; + XML_Char *cdata; + size_t clength; + void *object; +} userdata; + +static int xml_strcmp(const XML_Char *xs, const char *cs) { + return strcmp(xs, cs); +} + +static const char * attr_get(const XML_Char **attr, const char *key) { + int i; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], key) == 0) { + return (const char *)attr[i + 1]; + } + } + return NULL; +} + +static bool xml_bool(const XML_Char *val) { + if (xml_strcmp(val, "yes") == 0) return true; + if (xml_strcmp(val, "true") == 0) return true; + if (xml_strcmp(val, "1") == 0) return true; + return false; +} + +static int xml_int(const XML_Char *val) { + return atoi((const char *)val); +} + +static bool attr_bool(XML_Char **pair, const char *key) { + if (xml_strcmp(pair[0], key) == 0) { + return xml_bool(pair[1]); + } + return false; +} + +static void handle_bad_input(userdata *ud, const XML_Char *el, const XML_Char *attr) { + if (attr) { + log_error("unknown attribute in <%s>: %s", (const char *)el, (const char *)attr); + } + else { + log_error("unexpected element <%s>", (const char *)el); + } + ++ud->errors; +} + +static bool handle_flag(int *flags, const XML_Char **pair, const char *names[]) { + int i; + for (i = 0; names[i]; ++i) { + if (xml_strcmp(pair[0], names[i]) == 0) { + if (xml_bool(pair[1])) { + *flags |= (1 << i); + } + else { + *flags &= ~(1 << i); + } + return true; + } + } + return false; +} + +static void handle_resource(userdata *ud, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "item", "limited", "pooled", NULL }; + int i; + const char *name = NULL, *appear = NULL; + int flags = RTF_POOLED; + bool material = false; + (void)el; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "name") == 0) { + name = (const char *)attr[i + 1]; + } + else if (xml_strcmp(attr[i], "appearance") == 0) { + /* TODO: appearance should be a property of item, not resource */ + appear = (const char *)attr[i + 1]; + flags |= RTF_ITEM; + } + else if (xml_strcmp(attr[i], "material") == 0) { + /* TODO: appearance should be a property of item, not resource */ + material = xml_bool(attr[i + 1]); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(ud, el, attr[i]); + } + } + if (name) { + resource_type *rtype = rt_get_or_create(name); + rtype->flags = flags; + if (appear) { + /* TODO: appearance should be a property of item, not resource */ + rtype->itype = it_get_or_create(rtype); + it_set_appearance(rtype->itype, appear); + } + if (material) { + rmt_create(rtype); + } + ud->object = rtype; + } +} + +static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "herb", "cursed", "notlost", "big", "animal", "vehicle", "use", NULL }; + int i, flags = ITF_NONE; + resource_type *rtype = (resource_type *)ud->object; + item_type * itype = rtype->itype; + assert(rtype); + if (!itype) { + itype = it_get_or_create(rtype); + } + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "weight") == 0) { + itype->weight = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "capacity") == 0) { + itype->capacity = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "score") == 0) { + itype->score = xml_int(attr[i + 1]); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(ud, el, attr[i]); + } + } + itype->flags = flags; +} + +static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML_Char **attr) { + resource_type *rtype = (resource_type *)ud->object; + if (xml_strcmp(el, "resource") == 0) { + handle_resource(ud, el, attr); + } + else if (rtype) { + if (xml_strcmp(el, "item") == 0) { + assert(rtype); + handle_item(ud, el, attr); + } + else if (xml_strcmp(el, "function") == 0) { + assert(rtype); + /* TODO */ + } + else if (rtype->itype) { + item_type *itype = rtype->itype; + if (xml_strcmp(el, "construction") == 0) { + construction *con = calloc(sizeof(construction), 1); + int i; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "skill") == 0) { + con->skill = findskill((const char *)attr[i + 1]); + } + else if (xml_strcmp(attr[i], "maxsize") == 0) { + con->maxsize = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "reqsize") == 0) { + con->reqsize = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "minskill") == 0) { + con->minskill = xml_int(attr[i + 1]); + } + else { + handle_bad_input(ud, el, attr[i]); + } + } + itype->construction = con; + } + else if (xml_strcmp(el, "requirement") == 0) { + assert(itype->construction); + /* TODO */ + } + else if (xml_strcmp(el, "luxury") == 0) { + /* TODO */ + } + else if (xml_strcmp(el, "potion") == 0) { + /* TODO */ + } + else if (xml_strcmp(el, "armor") == 0) { + /* TODO */ + rtype->atype = new_armortype(itype, 0.0, frac_zero, 0, 0); + } + else if (xml_strcmp(el, "weapon") == 0) { + rtype->wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, SK_MELEE); + /* TODO */ + } + else if (xml_strcmp(el, "damage") == 0) { + assert(rtype->wtype); + /* TODO */ + } + else { + handle_bad_input(ud, el, NULL); + } + } + else { + handle_bad_input(ud, el, NULL); + } + } + else { + handle_bad_input(ud, el, NULL); + } +} + +static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char **attr) { + userdata *ud = (userdata *)data; + if (ud->depth == 0) { + ud->type = EXP_UNKNOWN; + if (xml_strcmp(el, "eressea") != 0) { + handle_bad_input(ud, el, NULL); + } + } + else if (ud->depth == 1) { + if (xml_strcmp(el, "resources") == 0) { + ud->type = EXP_RESOURCES; + } + else if (xml_strcmp(el, "buildings") == 0) { + ud->type = EXP_BUILDINGS; + } + else if (xml_strcmp(el, "ships") == 0) { + ud->type = EXP_SHIPS; + } + else if (xml_strcmp(el, "messages") == 0) { + ud->type = EXP_MESSAGES; + } + else if (xml_strcmp(el, "strings") == 0) { + ud->type = EXP_STRINGS; + } + else { + handle_bad_input(ud, el, NULL); + } + } + else { + switch (ud->type) { + case EXP_RESOURCES: + handle_resources(ud, el, attr); + default: + /* not implemented */ + handle_bad_input(ud, el, NULL); + } + } + ++ud->depth; +} + +static void XMLCALL handle_end(void *data, const XML_Char *el) { + userdata *ud = (userdata *)data; + --ud->depth; + if (ud->cdata) { + free(ud->cdata); + ud->cdata = NULL; + ud->clength = 0; + } + if (ud->depth == 0) { + ud->type = EXP_UNKNOWN; + } +} + +static void XMLCALL handle_data(void *data, const XML_Char *xs, int len) { + userdata *ud = (userdata *)data; + if (len > 0) { + if (ud->type == EXP_MESSAGES && ud->depth == 4) { + size_t bytes = (size_t)len; + ud->cdata = realloc(ud->cdata, ud->clength + bytes); + memcpy(ud->cdata + ud->clength, xs, bytes); + ud->clength = ud->clength + bytes; + } + } +} + + int exparse_readfile(const char * filename) { XML_Parser xp; FILE *F; int err = 1; char buf[4096]; + userdata ud; F = fopen(filename, "r"); if (!F) { return 2; } xp = XML_ParserCreate("UTF-8"); + XML_SetElementHandler(xp, handle_start, handle_end); + XML_SetCharacterDataHandler(xp, handle_data); + XML_SetUserData(xp, &ud); + memset(&ud, 0, sizeof(ud)); for (;;) { size_t len = (int) fread(buf, 1, sizeof(buf), F); int done; @@ -29,7 +338,7 @@ int exparse_readfile(const char * filename) { } done = feof(F); if (XML_Parse(xp, buf, len, done) == XML_STATUS_ERROR) { - log_error("parse error at line %u of %s: %s", + log_error("parse error at line %" XML_FMT_INT_MOD " of %s: %" XML_FMT_STR, XML_GetCurrentLineNumber(xp), filename, XML_ErrorString(XML_GetErrorCode(xp))); @@ -40,7 +349,11 @@ int exparse_readfile(const char * filename) { break; } } + assert(ud.depth == 0); XML_ParserFree(xp); fclose(F); - return err; + if (err != 0) { + return err; + } + return ud.errors; } diff --git a/src/kernel/item.c b/src/kernel/item.c index ab6ad8c8d..a573dc4ba 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -916,7 +916,11 @@ static void free_itype(item_type *itype) { free(itype); } -static void free_wtype(weapon_type *wtype) { +void free_atype(armor_type *atype) { + free(atype); +} + +void free_wtype(weapon_type *wtype) { assert(wtype); free(wtype->damage[0]); free(wtype->damage[1]); @@ -931,7 +935,9 @@ void free_rtype(resource_type *rtype) { if (rtype->itype) { free_itype(rtype->itype); } - free(rtype->atype); + if (rtype->atype) { + free_atype(rtype->atype); + } free(rtype->modifiers); free(rtype->raw); free(rtype->_name); diff --git a/src/kernel/item.h b/src/kernel/item.h index e7bfef7cc..9079369e8 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -224,9 +224,10 @@ extern "C" { weapon_type *new_weapontype(item_type * itype, int wflags, variant magres, const char *damage[], int offmod, int defmod, int reload, skill_t sk); + void free_wtype(struct weapon_type *wtype); armor_type *new_armortype(item_type * itype, double penalty, variant magres, int prot, unsigned int flags); - + void free_atype(struct armor_type *wtype); /* these constants are used with get_resourcetype. * The order of the enum is not important for stored data. * The resourcenames array must be updated to match. diff --git a/src/kernel/region.c b/src/kernel/region.c index 790a8341c..7ceab2f18 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -971,16 +971,16 @@ static char *makename(void) size_t nk, ne, nv, ns; static char name[16]; const char *kons = "bcdfghklmnprstvwz", - *start = "bcdgtskpvfr", - *end = "nlrdst", + *handle_start = "bcdgtskpvfr", + *handle_end = "nlrdst", *vowels = "aaaaaaaaaaaeeeeeeeeeeeeiiiiiiiiiiioooooooooooouuuuuuuuuuyy"; /* const char * vowels_latin1 = "aaaaaaaaaeeeeeeeeeiiiiiiiiiooooooooouuuuuuuuuyy"; */ nk = strlen(kons); - ne = strlen(end); + ne = strlen(handle_end); nv = strlen(vowels); - ns = strlen(start); + ns = strlen(handle_start); for (s = rng_int() % 3 + 2; s > 0; s--) { int v; @@ -991,7 +991,7 @@ static char *makename(void) } else { k = rng_int() % (int)ns; - name[p] = start[k]; + name[p] = handle_start[k]; p++; } v = rng_int() % (int)nv; @@ -999,7 +999,7 @@ static char *makename(void) p++; if (rng_int() % 3 == 2 || s == 1) { e = rng_int() % (int)ne; - name[p] = end[e]; + name[p] = handle_end[e]; p++; x = 1; } diff --git a/src/kernel/resources.c b/src/kernel/resources.c index bcf26efb3..231b763f8 100644 --- a/src/kernel/resources.c +++ b/src/kernel/resources.c @@ -180,15 +180,15 @@ struct rawmaterial_type *rmt_create(struct resource_type *rtype) { rawmaterial_type *rmtype; - assert(!rtype->raw); - assert(!rtype->itype || rtype->itype->construction); - rmtype = rtype->raw = malloc(sizeof(rawmaterial_type)); - rmtype->rtype = rtype; - rmtype->terraform = terraform_default; - rmtype->update = NULL; - rmtype->use = use_default; - rmtype->visible = visible_default; - return rmtype; + if (!rtype->raw) { + rmtype = rtype->raw = malloc(sizeof(rawmaterial_type)); + rmtype->rtype = rtype; + rmtype->terraform = terraform_default; + rmtype->update = NULL; + rmtype->use = use_default; + rmtype->visible = visible_default; + } + return rtype->raw; } int limit_resource(const struct region *r, const resource_type *rtype) diff --git a/src/spells/unitcurse.c b/src/spells/unitcurse.c index 6fc979e38..a99eb082c 100644 --- a/src/spells/unitcurse.c +++ b/src/spells/unitcurse.c @@ -232,7 +232,7 @@ static message *cinfo_sparkle(const void *obj, objtype_t typ, const curse * c, "sparkle_18", NULL, /* end draig */ }; - int m, begin = 0, end = 0; + int m, begin = 0, handle_end = 0; unit *u; UNUSED_ARG(typ); @@ -243,18 +243,18 @@ static message *cinfo_sparkle(const void *obj, objtype_t typ, const curse * c, return NULL; for (m = 0; m != c->magician->faction->magiegebiet; ++m) { - while (effects[end] != NULL) - ++end; - begin = end + 1; - end = begin; + while (effects[handle_end] != NULL) + ++handle_end; + begin = handle_end + 1; + handle_end = begin; } - while (effects[end] != NULL) - ++end; - if (end == begin) + while (effects[handle_end] != NULL) + ++handle_end; + if (handle_end == begin) return NULL; else { - int index = begin + curse_geteffect_int(c) % (end - begin); + int index = begin + curse_geteffect_int(c) % (handle_end - begin); return msg_message(mkname("curseinfo", effects[index]), "unit id", u, c->no); } diff --git a/src/xmlreader.c b/src/xmlreader.c index 66b04e611..a157569fd 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -559,8 +559,7 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) assert(sk != NOSKILL); xmlFree(propValue); - wtype = - new_weapontype(itype, flags, magres, NULL, offmod, defmod, reload, sk); + wtype = new_weapontype(itype, flags, magres, NULL, offmod, defmod, reload, sk); /* reading weapon/damage */ xpath->node = node; @@ -712,7 +711,14 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) flags |= ITF_ANIMAL; if (xml_bvalue(node, "vehicle", false)) flags |= ITF_VEHICLE; + itype = rtype->itype ? rtype->itype : it_get_or_create(rtype); + /* exparse: recreate child data. */ + if (itype->construction) { + free_construction(itype->construction); + itype->construction = NULL; + } + itype->weight = xml_ivalue(node, "weight", 0); itype->capacity = xml_ivalue(node, "capacity", 0); mask_races(node, "allow", &itype->mask_allow); @@ -823,7 +829,18 @@ static int parse_resources(xmlDocPtr doc) log_error("invalid resource %d has no name", i); continue; } + rtype = rt_get_or_create((const char *)name); + /* exparse: recreate child data. */ + if (rtype->atype) { + free_atype(rtype->atype); + rtype->atype = NULL; + } + if (rtype->wtype) { + free_wtype(rtype->wtype); + rtype->wtype = NULL; + } + rtype->flags |= flags; xmlFree(name); @@ -858,10 +875,6 @@ static int parse_resources(xmlDocPtr doc) } xmlXPathFreeObject(result); - if (xml_bvalue(node, "material", false)) { - rmt_create(rtype); - } - if (xml_bvalue(node, "limited", false)) { rtype->flags |= RTF_LIMITED; } @@ -869,6 +882,7 @@ static int parse_resources(xmlDocPtr doc) result = xmlXPathEvalExpression(BAD_CAST "modifier", xpath); rtype->modifiers = xml_readmodifiers(result, node); xmlXPathFreeObject(result); + /* reading eressea/resources/resource/resourcelimit/function */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "resourcelimit/function", xpath); @@ -889,6 +903,11 @@ static int parse_resources(xmlDocPtr doc) } } xmlXPathFreeObject(result); + + if (xml_bvalue(node, "material", false)) { + assert(!rtype->itype || rtype->itype->construction); + rmt_create(rtype); + } } } xmlXPathFreeObject(resources); From 03cff6d595bbc72d386840e2584ac2357afae27c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 16:14:32 +0200 Subject: [PATCH 085/231] extract rc_mask, add it to exparse code. --- src/exparse.c | 14 ++++++++++++++ src/kernel/race.c | 17 +++++++++++++++++ src/kernel/race.h | 2 ++ src/kernel/race.test.c | 15 +++++++++++++++ src/xmlreader.c | 13 +------------ 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 44593f3cf..5b8b2a279 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -5,6 +5,7 @@ #include "kernel/build.h" #include "kernel/item.h" +#include "kernel/race.h" #include "kernel/resources.h" #include "util/log.h" @@ -156,6 +157,7 @@ static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) itype = it_get_or_create(rtype); } for (i = 0; attr[i]; i += 2) { + char buffer[64]; if (xml_strcmp(attr[i], "weight") == 0) { itype->weight = xml_int(attr[i + 1]); } @@ -165,6 +167,18 @@ static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) else if (xml_strcmp(attr[i], "score") == 0) { itype->score = xml_int(attr[i + 1]); } + else if (xml_strcmp(attr[i], "allow") == 0) { + size_t len = strlen(attr[i + 1]); + assert(len < sizeof(buffer)); + memcpy(buffer, attr[i + 1], len + 1); + itype->mask_allow = rc_mask(buffer); + } + else if (xml_strcmp(attr[i], "deny") == 0) { + size_t len = strlen(attr[i + 1]); + assert(len < sizeof(buffer)); + memcpy(buffer, attr[i + 1], len + 1); + itype->mask_deny = rc_mask(buffer); + } else if (!handle_flag(&flags, attr + i, flag_names)) { handle_bad_input(ud, el, attr[i]); } diff --git a/src/kernel/race.c b/src/kernel/race.c index edf415223..c9299d5bd 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -574,3 +574,20 @@ struct race * read_race_reference(struct storage *store) void register_race_function(race_func func, const char *name) { register_function((pf_generic)func, name); } + +static int race_mask = 1; + +int rc_mask(char *list) { + int mask = 0; + char * tok = strtok(list, " ,"); + while (tok) { + race * rc = rc_get_or_create(tok); + if (!rc->mask_item) { + rc->mask_item = race_mask; + race_mask = race_mask << 1; + } + mask |= rc->mask_item; + tok = strtok(NULL, " ,"); + } + return mask; +} diff --git a/src/kernel/race.h b/src/kernel/race.h index 1203eaed2..042cb5e78 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -197,6 +197,8 @@ extern "C" { #define MIGRANTS_NONE 0 #define MIGRANTS_LOG10 1 int rc_migrants_formula(const race *rc); + + int rc_mask(char *list); /* Flags. Do not reorder these without changing json_race() in jsonconf.c */ #define RCF_NPC (1<<0) /* cannot be the race for a player faction (and other limits?) */ diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index dcb4ce6f7..2f34c127e 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -172,6 +173,19 @@ static void test_racename(CuTest *tc) { test_teardown(); } +static void test_rc_mask(CuTest *tc) { + int mask; + char list[64]; + test_setup(); + strcpy(list, "goblin dwarf"); + mask = rc_mask(list); + CuAssertIntEquals(tc, 3, mask); + CuAssertStrEquals(tc, "goblin", list); + mask = rc_mask(list); + CuAssertIntEquals(tc, 1, mask); + test_teardown(); +} + CuSuite *get_race_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -180,6 +194,7 @@ CuSuite *get_race_suite(void) SUITE_ADD_TEST(suite, test_rc_name); SUITE_ADD_TEST(suite, test_rc_defaults); SUITE_ADD_TEST(suite, test_rc_find); + SUITE_ADD_TEST(suite, test_rc_mask); SUITE_ADD_TEST(suite, test_rc_set_param); SUITE_ADD_TEST(suite, test_rc_can_use); SUITE_ADD_TEST(suite, test_racename); diff --git a/src/xmlreader.c b/src/xmlreader.c index a157569fd..111ce624e 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -667,23 +667,12 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) return wtype; } -static int race_mask = 1; - static void mask_races(xmlNodePtr node, const char *key, int *maskp) { xmlChar *propValue = xmlGetProp(node, BAD_CAST key); int mask = 0; assert(maskp); if (propValue) { - char * tok = strtok((char *)propValue, " ,"); - while (tok) { - race * rc = rc_get_or_create(tok); - if (!rc->mask_item) { - rc->mask_item = race_mask; - race_mask = race_mask << 1; - } - mask |= rc->mask_item; - tok = strtok(NULL, " ,"); - } + mask = rc_mask((char *)propValue); xmlFree(propValue); } *maskp = mask; From ff4bae4da113aff14846fbe96dd70222f2441c66 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 17:52:48 +0200 Subject: [PATCH 086/231] delete unused static functions. --- src/exparse.c | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 5b8b2a279..afaa3daf8 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -54,16 +54,6 @@ static int xml_strcmp(const XML_Char *xs, const char *cs) { return strcmp(xs, cs); } -static const char * attr_get(const XML_Char **attr, const char *key) { - int i; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], key) == 0) { - return (const char *)attr[i + 1]; - } - } - return NULL; -} - static bool xml_bool(const XML_Char *val) { if (xml_strcmp(val, "yes") == 0) return true; if (xml_strcmp(val, "true") == 0) return true; @@ -75,13 +65,6 @@ static int xml_int(const XML_Char *val) { return atoi((const char *)val); } -static bool attr_bool(XML_Char **pair, const char *key) { - if (xml_strcmp(pair[0], key) == 0) { - return xml_bool(pair[1]); - } - return false; -} - static void handle_bad_input(userdata *ud, const XML_Char *el, const XML_Char *attr) { if (attr) { log_error("unknown attribute in <%s>: %s", (const char *)el, (const char *)attr); @@ -125,7 +108,6 @@ static void handle_resource(userdata *ud, const XML_Char *el, const XML_Char **a flags |= RTF_ITEM; } else if (xml_strcmp(attr[i], "material") == 0) { - /* TODO: appearance should be a property of item, not resource */ material = xml_bool(attr[i + 1]); } else if (!handle_flag(&flags, attr + i, flag_names)) { @@ -229,7 +211,7 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML /* TODO */ } else if (xml_strcmp(el, "luxury") == 0) { - /* TODO */ + rtype->ltype = new_luxurytype(itype, 0); } else if (xml_strcmp(el, "potion") == 0) { /* TODO */ @@ -291,6 +273,7 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char switch (ud->type) { case EXP_RESOURCES: handle_resources(ud, el, attr); + break; default: /* not implemented */ handle_bad_input(ud, el, NULL); @@ -328,7 +311,7 @@ static void XMLCALL handle_data(void *data, const XML_Char *xs, int len) { int exparse_readfile(const char * filename) { XML_Parser xp; FILE *F; - int err = 1; + int err = 0; char buf[4096]; userdata ud; From ce50b888c922568ae50e453f38382fdc84a0abe3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 18:10:04 +0200 Subject: [PATCH 087/231] finish loading luxury items. --- src/xmlreader.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/xmlreader.c b/src/xmlreader.c index 111ce624e..60231688e 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -498,6 +498,10 @@ static void xml_readpotion(xmlXPathContextPtr xpath, item_type * itype) static luxury_type *xml_readluxury(xmlXPathContextPtr xpath, item_type * itype) { int price = xml_ivalue(xpath->node, "price", 0); + if (itype->rtype->ltype) { + itype->rtype->ltype->price = price; + return itype->rtype->ltype; + } return new_luxurytype(itype, price); } From 16cebed0132954ab4af9e06b4e5f7aec8d11f934 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 18:40:14 +0200 Subject: [PATCH 088/231] implement weapons loading with expat. --- src/exparse.c | 65 +++++++++++++++++++++++++++++++++++++++++++---- src/kernel/item.c | 2 +- src/xmlreader.c | 4 +-- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index afaa3daf8..8a45e3fe9 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -9,6 +9,7 @@ #include "kernel/resources.h" #include "util/log.h" +#include "util/strings.h" #include @@ -65,6 +66,13 @@ static int xml_int(const XML_Char *val) { return atoi((const char *)val); } +static variant xml_fraction(const XML_Char *val) { + int num, den = 100; + double fval = atof((const char *)val); + num = (int)(fval * den + 0.5); + return frac_make(num, den); +} + static void handle_bad_input(userdata *ud, const XML_Char *el, const XML_Char *attr) { if (attr) { log_error("unknown attribute in <%s>: %s", (const char *)el, (const char *)attr); @@ -168,6 +176,35 @@ static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) itype->flags = flags; } +static void handle_weapon(userdata *ud, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "missile", "magical", "pierce", "cut", "bash", "siege", "armorpiercing", "horse", "useshield", NULL }; + resource_type *rtype = (resource_type *)ud->object; + item_type * itype = rtype->itype; + weapon_type *wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, NOSKILL); + int i, flags = 0; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "offmod") == 0) { + wtype->offmod = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "defmod") == 0) { + wtype->defmod = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "reload") == 0) { + wtype->reload = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "skill") == 0) { + wtype->skill = findskill(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "magres") == 0) { + wtype->magres = xml_fraction(attr[i + 1]);; + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(ud, el, attr[i]); + } + } + wtype->flags = flags; +} + static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)ud->object; if (xml_strcmp(el, "resource") == 0) { @@ -221,12 +258,30 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML rtype->atype = new_armortype(itype, 0.0, frac_zero, 0, 0); } else if (xml_strcmp(el, "weapon") == 0) { - rtype->wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, SK_MELEE); - /* TODO */ + handle_weapon(ud, el, attr); } - else if (xml_strcmp(el, "damage") == 0) { - assert(rtype->wtype); - /* TODO */ + else if (rtype->wtype) { + weapon_type *wtype = rtype->wtype; + if (xml_strcmp(el, "damage") == 0) { + int i, pos = 0; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + /* damage vs. rider(1) or not(0)? */ + if (xml_strcmp(attr[i + 1], "rider") == 0) { + pos = 1; + } + } + else if (xml_strcmp(attr[i], "value") == 0) { + wtype->damage[pos] = str_strdup(attr[i + 1]); + } + else { + handle_bad_input(ud, el, NULL); + } + } + } + else { + handle_bad_input(ud, el, NULL); + } } else { handle_bad_input(ud, el, NULL); diff --git a/src/kernel/item.c b/src/kernel/item.c index a573dc4ba..ef0f46768 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -291,7 +291,7 @@ weapon_type *new_weapontype(item_type * itype, wtype->damage[1] = str_strdup(damage[1]); } wtype->defmod = defmod; - wtype->flags |= wflags; + wtype->flags = wflags; wtype->itype = itype; wtype->magres = magres; wtype->offmod = offmod; diff --git a/src/xmlreader.c b/src/xmlreader.c index 60231688e..af057fc03 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -548,7 +548,7 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) flags |= WTF_PIERCE; if (xml_bvalue(node, "cut", false)) flags |= WTF_CUT; - if (xml_bvalue(node, "blunt", false)) + if (xml_bvalue(node, "bash", false)) flags |= WTF_BLUNT; if (xml_bvalue(node, "siege", false)) flags |= WTF_SIEGE; @@ -581,8 +581,6 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) propValue = xmlGetProp(node, BAD_CAST "value"); wtype->damage[pos] = str_strdup((const char *)propValue); /* TODO: this is a memory leak */ - if (k == 0) - wtype->damage[1 - pos] = wtype->damage[pos]; xmlFree(propValue); } xmlXPathFreeObject(result); From e4a2b6cb357d2a3f97f07e0b28cf246a947c62da Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 18:47:17 +0200 Subject: [PATCH 089/231] loading armor with expat. --- src/exparse.c | 33 +++++++++++++++++++++++++++++++-- src/kernel/item.h | 2 +- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 8a45e3fe9..e42b1c81a 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -66,6 +66,10 @@ static int xml_int(const XML_Char *val) { return atoi((const char *)val); } +static double xml_float(const XML_Char *val) { + return atof((const char *)val); +} + static variant xml_fraction(const XML_Char *val) { int num, den = 100; double fval = atof((const char *)val); @@ -176,6 +180,32 @@ static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) itype->flags = flags; } +static void handle_armor(userdata *ud, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "shield", "laen", NULL }; + resource_type *rtype = (resource_type *)ud->object; + item_type * itype = rtype->itype; + armor_type *atype = new_armortype(itype, 0.0, frac_zero, 0, 0); + int i, flags = 0; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "penalty") == 0) { + atype->penalty = xml_float(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "projectile") == 0) { + atype->projectile = xml_float(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "ac") == 0) { + atype->prot = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "magres") == 0) { + atype->magres = xml_fraction(attr[i + 1]); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(ud, el, attr[i]); + } + } + atype->flags = flags; +} + static void handle_weapon(userdata *ud, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "missile", "magical", "pierce", "cut", "bash", "siege", "armorpiercing", "horse", "useshield", NULL }; resource_type *rtype = (resource_type *)ud->object; @@ -254,8 +284,7 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML /* TODO */ } else if (xml_strcmp(el, "armor") == 0) { - /* TODO */ - rtype->atype = new_armortype(itype, 0.0, frac_zero, 0, 0); + handle_armor(ud, el, attr); } else if (xml_strcmp(el, "weapon") == 0) { handle_weapon(ud, el, attr); diff --git a/src/kernel/item.h b/src/kernel/item.h index 9079369e8..802c483a8 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -159,9 +159,9 @@ extern "C" { const item_type *itype; unsigned int flags; double penalty; + double projectile; /* chance, dass ein projektil abprallt */ variant magres; int prot; - float projectile; /* chance, dass ein projektil abprallt */ } armor_type; #define WTF_NONE 0x00 From 9d3385de9788c0ac1eeab91229f88b748d318845 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 18:49:13 +0200 Subject: [PATCH 090/231] still cannot read potions, requirements, functions. --- src/exparse.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index e42b1c81a..aca35c8ec 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -247,6 +247,7 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML } else if (xml_strcmp(el, "function") == 0) { assert(rtype); + ++ud->errors; /* TODO */ } else if (rtype->itype) { @@ -276,12 +277,14 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML else if (xml_strcmp(el, "requirement") == 0) { assert(itype->construction); /* TODO */ + ++ud->errors; } else if (xml_strcmp(el, "luxury") == 0) { rtype->ltype = new_luxurytype(itype, 0); } else if (xml_strcmp(el, "potion") == 0) { /* TODO */ + ++ud->errors; } else if (xml_strcmp(el, "armor") == 0) { handle_armor(ud, el, attr); From 9dbfaea708dcdd712b9edd327690445b8fb29981 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 21:12:28 +0200 Subject: [PATCH 091/231] parse construction requirements for items. --- src/exparse.c | 52 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index aca35c8ec..0b76aa792 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -235,7 +235,11 @@ static void handle_weapon(userdata *ud, const XML_Char *el, const XML_Char **att wtype->flags = flags; } -static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML_Char **attr) { +#define MAX_REQUIREMENTS 8 +static requirement reqs[MAX_REQUIREMENTS]; +static int nreqs; + +static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)ud->object; if (xml_strcmp(el, "resource") == 0) { handle_resource(ud, el, attr); @@ -273,11 +277,23 @@ static void XMLCALL handle_resources(userdata *ud, const XML_Char *el, const XML } } itype->construction = con; + nreqs = 0; } else if (xml_strcmp(el, "requirement") == 0) { + requirement *req; + int i; assert(itype->construction); - /* TODO */ - ++ud->errors; + assert(nreqs < MAX_REQUIREMENTS); + req = reqs + nreqs; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + req->rtype = rt_get_or_create((const char *)attr[i + 1]); + } + else if (xml_strcmp(attr[i], "quantity") == 0) { + req->number = xml_int(attr[i + 1]); + } + } + ++nreqs; } else if (xml_strcmp(el, "luxury") == 0) { rtype->ltype = new_luxurytype(itype, 0); @@ -359,7 +375,7 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char else { switch (ud->type) { case EXP_RESOURCES: - handle_resources(ud, el, attr); + start_resources(ud, el, attr); break; default: /* not implemented */ @@ -369,14 +385,32 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char ++ud->depth; } +static void end_resources(userdata *ud, const XML_Char *el) { + resource_type *rtype = (resource_type *)ud->object; + if (xml_strcmp(el, "construction") == 0) { + if (nreqs > 0) { + construction *con = rtype->itype->construction; + con->materials = calloc(sizeof(requirement), nreqs + 1); + memcpy(con->materials, reqs, sizeof(requirement) * nreqs); + nreqs = 0; + } + } +} + static void XMLCALL handle_end(void *data, const XML_Char *el) { userdata *ud = (userdata *)data; - --ud->depth; - if (ud->cdata) { - free(ud->cdata); - ud->cdata = NULL; - ud->clength = 0; + + if (ud->type == EXP_RESOURCES) { + end_resources(ud, el); } + else { + if (ud->cdata) { + free(ud->cdata); + ud->cdata = NULL; + ud->clength = 0; + } + } + --ud->depth; if (ud->depth == 0) { ud->type = EXP_UNKNOWN; } From 4812fa1c41136d288ed9b3de6e171f1982fe8a2e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 21:25:26 +0200 Subject: [PATCH 092/231] unnecessary xpath searches. 1. item does not have functions. 2. resourcelimit is gone. --- src/xmlreader.c | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 66b04e611..333e891df 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -696,7 +696,6 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) item_type *itype = NULL; unsigned int flags = ITF_NONE; xmlXPathObjectPtr result; - int k; if (xml_bvalue(node, "cursed", false)) flags |= ITF_CURSED; @@ -769,27 +768,8 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) } xmlXPathFreeObject(result); - /* reading item/function */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "function", xpath); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - xmlChar *propValue; - pf_generic fun; - - parse_function(node, &fun, &propValue); - if (fun == NULL) { - log_error("unknown function name '%s' for item '%s'\n", (const char *)propValue, rtype->_name); - xmlFree(propValue); - continue; - } - assert(propValue != NULL); - log_error("unknown function type '%s' for item '%s'\n", (const char *)propValue, rtype->_name); - xmlFree(propValue); - } itype->score = xml_ivalue(node, "score", 0); if (!itype->score) itype->score = default_score(itype); - xmlXPathFreeObject(result); return itype; } @@ -869,10 +849,6 @@ static int parse_resources(xmlDocPtr doc) result = xmlXPathEvalExpression(BAD_CAST "modifier", xpath); rtype->modifiers = xml_readmodifiers(result, node); xmlXPathFreeObject(result); - /* reading eressea/resources/resource/resourcelimit/function */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "resourcelimit/function", xpath); - xmlXPathFreeObject(result); /* reading eressea/resources/resource/item */ xpath->node = node; From e86f3e7589d3f753688e87f2d4bd32b55a85c98f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 21:46:01 +0200 Subject: [PATCH 093/231] read callback fucntions for resources and weapons. --- src/exparse.c | 29 +++++++++++++++++++++++++++++ src/kernel/item.h | 4 ++++ src/xmlreader.c | 4 +--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 0b76aa792..8bee331fc 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -8,6 +8,7 @@ #include "kernel/race.h" #include "kernel/resources.h" +#include "util/functions.h" #include "util/log.h" #include "util/strings.h" @@ -250,7 +251,35 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ handle_item(ud, el, attr); } else if (xml_strcmp(el, "function") == 0) { + const XML_Char *name = NULL; + pf_generic fun = NULL; + int i; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "name") == 0) { + name = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "value") == 0) { + fun = get_function((const char *)attr[i + 1]); + } + else { + handle_bad_input(ud, el, attr[i]); + } + } + assert(rtype); + if (name && fun) { + if (xml_strcmp(name, "change") == 0) { + rtype->uchange = (rtype_uchange)fun; + } + else if (xml_strcmp(name, "name") == 0) { + rtype->name = (rtype_name)fun; + } + else if (xml_strcmp(name, "attack") == 0) { + assert(rtype->wtype); + rtype->wtype->attack = (wtype_attack)fun; + } + } ++ud->errors; /* TODO */ } diff --git a/src/kernel/item.h b/src/kernel/item.h index 802c483a8..f0ee6050b 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -40,6 +40,7 @@ extern "C" { struct gamedata; struct rawmaterial_type; struct resource_mod; + struct weapon_type; typedef struct item { struct item *next; @@ -66,9 +67,12 @@ extern "C" { void item_done(void); + typedef bool(*wtype_attack)(const struct troop *, + const struct weapon_type *, int *); typedef int(*rtype_uchange) (struct unit * user, const struct resource_type * rtype, int delta); typedef char *(*rtype_name) (const struct resource_type * rtype, int flags); + typedef struct resource_type { /* --- constants --- */ char *_name; /* wie es hei�t */ diff --git a/src/xmlreader.c b/src/xmlreader.c index cffbb9a1e..c65a4ca9c 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -654,9 +654,7 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) } assert(propValue != NULL); if (strcmp((const char *)propValue, "attack") == 0) { - wtype->attack = - (bool(*)(const struct troop *, const struct weapon_type *, - int *))fun; + wtype->attack = (wtype_attack)fun; } else { log_error("unknown function type '%s' for item '%s'\n", (const char *)propValue, itype->rtype->_name); From dc891a94b4d44a002af255eebf60fa7c0e1fd4cc Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 10:32:10 +0200 Subject: [PATCH 094/231] armor and weapon are harder to read than other items. modifier handling for weapons seems ok, except races. --- src/exparse.c | 382 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 297 insertions(+), 85 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 8bee331fc..7ceb60728 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -3,7 +3,10 @@ #endif #include "exparse.h" +#include "alchemy.h" + #include "kernel/build.h" +#include "kernel/building.h" #include "kernel/item.h" #include "kernel/race.h" #include "kernel/resources.h" @@ -35,22 +38,23 @@ enum { EXP_UNKNOWN, - EXP_RESOURCES, + EXP_WEAPON, + EXP_ARMOR, EXP_BUILDINGS, EXP_SHIPS, EXP_MESSAGES, EXP_STRINGS, }; -typedef struct userdata { +typedef struct parseinfo { int type; int depth; int errors; XML_Char *cdata; size_t clength; void *object; -} userdata; +} parseinfo; static int xml_strcmp(const XML_Char *xs, const char *cs) { return strcmp(xs, cs); @@ -64,28 +68,28 @@ static bool xml_bool(const XML_Char *val) { } static int xml_int(const XML_Char *val) { - return atoi((const char *)val); + return atoi(val); } static double xml_float(const XML_Char *val) { - return atof((const char *)val); + return atof(val); } static variant xml_fraction(const XML_Char *val) { int num, den = 100; - double fval = atof((const char *)val); + double fval = atof(val); num = (int)(fval * den + 0.5); return frac_make(num, den); } -static void handle_bad_input(userdata *ud, const XML_Char *el, const XML_Char *attr) { +static void handle_bad_input(parseinfo *pi, const XML_Char *el, const XML_Char *attr) { if (attr) { - log_error("unknown attribute in <%s>: %s", (const char *)el, (const char *)attr); + log_error("unknown attribute in <%s>: %s", el, attr); } else { - log_error("unexpected element <%s>", (const char *)el); + log_error("unexpected element <%s>", el); } - ++ud->errors; + ++pi->errors; } static bool handle_flag(int *flags, const XML_Char **pair, const char *names[]) { @@ -104,7 +108,7 @@ static bool handle_flag(int *flags, const XML_Char **pair, const char *names[]) return false; } -static void handle_resource(userdata *ud, const XML_Char *el, const XML_Char **attr) { +static void handle_resource(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "item", "limited", "pooled", NULL }; int i; const char *name = NULL, *appear = NULL; @@ -113,18 +117,18 @@ static void handle_resource(userdata *ud, const XML_Char *el, const XML_Char **a (void)el; for (i = 0; attr[i]; i += 2) { if (xml_strcmp(attr[i], "name") == 0) { - name = (const char *)attr[i + 1]; + name = attr[i + 1]; } else if (xml_strcmp(attr[i], "appearance") == 0) { /* TODO: appearance should be a property of item, not resource */ - appear = (const char *)attr[i + 1]; + appear = attr[i + 1]; flags |= RTF_ITEM; } else if (xml_strcmp(attr[i], "material") == 0) { material = xml_bool(attr[i + 1]); } else if (!handle_flag(&flags, attr + i, flag_names)) { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } if (name) { @@ -138,14 +142,14 @@ static void handle_resource(userdata *ud, const XML_Char *el, const XML_Char **a if (material) { rmt_create(rtype); } - ud->object = rtype; + pi->object = rtype; } } -static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) { +static void handle_item(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "herb", "cursed", "notlost", "big", "animal", "vehicle", "use", NULL }; int i, flags = ITF_NONE; - resource_type *rtype = (resource_type *)ud->object; + resource_type *rtype = (resource_type *)pi->object; item_type * itype = rtype->itype; assert(rtype); if (!itype) { @@ -175,15 +179,15 @@ static void handle_item(userdata *ud, const XML_Char *el, const XML_Char **attr) itype->mask_deny = rc_mask(buffer); } else if (!handle_flag(&flags, attr + i, flag_names)) { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } itype->flags = flags; } -static void handle_armor(userdata *ud, const XML_Char *el, const XML_Char **attr) { +static void handle_armor(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "shield", "laen", NULL }; - resource_type *rtype = (resource_type *)ud->object; + resource_type *rtype = (resource_type *)pi->object; item_type * itype = rtype->itype; armor_type *atype = new_armortype(itype, 0.0, frac_zero, 0, 0); int i, flags = 0; @@ -201,15 +205,15 @@ static void handle_armor(userdata *ud, const XML_Char *el, const XML_Char **attr atype->magres = xml_fraction(attr[i + 1]); } else if (!handle_flag(&flags, attr + i, flag_names)) { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } atype->flags = flags; } -static void handle_weapon(userdata *ud, const XML_Char *el, const XML_Char **attr) { +static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "missile", "magical", "pierce", "cut", "bash", "siege", "armorpiercing", "horse", "useshield", NULL }; - resource_type *rtype = (resource_type *)ud->object; + resource_type *rtype = (resource_type *)pi->object; item_type * itype = rtype->itype; weapon_type *wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, NOSKILL); int i, flags = 0; @@ -230,25 +234,132 @@ static void handle_weapon(userdata *ud, const XML_Char *el, const XML_Char **att wtype->magres = xml_fraction(attr[i + 1]);; } else if (!handle_flag(&flags, attr + i, flag_names)) { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } wtype->flags = flags; } + +static void XMLCALL start_armor(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + resource_type *rtype = (resource_type *)pi->object; + + assert(rtype && rtype->atype); + if (xml_strcmp(el, "modifier") == 0) { + } + handle_bad_input(pi, el, NULL); +} + +#define WMOD_MAX 8 +static weapon_mod wmods[WMOD_MAX]; +static int nwmods; + +static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + resource_type *rtype = (resource_type *)pi->object; + + assert(rtype && rtype->wtype); + if (xml_strcmp(el, "function") == 0) { + ++pi->errors; + } + else if (xml_strcmp(el, "modifier") == 0) { + const XML_Char *type = NULL; + race *rc = NULL; + int i, flags = 0; + int value = 0; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + type = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "value") == 0) { + value = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "race") == 0) { + rc = rc_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "offensive") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_OFFENSIVE; + } + } + else if (xml_strcmp(attr[i], "defensive") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_DEFENSIVE; + } + } + else if (xml_strcmp(attr[i], "walking") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_WALKING; + } + } + else if (xml_strcmp(attr[i], "riding") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_RIDING; + } + } + else if (xml_strcmp(attr[i], "against_riding") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_AGAINST_RIDING; + } + } + else if (xml_strcmp(attr[i], "against_walking") == 0) { + if (xml_bool(attr[i + 1])) { + flags |= WMF_AGAINST_WALKING; + } + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + if (type) { + weapon_mod *mod = wmods + nwmods; + + assert(nwmods < WMOD_MAX); + ++nwmods; + + /* weapon modifiers */ + if (xml_strcmp(type, "missile_target") == 0) { + flags |= WMF_MISSILE_TARGET; + } + else if (xml_strcmp(type, "require") == 0) { + /* does require even work? */ + flags = flags; + } + else if (xml_strcmp(type, "damage") == 0) { + flags |= WMF_DAMAGE; + } + else if (xml_strcmp(type, "skill") == 0) { + flags |= WMF_SKILL; + } + else { + handle_bad_input(pi, el, type); + } + mod->value = value; + mod->flags = flags; + mod->races = NULL; + } + else { + ++pi->errors; + } + } + else { + handle_bad_input(pi, el, NULL); + } +} + #define MAX_REQUIREMENTS 8 static requirement reqs[MAX_REQUIREMENTS]; static int nreqs; -static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_Char **attr) { - resource_type *rtype = (resource_type *)ud->object; +static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resource") == 0) { - handle_resource(ud, el, attr); + handle_resource(pi, el, attr); } else if (rtype) { if (xml_strcmp(el, "item") == 0) { assert(rtype); - handle_item(ud, el, attr); + handle_item(pi, el, attr); } else if (xml_strcmp(el, "function") == 0) { const XML_Char *name = NULL; @@ -260,10 +371,10 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ name = attr[i + 1]; } else if (xml_strcmp(attr[i], "value") == 0) { - fun = get_function((const char *)attr[i + 1]); + fun = get_function(attr[i + 1]); } else { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } @@ -280,8 +391,6 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ rtype->wtype->attack = (wtype_attack)fun; } } - ++ud->errors; - /* TODO */ } else if (rtype->itype) { item_type *itype = rtype->itype; @@ -290,7 +399,7 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ int i; for (i = 0; attr[i]; i += 2) { if (xml_strcmp(attr[i], "skill") == 0) { - con->skill = findskill((const char *)attr[i + 1]); + con->skill = findskill(attr[i + 1]); } else if (xml_strcmp(attr[i], "maxsize") == 0) { con->maxsize = xml_int(attr[i + 1]); @@ -302,12 +411,50 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ con->minskill = xml_int(attr[i + 1]); } else { - handle_bad_input(ud, el, attr[i]); + handle_bad_input(pi, el, attr[i]); } } itype->construction = con; nreqs = 0; } + else if (xml_strcmp(el, "modifier") == 0) { + int i; + double value = 0; + building_type * btype = NULL; + race *rc = NULL; + const XML_Char *type = NULL; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + type = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "building") == 0) { + btype = bt_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "race") == 0) { + rc = rc_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "value") == 0) { + value = xml_float(attr[i + 1]); + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + /* resource modifiers */ + if (xml_strcmp(type, "skill") == 0) { + /* TODO: dupe with weapons! */ + } + else if (xml_strcmp(type, "save") == 0) { + } + else if (xml_strcmp(type, "require") == 0) { + } + else if (xml_strcmp(type, "material") == 0) { + } + else { + handle_bad_input(pi, el, type); + } + } else if (xml_strcmp(el, "requirement") == 0) { requirement *req; int i; @@ -316,11 +463,14 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ req = reqs + nreqs; for (i = 0; attr[i]; i += 2) { if (xml_strcmp(attr[i], "type") == 0) { - req->rtype = rt_get_or_create((const char *)attr[i + 1]); + req->rtype = rt_get_or_create(attr[i + 1]); } else if (xml_strcmp(attr[i], "quantity") == 0) { req->number = xml_int(attr[i + 1]); } + else { + handle_bad_input(pi, el, attr[i]); + } } ++nreqs; } @@ -328,14 +478,24 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ rtype->ltype = new_luxurytype(itype, 0); } else if (xml_strcmp(el, "potion") == 0) { - /* TODO */ - ++ud->errors; + int i, level = 0; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "level") == 0) { + level = xml_int(attr[i + 1]); + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + new_potiontype(itype, level); } else if (xml_strcmp(el, "armor") == 0) { - handle_armor(ud, el, attr); + pi->type = EXP_ARMOR; + handle_armor(pi, el, attr); } else if (xml_strcmp(el, "weapon") == 0) { - handle_weapon(ud, el, attr); + pi->type = EXP_WEAPON; + handle_weapon(pi, el, attr); } else if (rtype->wtype) { weapon_type *wtype = rtype->wtype; @@ -352,71 +512,114 @@ static void XMLCALL start_resources(userdata *ud, const XML_Char *el, const XML_ wtype->damage[pos] = str_strdup(attr[i + 1]); } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char **attr) { - userdata *ud = (userdata *)data; - if (ud->depth == 0) { - ud->type = EXP_UNKNOWN; + parseinfo *pi = (parseinfo *)data; + if (pi->depth == 0) { + pi->type = EXP_UNKNOWN; if (xml_strcmp(el, "eressea") != 0) { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } - else if (ud->depth == 1) { + else if (pi->depth == 1) { if (xml_strcmp(el, "resources") == 0) { - ud->type = EXP_RESOURCES; + pi->type = EXP_RESOURCES; } else if (xml_strcmp(el, "buildings") == 0) { - ud->type = EXP_BUILDINGS; + pi->type = EXP_BUILDINGS; } else if (xml_strcmp(el, "ships") == 0) { - ud->type = EXP_SHIPS; + pi->type = EXP_SHIPS; } else if (xml_strcmp(el, "messages") == 0) { - ud->type = EXP_MESSAGES; + pi->type = EXP_MESSAGES; } else if (xml_strcmp(el, "strings") == 0) { - ud->type = EXP_STRINGS; + pi->type = EXP_STRINGS; } else { - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } else { - switch (ud->type) { + switch (pi->type) { case EXP_RESOURCES: - start_resources(ud, el, attr); + start_resources(pi, el, attr); + break; + case EXP_WEAPON: + start_weapon(pi, el, attr); + break; + case EXP_ARMOR: + start_armor(pi, el, attr); break; default: /* not implemented */ - handle_bad_input(ud, el, NULL); + handle_bad_input(pi, el, NULL); } } - ++ud->depth; + ++pi->depth; } -static void end_resources(userdata *ud, const XML_Char *el) { - resource_type *rtype = (resource_type *)ud->object; - if (xml_strcmp(el, "construction") == 0) { +static void end_armor(parseinfo *pi, const XML_Char *el) { + resource_type *rtype = (resource_type *)pi->object; + assert(rtype && rtype->atype); + + if (xml_strcmp(el, "armor") == 0) { + pi->type = EXP_RESOURCES; + } + else if (xml_strcmp(el, "modifier") == 0) { + } + else { + handle_bad_input(pi, el, NULL); + } +} + +static void end_weapon(parseinfo *pi, const XML_Char *el) { + resource_type *rtype = (resource_type *)pi->object; + assert(rtype && rtype->wtype); + + if (xml_strcmp(el, "weapon") == 0) { + pi->type = EXP_RESOURCES; + } + else if (xml_strcmp(el, "modifier") == 0) { + if (nwmods > 0) { + weapon_type *wtype = rtype->wtype; + wtype->modifiers = calloc(sizeof(weapon_mod), nwmods + 1); + memcpy(wtype->modifiers, wmods, sizeof(weapon_mod) * nwmods); + nwmods = 0; + } + } + else { + handle_bad_input(pi, el, NULL); + } +} + +static void end_resources(parseinfo *pi, const XML_Char *el) { + resource_type *rtype = (resource_type *)pi->object; + if (xml_strcmp(el, "resources") == 0) { + pi->type = EXP_UNKNOWN; + } + else if (xml_strcmp(el, "construction") == 0) { if (nreqs > 0) { construction *con = rtype->itype->construction; con->materials = calloc(sizeof(requirement), nreqs + 1); @@ -427,43 +630,52 @@ static void end_resources(userdata *ud, const XML_Char *el) { } static void XMLCALL handle_end(void *data, const XML_Char *el) { - userdata *ud = (userdata *)data; + parseinfo *pi = (parseinfo *)data; - if (ud->type == EXP_RESOURCES) { - end_resources(ud, el); - } - else { - if (ud->cdata) { - free(ud->cdata); - ud->cdata = NULL; - ud->clength = 0; + switch (pi->type) { + case EXP_RESOURCES: + end_resources(pi, el); + break; + case EXP_ARMOR: + end_armor(pi, el); + break; + case EXP_WEAPON: + end_weapon(pi, el); + break; + default: + if (pi->depth == 1) { + pi->type = EXP_UNKNOWN; + } + if (pi->cdata) { + free(pi->cdata); + pi->cdata = NULL; + pi->clength = 0; } } - --ud->depth; - if (ud->depth == 0) { - ud->type = EXP_UNKNOWN; + --pi->depth; + if (pi->depth == 0) { + assert(pi->type == EXP_UNKNOWN); } } static void XMLCALL handle_data(void *data, const XML_Char *xs, int len) { - userdata *ud = (userdata *)data; + parseinfo *pi = (parseinfo *)data; if (len > 0) { - if (ud->type == EXP_MESSAGES && ud->depth == 4) { + if (pi->type == EXP_MESSAGES && pi->depth == 4) { size_t bytes = (size_t)len; - ud->cdata = realloc(ud->cdata, ud->clength + bytes); - memcpy(ud->cdata + ud->clength, xs, bytes); - ud->clength = ud->clength + bytes; + pi->cdata = realloc(pi->cdata, pi->clength + bytes); + memcpy(pi->cdata + pi->clength, xs, bytes); + pi->clength = pi->clength + bytes; } } } - int exparse_readfile(const char * filename) { XML_Parser xp; FILE *F; int err = 0; char buf[4096]; - userdata ud; + parseinfo pi; F = fopen(filename, "r"); if (!F) { @@ -472,8 +684,8 @@ int exparse_readfile(const char * filename) { xp = XML_ParserCreate("UTF-8"); XML_SetElementHandler(xp, handle_start, handle_end); XML_SetCharacterDataHandler(xp, handle_data); - XML_SetUserData(xp, &ud); - memset(&ud, 0, sizeof(ud)); + XML_SetUserData(xp, &pi); + memset(&pi, 0, sizeof(pi)); for (;;) { size_t len = (int) fread(buf, 1, sizeof(buf), F); int done; @@ -496,11 +708,11 @@ int exparse_readfile(const char * filename) { break; } } - assert(ud.depth == 0); + assert(pi.depth == 0); XML_ParserFree(xp); fclose(F); if (err != 0) { return err; } - return ud.errors; + return pi.errors; } From 3cb1d1a071b99203fc4908e8550baa9b1a4e714f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 13:13:10 +0200 Subject: [PATCH 095/231] simplify race masking for weapon modifiers. --- res/core/weapons/greatbow.xml | 4 +--- res/core/weapons/mallornbow.xml | 4 +--- res/e3a/armor.xml | 4 +--- res/e3a/weapons.xml | 4 +--- res/eressea/items.xml | 4 +--- src/battle.c | 30 +++++++++--------------------- src/kernel/item.c | 11 ----------- src/kernel/item.h | 4 ++-- src/xmlreader.c | 24 ++++++------------------ 9 files changed, 22 insertions(+), 67 deletions(-) diff --git a/res/core/weapons/greatbow.xml b/res/core/weapons/greatbow.xml index b30cae8c6..a63761535 100644 --- a/res/core/weapons/greatbow.xml +++ b/res/core/weapons/greatbow.xml @@ -11,9 +11,7 @@ - - - + diff --git a/res/core/weapons/mallornbow.xml b/res/core/weapons/mallornbow.xml index 9164d2c4b..b50104e36 100644 --- a/res/core/weapons/mallornbow.xml +++ b/res/core/weapons/mallornbow.xml @@ -10,9 +10,7 @@ - - - + diff --git a/res/e3a/armor.xml b/res/e3a/armor.xml index d0d5138ef..160e527d9 100644 --- a/res/e3a/armor.xml +++ b/res/e3a/armor.xml @@ -8,9 +8,7 @@ - - - + diff --git a/res/e3a/weapons.xml b/res/e3a/weapons.xml index 3a75fe350..6f9b5fa5e 100644 --- a/res/e3a/weapons.xml +++ b/res/e3a/weapons.xml @@ -136,9 +136,7 @@ - - - + diff --git a/res/eressea/items.xml b/res/eressea/items.xml index 2cfa9e653..ea6ab047d 100644 --- a/res/eressea/items.xml +++ b/res/eressea/items.xml @@ -10,9 +10,7 @@ - - - + diff --git a/src/battle.c b/src/battle.c index f6a1314ea..fb91a1998 100644 --- a/src/battle.c +++ b/src/battle.c @@ -723,6 +723,7 @@ bool missile) } if (wtype->modifiers != NULL) { /* Pferdebonus, Lanzenbonus, usw. */ + const race *rc = u_race(tu); int m; unsigned int flags = WMF_SKILL | (attacking ? WMF_OFFENSIVE : WMF_DEFENSIVE); @@ -738,17 +739,10 @@ bool missile) for (m = 0; wtype->modifiers[m].value; ++m) { if ((wtype->modifiers[m].flags & flags) == flags) { - race_list *rlist = wtype->modifiers[m].races; - if (rlist != NULL) { - while (rlist) { - if (rlist->data == u_race(tu)) - break; - rlist = rlist->next; - } - if (rlist == NULL) - continue; + int mask = wtype->modifiers[m].race_mask; + if ((mask == 0) || (mask & rc->mask_item)) { + skill += wtype->modifiers[m].value; } - skill += wtype->modifiers[m].value; } } } @@ -1029,17 +1023,10 @@ static int rc_specialdamage(const unit *au, const unit *du, const struct weapon_ for (m = 0; wtype->modifiers[m].value; ++m) { /* weapon damage for this weapon, possibly by race */ if (wtype->modifiers[m].flags & WMF_DAMAGE) { - race_list *rlist = wtype->modifiers[m].races; - if (rlist != NULL) { - while (rlist) { - if (rlist->data == ar) - break; - rlist = rlist->next; - } - if (rlist == NULL) - continue; + int mask = wtype->modifiers[m].race_mask; + if ((mask == 0) || (mask & ar->mask_item)) { + modifier += wtype->modifiers[m].value; } - modifier += wtype->modifiers[m].value; } } } @@ -3272,8 +3259,9 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack) adata->atype = itm->type->rtype->atype; adata->count = itm->number; for (aptr = &fig->armors; *aptr; aptr = &(*aptr)->next) { - if (adata->atype->prot > (*aptr)->atype->prot) + if (adata->atype->prot > (*aptr)->atype->prot) { break; + } } adata->next = *aptr; *aptr = adata; diff --git a/src/kernel/item.c b/src/kernel/item.c index ab6ad8c8d..ad811fefd 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -609,16 +609,6 @@ mod_elves_only(const unit * u, const region * r, skill_t sk, int value) return -118; } -static int -mod_dwarves_only(const unit * u, const region * r, skill_t sk, int value) -{ - UNUSED_ARG(r); - if (u_race(u) == get_race(RC_DWARF) || (u_race(u)->ec_flags & ECF_IRONGOLEM)) { - return value; - } - return -118; -} - void register_item_give(int(*foo) (struct unit *, struct unit *, const struct item_type *, int, struct order *), const char *name) @@ -973,7 +963,6 @@ void register_resources(void) registered = true; register_function((pf_generic)mod_elves_only, "mod_elves_only"); - register_function((pf_generic)mod_dwarves_only, "mod_dwarves_only"); register_function((pf_generic)res_changeitem, "changeitem"); register_function((pf_generic)res_changeperson, "changeperson"); register_function((pf_generic)res_changepeasants, "changepeasants"); diff --git a/src/kernel/item.h b/src/kernel/item.h index e7bfef7cc..e08c95e57 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -147,8 +147,8 @@ extern "C" { struct race_list; typedef struct weapon_mod { int value; - unsigned int flags; - struct race_list *races; + int flags; + int race_mask; } weapon_mod; #define ATF_NONE 0x00 diff --git a/src/xmlreader.c b/src/xmlreader.c index 333e891df..fa81ea11d 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -520,6 +520,8 @@ static armor_type *xml_readarmor(xmlXPathContextPtr xpath, item_type * itype) return atype; } +static void mask_races(xmlNodePtr node, const char *key, int *maskp); + static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) { xmlNodePtr node = xpath->node; @@ -591,8 +593,7 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) wtype->modifiers = calloc(result->nodesetval->nodeNr + 1, sizeof(weapon_mod)); for (k = 0; k != result->nodesetval->nodeNr; ++k) { xmlNodePtr node = result->nodesetval->nodeTab[k]; - xmlXPathObjectPtr races; - int r, flags = 0; + int flags = 0; if (xml_bvalue(node, "walking", false)) flags |= WMF_WALKING; @@ -619,21 +620,8 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) wtype->modifiers[k].flags = flags; wtype->modifiers[k].value = xml_ivalue(node, "value", 0); - xpath->node = node; - races = xmlXPathEvalExpression(BAD_CAST "race", xpath); - for (r = 0; r != races->nodesetval->nodeNr; ++r) { - xmlNodePtr node = races->nodesetval->nodeTab[r]; - - propValue = xmlGetProp(node, BAD_CAST "name"); - if (propValue != NULL) { - const race *rc = rc_find((const char *)propValue); - if (rc == NULL) - rc = rc_get_or_create((const char *)propValue); - racelist_insert(&wtype->modifiers[k].races, rc); - xmlFree(propValue); - } - } - xmlXPathFreeObject(races); + mask_races(node, "races", &wtype->modifiers[k].race_mask); + wtype->modifiers[k].race_mask = 0; } xmlXPathFreeObject(result); @@ -1311,7 +1299,7 @@ static void parse_ai(race * rc, xmlNodePtr node) rc->flags |= RCF_ATTACK_MOVED; } -static void set_study_speed(race *rc, skill_t sk, int modifier){ +static void set_study_speed(race *rc, skill_t sk, int modifier) { if (!rc->study_speed) rc->study_speed = calloc(1, MAXSKILLS); rc->study_speed[sk] = (char)modifier; From ac786e034ca4a8ac38c56fe17b644bac8dbf9e60 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 28 Apr 2018 16:14:32 +0200 Subject: [PATCH 096/231] extract rc_mask, add it to exparse code. --- src/kernel/race.c | 17 +++++++++++++++++ src/kernel/race.h | 2 ++ src/kernel/race.test.c | 15 +++++++++++++++ src/xmlreader.c | 13 +------------ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/kernel/race.c b/src/kernel/race.c index edf415223..c9299d5bd 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -574,3 +574,20 @@ struct race * read_race_reference(struct storage *store) void register_race_function(race_func func, const char *name) { register_function((pf_generic)func, name); } + +static int race_mask = 1; + +int rc_mask(char *list) { + int mask = 0; + char * tok = strtok(list, " ,"); + while (tok) { + race * rc = rc_get_or_create(tok); + if (!rc->mask_item) { + rc->mask_item = race_mask; + race_mask = race_mask << 1; + } + mask |= rc->mask_item; + tok = strtok(NULL, " ,"); + } + return mask; +} diff --git a/src/kernel/race.h b/src/kernel/race.h index 1203eaed2..042cb5e78 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -197,6 +197,8 @@ extern "C" { #define MIGRANTS_NONE 0 #define MIGRANTS_LOG10 1 int rc_migrants_formula(const race *rc); + + int rc_mask(char *list); /* Flags. Do not reorder these without changing json_race() in jsonconf.c */ #define RCF_NPC (1<<0) /* cannot be the race for a player faction (and other limits?) */ diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index dcb4ce6f7..2f34c127e 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -172,6 +173,19 @@ static void test_racename(CuTest *tc) { test_teardown(); } +static void test_rc_mask(CuTest *tc) { + int mask; + char list[64]; + test_setup(); + strcpy(list, "goblin dwarf"); + mask = rc_mask(list); + CuAssertIntEquals(tc, 3, mask); + CuAssertStrEquals(tc, "goblin", list); + mask = rc_mask(list); + CuAssertIntEquals(tc, 1, mask); + test_teardown(); +} + CuSuite *get_race_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -180,6 +194,7 @@ CuSuite *get_race_suite(void) SUITE_ADD_TEST(suite, test_rc_name); SUITE_ADD_TEST(suite, test_rc_defaults); SUITE_ADD_TEST(suite, test_rc_find); + SUITE_ADD_TEST(suite, test_rc_mask); SUITE_ADD_TEST(suite, test_rc_set_param); SUITE_ADD_TEST(suite, test_rc_can_use); SUITE_ADD_TEST(suite, test_racename); diff --git a/src/xmlreader.c b/src/xmlreader.c index fa81ea11d..edbf677ef 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -656,23 +656,12 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) return wtype; } -static int race_mask = 1; - static void mask_races(xmlNodePtr node, const char *key, int *maskp) { xmlChar *propValue = xmlGetProp(node, BAD_CAST key); int mask = 0; assert(maskp); if (propValue) { - char * tok = strtok((char *)propValue, " ,"); - while (tok) { - race * rc = rc_get_or_create(tok); - if (!rc->mask_item) { - rc->mask_item = race_mask; - race_mask = race_mask << 1; - } - mask |= rc->mask_item; - tok = strtok(NULL, " ,"); - } + mask = rc_mask((char *)propValue); xmlFree(propValue); } *maskp = mask; From 837ab325f9aca9aee0b40479c62bb8880cf4a0b3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 13:46:17 +0200 Subject: [PATCH 097/231] XML simplificatio: unified system for masking races on modifiers. --- res/core/resources/iron.xml | 2 +- res/core/resources/stone.xml | 2 +- res/core/weapons/greatbow.xml | 2 +- res/e3a/armor.xml | 6 ++---- res/e3a/weapons.xml | 4 ++-- src/economy.c | 7 ++++--- src/economy.test.c | 12 ++++++------ src/kernel/build.c | 2 +- src/kernel/race.c | 20 +++++++++++++------- src/kernel/race.h | 3 ++- src/kernel/race.test.c | 4 ++-- src/kernel/resources.h | 2 +- src/xmlreader.c | 34 ++++++++++++---------------------- 13 files changed, 48 insertions(+), 52 deletions(-) diff --git a/res/core/resources/iron.xml b/res/core/resources/iron.xml index 38ddb33c8..ae4829dd7 100644 --- a/res/core/resources/iron.xml +++ b/res/core/resources/iron.xml @@ -8,7 +8,7 @@ - + diff --git a/res/core/resources/stone.xml b/res/core/resources/stone.xml index b8f91eadc..459e66074 100644 --- a/res/core/resources/stone.xml +++ b/res/core/resources/stone.xml @@ -7,7 +7,7 @@ - + diff --git a/res/core/weapons/greatbow.xml b/res/core/weapons/greatbow.xml index a63761535..ad6a4e018 100644 --- a/res/core/weapons/greatbow.xml +++ b/res/core/weapons/greatbow.xml @@ -2,7 +2,7 @@ - + diff --git a/res/e3a/armor.xml b/res/e3a/armor.xml index 160e527d9..207f873b2 100644 --- a/res/e3a/armor.xml +++ b/res/e3a/armor.xml @@ -2,8 +2,7 @@ - - + @@ -20,8 +19,7 @@ - - + diff --git a/res/e3a/weapons.xml b/res/e3a/weapons.xml index 6f9b5fa5e..3eea6dc44 100644 --- a/res/e3a/weapons.xml +++ b/res/e3a/weapons.xml @@ -31,7 +31,7 @@ - + @@ -127,7 +127,7 @@ * has a lua canuse function * has lower damage --> - + diff --git a/src/economy.c b/src/economy.c index 18ca23b8e..4cabb4ab5 100644 --- a/src/economy.c +++ b/src/economy.c @@ -833,7 +833,8 @@ static struct message * get_modifiers(unit *u, skill_t sk, const resource_type * for (mod = rtype->modifiers; mod && mod->type != RMT_END; ++mod) { if (mod->btype == NULL || mod->btype == btype) { - if (mod->race == NULL || mod->race == u_race(u)) { + const race * rc = u_race(u); + if (mod->race_mask == 0 || (mod->race_mask & rc->mask_item)) { switch (mod->type) { case RMT_PROD_SAVE: if (savep) { @@ -845,7 +846,7 @@ static struct message * get_modifiers(unit *u, skill_t sk, const resource_type * mod_skill(mod, sk, &skill); break; case RMT_PROD_REQUIRE: - if (mod->race) need_race |= 1; + if (mod->race_mask) need_race |= 1; if (mod->btype) { need_bldg |= 1; } @@ -857,7 +858,7 @@ static struct message * get_modifiers(unit *u, skill_t sk, const resource_type * } } if (mod->type == RMT_PROD_REQUIRE) { - if (mod->race) need_race |= 2; + if (mod->race_mask) need_race |= 2; if (mod->btype) { btype_needed = mod->btype; need_bldg |= 2; diff --git a/src/economy.test.c b/src/economy.test.c index 282318191..3e5d39007 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -509,7 +509,7 @@ static void test_modify_material(CuTest *tc) { mod = rtype->modifiers = calloc(2, sizeof(resource_mod)); mod[0].type = RMT_USE_SAVE; mod[0].value = frac_make(2, 1); - mod[0].race = u_race(u); + mod[0].race_mask = rc_mask(u_race(u)); itype = test_create_itemtype("sword"); make_item(u, itype, 1); @@ -574,7 +574,7 @@ static void test_modify_skill(CuTest *tc) { mod[0].type = RMT_PROD_SKILL; mod[0].value.sa[0] = SK_WEAPONSMITH; mod[0].value.sa[1] = 1; - mod[0].race = u_race(u); + mod[0].race_mask = rc_mask(u_race(u)); set_item(u, rtype->itype, 2); /* 2 iron should get us 2 swords */ make_item(u, itype, 2); @@ -647,7 +647,7 @@ static void test_modify_production(CuTest *tc) { rtype->modifiers = calloc(3, sizeof(resource_mod)); rtype->modifiers[0].type = RMT_PROD_SAVE; - rtype->modifiers[0].race = u->_race; + rtype->modifiers[0].race_mask = rc_mask(u->_race); rtype->modifiers[0].value.sa[0] = (short)(0.5+100*d); rtype->modifiers[0].value.sa[1] = 100; rtype->modifiers[1].type = RMT_END; @@ -668,7 +668,7 @@ static void test_modify_production(CuTest *tc) { CuAssertIntEquals(tc, 280, region_getresource(u->region, rtype)); /* 50% saving = 3 stones make 6 stones */ rtype->modifiers[0].type = RMT_PROD_REQUIRE; - rtype->modifiers[0].race = NULL; + rtype->modifiers[0].race_mask = 0; rtype->modifiers[0].btype = bt_get_or_create("mine"); test_clear_messages(u->faction); @@ -677,7 +677,7 @@ static void test_modify_production(CuTest *tc) { CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "building_needed")); rtype->modifiers[0].type = RMT_PROD_REQUIRE; - rtype->modifiers[0].race = test_create_race("smurf"); + rtype->modifiers[0].race_mask = rc_mask(test_create_race("smurf")); rtype->modifiers[0].btype = NULL; test_clear_messages(u->faction); @@ -686,7 +686,7 @@ static void test_modify_production(CuTest *tc) { CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "error117")); rtype->modifiers[1].type = RMT_PROD_REQUIRE; - rtype->modifiers[1].race = u_race(u); + rtype->modifiers[1].race_mask = rc_mask(u_race(u)); rtype->modifiers[1].btype = NULL; rtype->modifiers[2].type = RMT_END; diff --git a/src/kernel/build.c b/src/kernel/build.c index b2774fbd7..96aee5662 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -419,7 +419,7 @@ static int matmod(const unit * u, const resource_type * rtype, int value) for (mod = rtype->modifiers; mod->type != RMT_END; ++mod) { if (mod->type == RMT_USE_SAVE) { if (!mod->btype || mod->btype == btype) { - if (!mod->race || mod->race == rc) { + if (!mod->race_mask || (mod->race_mask & rc->mask_item)) { save = frac_mul(save, mod->value); } } diff --git a/src/kernel/race.c b/src/kernel/race.c index c9299d5bd..ac81f7f78 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -259,7 +259,10 @@ void racelist_insert(struct race_list **rl, const struct race *r) *rl = rl2; } +static int race_mask = 0; + void free_races(void) { + race_mask = 0; while (races) { int i; race * rc = races->next; @@ -347,6 +350,10 @@ race *rc_create(const char *zName) assert(zName); rc = (race *)calloc(sizeof(race), 1); + + rc->mask_item = 1 << race_mask; + ++race_mask; + rc->magres.sa[1] = 1; rc->hitpoints = 1; rc->weight = PERSON_WEIGHT; @@ -575,18 +582,17 @@ void register_race_function(race_func func, const char *name) { register_function((pf_generic)func, name); } -static int race_mask = 1; +int rc_mask(const race * rc) { + assert(rc->mask_item); + return rc->mask_item; +} -int rc_mask(char *list) { +int rc_get_mask(char *list) { int mask = 0; char * tok = strtok(list, " ,"); while (tok) { race * rc = rc_get_or_create(tok); - if (!rc->mask_item) { - rc->mask_item = race_mask; - race_mask = race_mask << 1; - } - mask |= rc->mask_item; + mask |= rc_mask(rc); tok = strtok(NULL, " ,"); } return mask; diff --git a/src/kernel/race.h b/src/kernel/race.h index 042cb5e78..7c38eec57 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -198,7 +198,8 @@ extern "C" { #define MIGRANTS_LOG10 1 int rc_migrants_formula(const race *rc); - int rc_mask(char *list); + int rc_mask(const race *rc); + int rc_get_mask(char *list); /* Flags. Do not reorder these without changing json_race() in jsonconf.c */ #define RCF_NPC (1<<0) /* cannot be the race for a player faction (and other limits?) */ diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index 2f34c127e..d695969b7 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -178,10 +178,10 @@ static void test_rc_mask(CuTest *tc) { char list[64]; test_setup(); strcpy(list, "goblin dwarf"); - mask = rc_mask(list); + mask = rc_get_mask(list); CuAssertIntEquals(tc, 3, mask); CuAssertStrEquals(tc, "goblin", list); - mask = rc_mask(list); + mask = rc_get_mask(list); CuAssertIntEquals(tc, 1, mask); test_teardown(); } diff --git a/src/kernel/resources.h b/src/kernel/resources.h index 2daa44dd8..8f291c305 100644 --- a/src/kernel/resources.h +++ b/src/kernel/resources.h @@ -50,7 +50,7 @@ extern "C" { resource_modifier_type type; variant value; const struct building_type *btype; - const struct race *race; + int race_mask; } resource_mod; typedef struct rawmaterial_type { diff --git a/src/xmlreader.c b/src/xmlreader.c index edbf677ef..adddb808e 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -61,6 +61,17 @@ without prior permission by the authors of Eressea. #include +static void mask_races(xmlNodePtr node, const char *key, int *maskp) { + xmlChar *propValue = xmlGetProp(node, BAD_CAST key); + int mask = 0; + assert(maskp); + if (propValue) { + mask = rc_get_mask((char *)propValue); + xmlFree(propValue); + } + *maskp = mask; +} + static variant xml_fraction(xmlNodePtr node, const char *name) { xmlChar *propValue = xmlGetProp(node, BAD_CAST name); if (propValue != NULL) { @@ -129,16 +140,8 @@ static resource_mod * xml_readmodifiers(xmlXPathObjectPtr result, xmlNodePtr nod xmlNodePtr node = result->nodesetval->nodeTab[k]; xmlChar *propValue; building_type *btype = NULL; - const race *rc = NULL; - propValue = xmlGetProp(node, BAD_CAST "race"); - if (propValue != NULL) { - rc = rc_find((const char *)propValue); - if (rc == NULL) - rc = rc_get_or_create((const char *)propValue); - xmlFree(propValue); - } - modifiers[k].race = rc; + mask_races(node, "races", &modifiers[k].race_mask); propValue = xmlGetProp(node, BAD_CAST "building"); if (propValue != NULL) { @@ -520,8 +523,6 @@ static armor_type *xml_readarmor(xmlXPathContextPtr xpath, item_type * itype) return atype; } -static void mask_races(xmlNodePtr node, const char *key, int *maskp); - static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) { xmlNodePtr node = xpath->node; @@ -656,17 +657,6 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) return wtype; } -static void mask_races(xmlNodePtr node, const char *key, int *maskp) { - xmlChar *propValue = xmlGetProp(node, BAD_CAST key); - int mask = 0; - assert(maskp); - if (propValue) { - mask = rc_mask((char *)propValue); - xmlFree(propValue); - } - *maskp = mask; -} - static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) { xmlNodePtr node = xpath->node; From c01e9b24ad93fcc017ee46578096bccc3c7f2c85 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 15:09:07 +0200 Subject: [PATCH 098/231] unit tests for racial weapon permissions. --- src/battle.test.c | 49 ++++++++++++++++++++++++++++++++++++++++++ src/kernel/race.test.c | 13 +++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/battle.test.c b/src/battle.test.c index 7d968c091..865fc08c2 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -68,6 +68,54 @@ static void test_make_fighter(CuTest * tc) test_teardown(); } +static void test_select_weapon(CuTest *tc) { + item_type *itype; + weapon_type *wtype; + unit *au; + fighter *af; + battle *b; + race * rc; + + test_setup(); + au = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + itype = test_create_itemtype("halberd"); + wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, SK_MELEE); + i_change(&au->items, itype, 1); + rc = test_create_race("smurf"); + CuAssertIntEquals(tc, 0, rc->mask_item & au->_race->mask_item); + + b = make_battle(au->region); + af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); + CuAssertPtrNotNull(tc, af->weapons); + CuAssertIntEquals(tc, 1, af->weapons[0].count); + free_battle(b); + + itype->mask_deny = rc_mask(au->_race); + b = make_battle(au->region); + af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); + CuAssertPtrNotNull(tc, af->weapons); + CuAssertIntEquals(tc, 0, af->weapons[0].count); + free_battle(b); + + itype->mask_deny = 0; + itype->mask_allow = rc_mask(rc); + b = make_battle(au->region); + af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); + CuAssertPtrNotNull(tc, af->weapons); + CuAssertIntEquals(tc, 0, af->weapons[0].count); + free_battle(b); + + itype->mask_deny = 0; + itype->mask_allow = rc_mask(au->_race); + b = make_battle(au->region); + af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); + CuAssertPtrNotNull(tc, af->weapons); + CuAssertIntEquals(tc, 1, af->weapons[0].count); + free_battle(b); + + test_teardown(); +} + static building_type * setup_castle(void) { building_type * btype; construction *cons; @@ -583,6 +631,7 @@ CuSuite *get_battle_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_make_fighter); + SUITE_ADD_TEST(suite, test_select_weapon); SUITE_ADD_TEST(suite, test_battle_skilldiff); SUITE_ADD_TEST(suite, test_battle_skilldiff_building); SUITE_ADD_TEST(suite, test_defenders_get_building_bonus); diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index d695969b7..dcbe26e0e 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -26,6 +26,18 @@ static void test_rc_name(CuTest *tc) { test_teardown(); } +static void test_rc_item_mask(CuTest *tc) { + struct race *rc; + test_setup(); + rc = rc_get_or_create("hooman"); + CuAssertIntEquals(tc, 1, rc->mask_item); + rc = rc_get_or_create("aelf"); + CuAssertIntEquals(tc, 2, rc->mask_item); + rc = rc_get_or_create("dorf"); + CuAssertIntEquals(tc, 4, rc->mask_item); + test_teardown(); +} + static void test_rc_defaults(CuTest *tc) { struct race *rc; test_setup(); @@ -193,6 +205,7 @@ CuSuite *get_race_suite(void) SUITE_ADD_TEST(suite, test_old_race); SUITE_ADD_TEST(suite, test_rc_name); SUITE_ADD_TEST(suite, test_rc_defaults); + SUITE_ADD_TEST(suite, test_rc_item_mask); SUITE_ADD_TEST(suite, test_rc_find); SUITE_ADD_TEST(suite, test_rc_mask); SUITE_ADD_TEST(suite, test_rc_set_param); From f6735049d8b14e559f172757a34169a5b82d543d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 15:24:36 +0200 Subject: [PATCH 099/231] add a few tests for fighters equipping the right weapons and armor. --- src/battle.h | 2 +- src/battle.test.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/battle.h b/src/battle.h index fd31a0284..f2dd1fea3 100644 --- a/src/battle.h +++ b/src/battle.h @@ -143,7 +143,7 @@ extern "C" { } troop; typedef struct armor { - struct armor *next; + struct armor *next; /* TODO: make this an array, not a list, like weapon */ const struct armor_type *atype; int count; } armor; diff --git a/src/battle.test.c b/src/battle.test.c index 865fc08c2..69fac2425 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -68,7 +68,7 @@ static void test_make_fighter(CuTest * tc) test_teardown(); } -static void test_select_weapon(CuTest *tc) { +static void test_select_weapon_restricted(CuTest *tc) { item_type *itype; weapon_type *wtype; unit *au; @@ -88,6 +88,7 @@ static void test_select_weapon(CuTest *tc) { af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); CuAssertPtrNotNull(tc, af->weapons); CuAssertIntEquals(tc, 1, af->weapons[0].count); + CuAssertIntEquals(tc, 0, af->weapons[1].count); free_battle(b); itype->mask_deny = rc_mask(au->_race); @@ -111,6 +112,35 @@ static void test_select_weapon(CuTest *tc) { af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); CuAssertPtrNotNull(tc, af->weapons); CuAssertIntEquals(tc, 1, af->weapons[0].count); + CuAssertIntEquals(tc, 0, af->weapons[1].count); + free_battle(b); + + test_teardown(); +} + +static void test_select_armor(CuTest *tc) { + item_type *itype, *iscale; + unit *au; + fighter *af; + battle *b; + + test_setup(); + au = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + itype = test_create_itemtype("plate"); + new_armortype(itype, 0.0, frac_zero, 1, 0); + i_change(&au->items, itype, 2); + iscale = test_create_itemtype("scale"); + new_armortype(iscale, 0.0, frac_zero, 2, 0); + i_change(&au->items, iscale, 1); + + b = make_battle(au->region); + af = make_fighter(b, au, make_side(b, au->faction, 0, 0, 0), false); + CuAssertPtrNotNull(tc, af->armors); + CuAssertIntEquals(tc, 1, af->armors->count); + CuAssertPtrEquals(tc, iscale->rtype->atype, (armor_type *)af->armors->atype); + CuAssertIntEquals(tc, 2, af->armors->next->count); + CuAssertPtrEquals(tc, itype->rtype->atype, (armor_type *)af->armors->next->atype); + CuAssertPtrEquals(tc, NULL, af->armors->next->next); free_battle(b); test_teardown(); @@ -631,7 +661,8 @@ CuSuite *get_battle_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_make_fighter); - SUITE_ADD_TEST(suite, test_select_weapon); + SUITE_ADD_TEST(suite, test_select_weapon_restricted); + SUITE_ADD_TEST(suite, test_select_armor); SUITE_ADD_TEST(suite, test_battle_skilldiff); SUITE_ADD_TEST(suite, test_battle_skilldiff_building); SUITE_ADD_TEST(suite, test_defenders_get_building_bonus); From 10884c825ed2c74f19168d1007f6b55f44001a70 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 16:11:35 +0200 Subject: [PATCH 100/231] fix compile, invalid use of rc_mask. --- src/exparse.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 7ceb60728..fba7188e1 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -170,13 +170,13 @@ static void handle_item(parseinfo *pi, const XML_Char *el, const XML_Char **attr size_t len = strlen(attr[i + 1]); assert(len < sizeof(buffer)); memcpy(buffer, attr[i + 1], len + 1); - itype->mask_allow = rc_mask(buffer); + itype->mask_allow = rc_get_mask(buffer); } else if (xml_strcmp(attr[i], "deny") == 0) { size_t len = strlen(attr[i + 1]); assert(len < sizeof(buffer)); memcpy(buffer, attr[i + 1], len + 1); - itype->mask_deny = rc_mask(buffer); + itype->mask_deny = rc_get_mask(buffer); } else if (!handle_flag(&flags, attr + i, flag_names)) { handle_bad_input(pi, el, attr[i]); @@ -263,8 +263,7 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch } else if (xml_strcmp(el, "modifier") == 0) { const XML_Char *type = NULL; - race *rc = NULL; - int i, flags = 0; + int i, flags = 0, race_mask = 0; int value = 0; for (i = 0; attr[i]; i += 2) { @@ -274,8 +273,10 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch else if (xml_strcmp(attr[i], "value") == 0) { value = xml_int(attr[i + 1]); } - else if (xml_strcmp(attr[i], "race") == 0) { - rc = rc_get_or_create(attr[i + 1]); + else if (xml_strcmp(type, "races") == 0) { + char list[64]; + strcpy(list, attr[i + 1]); + race_mask = rc_get_mask(list); } else if (xml_strcmp(attr[i], "offensive") == 0) { if (xml_bool(attr[i + 1])) { @@ -336,7 +337,7 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch } mod->value = value; mod->flags = flags; - mod->races = NULL; + mod->race_mask = race_mask; } else { ++pi->errors; From ec9038a5ea45c2bdb04f4fd504ec14913dbc2946 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 17:27:12 +0200 Subject: [PATCH 101/231] fix copy/paste errors, remove armor element handlers. --- src/exparse.c | 72 +++++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 45 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index fba7188e1..f76959e5d 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -40,7 +40,6 @@ enum { EXP_UNKNOWN, EXP_RESOURCES, EXP_WEAPON, - EXP_ARMOR, EXP_BUILDINGS, EXP_SHIPS, EXP_MESSAGES, @@ -241,15 +240,6 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at } -static void XMLCALL start_armor(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { - resource_type *rtype = (resource_type *)pi->object; - - assert(rtype && rtype->atype); - if (xml_strcmp(el, "modifier") == 0) { - } - handle_bad_input(pi, el, NULL); -} - #define WMOD_MAX 8 static weapon_mod wmods[WMOD_MAX]; static int nwmods; @@ -273,7 +263,7 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch else if (xml_strcmp(attr[i], "value") == 0) { value = xml_int(attr[i + 1]); } - else if (xml_strcmp(type, "races") == 0) { + else if (xml_strcmp(attr[i], "races") == 0) { char list[64]; strcpy(list, attr[i + 1]); race_mask = rc_get_mask(list); @@ -352,6 +342,10 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch static requirement reqs[MAX_REQUIREMENTS]; static int nreqs; +#define RMOD_MAX 8 +static resource_mod rmods[RMOD_MAX]; +static int nrmods; + static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resource") == 0) { @@ -420,37 +414,41 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML } else if (xml_strcmp(el, "modifier") == 0) { int i; - double value = 0; - building_type * btype = NULL; - race *rc = NULL; const XML_Char *type = NULL; + resource_mod * mod = rmods + nrmods; + assert(nrmods < RMOD_MAX); + ++nrmods; for (i = 0; attr[i]; i += 2) { if (xml_strcmp(attr[i], "type") == 0) { type = attr[i + 1]; } else if (xml_strcmp(attr[i], "building") == 0) { - btype = bt_get_or_create(attr[i + 1]); + mod->btype = bt_get_or_create(attr[i + 1]); } - else if (xml_strcmp(attr[i], "race") == 0) { - rc = rc_get_or_create(attr[i + 1]); + else if (xml_strcmp(attr[i], "races") == 0) { + char list[64]; + strcpy(list, attr[i + 1]); + mod->race_mask = rc_get_mask(list); } else if (xml_strcmp(attr[i], "value") == 0) { - value = xml_float(attr[i + 1]); + mod->value = xml_fraction(attr[i + 1]); } else { handle_bad_input(pi, el, attr[i]); } } - /* resource modifiers */ if (xml_strcmp(type, "skill") == 0) { - /* TODO: dupe with weapons! */ - } - else if (xml_strcmp(type, "save") == 0) { - } - else if (xml_strcmp(type, "require") == 0) { + mod->type = RMT_PROD_SKILL; } else if (xml_strcmp(type, "material") == 0) { + mod->type = RMT_PROD_SAVE; + } + else if (xml_strcmp(type, "require") == 0) { + mod->type = RMT_PROD_REQUIRE; + } + else if (xml_strcmp(type, "save") == 0) { + mod->type = RMT_USE_SAVE; } else { handle_bad_input(pi, el, type); @@ -491,7 +489,6 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML new_potiontype(itype, level); } else if (xml_strcmp(el, "armor") == 0) { - pi->type = EXP_ARMOR; handle_armor(pi, el, attr); } else if (xml_strcmp(el, "weapon") == 0) { @@ -570,9 +567,6 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_WEAPON: start_weapon(pi, el, attr); break; - case EXP_ARMOR: - start_armor(pi, el, attr); - break; default: /* not implemented */ handle_bad_input(pi, el, NULL); @@ -581,20 +575,6 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char ++pi->depth; } -static void end_armor(parseinfo *pi, const XML_Char *el) { - resource_type *rtype = (resource_type *)pi->object; - assert(rtype && rtype->atype); - - if (xml_strcmp(el, "armor") == 0) { - pi->type = EXP_RESOURCES; - } - else if (xml_strcmp(el, "modifier") == 0) { - } - else { - handle_bad_input(pi, el, NULL); - } -} - static void end_weapon(parseinfo *pi, const XML_Char *el) { resource_type *rtype = (resource_type *)pi->object; assert(rtype && rtype->wtype); @@ -618,6 +598,11 @@ static void end_weapon(parseinfo *pi, const XML_Char *el) { static void end_resources(parseinfo *pi, const XML_Char *el) { resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resources") == 0) { + if (nrmods > 0) { + rtype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); + memcpy(rtype->modifiers, rmods, sizeof(resource_mod) * nrmods); + nrmods = 0; + } pi->type = EXP_UNKNOWN; } else if (xml_strcmp(el, "construction") == 0) { @@ -637,9 +622,6 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { case EXP_RESOURCES: end_resources(pi, el); break; - case EXP_ARMOR: - end_armor(pi, el); - break; case EXP_WEAPON: end_weapon(pi, el); break; From 177e0159c4b9f69d6b66baf29a8357a8f781a6bf Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 18:23:23 +0200 Subject: [PATCH 102/231] init construction defaults. --- src/exparse.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index f76959e5d..a0daf41f8 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -392,6 +392,9 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML if (xml_strcmp(el, "construction") == 0) { construction *con = calloc(sizeof(construction), 1); int i; + con->maxsize = -1; + con->minskill = -1; + con->reqsize = 1; for (i = 0; attr[i]; i += 2) { if (xml_strcmp(attr[i], "skill") == 0) { con->skill = findskill(attr[i + 1]); From 12416e8b0d616d241461fe6c840e56245e802b74 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 18:44:17 +0200 Subject: [PATCH 103/231] fix reading skill modifiers. --- src/exparse.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index a0daf41f8..5db7f6b29 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -417,8 +417,10 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML } else if (xml_strcmp(el, "modifier") == 0) { int i; + skill_t sk = NOSKILL; const XML_Char *type = NULL; resource_mod * mod = rmods + nrmods; + const XML_Char *value = NULL; assert(nrmods < RMOD_MAX); ++nrmods; @@ -429,13 +431,16 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML else if (xml_strcmp(attr[i], "building") == 0) { mod->btype = bt_get_or_create(attr[i + 1]); } + else if (xml_strcmp(attr[i], "skill") == 0) { + sk = findskill(attr[i + 1]); + } else if (xml_strcmp(attr[i], "races") == 0) { char list[64]; strcpy(list, attr[i + 1]); mod->race_mask = rc_get_mask(list); } else if (xml_strcmp(attr[i], "value") == 0) { - mod->value = xml_fraction(attr[i + 1]); + value = attr[i + 1]; } else { handle_bad_input(pi, el, attr[i]); @@ -443,15 +448,19 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML } if (xml_strcmp(type, "skill") == 0) { mod->type = RMT_PROD_SKILL; - } - else if (xml_strcmp(type, "material") == 0) { - mod->type = RMT_PROD_SAVE; + mod->value.sa[0] = (short)sk; + mod->value.sa[1] = (short)xml_int(value); } else if (xml_strcmp(type, "require") == 0) { mod->type = RMT_PROD_REQUIRE; } + else if (xml_strcmp(type, "material") == 0) { + mod->type = RMT_PROD_SAVE; + mod->value = xml_fraction(value); + } else if (xml_strcmp(type, "save") == 0) { mod->type = RMT_USE_SAVE; + mod->value = xml_fraction(value); } else { handle_bad_input(pi, el, type); @@ -601,12 +610,14 @@ static void end_weapon(parseinfo *pi, const XML_Char *el) { static void end_resources(parseinfo *pi, const XML_Char *el) { resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resources") == 0) { + pi->type = EXP_UNKNOWN; + } + else if (xml_strcmp(el, "resource") == 0) { if (nrmods > 0) { rtype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); memcpy(rtype->modifiers, rmods, sizeof(resource_mod) * nrmods); nrmods = 0; } - pi->type = EXP_UNKNOWN; } else if (xml_strcmp(el, "construction") == 0) { if (nreqs > 0) { From 2579bf71b520baf4e843645592638dd18b3401f9 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 19:33:39 +0200 Subject: [PATCH 104/231] fix test_troll_quarrying_bonus --- src/exparse.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index 5db7f6b29..7a337b023 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -422,6 +422,8 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML resource_mod * mod = rmods + nrmods; const XML_Char *value = NULL; + mod->race_mask = 0; + mod->btype = NULL; assert(nrmods < RMOD_MAX); ++nrmods; for (i = 0; attr[i]; i += 2) { From a8f6f1a40c690c989a3f852e110fca4d46f17498 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 29 Apr 2018 20:23:41 +0200 Subject: [PATCH 105/231] there is no require element for weapons. oops. --- src/exparse.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 7a337b023..c98d28d6e 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -312,10 +312,6 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch if (xml_strcmp(type, "missile_target") == 0) { flags |= WMF_MISSILE_TARGET; } - else if (xml_strcmp(type, "require") == 0) { - /* does require even work? */ - flags = flags; - } else if (xml_strcmp(type, "damage") == 0) { flags |= WMF_DAMAGE; } From 6b38fdf4e6c91d5c89e2ea47337aa8d1c1e65af5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 30 Apr 2018 20:25:58 +0200 Subject: [PATCH 106/231] fix build --- src/battle.test.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/battle.test.c b/src/battle.test.c index 69fac2425..d55ddd4a7 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -70,7 +70,6 @@ static void test_make_fighter(CuTest * tc) static void test_select_weapon_restricted(CuTest *tc) { item_type *itype; - weapon_type *wtype; unit *au; fighter *af; battle *b; @@ -79,7 +78,7 @@ static void test_select_weapon_restricted(CuTest *tc) { test_setup(); au = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); itype = test_create_itemtype("halberd"); - wtype = new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, SK_MELEE); + new_weapontype(itype, 0, frac_zero, NULL, 0, 0, 0, SK_MELEE); i_change(&au->items, itype, 1); rc = test_create_race("smurf"); CuAssertIntEquals(tc, 0, rc->mask_item & au->_race->mask_item); From 22734a4ae41c6eb894115c78e0c3ac3d76a6b352 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 30 Apr 2018 22:52:38 +0200 Subject: [PATCH 107/231] refactor building stages into build_stages(). TODO: remove them from build(). --- src/kernel/build.c | 101 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/src/kernel/build.c b/src/kernel/build.c index 96aee5662..c36c21a7f 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -679,7 +679,69 @@ int maxbuild(const unit * u, const construction * cons) return maximum; } -/** old build routines */ +static int build_failure(unit *u, order *ord, const building_type *btype, int want, int err) { + switch (err) { + case ECOMPLETE: + /* the building is already complete */ + cmistake(u, ord, 4, MSG_PRODUCE); + break; + case ENOMATERIALS: + ADDMSG(&u->faction->msgs, msg_materials_required(u, ord, + btype->construction, want)); + break; + case ELOWSKILL: + case ENEEDSKILL: + /* no skill, or not enough skill points to build */ + cmistake(u, ord, 50, MSG_PRODUCE); + break; + } + return err; +} + +int build_stages(unit *u, construction * con, int built, int n) { + int made = 0; + while (con) { + if (con->maxsize < 0 || con->maxsize > built) { + int err, want = INT_MAX; + if (n < INT_MAX) { + /* do not build more than n total */ + want = n - made; + } + if (con->maxsize > 0) { + /* do not build more than the rest of the stage */ + int todo = con->maxsize - built; + if (todo < want) { + want = todo; + } + } + err = build(u, con, built, want, 0); + if (err < 0) { + if (made == 0) { + /* could not make any part at all */ + return err; + } + else { + /* could not build any part of this stage (low skill, etc). */ + break; + } + } + else { + /* err is the amount we built of this stage */ + made += err; + if (err != con->maxsize && con->maxsize > 0) { + /* we did not finish the stage, can quit here */ + break; + } + } + } + /* build the next stage: */ + if (built >= con->maxsize && con->maxsize > 0) { + built -= con->maxsize; + } + con = con->improvement; + } + return made; +} int build_building(unit * u, const building_type * btype, int id, int want, order * ord) @@ -783,30 +845,19 @@ build_building(unit * u, const building_type * btype, int id, int want, order * } } } - built = build(u, btype->construction, built, n, 0); - switch (built) { - case ECOMPLETE: - /* the building is already complete */ - cmistake(u, ord, 4, MSG_PRODUCE); - break; - case ENOMATERIALS: - ADDMSG(&u->faction->msgs, msg_materials_required(u, ord, - btype->construction, want)); - break; - case ELOWSKILL: - case ENEEDSKILL: - /* no skill, or not enough skill points to build */ - cmistake(u, ord, 50, MSG_PRODUCE); - break; + built = build_stages(u, btype->construction, built, n); + + if (built < 0) { + return build_failure(u, ord, btype, want, built); } - if (built <= 0) { - return built; - } - /* at this point, the building size is increased. */ - if (b == NULL) { + + if (b) { + b->size += built; + } else { /* build a new building */ b = new_building(btype, r, lang); + b->size = built; b->type = btype; fset(b, BLD_MAINTAINED); @@ -818,7 +869,7 @@ build_building(unit * u, const building_type * btype, int id, int want, order * btname = LOC(lang, btype->_name); - if (want - built <= 0) { + if (want <= built) { /* geb�ude fertig */ new_order = default_order(lang); } @@ -850,7 +901,9 @@ build_building(unit * u, const building_type * btype, int id, int want, order * free_order(new_order); } - b->size += built; + ADDMSG(&u->faction->msgs, msg_message("buildbuilding", + "building unit size", b, u, built)); + if (b->type->maxsize > 0 && b->size > b->type->maxsize) { log_error("build: %s has size=%d, maxsize=%d", buildingname(b), b->size, b->type->maxsize); } @@ -858,8 +911,6 @@ build_building(unit * u, const building_type * btype, int id, int want, order * update_lighthouse(b); - ADDMSG(&u->faction->msgs, msg_message("buildbuilding", - "building unit size", b, u, built)); return built; } From e0e873044de40411716f51b8e8c90ef69b867350 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 30 Apr 2018 23:11:13 +0200 Subject: [PATCH 108/231] fix stone golems (assert). remove improvement logic from build(). --- scripts/tests/e2/e2features.lua | 6 +++--- src/kernel/build.c | 24 ++++-------------------- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index d9a7da4f8..0e8e3a24d 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -339,11 +339,11 @@ function test_stonegolems() u1:set_skill("building", 1) u2:set_skill("building", 1) --- test that no server crash occur +-- test that no server crash occurs u1:clear_orders() u1:add_order("Mache Burg") process_orders() - assert_equal(0 ,u1.number, "There shoud be no Stone Golems") + assert_equal(0, u1.number, "There should be no more stone golems") -- end test server crash -- test that Stone Golems build for four stones @@ -351,7 +351,7 @@ function test_stonegolems() u2:add_order("MACHE 4 BURG " .. itoa36(c1.id)) process_orders() assert_equal(230, c1.size, "resulting size should be 230") - assert_equal(1 ,u2.number, "There shoud be one Stone Golems") + assert_equal(1, u2.number, "There should be one stone golem") -- end test Stone Golems four stones end diff --git a/src/kernel/build.c b/src/kernel/build.c index c36c21a7f..e2f4f9503 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -512,15 +512,16 @@ int build(unit * u, const construction * ctype, int completed, int want, int ski if (want <= 0) return 0; - if (con == NULL) + if (con == NULL) { return ENOMATERIALS; - if (con->improvement == NULL && completed == con->maxsize) + } + if (completed == con->maxsize) { return ECOMPLETE; + } if (con->skill != NOSKILL) { int effsk; int dm = get_effect(u, oldpotiontype[P_DOMORE]); - assert(u->number); basesk = effskill(u, con->skill, 0); if (basesk == 0) return ENEEDSKILL; @@ -544,23 +545,6 @@ int build(unit * u, const construction * ctype, int completed, int want, int ski for (; want > 0 && skills > 0;) { int err, n; - /* skip over everything that's already been done: - * type->improvement==NULL means no more improvements, but no size limits - * type->improvement==type means build another object of the same time - * while material lasts type->improvement==x means build x when type - * is finished */ - while (con && con->improvement && - con->improvement != con && - con->maxsize > 0 && con->maxsize <= completed) { - completed -= con->maxsize; - con = con->improvement; - } - if (con == NULL) { - if (made == 0) - return ECOMPLETE; - break; /* completed */ - } - /* Hier ist entweder maxsize == -1, oder completed < maxsize. * Andernfalls ist das Datenfile oder sonstwas kaputt... * (enno): Nein, das ist f�r Dinge, bei denen die n�chste Ausbaustufe From e0cae602dd0fe032ded0e8722adbff6d019b8895 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 30 Apr 2018 23:17:48 +0200 Subject: [PATCH 109/231] add a test for building items. --- scripts/tests/e2/e2features.lua | 2 -- scripts/tests/e2/production.lua | 16 ++++++++++++++++ src/kernel/build.c | 4 +--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 0e8e3a24d..8fea1641a 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -284,8 +284,6 @@ function test_block_movement() end end - - function test_block_movement_aots() eressea.settings.set("rules.guard.base_stop_prob", "0.0") eressea.settings.set("rules.guard.skill_stop_prob", "1.0") diff --git a/scripts/tests/e2/production.lua b/scripts/tests/e2/production.lua index 5eae8ec74..5070d02f6 100644 --- a/scripts/tests/e2/production.lua +++ b/scripts/tests/e2/production.lua @@ -12,6 +12,22 @@ local function create_faction(race) return faction.create(race, race .. '@example.com', "de") end +function test_produce_multi() + local r = region.create(0, 0, 'mountain') + local f = create_faction('human') + local u = unit.create(f, r, 1) + -- sword needs skill=3, iron=1 + u:set_skill('weaponsmithing', 15) + u:add_item('iron', 5) + + turn_begin() + u:add_order("MACHE 6 Schwert") + + turn_process() + assert_equal(5, u:get_item('sword')) + assert_equal(0, u:get_item('iron')) +end + function test_greatbow_needs_elf() -- only elves can build a greatbow local r = region.create(0, 0, 'mountain') diff --git a/src/kernel/build.c b/src/kernel/build.c index e2f4f9503..ab2828873 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -589,9 +589,7 @@ int build(unit * u, const construction * ctype, int completed, int want, int ski if (con->maxsize > 0) { int req = con->maxsize - completed; if (req < n) n = req; - if (con->improvement == NULL) { - want = n; - } + want = n; } n = count_materials(u, con, n, completed); From b44e4e747d549a613c0206f042b4d30ff59b1164 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 30 Apr 2018 23:23:48 +0200 Subject: [PATCH 110/231] ships and items never have multi-stage builds. we are going to make sure of this soon. --- src/kernel/build.c | 1 - src/kernel/ship.c | 5 ----- src/move.c | 2 -- src/report.c | 1 - 4 files changed, 9 deletions(-) diff --git a/src/kernel/build.c b/src/kernel/build.c index ab2828873..bb6420717 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -642,7 +642,6 @@ message *msg_materials_required(unit * u, order * ord, int maxbuild(const unit * u, const construction * cons) /* calculate maximum size that can be built from available material */ -/* !! ignores maximum objectsize and improvements... */ { int c; int maximum = INT_MAX; diff --git a/src/kernel/ship.c b/src/kernel/ship.c index 8b38f1375..3f4c099ac 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -328,7 +328,6 @@ int shipspeed(const ship * sh, const unit * u) assert(u->ship == sh); assert(u == ship_owner(sh)); assert(sh->type->construction); - assert(sh->type->construction->improvement == NULL); /* sonst ist construction::size nicht ship_type::maxsize */ k = sh->type->range; if (sh->size != sh->type->construction->maxsize) @@ -396,10 +395,6 @@ int shipcapacity(const ship * sh) { int i = sh->type->cargo; - /* sonst ist construction:: size nicht ship_type::maxsize */ - assert(!sh->type->construction - || sh->type->construction->improvement == NULL); - if (sh->type->construction && sh->size != sh->type->construction->maxsize) return 0; diff --git a/src/move.c b/src/move.c index bb6b9d212..3f940c78a 100644 --- a/src/move.c +++ b/src/move.c @@ -847,7 +847,6 @@ static void drifting_ships(region * r) /* Kapitän da? Beschädigt? Genügend Matrosen? * Genügend leicht? Dann ist alles OK. */ - assert(sh->type->construction->improvement == NULL); /* sonst ist construction::size nicht ship_type::maxsize */ if (captain && sh->size == sh->type->construction->maxsize && enoughsailors(sh, crew_skill(sh)) && cansail(r, sh)) { shp = &sh->next; @@ -1669,7 +1668,6 @@ static bool ship_ready(const region * r, unit * u, order * ord) return false; } if (u->ship->type->construction) { - assert(!u->ship->type->construction->improvement); /* sonst ist construction::size nicht ship_type::maxsize */ if (u->ship->size != u->ship->type->construction->maxsize) { cmistake(u, ord, 15, MSG_MOVE); return false; diff --git a/src/report.c b/src/report.c index 319203e3b..c0b84f181 100644 --- a/src/report.c +++ b/src/report.c @@ -1803,7 +1803,6 @@ nr_ship(struct stream *out, const region *r, const ship * sh, const faction * f, if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - assert(sh->type->construction->improvement == NULL); /* sonst ist construction::size nicht ship_type::maxsize */ if (sh->size != sh->type->construction->maxsize) { bytes = snprintf(bufp, size, ", %s (%d/%d)", LOC(f->locale, "nr_undercons"), sh->size, From c7ae070fa78f72d9f12dce4847719a81021171f5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 07:02:55 +0200 Subject: [PATCH 111/231] nobody needs the construct_t enum. --- src/kernel/build.h | 7 ------- src/xmlreader.c | 13 ++++++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/kernel/build.h b/src/kernel/build.h index c201d900b..5f93884cd 100644 --- a/src/kernel/build.h +++ b/src/kernel/build.h @@ -37,14 +37,7 @@ extern "C" { int number; } requirement; - typedef enum construct_t { - CONS_OTHER, - CONS_ITEM, - CONS_BUILDING - } construct_t; - typedef struct construction { - construct_t type; skill_t skill; /* skill req'd per point of size */ int minskill; /* skill req'd per point of size */ diff --git a/src/xmlreader.c b/src/xmlreader.c index adddb808e..03f016986 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -214,9 +214,9 @@ xml_readrequirements(xmlNodePtr * nodeTab, int nodeNr, requirement ** reqArray) } } -void +static void xml_readconstruction(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, -construction ** consPtr, construct_t type) +construction ** consPtr, bool is_building) { xmlNodePtr pushNode = xpath->node; int k; @@ -243,13 +243,12 @@ construction ** consPtr, construct_t type) *consPtr = con = (construction *)calloc(sizeof(construction), 1); consPtr = &con->improvement; - con->type = type; con->skill = sk; con->maxsize = xml_ivalue(node, "maxsize", -1); con->minskill = xml_ivalue(node, "minskill", -1); con->reqsize = xml_ivalue(node, "reqsize", 1); - if (type == CONS_BUILDING) { + if (is_building) { propValue = xmlGetProp(node, BAD_CAST "name"); if (propValue != NULL) { con->name = str_strdup((const char *)propValue); @@ -342,7 +341,7 @@ static int parse_buildings(xmlDocPtr doc) /* reading eressea/buildings/building/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &btype->construction, CONS_BUILDING); + xml_readconstruction(xpath, result->nodesetval, &btype->construction, true); xmlXPathFreeObject(result); /* reading eressea/buildings/building/function */ @@ -442,7 +441,7 @@ static int parse_ships(xmlDocPtr doc) /* reading eressea/ships/ship/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &st->construction, CONS_OTHER); + xml_readconstruction(xpath, result->nodesetval, &st->construction, false); xmlXPathFreeObject(result); for (child = node->children; child; child = child->next) { @@ -688,7 +687,7 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) /* reading item/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &itype->construction, CONS_ITEM); + xml_readconstruction(xpath, result->nodesetval, &itype->construction, false); xmlXPathFreeObject(result); /* reading item/weapon */ From bddf4bff39512830c9670ebee941ccc6c9ba3844 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 10:47:17 +0200 Subject: [PATCH 112/231] unnecessary xpath wrangling --- src/xmlreader.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 03f016986..348146d51 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -216,9 +216,8 @@ xml_readrequirements(xmlNodePtr * nodeTab, int nodeNr, requirement ** reqArray) static void xml_readconstruction(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, -construction ** consPtr, bool is_building) + construction **consPtr, bool is_building) { - xmlNodePtr pushNode = xpath->node; int k; for (k = 0; k != nodeSet->nodeNr; ++k) { xmlNodePtr node = nodeSet->nodeTab[k]; @@ -263,7 +262,6 @@ construction ** consPtr, bool is_building) req->nodesetval->nodeNr, &con->materials); xmlXPathFreeObject(req); } - xpath->node = pushNode; } static int From dddbf5287a2e04c284c5047dd15c1305e6f70daf Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 10:53:12 +0200 Subject: [PATCH 113/231] refactor construction list. --- src/xmlreader.c | 94 +++++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 348146d51..d98ddaa2b 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -214,53 +214,63 @@ xml_readrequirements(xmlNodePtr * nodeTab, int nodeNr, requirement ** reqArray) } } +static construction * +xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node, bool is_building) +{ + construction *con; + xmlChar *propValue; + xmlXPathObjectPtr req; + skill_t sk = NOSKILL; + + propValue = xmlGetProp(node, BAD_CAST "skill"); + if (propValue != NULL) { + sk = findskill((const char *)propValue); + if (sk == NOSKILL) { + log_error("construction requires skill '%s' that does not exist.\n", (const char *)propValue); + xmlFree(propValue); + return NULL; + } + xmlFree(propValue); + } + + con = (construction *)calloc(sizeof(construction), 1); + + con->skill = sk; + con->maxsize = xml_ivalue(node, "maxsize", -1); + con->minskill = xml_ivalue(node, "minskill", -1); + con->reqsize = xml_ivalue(node, "reqsize", 1); + + if (is_building) { + propValue = xmlGetProp(node, BAD_CAST "name"); + if (propValue != NULL) { + con->name = str_strdup((const char *)propValue); + xmlFree(propValue); + } + } + + /* read construction/requirement */ + xpath->node = node; + req = xmlXPathEvalExpression(BAD_CAST "requirement", xpath); + xml_readrequirements(req->nodesetval->nodeTab, + req->nodesetval->nodeNr, &con->materials); + xmlXPathFreeObject(req); + + return con; +} + static void -xml_readconstruction(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, +xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, construction **consPtr, bool is_building) { int k; for (k = 0; k != nodeSet->nodeNr; ++k) { xmlNodePtr node = nodeSet->nodeTab[k]; - xmlChar *propValue; - construction *con; - xmlXPathObjectPtr req; - skill_t sk = NOSKILL; + construction *con = xml_readconstruction(xpath, node, is_building); - propValue = xmlGetProp(node, BAD_CAST "skill"); - if (propValue != NULL) { - sk = findskill((const char *)propValue); - if (sk == NOSKILL) { - log_error("construction requires skill '%s' that does not exist.\n", (const char *)propValue); - xmlFree(propValue); - continue; - } - xmlFree(propValue); + if (con) { + *consPtr = con; + consPtr = &con->improvement; } - - assert(*consPtr == NULL); - - *consPtr = con = (construction *)calloc(sizeof(construction), 1); - consPtr = &con->improvement; - - con->skill = sk; - con->maxsize = xml_ivalue(node, "maxsize", -1); - con->minskill = xml_ivalue(node, "minskill", -1); - con->reqsize = xml_ivalue(node, "reqsize", 1); - - if (is_building) { - propValue = xmlGetProp(node, BAD_CAST "name"); - if (propValue != NULL) { - con->name = str_strdup((const char *)propValue); - xmlFree(propValue); - } - } - - /* read construction/requirement */ - xpath->node = node; - req = xmlXPathEvalExpression(BAD_CAST "requirement", xpath); - xml_readrequirements(req->nodesetval->nodeTab, - req->nodesetval->nodeNr, &con->materials); - xmlXPathFreeObject(req); } } @@ -339,7 +349,7 @@ static int parse_buildings(xmlDocPtr doc) /* reading eressea/buildings/building/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &btype->construction, true); + xml_readconstructions(xpath, result->nodesetval, &btype->construction, true); xmlXPathFreeObject(result); /* reading eressea/buildings/building/function */ @@ -439,7 +449,7 @@ static int parse_ships(xmlDocPtr doc) /* reading eressea/ships/ship/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &st->construction, false); + xml_readconstructions(xpath, result->nodesetval, &st->construction, false); xmlXPathFreeObject(result); for (child = node->children; child; child = child->next) { @@ -685,7 +695,7 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) /* reading item/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstruction(xpath, result->nodesetval, &itype->construction, false); + xml_readconstructions(xpath, result->nodesetval, &itype->construction, false); xmlXPathFreeObject(result); /* reading item/weapon */ From 0b097371a19ce24f438c344add27869daa1babd3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 11:18:18 +0200 Subject: [PATCH 114/231] items: less xpath, more child iteration. --- src/modules/score.c | 3 ++ src/xmlreader.c | 117 +++++++++++++++++++------------------------- 2 files changed, 53 insertions(+), 67 deletions(-) diff --git a/src/modules/score.c b/src/modules/score.c index 7b6cb07bb..0ffb73301 100644 --- a/src/modules/score.c +++ b/src/modules/score.c @@ -222,6 +222,9 @@ void score(void) int default_score(const item_type *itype) { int result = 0; + if (itype->rtype->wtype || itype->rtype->atype) { + result += 10; + } if (itype->construction) { requirement *req = itype->construction->materials; while (req->number) { diff --git a/src/xmlreader.c b/src/xmlreader.c index d98ddaa2b..fb8f8c18a 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -259,13 +259,14 @@ xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node, bool is_building } static void -xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, - construction **consPtr, bool is_building) +xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, building_type *btype) { + construction **consPtr = &btype->construction; int k; + for (k = 0; k != nodeSet->nodeNr; ++k) { xmlNodePtr node = nodeSet->nodeTab[k]; - construction *con = xml_readconstruction(xpath, node, is_building); + construction *con = xml_readconstruction(xpath, node, true); if (con) { *consPtr = con; @@ -349,7 +350,7 @@ static int parse_buildings(xmlDocPtr doc) /* reading eressea/buildings/building/construction */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstructions(xpath, result->nodesetval, &btype->construction, true); + xml_readconstructions(xpath, result->nodesetval, btype); xmlXPathFreeObject(result); /* reading eressea/buildings/building/function */ @@ -446,12 +447,6 @@ static int parse_ships(xmlDocPtr doc) st->range_max = xml_ivalue(node, "maxrange", st->range_max); st->storm = xml_fvalue(node, "storm", st->storm); - /* reading eressea/ships/ship/construction */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstructions(xpath, result->nodesetval, &st->construction, false); - xmlXPathFreeObject(result); - for (child = node->children; child; child = child->next) { if (strcmp((const char *)child->name, "modifier") == 0) { double value = xml_fvalue(child, "value", 0.0); @@ -464,6 +459,10 @@ static int parse_ships(xmlDocPtr doc) st->df_bonus = (int)value; xmlFree(propValue); } + else if (strcmp((const char *)child->name, "construction") == 0) { + assert(!st->construction); + st->construction = xml_readconstruction(xpath, child, false); + } } /* reading eressea/ships/ship/coast */ xpath->node = node; @@ -498,22 +497,25 @@ static int parse_ships(xmlDocPtr doc) return result; } -static void xml_readpotion(xmlXPathContextPtr xpath, item_type * itype) +static void xml_readpotion(xmlNodePtr node, item_type * itype) { - int level = xml_ivalue(xpath->node, "level", 0); + int level = xml_ivalue(node, "level", 0); + if ((itype->flags & ITF_CANUSE) == 0) { + log_error("potion %s has no use attribute", itype->rtype->_name); + itype->flags |= ITF_CANUSE; + } new_potiontype(itype, level); } -static luxury_type *xml_readluxury(xmlXPathContextPtr xpath, item_type * itype) +static luxury_type *xml_readluxury(xmlNodePtr node, item_type * itype) { - int price = xml_ivalue(xpath->node, "price", 0); + int price = xml_ivalue(node, "price", 0); return new_luxurytype(itype, price); } -static armor_type *xml_readarmor(xmlXPathContextPtr xpath, item_type * itype) +static armor_type *xml_readarmor(xmlNodePtr node, item_type * itype) { - xmlNodePtr node = xpath->node; armor_type *atype = NULL; unsigned int flags = ATF_NONE; int ac = xml_ivalue(node, "ac", 0); @@ -666,10 +668,9 @@ static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) { - xmlNodePtr node = xpath->node; + xmlNodePtr child, node = xpath->node; item_type *itype = NULL; unsigned int flags = ITF_NONE; - xmlXPathObjectPtr result; if (xml_bvalue(node, "cursed", false)) flags |= ITF_CURSED; @@ -688,63 +689,45 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) itype = rtype->itype ? rtype->itype : it_get_or_create(rtype); itype->weight = xml_ivalue(node, "weight", 0); itype->capacity = xml_ivalue(node, "capacity", 0); + itype->score = xml_ivalue(node, "score", 0); + mask_races(node, "allow", &itype->mask_allow); mask_races(node, "deny", &itype->mask_deny); itype->flags |= flags; - /* reading item/construction */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstructions(xpath, result->nodesetval, &itype->construction, false); - xmlXPathFreeObject(result); - - /* reading item/weapon */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "weapon", xpath); - assert(result->nodesetval->nodeNr <= 1); - if (result->nodesetval->nodeNr != 0) { - xpath->node = result->nodesetval->nodeTab[0]; - rtype->wtype = xml_readweapon(xpath, itype); - } - xmlXPathFreeObject(result); - - /* reading item/potion */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "potion", xpath); - assert(result->nodesetval->nodeNr <= 1); - if (result->nodesetval->nodeNr != 0) { - if ((itype->flags & ITF_CANUSE) == 0) { - log_error("potion %s has no use attribute", rtype->_name); - itype->flags |= ITF_CANUSE; + for (child = node->children; child; child = child->next) { + if (strcmp((const char *)child->name, "construction") == 0) { + /* reading item/construction */ + assert(!itype->construction); + xpath->node = child; + itype->construction = xml_readconstruction(xpath, child, false); + } + else if (strcmp((const char *)child->name, "weapon") == 0) { + /* reading item/weapon */ + assert(!rtype->wtype); + xpath->node = child; + rtype->wtype = xml_readweapon(xpath, itype); + } + else if (strcmp((const char *)child->name, "armor") == 0) { + /* reading item/weapon */ + assert(!rtype->atype); + rtype->atype = xml_readarmor(child, itype); + } + else if (strcmp((const char *)child->name, "luxury") == 0) { + /* reading item/luxury */ + assert(!rtype->ltype); + rtype->ltype = xml_readluxury(child, itype); + } + else if (strcmp((const char *)child->name, "potion") == 0) { + /* reading item/potion */ + xml_readpotion(child, itype); } - xpath->node = result->nodesetval->nodeTab[0]; - xml_readpotion(xpath, itype); } - xmlXPathFreeObject(result); - /* reading item/luxury */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "luxury", xpath); - assert(result->nodesetval->nodeNr <= 1); - if (result->nodesetval->nodeNr != 0) { - xpath->node = result->nodesetval->nodeTab[0]; - rtype->ltype = xml_readluxury(xpath, itype); + if (!itype->score) { + /* do this last, because score depends on itype data */ + itype->score = default_score(itype); } - xmlXPathFreeObject(result); - - /* reading item/armor */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "armor", xpath); - assert(result->nodesetval->nodeNr <= 1); - if (result->nodesetval->nodeNr != 0) { - xpath->node = result->nodesetval->nodeTab[0]; - rtype->atype = xml_readarmor(xpath, itype); - } - xmlXPathFreeObject(result); - - itype->score = xml_ivalue(node, "score", 0); - if (!itype->score) itype->score = default_score(itype); - return itype; } From 8a21b42b65038ff444635dfed11faf5b2ad2c1cb Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 11:22:47 +0200 Subject: [PATCH 115/231] start extracting building-only construction stuff. --- src/xmlreader.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index fb8f8c18a..59e092d71 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -215,7 +215,7 @@ xml_readrequirements(xmlNodePtr * nodeTab, int nodeNr, requirement ** reqArray) } static construction * -xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node, bool is_building) +xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node) { construction *con; xmlChar *propValue; @@ -240,14 +240,6 @@ xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node, bool is_building con->minskill = xml_ivalue(node, "minskill", -1); con->reqsize = xml_ivalue(node, "reqsize", 1); - if (is_building) { - propValue = xmlGetProp(node, BAD_CAST "name"); - if (propValue != NULL) { - con->name = str_strdup((const char *)propValue); - xmlFree(propValue); - } - } - /* read construction/requirement */ xpath->node = node; req = xmlXPathEvalExpression(BAD_CAST "requirement", xpath); @@ -266,7 +258,13 @@ xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, building_ for (k = 0; k != nodeSet->nodeNr; ++k) { xmlNodePtr node = nodeSet->nodeTab[k]; - construction *con = xml_readconstruction(xpath, node, true); + construction *con = xml_readconstruction(xpath, node); + xmlChar *propValue = xmlGetProp(node, BAD_CAST "name"); + + if (propValue != NULL) { + con->name = str_strdup((const char *)propValue); + xmlFree(propValue); + } if (con) { *consPtr = con; @@ -461,7 +459,7 @@ static int parse_ships(xmlDocPtr doc) } else if (strcmp((const char *)child->name, "construction") == 0) { assert(!st->construction); - st->construction = xml_readconstruction(xpath, child, false); + st->construction = xml_readconstruction(xpath, child); } } /* reading eressea/ships/ship/coast */ @@ -700,7 +698,7 @@ static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) /* reading item/construction */ assert(!itype->construction); xpath->node = child; - itype->construction = xml_readconstruction(xpath, child, false); + itype->construction = xml_readconstruction(xpath, child); } else if (strcmp((const char *)child->name, "weapon") == 0) { /* reading item/weapon */ From b5b9611a163bee130dfc39f8f403b9f4e1869b2b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 15:32:06 +0200 Subject: [PATCH 116/231] eliminate construction.improvement, create building_type.stages instead. --- src/battle.test.c | 15 +++++-- src/bindings.c | 20 --------- src/economy.c | 2 +- src/jsonconf.c | 80 +++++++++++++++++++++++++++-------- src/jsonconf.test.c | 87 +++++++++++++++++++++++--------------- src/kernel/build.c | 60 +++++++++++++------------- src/kernel/build.h | 5 --- src/kernel/build.test.c | 13 +++--- src/kernel/building.c | 51 +++++++++++++--------- src/kernel/building.h | 11 ++++- src/kernel/building.test.c | 42 ++++++++++++------ src/kernel/item.c | 4 +- src/kernel/ship.c | 4 +- src/magic.test.c | 2 +- src/move.c | 8 ---- src/tests.c | 29 ++++++++----- src/xmlreader.c | 13 +++--- 17 files changed, 264 insertions(+), 182 deletions(-) diff --git a/src/battle.test.c b/src/battle.test.c index d55ddd4a7..f293f967d 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -17,9 +17,11 @@ #include #include #include +#include #include +#include #include #include "tests.h" @@ -149,12 +151,17 @@ static building_type * setup_castle(void) { building_type * btype; construction *cons; - btype = bt_get_or_create("castle"); + btype = test_create_buildingtype("castle"); + assert(btype->stages); + assert(btype->stages->construction); + btype->flags |= BTF_FORTIFICATION; - cons = btype->construction = calloc(1, sizeof(construction)); + cons = btype->stages->construction; cons->maxsize = 5; - cons = cons->improvement = calloc(1, sizeof(construction)); + btype->stages->next = calloc(1, sizeof(building_stage)); + cons = calloc(1, sizeof(construction)); cons->maxsize = -1; + btype->stages->next->construction = cons; return btype; } @@ -563,9 +570,11 @@ static void test_battle_skilldiff_building(CuTest *tc) td.index = 0; ta.fighter = setup_fighter(&b, ua); ta.index = 0; + CuAssertIntEquals(tc, 0, buildingeffsize(ud->building, false)); CuAssertIntEquals(tc, 0, skilldiff(ta, td, 0)); ud->building->size = 10; + CuAssertIntEquals(tc, 1, buildingeffsize(ud->building, false)); CuAssertIntEquals(tc, -1, skilldiff(ta, td, 0)); create_curse(NULL, &ud->building->attribs, &ct_magicwalls, 1, 1, 1, 1); diff --git a/src/bindings.c b/src/bindings.c index 90f734fd9..5797f7cb5 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -770,26 +770,6 @@ static int config_get_btype(lua_State * L) } lua_settable(L, -3); } - if (btype->construction) { - lua_pushstring(L, "build_skill_min"); - lua_pushinteger(L, btype->construction->minskill); - lua_settable(L, -3); - lua_pushstring(L, "build_skill_name"); - lua_pushstring(L, skillnames[btype->construction->skill]); - lua_settable(L, -3); - if (btype->construction->materials) { - int i; - lua_pushstring(L, "materials"); - lua_newtable(L); - for (i = 0; btype->construction->materials[i].number; ++i) { - lua_pushstring(L, - btype->construction->materials[i].rtype->_name); - lua_pushinteger(L, btype->construction->materials[i].number); - lua_settable(L, -3); - } - lua_settable(L, -3); - } - } return 1; } } diff --git a/src/economy.c b/src/economy.c index 4cabb4ab5..a41b4525e 100644 --- a/src/economy.c +++ b/src/economy.c @@ -1409,7 +1409,7 @@ int make_cmd(unit * u, struct order *ord) if (pl && fval(pl, PFL_NOBUILD)) { cmistake(u, ord, 275, MSG_PRODUCE); } - else if (btype->construction) { + else if (btype->stages && btype->stages->construction) { int id = getid(); build_building(u, btype, id, m, ord); } diff --git a/src/jsonconf.c b/src/jsonconf.c index c14ac9216..b16097d51 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -151,20 +151,6 @@ static void json_construction(cJSON *json, construction **consp) { cJSON *child; construction * cons; - if (json->type == cJSON_Array) { - int size = 0; - for (child = json->child; child; child = child->next) { - construction *cons = 0; - json_construction(child, &cons); - if (cons) { - cons->maxsize -= size; - size += cons->maxsize + size; - *consp = cons; - consp = &cons->improvement; - } - } - return; - } if (json->type != cJSON_Object) { log_error("construction %s is not a json object: %d", json->string, json->type); return; @@ -309,6 +295,57 @@ static void json_terrain(cJSON *json, terrain_type *ter) { } } +static void json_stage(cJSON *json, building_stage *stage) { + cJSON *child; + + if (json->type != cJSON_Object) { + log_error("building stages is not a json object: %d", json->type); + return; + } + for (child = json->child; child; child = child->next) { + switch (child->type) { + case cJSON_Object: + if (strcmp(child->string, "construction") == 0) { + json_construction(child, &stage->construction); + } + break; + case cJSON_String: + if (strcmp(child->string, "name") == 0) { + stage->name = str_strdup(child->valuestring); + } + break; + } + } +} + +static void json_stages(cJSON *json, building_type *bt) { + cJSON *child; + building_stage *stage, **sp = &bt->stages; + int size = 0; + + if (json->type != cJSON_Array) { + log_error("building stages is not a json array: %d", json->type); + return; + } + + for (child = json->child; child; child = child->next) { + switch (child->type) { + case cJSON_Object: + stage = calloc(sizeof(building_stage), 1); + json_stage(child, stage); + if (stage->construction->maxsize > 0) { + stage->construction->maxsize -= size; + size += stage->construction->maxsize; + } + *sp = stage; + sp = &stage->next; + break; + default: + log_error("building stage contains non-object type %d", child->type); + } + } +} + static void json_building(cJSON *json, building_type *bt) { cJSON *child; const char *flags[] = { @@ -321,8 +358,10 @@ static void json_building(cJSON *json, building_type *bt) { for (child = json->child; child; child = child->next) { switch (child->type) { case cJSON_Array: - if (strcmp(child->string, "construction") == 0) { - json_construction(child, &bt->construction); + if (strcmp(child->string, "stages") == 0) { + if (!bt->stages) { + json_stages(child, bt); + } } else if (strcmp(child->string, "maintenance") == 0) { json_maintenance(child, &bt->maintenance); @@ -333,9 +372,14 @@ static void json_building(cJSON *json, building_type *bt) { break; case cJSON_Object: if (strcmp(child->string, "construction") == 0) { - json_construction(child, &bt->construction); + /* simple, single-stage building */ + if (!bt->stages) { + building_stage *stage = calloc(sizeof(building_stage), 1); + json_construction(child, &stage->construction); + bt->stages = stage; + } } - else if (strcmp(child->string, "maintenance") == 0) { + if (strcmp(child->string, "maintenance") == 0) { json_maintenance(child, &bt->maintenance); } break; diff --git a/src/jsonconf.test.c b/src/jsonconf.test.c index 88630c833..482337e40 100644 --- a/src/jsonconf.test.c +++ b/src/jsonconf.test.c @@ -110,7 +110,7 @@ static void test_prefixes(CuTest * tc) CuAssertPtrNotNull(tc, race_prefixes); CuAssertStrEquals(tc, "snow", race_prefixes[0]); CuAssertStrEquals(tc, "dark", race_prefixes[2]); - CuAssertPtrEquals(tc, 0, race_prefixes[3]); + CuAssertPtrEquals(tc, NULL, race_prefixes[3]); cJSON_Delete(json); test_teardown(); } @@ -189,7 +189,7 @@ static void test_races(CuTest * tc) test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, races); + CuAssertPtrEquals(tc, NULL, races); json_config(json); CuAssertPtrNotNull(tc, races); @@ -222,7 +222,7 @@ static void test_findrace(CuTest *tc) { CuAssertPtrNotNull(tc, json); test_setup(); lang = get_or_create_locale("de"); - CuAssertPtrEquals(tc, 0, (void *)findrace("Zwerg", lang)); + CuAssertPtrEquals(tc, NULL, (void *)findrace("Zwerg", lang)); json_config(json); init_locale(lang); @@ -245,9 +245,9 @@ static void test_items(CuTest * tc) test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, it_find("axe")); - CuAssertPtrEquals(tc, 0, rt_find("axe")); - CuAssertPtrEquals(tc, 0, (void *)get_resourcetype(R_HORSE)); + CuAssertPtrEquals(tc, NULL, it_find("axe")); + CuAssertPtrEquals(tc, NULL, rt_find("axe")); + CuAssertPtrEquals(tc, NULL, (void *)get_resourcetype(R_HORSE)); json_config(json); @@ -283,7 +283,7 @@ static void test_ships(CuTest * tc) test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, shiptypes); + CuAssertPtrEquals(tc, NULL, shiptypes); json_config(json); CuAssertPtrNotNull(tc, shiptypes); @@ -301,7 +301,7 @@ static void test_ships(CuTest * tc) CuAssertPtrNotNull(tc, st->coasts); CuAssertPtrEquals(tc, (void *)ter, (void *)st->coasts[0]); - CuAssertPtrEquals(tc, 0, (void *)st->coasts[1]); + CuAssertPtrEquals(tc, NULL, (void *)st->coasts[1]); cJSON_Delete(json); test_teardown(); @@ -309,28 +309,42 @@ static void test_ships(CuTest * tc) static void test_castles(CuTest *tc) { const char * data = "{\"buildings\": { \"castle\" : { " - "\"construction\" : [" - "{ \"maxsize\" : 2 }," - "{ \"maxsize\" : 8 }" + "\"stages\" : [" + "{ \"construction\": { \"maxsize\" : 2 }, \"name\": \"site\" }," + "{ \"construction\": { \"maxsize\" : 8 } }," + "{ \"construction\": { \"maxsize\" : -1 } }" "]}}}"; cJSON *json = cJSON_Parse(data); const building_type *bt; + const building_stage *stage; + const construction *con; test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, buildingtypes); + CuAssertPtrEquals(tc, NULL, buildingtypes); json_config(json); CuAssertPtrNotNull(tc, buildingtypes); bt = bt_find("castle"); CuAssertPtrNotNull(tc, bt); - CuAssertPtrNotNull(tc, bt->construction); - CuAssertIntEquals(tc, 2, bt->construction->maxsize); - CuAssertPtrNotNull(tc, bt->construction->improvement); - CuAssertIntEquals(tc, 6, bt->construction->improvement->maxsize); - CuAssertPtrEquals(tc, 0, bt->construction->improvement->improvement); + CuAssertPtrNotNull(tc, stage = bt->stages); + CuAssertStrEquals(tc, "site", stage->name); + CuAssertPtrNotNull(tc, con = stage->construction); + CuAssertIntEquals(tc, 2, con->maxsize); + + CuAssertPtrNotNull(tc, stage = stage->next); + CuAssertPtrEquals(tc, NULL, stage->name); + CuAssertPtrNotNull(tc, con = stage->construction); + CuAssertIntEquals(tc, 6, con->maxsize); + + CuAssertPtrNotNull(tc, stage = stage->next); + CuAssertPtrNotNull(tc, con = stage->construction); + CuAssertIntEquals(tc, -1, con->maxsize); + + CuAssertPtrEquals(tc, NULL, stage->next); + cJSON_Delete(json); test_teardown(); } @@ -344,7 +358,7 @@ static void test_spells(CuTest * tc) test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, find_spell("fireball")); + CuAssertPtrEquals(tc, NULL, find_spell("fireball")); json_config(json); sp = find_spell("fireball"); @@ -353,7 +367,7 @@ static void test_spells(CuTest * tc) cJSON_Delete(json); test_teardown(); - CuAssertPtrEquals(tc, 0, find_spell("fireball")); + CuAssertPtrEquals(tc, NULL, find_spell("fireball")); } static const char * building_data = "{\"buildings\": { " @@ -380,11 +394,12 @@ static void test_buildings(CuTest * tc) { cJSON *json = cJSON_Parse(building_data); const building_type *bt; + const construction *con; test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, buildingtypes); + CuAssertPtrEquals(tc, NULL, buildingtypes); json_config(json); CuAssertPtrNotNull(tc, buildingtypes); @@ -406,17 +421,19 @@ static void test_buildings(CuTest * tc) CuAssertIntEquals(tc, MTF_VARIABLE, bt->maintenance[0].flags); CuAssertIntEquals(tc, 0, bt->maintenance[1].number); - CuAssertPtrNotNull(tc, bt->construction); - CuAssertPtrNotNull(tc, bt->construction->materials); - CuAssertIntEquals(tc, 2, bt->construction->materials[0].number); - CuAssertPtrEquals(tc, (void *)get_resourcetype(R_STONE), (void *)bt->construction->materials[0].rtype); - CuAssertIntEquals(tc, 1, bt->construction->materials[1].number); - CuAssertPtrEquals(tc, (void *)get_resourcetype(R_IRON), (void *)bt->construction->materials[1].rtype); - CuAssertIntEquals(tc, 0, bt->construction->materials[2].number); - CuAssertIntEquals(tc, 10, bt->construction->reqsize); - CuAssertIntEquals(tc, 20, bt->construction->maxsize); - CuAssertIntEquals(tc, 1, bt->construction->minskill); - CuAssertPtrEquals(tc, 0, bt->construction->improvement); + CuAssertPtrNotNull(tc, bt->stages); + CuAssertPtrEquals(tc, NULL, bt->stages->next); + CuAssertPtrNotNull(tc, bt->stages->construction); + CuAssertPtrNotNull(tc, con = bt->stages->construction); + CuAssertPtrNotNull(tc, con->materials); + CuAssertIntEquals(tc, 2, con->materials[0].number); + CuAssertPtrEquals(tc, (void *)get_resourcetype(R_STONE), (void *)con->materials[0].rtype); + CuAssertIntEquals(tc, 1, con->materials[1].number); + CuAssertPtrEquals(tc, (void *)get_resourcetype(R_IRON), (void *)con->materials[1].rtype); + CuAssertIntEquals(tc, 0, con->materials[2].number); + CuAssertIntEquals(tc, 10, con->reqsize); + CuAssertIntEquals(tc, 20, con->maxsize); + CuAssertIntEquals(tc, 1, con->minskill); cJSON_Delete(json); test_teardown(); } @@ -483,7 +500,7 @@ static void test_configs(CuTest * tc) fwrite(building_data, 1, strlen(building_data), F); fclose(F); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, buildingtypes); + CuAssertPtrEquals(tc, NULL, buildingtypes); json_config(json); CuAssertPtrNotNull(tc, buildingtypes); if (remove("test.json")!=0 && errno==ENOENT) { @@ -508,7 +525,7 @@ static void test_terrains(CuTest * tc) test_setup(); CuAssertPtrNotNull(tc, json); - CuAssertPtrEquals(tc, 0, (void *)get_terrain("plain")); + CuAssertPtrEquals(tc, NULL, (void *)get_terrain("plain")); json_config(json); ter = get_terrain("plain"); @@ -520,7 +537,7 @@ static void test_terrains(CuTest * tc) CuAssertPtrNotNull(tc, ter->herbs); CuAssertPtrEquals(tc, rt_get_or_create("h0"), ter->herbs[0]->rtype); CuAssertPtrEquals(tc, rt_get_or_create("h1"), ter->herbs[1]->rtype); - CuAssertPtrEquals(tc, 0, (void *)ter->herbs[2]); + CuAssertPtrEquals(tc, NULL, (void *)ter->herbs[2]); CuAssertPtrNotNull(tc, ter->name); /* anything named "plain" uses plain_name() */ CuAssertPtrNotNull(tc, ter->production); CuAssertPtrEquals(tc, rt_get_or_create("stone"), (resource_type *)ter->production[0].type); @@ -529,7 +546,7 @@ static void test_terrains(CuTest * tc) CuAssertStrEquals(tc, "1d5", ter->production[0].divisor); CuAssertStrEquals(tc, "1d6", ter->production[0].startlevel); CuAssertPtrEquals(tc, rt_get_or_create("iron"), (resource_type *)ter->production[1].type); - CuAssertPtrEquals(tc, 0, (void *)ter->production[2].type); + CuAssertPtrEquals(tc, NULL, (void *)ter->production[2].type); cJSON_Delete(json); test_teardown(); diff --git a/src/kernel/build.c b/src/kernel/build.c index bb6420717..45a7d0898 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -145,13 +145,25 @@ static void destroy_road(unit * u, int nmax, struct order *ord) } } +static int recycle(unit *u, construction *con, int size) { + /* TODO: Nicht an ZERST�RE mit Punktangabe angepasst! */ + int c; + for (c = 0; con->materials[c].number; ++c) { + const requirement *rq = con->materials + c; + int num = (rq->number * size / con->reqsize) / 2; + if (num) { + change_resource(u, rq->rtype, num); + } + } + return size; +} + int destroy_cmd(unit * u, struct order *ord) { char token[128]; ship *sh; unit *u2; region *r = u->region; - const construction *con = NULL; int size = 0; const char *s; int n = INT_MAX; @@ -194,6 +206,7 @@ int destroy_cmd(unit * u, struct order *ord) return 138; } if (n >= b->size) { + building_stage *stage; /* destroy completly */ /* all units leave the building */ for (u2 = r->units; u2; u2 = u2->next) { @@ -202,11 +215,13 @@ int destroy_cmd(unit * u, struct order *ord) } } ADDMSG(&u->faction->msgs, msg_message("destroy", "building unit", b, u)); - con = b->type->construction; + for (stage = b->type->stages; stage; stage = stage->next) { + size = recycle(u, stage->construction, size); + } remove_building(&r->buildings, b); } else { - /* partial destroy */ + /* TODO: partial destroy does not recycle */ b->size -= n; ADDMSG(&u->faction->msgs, msg_message("destroy_partial", "building unit", b, u)); @@ -234,7 +249,7 @@ int destroy_cmd(unit * u, struct order *ord) } ADDMSG(&u->faction->msgs, msg_message("shipdestroy", "unit region ship", u, r, sh)); - con = sh->type->construction; + size = recycle(u, sh->type->construction, size); remove_ship(&sh->region->ships, sh); } else { @@ -248,18 +263,6 @@ int destroy_cmd(unit * u, struct order *ord) cmistake(u, ord, 138, MSG_PRODUCE); return 138; } - - if (con) { - /* TODO: Nicht an ZERST�RE mit Punktangabe angepasst! */ - int c; - for (c = 0; con->materials[c].number; ++c) { - const requirement *rq = con->materials + c; - int recycle = (rq->number * size / con->reqsize) / 2; - if (recycle) { - change_resource(u, rq->rtype, recycle); - } - } - } return 0; } @@ -668,7 +671,7 @@ static int build_failure(unit *u, order *ord, const building_type *btype, int wa break; case ENOMATERIALS: ADDMSG(&u->faction->msgs, msg_materials_required(u, ord, - btype->construction, want)); + btype->stages->construction, want)); break; case ELOWSKILL: case ENEEDSKILL: @@ -679,9 +682,13 @@ static int build_failure(unit *u, order *ord, const building_type *btype, int wa return err; } -int build_stages(unit *u, construction * con, int built, int n) { +static int build_stages(unit *u, const building_type *btype, int built, int n) { + + const building_stage *stage; int made = 0; - while (con) { + + for (stage = btype->stages; stage; stage = stage->next) { + const construction * con = stage->construction; if (con->maxsize < 0 || con->maxsize > built) { int err, want = INT_MAX; if (n < INT_MAX) { @@ -719,7 +726,6 @@ int build_stages(unit *u, construction * con, int built, int n) { if (built >= con->maxsize && con->maxsize > 0) { built -= con->maxsize; } - con = con->improvement; } return made; } @@ -736,7 +742,7 @@ build_building(unit * u, const building_type * btype, int id, int want, order * const struct locale *lang = u->faction->locale; assert(u->number); - assert(btype->construction); + assert(btype->stages && btype->stages->construction); if (effskill(u, SK_BUILDING, 0) == 0) { cmistake(u, ord, 101, MSG_PRODUCE); return 0; @@ -827,7 +833,7 @@ build_building(unit * u, const building_type * btype, int id, int want, order * } } - built = build_stages(u, btype->construction, built, n); + built = build_stages(u, btype, built, n); if (built < 0) { return build_failure(u, ord, btype, want, built); @@ -1002,7 +1008,6 @@ void continue_ship(unit * u, int want) return; } cons = sh->type->construction; - assert(cons->improvement == NULL); /* sonst ist construction::size nicht ship_type::maxsize */ if (sh->size == cons->maxsize && !sh->damage) { cmistake(u, u->thisorder, 16, MSG_PRODUCE); return; @@ -1026,11 +1031,6 @@ void continue_ship(unit * u, int want) void free_construction(struct construction *cons) { - while (cons) { - construction *next = cons->improvement; - free(cons->name); - free(cons->materials); - free(cons); - cons = next; - } + free(cons->materials); + free(cons); } diff --git a/src/kernel/build.h b/src/kernel/build.h index 5f93884cd..c52cc5da1 100644 --- a/src/kernel/build.h +++ b/src/kernel/build.h @@ -44,11 +44,6 @@ extern "C" { int maxsize; /* maximum size of this type */ int reqsize; /* size of object using up 1 set of requirement. */ requirement *materials; /* material req'd to build one object */ - - /* only used by CONS_BUILDING: */ - char * name; /* building level name */ - struct construction *improvement; - /* next level, if upgradable. */ } construction; void free_construction(struct construction *cons); diff --git a/src/kernel/build.test.c b/src/kernel/build.test.c index d7a12325d..1261e5496 100644 --- a/src/kernel/build.test.c +++ b/src/kernel/build.test.c @@ -26,6 +26,7 @@ typedef struct build_fixture { region *r; race *rc; construction cons; + building_type *btype; } build_fixture; static unit * setup_build(build_fixture *bf) { @@ -34,7 +35,7 @@ static unit * setup_build(build_fixture *bf) { init_resources(); test_create_itemtype("stone"); - test_create_buildingtype("castle"); + bf->btype = test_create_buildingtype("castle"); bf->rc = test_create_race("human"); bf->r = test_create_region(0, 0, NULL); bf->f = test_create_faction(bf->rc); @@ -192,8 +193,7 @@ static void test_build_building_no_materials(CuTest *tc) { unit *u; u = setup_build(&bf); - btype = bt_find("castle"); - assert(btype); + btype = bf.btype; set_level(u, SK_BUILDING, 1); u->orders = create_order(K_MAKE, u->faction->locale, 0); CuAssertIntEquals(tc, ENOMATERIALS, build_building(u, btype, 0, 4, u->orders)); @@ -209,9 +209,7 @@ static void test_build_building_with_golem(CuTest *tc) { u = setup_build(&bf); bf.rc->ec_flags |= ECF_STONEGOLEM; - btype = bt_find("castle"); - assert(btype); - assert(btype->construction); + btype = bf.btype; set_level(bf.u, SK_BUILDING, 1); u->orders = create_order(K_MAKE, u->faction->locale, 0); @@ -231,9 +229,8 @@ static void test_build_building_success(CuTest *tc) { u = setup_build(&bf); rtype = get_resourcetype(R_STONE); - btype = bt_find("castle"); + btype = bf.btype; assert(btype && rtype && rtype->itype); - assert(btype->construction); assert(!u->region->buildings); i_change(&bf.u->items, rtype->itype, 1); diff --git a/src/kernel/building.c b/src/kernel/building.c index 7ee77ae28..c71cbc552 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -116,7 +116,13 @@ static void bt_register(building_type * btype) static void free_buildingtype(void *ptr) { building_type *btype = (building_type *)ptr; - free_construction(btype->construction); + while (btype->stages) { + building_stage *next = btype->stages->next; + free_construction(btype->stages->construction); + free(btype->stages->name); + free(btype->stages); + btype->stages = next; + } free(btype->maintenance); free(btype->_name); free(btype); @@ -189,8 +195,6 @@ static int adjust_size(const building *b, int bsize) { */ const char *buildingtype(const building_type * btype, const building * b, int bsize) { - const construction *con; - assert(btype); if (b && b->attribs) { @@ -201,14 +205,15 @@ const char *buildingtype(const building_type * btype, const building * b, int bs } } } - if (btype->construction && btype->construction->name) { + if (btype->stages && btype->stages->name) { + const building_stage *stage; if (b) { bsize = adjust_size(b, bsize); } - for (con = btype->construction; con; con = con->improvement) { - bsize -= con->maxsize; - if (!con->improvement || bsize <0) { - return con->name; + for (stage = btype->stages; stage; stage = stage->next) { + bsize -= stage->construction->maxsize; + if (!stage->next || bsize <0) { + return stage->name; } } } @@ -476,24 +481,30 @@ int buildingeffsize(const building * b, int img) int bt_effsize(const building_type * btype, const building * b, int bsize) { - int n = 0; - const construction *cons = btype->construction; - if (b) { bsize = adjust_size(b, bsize); } - if (!cons) { - return 0; + if (btype->stages) { + int n = 0; + const building_stage *stage = btype->stages; + do { + const construction *con = stage->construction; + if (con->maxsize < 0) { + break; + } + else { + if (bsize >= con->maxsize) { + bsize -= con->maxsize; + ++n; + } + stage = stage->next; + } + } while (stage && bsize > 0); + return n; } - while (cons && cons->maxsize != -1 && bsize >= cons->maxsize) { - bsize -= cons->maxsize; - cons = cons->improvement; - ++n; - } - - return n; + return 0; } const char *write_buildingname(const building * b, char *ibuf, size_t size) diff --git a/src/kernel/building.h b/src/kernel/building.h index 5a83fd0ca..915a756b7 100644 --- a/src/kernel/building.h +++ b/src/kernel/building.h @@ -54,6 +54,15 @@ extern "C" { #define BTF_NAMECHANGE 0x100 /* name and description can be changed more than once */ #define BTF_FORTIFICATION 0x200 /* building_protection, safe from monsters */ + typedef struct building_stage { + /* construction of this building stage: */ + struct construction *construction; + /* building stage name: */ + char * name; + /* next stage, if upgradable: */ + struct building_stage * next; + } building_stage; + typedef struct building_type { char *_name; @@ -67,8 +76,8 @@ extern "C" { int taxes; /* receive $1 tax per `taxes` in region */ double auraregen; /* modifier for aura regeneration inside building */ struct maintenance *maintenance; /* array of requirements */ - struct construction *construction; /* construction of 1 building-level */ struct resource_mod *modifiers; /* modify production skills */ + struct building_stage *stages; } building_type; extern struct selist *buildingtypes; diff --git a/src/kernel/building.test.c b/src/kernel/building.test.c index 1c736c75b..94dfd1b49 100644 --- a/src/kernel/building.test.c +++ b/src/kernel/building.test.c @@ -224,7 +224,7 @@ static void test_buildingowner_goes_to_same_faction_after_leave(CuTest * tc) leave_building(u3); CuAssertPtrEquals(tc, u2, building_owner(bld)); leave_building(u2); - CuAssertPtrEquals(tc, 0, building_owner(bld)); + CuAssertPtrEquals(tc, NULL, building_owner(bld)); test_teardown(); } @@ -281,7 +281,7 @@ void test_buildingowner_goes_to_empty_unit_after_leave(CuTest * tc) leave_building(u1); CuAssertPtrEquals(tc, u3, building_owner(bld)); leave_building(u3); - CuAssertPtrEquals(tc, 0, building_owner(bld)); + CuAssertPtrEquals(tc, NULL, building_owner(bld)); u2->number = 1; CuAssertPtrEquals(tc, u2, building_owner(bld)); test_teardown(); @@ -295,8 +295,8 @@ static void test_btype_defaults(CuTest *tc) { btype = bt_get_or_create("hodor"); CuAssertPtrNotNull(tc, btype); CuAssertStrEquals(tc, "hodor", btype->_name); - CuAssertPtrEquals(tc, 0, btype->maintenance); - CuAssertPtrEquals(tc, 0, btype->construction); + CuAssertPtrEquals(tc, NULL, btype->maintenance); + CuAssertPtrEquals(tc, NULL, btype->stages); CuAssertDblEquals(tc, 1.0, btype->auraregen, 0.0); CuAssertIntEquals(tc, 0, btype->taxes); CuAssertIntEquals(tc, -1, btype->maxsize); @@ -489,11 +489,11 @@ static void test_cmp_current_owner(CuTest *tc) { config_set("rules.region_owners", "1"); r = test_create_region(0, 0, NULL); btype = test_create_buildingtype("watch"); - btype->construction->maxsize = 1; + btype->stages->construction->maxsize = 1; btype->taxes = 200; b1 = test_create_building(r, btype); btype = test_create_buildingtype("castle"); - btype->construction->maxsize = 1; + btype->stages->construction->maxsize = 1; btype->taxes = 100; b2 = test_create_building(r, btype); b1->size = 1; @@ -515,16 +515,26 @@ static void test_cmp_current_owner(CuTest *tc) { static void test_building_effsize(CuTest *tc) { building *b; building_type *btype; + building_stage *stage; construction *cons; test_setup(); - btype = bt_get_or_create("castle"); - cons = btype->construction = calloc(1, sizeof(construction)); + btype = test_create_buildingtype("castle"); + stage = btype->stages; + assert(stage && stage->construction); + cons = stage->construction; cons->maxsize = 5; - cons = cons->improvement = calloc(1, sizeof(construction)); + + stage->next = calloc(1, sizeof(building_stage)); + stage = stage->next; + cons = stage->construction = calloc(1, sizeof(construction)); cons->maxsize = 5; - cons = cons->improvement = calloc(1, sizeof(construction)); + + stage->next = calloc(1, sizeof(building_stage)); + stage = stage->next; + cons = stage->construction = calloc(1, sizeof(construction)); cons->maxsize = -1; + b = test_create_building(test_create_region(0,0,0), btype); b->size = 1; CuAssertIntEquals(tc, 0, buildingeffsize(b, false)); @@ -563,14 +573,20 @@ static void test_largestbuilding(CuTest *tc) { static void test_buildingtype(CuTest *tc) { building_type *btype; test_setup(); + btype = test_create_buildingtype("hodor"); - CuAssertPtrNotNull(tc, btype->construction); + CuAssertPtrNotNull(tc, btype->stages); + CuAssertPtrEquals(tc, NULL, btype->stages->name); + CuAssertPtrNotNull(tc, btype->stages->construction); CuAssertStrEquals(tc, "hodor", buildingtype(btype, NULL, 1)); - btype->construction->name = str_strdup("castle"); + + btype->stages->name = str_strdup("castle"); CuAssertStrEquals(tc, "castle", buildingtype(btype, NULL, 1)); + btype = bt_get_or_create("portal"); - CuAssertPtrEquals(tc, NULL, btype->construction); + CuAssertPtrEquals(tc, NULL, btype->stages); CuAssertStrEquals(tc, "portal", buildingtype(btype, NULL, 1)); + test_teardown(); } diff --git a/src/kernel/item.c b/src/kernel/item.c index ad811fefd..7307c82c2 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -900,7 +900,9 @@ void write_items(struct storage *store, item * ilist) static void free_itype(item_type *itype) { assert(itype); - free_construction(itype->construction); + if (itype->construction) { + free_construction(itype->construction); + } free(itype->_appearance[0]); free(itype->_appearance[1]); free(itype); diff --git a/src/kernel/ship.c b/src/kernel/ship.c index 3f4c099ac..08eefbd12 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -249,7 +249,9 @@ static void free_shiptype(void *ptr) { ship_type *stype = (ship_type *)ptr; free(stype->_name); free(stype->coasts); - free_construction(stype->construction); + if (stype->construction) { + free_construction(stype->construction); + } free(stype); } diff --git a/src/magic.test.c b/src/magic.test.c index f4606b75a..e68f3ca21 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -477,7 +477,7 @@ static void test_illusioncastle(CuTest *tc) CuAssertPtrEquals(tc, btype, (void *)icastle_type(a)); CuAssertPtrEquals(tc, bt_icastle, (void *)b->type); CuAssertStrEquals(tc, "castle", buildingtype(btype, b, b->size)); - btype->construction->name = str_strdup("site"); + btype->stages->name = str_strdup("site"); CuAssertStrEquals(tc, "site", buildingtype(btype, b, b->size)); test_teardown(); } diff --git a/src/move.c b/src/move.c index 3f940c78a..b30717596 100644 --- a/src/move.c +++ b/src/move.c @@ -479,10 +479,6 @@ static bool cansail(const region * r, ship * sh) { UNUSED_ARG(r); - /* sonst ist construction:: size nicht ship_type::maxsize */ - assert(!sh->type->construction - || sh->type->construction->improvement == NULL); - if (sh->type->construction && sh->size != sh->type->construction->maxsize) { return false; } @@ -505,10 +501,6 @@ static double overload(const region * r, ship * sh) { UNUSED_ARG(r); - /* sonst ist construction:: size nicht ship_type::maxsize */ - assert(!sh->type->construction - || sh->type->construction->improvement == NULL); - if (sh->type->construction && sh->size != sh->type->construction->maxsize) { return DBL_MAX; } diff --git a/src/tests.c b/src/tests.c index 2affead5f..e3799c1b5 100644 --- a/src/tests.c +++ b/src/tests.c @@ -336,20 +336,27 @@ ship_type * test_create_shiptype(const char * name) building_type * test_create_buildingtype(const char * name) { + construction *con; building_type *btype = bt_get_or_create(name); btype->flags = BTF_NAMECHANGE; - if (!btype->construction) { - btype->construction = (construction *)calloc(sizeof(construction), 1); - btype->construction->skill = SK_BUILDING; - btype->construction->maxsize = -1; - btype->construction->minskill = 1; - btype->construction->reqsize = 1; + if (btype->stages) { + con = btype->stages->construction; + } else { + btype->stages = calloc(1, sizeof(building_stage)); + con = (construction *)calloc(1, sizeof(construction)); + if (con) { + con->skill = SK_BUILDING; + con->maxsize = -1; + con->minskill = 1; + con->reqsize = 1; + btype->stages->construction = con; + } } - if (!btype->construction->materials) { - btype->construction->materials = (requirement *)calloc(sizeof(requirement), 2); - btype->construction->materials[1].number = 0; - btype->construction->materials[0].number = 1; - btype->construction->materials[0].rtype = get_resourcetype(R_STONE); + if (con && !con->materials) { + con->materials = (requirement *)calloc(2, sizeof(requirement)); + con->materials[1].number = 0; + con->materials[0].number = 1; + con->materials[0].rtype = get_resourcetype(R_STONE); } if (default_locale) { locale_setstring(default_locale, name, name); diff --git a/src/xmlreader.c b/src/xmlreader.c index 59e092d71..dfb3b54ea 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -253,23 +253,24 @@ xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node) static void xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, building_type *btype) { - construction **consPtr = &btype->construction; + building_stage **stage_ptr = &btype->stages; int k; for (k = 0; k != nodeSet->nodeNr; ++k) { + building_stage *stage = calloc(1, sizeof(building_stage)); xmlNodePtr node = nodeSet->nodeTab[k]; construction *con = xml_readconstruction(xpath, node); xmlChar *propValue = xmlGetProp(node, BAD_CAST "name"); if (propValue != NULL) { - con->name = str_strdup((const char *)propValue); + stage->name = str_strdup((const char *)propValue); xmlFree(propValue); } + stage->next = NULL; + stage->construction = con; - if (con) { - *consPtr = con; - consPtr = &con->improvement; - } + *stage_ptr = stage; + stage_ptr = &stage->next; } } From e5d3d77c067094c9dc8788a199928b1d261780c7 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 18:52:48 +0200 Subject: [PATCH 117/231] begin parsing buildings. --- src/exparse.c | 68 +++++++++++++++++++++++++++++++++++++++++++ src/kernel/building.c | 1 + src/kernel/building.h | 10 ++++--- src/tests.c | 1 - src/xmlreader.c | 20 +++---------- 5 files changed, 79 insertions(+), 21 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index c98d28d6e..590cb446b 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -541,6 +541,70 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML } } +const XML_Char *attr_get(const XML_Char **attr, const char *key) { + int i; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], key) == 0) { + return attr[i + 1]; + } + } + return NULL; +} + +static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "nodestroy", "nobuild", "unique", "decay", "magic", "namechange", "fort", "oneperturn", NULL }; + if (xml_strcmp(el, "building") == 0) { + const XML_Char *name; + + name = attr_get(attr, "name"); + if (name) { + building_type *btype = bt_get_or_create(name); + int i, flags = BTF_DEFAULT; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "maxsize") == 0) { + btype->maxsize = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "capacity") == 0) { + btype->capacity = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "maxcapacity") == 0) { + btype->maxcapacity = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "magresbonus") == 0) { + btype->magresbonus = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "fumblebonus") == 0) { + btype->fumblebonus = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "taxes") == 0) { + btype->taxes = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "auraregen") == 0) { + btype->auraregen = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "magres") == 0) { + /* magres is specified in percent! */ + btype->magres = frac_make(xml_int(attr[i + 1]), 100); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + /* we already handled the name earlier */ + if (xml_strcmp(attr[i], "name") != 0) { + handle_bad_input(pi, el, attr[i]); + } + } + } + btype->flags = flags; + pi->object = btype; + } + } + else { + building_type *btype = (building_type *)pi->object; + assert(btype); + handle_bad_input(pi, el, NULL); + } +} + static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char **attr) { parseinfo *pi = (parseinfo *)data; if (pi->depth == 0) { @@ -571,6 +635,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char } else { switch (pi->type) { + case EXP_BUILDINGS: + start_buildings(pi, el, attr); + break; case EXP_RESOURCES: start_resources(pi, el, attr); break; @@ -639,6 +706,7 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { break; default: if (pi->depth == 1) { + pi->object = NULL; pi->type = EXP_UNKNOWN; } if (pi->cdata) { diff --git a/src/kernel/building.c b/src/kernel/building.c index c71cbc552..f3f01905f 100644 --- a/src/kernel/building.c +++ b/src/kernel/building.c @@ -144,6 +144,7 @@ building_type *bt_get_or_create(const char *name) if (btype == NULL) { btype = calloc(sizeof(building_type), 1); btype->_name = str_strdup(name); + btype->flags = BTF_DEFAULT; btype->auraregen = 1.0; btype->maxsize = -1; btype->capacity = 1; diff --git a/src/kernel/building.h b/src/kernel/building.h index 915a756b7..eacf42942 100644 --- a/src/kernel/building.h +++ b/src/kernel/building.h @@ -48,11 +48,13 @@ extern "C" { #define BTF_NOBUILD 0x02 /* special, can't be built */ #define BTF_UNIQUE 0x04 /* only one per struct region (harbour) */ #define BTF_DECAY 0x08 /* decays when not occupied */ -#define BTF_DYNAMIC 0x10 /* dynamic type, needs bt_write */ -#define BTF_MAGIC 0x40 /* magical effect */ +#define BTF_MAGIC 0x10 /* magical effect */ +#define BTF_NAMECHANGE 0x20 /* name and description can be changed more than once */ +#define BTF_FORTIFICATION 0x40 /* building_protection, safe from monsters */ #define BTF_ONEPERTURN 0x80 /* one one sizepoint can be added per turn */ -#define BTF_NAMECHANGE 0x100 /* name and description can be changed more than once */ -#define BTF_FORTIFICATION 0x200 /* building_protection, safe from monsters */ +#define BTF_DYNAMIC 0x100 /* dynamic type, needs bt_write */ + +#define BTF_DEFAULT (BTF_NAMECHANGE) typedef struct building_stage { /* construction of this building stage: */ diff --git a/src/tests.c b/src/tests.c index e3799c1b5..696baf447 100644 --- a/src/tests.c +++ b/src/tests.c @@ -338,7 +338,6 @@ building_type * test_create_buildingtype(const char * name) { construction *con; building_type *btype = bt_get_or_create(name); - btype->flags = BTF_NAMECHANGE; if (btype->stages) { con = btype->stages->construction; } else { diff --git a/src/xmlreader.c b/src/xmlreader.c index 45003e021..eea73e234 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -325,20 +325,20 @@ static int parse_buildings(xmlDocPtr doc) if (xml_bvalue(node, "nodestroy", false)) btype->flags |= BTF_INDESTRUCTIBLE; - if (xml_bvalue(node, "oneperturn", false)) - btype->flags |= BTF_ONEPERTURN; if (xml_bvalue(node, "nobuild", false)) btype->flags |= BTF_NOBUILD; - if (xml_bvalue(node, "namechange", true)) - btype->flags |= BTF_NAMECHANGE; if (xml_bvalue(node, "unique", false)) btype->flags |= BTF_UNIQUE; if (xml_bvalue(node, "decay", false)) btype->flags |= BTF_DECAY; if (xml_bvalue(node, "magic", false)) btype->flags |= BTF_MAGIC; + if (xml_bvalue(node, "namechange", true)) + btype->flags |= BTF_NAMECHANGE; if (xml_bvalue(node, "fort", false)) btype->flags |= BTF_FORTIFICATION; + if (xml_bvalue(node, "oneperturn", false)) + btype->flags |= BTF_ONEPERTURN; /* reading eressea/buildings/building/modifier */ xpath->node = node; @@ -1172,18 +1172,6 @@ static int parse_spells(xmlDocPtr doc) sp->syntax = str_strdup((const char *)propValue); xmlFree(propValue); } -#ifdef TODO /* no longer need it, spellbooks! */ - /* magic type */ - propValue = xmlGetProp(node, BAD_CAST "type"); - assert(propValue != NULL); - for (sp->magietyp = 0; sp->magietyp != MAXMAGIETYP; ++sp->magietyp) { - if (strcmp(magic_school[sp->magietyp], (const char *)propValue) == 0) - break; - } - assert(sp->magietyp != MAXMAGIETYP); - xmlFree(propValue); - /* level, rank and flags */ -#endif sp->rank = (char)xml_ivalue(node, "rank", -1); if (xml_bvalue(node, "los", false)) sp->sptyp |= TESTCANSEE; /* must see or have contact */ From 962b8082b7416218cca762e14c95199f00012acf Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 19:05:04 +0200 Subject: [PATCH 118/231] fix test for lifepotion (tree growth was fuxxing it up) --- scripts/tests/e2/items.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index e444a9c73..11bcdaed5 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -13,6 +13,7 @@ function setup() end function test_water_of_life() + eressea.settings.set("rules.grow.formula", 0) -- no tree growth local r = region.create(0, 0, "plain") r:set_flag(1, false) -- no mallorn local f = faction.create("human") From d2eccd56b923041d88f2e47c6dc28b038481cc60 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 19:39:41 +0200 Subject: [PATCH 119/231] defaults --- src/kernel/building.test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/building.test.c b/src/kernel/building.test.c index 94dfd1b49..daa75b496 100644 --- a/src/kernel/building.test.c +++ b/src/kernel/building.test.c @@ -305,7 +305,7 @@ static void test_btype_defaults(CuTest *tc) { CuAssertIntEquals(tc, 0, btype->magres.sa[0]); CuAssertIntEquals(tc, 0, btype->magresbonus); CuAssertIntEquals(tc, 0, btype->fumblebonus); - CuAssertIntEquals(tc, 0, btype->flags); + CuAssertIntEquals(tc, BTF_DEFAULT, btype->flags); test_teardown(); } From 7128e1fb5c13601ec00b4489ec2176f94d422bd0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 20:03:13 +0200 Subject: [PATCH 120/231] extract modifier parsing so it can be used for buildings. --- src/exparse.c | 136 +++++++++++++++++++++++++++++--------------------- 1 file changed, 80 insertions(+), 56 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 590cb446b..23f1f6535 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -342,7 +342,61 @@ static int nreqs; static resource_mod rmods[RMOD_MAX]; static int nrmods; -static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + int i; + skill_t sk = NOSKILL; + const XML_Char *type = NULL; + resource_mod * mod = rmods + nrmods; + const XML_Char *value = NULL; + + mod->race_mask = 0; + mod->btype = NULL; + assert(nrmods < RMOD_MAX); + ++nrmods; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + type = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "building") == 0) { + mod->btype = bt_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "skill") == 0) { + sk = findskill(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "races") == 0) { + char list[64]; + strcpy(list, attr[i + 1]); + mod->race_mask = rc_get_mask(list); + } + else if (xml_strcmp(attr[i], "value") == 0) { + value = attr[i + 1]; + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + if (xml_strcmp(type, "skill") == 0) { + mod->type = RMT_PROD_SKILL; + mod->value.sa[0] = (short)sk; + mod->value.sa[1] = (short)xml_int(value); + } + else if (xml_strcmp(type, "require") == 0) { + mod->type = RMT_PROD_REQUIRE; + } + else if (xml_strcmp(type, "material") == 0) { + mod->type = RMT_PROD_SAVE; + mod->value = xml_fraction(value); + } + else if (xml_strcmp(type, "save") == 0) { + mod->type = RMT_USE_SAVE; + mod->value = xml_fraction(value); + } + else { + handle_bad_input(pi, el, type); + } +} + +static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resource") == 0) { handle_resource(pi, el, attr); @@ -412,57 +466,7 @@ static void XMLCALL start_resources(parseinfo *pi, const XML_Char *el, const XML nreqs = 0; } else if (xml_strcmp(el, "modifier") == 0) { - int i; - skill_t sk = NOSKILL; - const XML_Char *type = NULL; - resource_mod * mod = rmods + nrmods; - const XML_Char *value = NULL; - - mod->race_mask = 0; - mod->btype = NULL; - assert(nrmods < RMOD_MAX); - ++nrmods; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], "type") == 0) { - type = attr[i + 1]; - } - else if (xml_strcmp(attr[i], "building") == 0) { - mod->btype = bt_get_or_create(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "skill") == 0) { - sk = findskill(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "races") == 0) { - char list[64]; - strcpy(list, attr[i + 1]); - mod->race_mask = rc_get_mask(list); - } - else if (xml_strcmp(attr[i], "value") == 0) { - value = attr[i + 1]; - } - else { - handle_bad_input(pi, el, attr[i]); - } - } - if (xml_strcmp(type, "skill") == 0) { - mod->type = RMT_PROD_SKILL; - mod->value.sa[0] = (short)sk; - mod->value.sa[1] = (short)xml_int(value); - } - else if (xml_strcmp(type, "require") == 0) { - mod->type = RMT_PROD_REQUIRE; - } - else if (xml_strcmp(type, "material") == 0) { - mod->type = RMT_PROD_SAVE; - mod->value = xml_fraction(value); - } - else if (xml_strcmp(type, "save") == 0) { - mod->type = RMT_USE_SAVE; - mod->value = xml_fraction(value); - } - else { - handle_bad_input(pi, el, type); - } + handle_modifier(pi, el, attr); } else if (xml_strcmp(el, "requirement") == 0) { requirement *req; @@ -598,6 +602,9 @@ static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML pi->object = btype; } } + else if (xml_strcmp(el, "modifier") == 0) { + handle_modifier(pi, el, attr); + } else { building_type *btype = (building_type *)pi->object; assert(btype); @@ -674,10 +681,7 @@ static void end_weapon(parseinfo *pi, const XML_Char *el) { static void end_resources(parseinfo *pi, const XML_Char *el) { resource_type *rtype = (resource_type *)pi->object; - if (xml_strcmp(el, "resources") == 0) { - pi->type = EXP_UNKNOWN; - } - else if (xml_strcmp(el, "resource") == 0) { + if (xml_strcmp(el, "resource") == 0) { if (nrmods > 0) { rtype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); memcpy(rtype->modifiers, rmods, sizeof(resource_mod) * nrmods); @@ -692,12 +696,32 @@ static void end_resources(parseinfo *pi, const XML_Char *el) { nreqs = 0; } } + else if (xml_strcmp(el, "resources") == 0) { + pi->type = EXP_UNKNOWN; + } +} + +static void end_buildings(parseinfo *pi, const XML_Char *el) { + building_type *btype = (building_type *)pi->object; + if (xml_strcmp(el, "building") == 0) { + if (nrmods > 0) { + btype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); + memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods); + nrmods = 0; + } + } + else if (xml_strcmp(el, "buildings") == 0) { + pi->type = EXP_UNKNOWN; + } } static void XMLCALL handle_end(void *data, const XML_Char *el) { parseinfo *pi = (parseinfo *)data; switch (pi->type) { + case EXP_BUILDINGS: + end_buildings(pi, el); + break; case EXP_RESOURCES: end_resources(pi, el); break; From 59f74d0a98f4821e4cb2fdb0629125aab4984fd0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 1 May 2018 20:58:30 +0200 Subject: [PATCH 121/231] parse building stages, too. --- src/exparse.c | 162 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 106 insertions(+), 56 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 23f1f6535..034343128 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -81,6 +81,20 @@ static variant xml_fraction(const XML_Char *val) { return frac_make(num, den); } +static building_stage *stage; + +#define MAX_REQUIREMENTS 8 +static requirement reqs[MAX_REQUIREMENTS]; +static int nreqs; + +#define RMOD_MAX 8 +static resource_mod rmods[RMOD_MAX]; +static int nrmods; + +#define WMOD_MAX 8 +static weapon_mod wmods[WMOD_MAX]; +static int nwmods; + static void handle_bad_input(parseinfo *pi, const XML_Char *el, const XML_Char *attr) { if (attr) { log_error("unknown attribute in <%s>: %s", el, attr); @@ -239,11 +253,6 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } - -#define WMOD_MAX 8 -static weapon_mod wmods[WMOD_MAX]; -static int nwmods; - static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; @@ -334,13 +343,25 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch } } -#define MAX_REQUIREMENTS 8 -static requirement reqs[MAX_REQUIREMENTS]; -static int nreqs; +static void handle_requirement(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + requirement *req; + int i; -#define RMOD_MAX 8 -static resource_mod rmods[RMOD_MAX]; -static int nrmods; + assert(nreqs < MAX_REQUIREMENTS); + req = reqs + nreqs; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + req->rtype = rt_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "quantity") == 0) { + req->number = xml_int(attr[i + 1]); + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + ++nreqs; +} static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { int i; @@ -396,6 +417,37 @@ static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char ** } } +static construction *parse_construction(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + construction *con = calloc(sizeof(construction), 1); + int i; + con->maxsize = -1; + con->minskill = -1; + con->reqsize = 1; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "skill") == 0) { + con->skill = findskill(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "maxsize") == 0) { + con->maxsize = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "reqsize") == 0) { + con->reqsize = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "minskill") == 0) { + con->minskill = xml_int(attr[i + 1]); + } + else if (stage != NULL && xml_strcmp(attr[i], "name") == 0) { + /* only building stages have names */ + stage->name = str_strdup(attr[i + 1]); + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + nreqs = 0; + return con; +} + static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; if (xml_strcmp(el, "resource") == 0) { @@ -440,52 +492,14 @@ static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char ** else if (rtype->itype) { item_type *itype = rtype->itype; if (xml_strcmp(el, "construction") == 0) { - construction *con = calloc(sizeof(construction), 1); - int i; - con->maxsize = -1; - con->minskill = -1; - con->reqsize = 1; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], "skill") == 0) { - con->skill = findskill(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "maxsize") == 0) { - con->maxsize = xml_int(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "reqsize") == 0) { - con->reqsize = xml_int(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "minskill") == 0) { - con->minskill = xml_int(attr[i + 1]); - } - else { - handle_bad_input(pi, el, attr[i]); - } - } - itype->construction = con; - nreqs = 0; + itype->construction = parse_construction(pi, el, attr); } else if (xml_strcmp(el, "modifier") == 0) { handle_modifier(pi, el, attr); } else if (xml_strcmp(el, "requirement") == 0) { - requirement *req; - int i; assert(itype->construction); - assert(nreqs < MAX_REQUIREMENTS); - req = reqs + nreqs; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], "type") == 0) { - req->rtype = rt_get_or_create(attr[i + 1]); - } - else if (xml_strcmp(attr[i], "quantity") == 0) { - req->number = xml_int(attr[i + 1]); - } - else { - handle_bad_input(pi, el, attr[i]); - } - } - ++nreqs; + handle_requirement(pi, el, attr); } else if (xml_strcmp(el, "luxury") == 0) { rtype->ltype = new_luxurytype(itype, 0); @@ -560,6 +574,7 @@ static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML if (xml_strcmp(el, "building") == 0) { const XML_Char *name; + assert(stage == NULL); name = attr_get(attr, "name"); if (name) { building_type *btype = bt_get_or_create(name); @@ -602,13 +617,25 @@ static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML pi->object = btype; } } - else if (xml_strcmp(el, "modifier") == 0) { - handle_modifier(pi, el, attr); - } else { building_type *btype = (building_type *)pi->object; assert(btype); - handle_bad_input(pi, el, NULL); + if (xml_strcmp(el, "modifier") == 0) { + handle_modifier(pi, el, attr); + } + else if (xml_strcmp(el, "requirement") == 0) { + assert(stage); + assert(stage->construction); + handle_requirement(pi, el, attr); + } + else if (xml_strcmp(el, "construction") == 0) { + assert(stage == NULL); + stage = calloc(1, sizeof(building_stage)); + stage->construction = parse_construction(pi, el, attr); + } + else { + handle_bad_input(pi, el, NULL); + } } } @@ -701,9 +728,32 @@ static void end_resources(parseinfo *pi, const XML_Char *el) { } } + static void end_buildings(parseinfo *pi, const XML_Char *el) { + /* stores the end of the building's stage list: */ + static building_stage **stage_ptr; + building_type *btype = (building_type *)pi->object; - if (xml_strcmp(el, "building") == 0) { + if (xml_strcmp(el, "construction") == 0) { + if (stage) { + if (nreqs > 0) { + construction *con = stage->construction; + con->materials = calloc(sizeof(requirement), nreqs + 1); + memcpy(con->materials, reqs, sizeof(requirement) * nreqs); + nreqs = 0; + } + if (stage_ptr == NULL) { + /* at the first build stage, initialize stage_ptr: */ + assert(btype->stages == NULL); + stage_ptr = &btype->stages; + } + *stage_ptr = stage; + stage_ptr = &stage->next; + stage = NULL; + } + } + else if (xml_strcmp(el, "building") == 0) { + stage_ptr = NULL; if (nrmods > 0) { btype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods); From 6d9ecd1879dfbd9b9586d0c7f527096e6f3ec960 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 2 May 2018 21:37:57 +0200 Subject: [PATCH 122/231] finish loading buildings with expat. --- src/exparse.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index 034343128..d50db46a0 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -83,6 +83,10 @@ static variant xml_fraction(const XML_Char *val) { static building_stage *stage; +#define UPKEEP_MAX 4 +static maintenance upkeep[UPKEEP_MAX]; +static int nupkeep; + #define MAX_REQUIREMENTS 8 static requirement reqs[MAX_REQUIREMENTS]; static int nreqs; @@ -363,6 +367,32 @@ static void handle_requirement(parseinfo *pi, const XML_Char *el, const XML_Char ++nreqs; } +static void handle_maintenance(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + maintenance *up; + int i; + + assert(nupkeep < UPKEEP_MAX); + up = upkeep + nupkeep; + memset(up, 0, sizeof(maintenance)); + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + up->rtype = rt_get_or_create(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "amount") == 0) { + up->number = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "variable") == 0) { + if (xml_bool(attr[i + 1])) { + up->flags |= MTF_VARIABLE; + } + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + ++nupkeep; +} + static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { int i; skill_t sk = NOSKILL; @@ -633,6 +663,10 @@ static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML stage = calloc(1, sizeof(building_stage)); stage->construction = parse_construction(pi, el, attr); } + else if (xml_strcmp(el, "maintenance") == 0) { + assert(!btype->maintenance); + handle_maintenance(pi, el, attr); + } else { handle_bad_input(pi, el, NULL); } @@ -754,6 +788,11 @@ static void end_buildings(parseinfo *pi, const XML_Char *el) { } else if (xml_strcmp(el, "building") == 0) { stage_ptr = NULL; + if (nupkeep > 0) { + btype->maintenance = calloc(sizeof(maintenance), nupkeep + 1); + memcpy(btype->maintenance, upkeep, sizeof(maintenance) * nupkeep); + nupkeep = 0; + } if (nrmods > 0) { btype->modifiers = calloc(sizeof(resource_mod), nrmods + 1); memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods); From 20b82fee51c84549ded4c78afd9729effeec64d3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 2 May 2018 21:55:17 +0200 Subject: [PATCH 123/231] old spellbooks no longer used anywhere --- res/core/spellbooks/cerddor.xml | 7 ------- res/core/spellbooks/draig.xml | 8 -------- res/core/spellbooks/gray.xml | 7 ------- res/core/spellbooks/gwyrrd.xml | 7 ------- res/core/spellbooks/illaun.xml | 8 -------- res/core/spellbooks/tybied.xml | 9 --------- 6 files changed, 46 deletions(-) delete mode 100644 res/core/spellbooks/cerddor.xml delete mode 100644 res/core/spellbooks/draig.xml delete mode 100644 res/core/spellbooks/gray.xml delete mode 100644 res/core/spellbooks/gwyrrd.xml delete mode 100644 res/core/spellbooks/illaun.xml delete mode 100644 res/core/spellbooks/tybied.xml diff --git a/res/core/spellbooks/cerddor.xml b/res/core/spellbooks/cerddor.xml deleted file mode 100644 index f5158f37f..000000000 --- a/res/core/spellbooks/cerddor.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/core/spellbooks/draig.xml b/res/core/spellbooks/draig.xml deleted file mode 100644 index f4c66156b..000000000 --- a/res/core/spellbooks/draig.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/res/core/spellbooks/gray.xml b/res/core/spellbooks/gray.xml deleted file mode 100644 index 36e44cbd0..000000000 --- a/res/core/spellbooks/gray.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/core/spellbooks/gwyrrd.xml b/res/core/spellbooks/gwyrrd.xml deleted file mode 100644 index 5e07b8c7f..000000000 --- a/res/core/spellbooks/gwyrrd.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/res/core/spellbooks/illaun.xml b/res/core/spellbooks/illaun.xml deleted file mode 100644 index cbf57aa51..000000000 --- a/res/core/spellbooks/illaun.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/res/core/spellbooks/tybied.xml b/res/core/spellbooks/tybied.xml deleted file mode 100644 index a48d8e768..000000000 --- a/res/core/spellbooks/tybied.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - From cb27895b81cff33c52b92f689bb210c01716b417 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 22:27:28 +0200 Subject: [PATCH 124/231] parsing ships, done! --- src/exparse.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 163 insertions(+), 6 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index d50db46a0..3e7e8b7a8 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -10,6 +10,8 @@ #include "kernel/item.h" #include "kernel/race.h" #include "kernel/resources.h" +#include "kernel/ship.h" +#include "kernel/terrain.h" #include "util/functions.h" #include "util/log.h" @@ -42,6 +44,7 @@ enum { EXP_WEAPON, EXP_BUILDINGS, EXP_SHIPS, + EXP_RACES, EXP_MESSAGES, EXP_STRINGS, }; @@ -81,6 +84,16 @@ static variant xml_fraction(const XML_Char *val) { return frac_make(num, den); } +const XML_Char *attr_get(const XML_Char **attr, const char *key) { + int i; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], key) == 0) { + return attr[i + 1]; + } + } + return NULL; +} + static building_stage *stage; #define UPKEEP_MAX 4 @@ -393,6 +406,20 @@ static void handle_maintenance(parseinfo *pi, const XML_Char *el, const XML_Char ++nupkeep; } +#define COASTS_MAX 16 +static int ncoasts; +static struct terrain_type *coasts[COASTS_MAX]; + +static void handle_coast(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + const XML_Char *tname = attr_get(attr, "terrain"); + + if (tname) { + terrain_type *coast = get_or_create_terrain(tname); + assert(ncoasts < COASTS_MAX); + coasts[ncoasts++] = coast; + } +} + static void handle_modifier(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { int i; skill_t sk = NOSKILL; @@ -589,14 +616,109 @@ static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char ** } } -const XML_Char *attr_get(const XML_Char **attr, const char *key) { - int i; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], key) == 0) { - return attr[i + 1]; +static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { "opensea", "fly", "nocoast", "speedy", NULL }; + if (xml_strcmp(el, "ship") == 0) { + const XML_Char *name; + + name = attr_get(attr, "name"); + if (name) { + ship_type *stype = st_get_or_create(name); + int i, flags = SFL_DEFAULT; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "range") == 0) { + stype->range = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "maxrange") == 0) { + stype->range_max = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "cabins") == 0) { + stype->cabins = PERSON_WEIGHT * xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "cargo") == 0) { + stype->cargo = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "combat") == 0) { + stype->combat = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "fishing") == 0) { + stype->fishing = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "cptskill") == 0) { + stype->cptskill = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "minskill") == 0) { + stype->minskill = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "sumskill") == 0) { + stype->sumskill = xml_int(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "damage") == 0) { + stype->damage = xml_float(attr[i + 1]); + } + else if (xml_strcmp(attr[i], "storm") == 0) { + stype->storm = xml_float(attr[i + 1]); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + /* we already handled the name earlier */ + if (xml_strcmp(attr[i], "name") != 0) { + handle_bad_input(pi, el, attr[i]); + } + } + } + stype->flags = flags; + pi->object = stype; + } + } + else { + ship_type *stype = (ship_type *)pi->object; + assert(stype); + if (xml_strcmp(el, "modifier") == 0) { + /* these modifiers are not like buildings */ + int i; + const XML_Char *type = NULL, *value = NULL; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + type = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "value") == 0) { + value = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "factor") == 0) { + value = attr[i + 1]; + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + if (type) { + if (xml_strcmp(type, "tactics") == 0) { + stype->tac_bonus = xml_float(value); + } + else if (xml_strcmp(type, "attack") == 0) { + stype->at_bonus = xml_int(value); + } + else if (xml_strcmp(type, "defense") == 0) { + stype->df_bonus = xml_int(value); + } + } + } + else if (xml_strcmp(el, "requirement") == 0) { + assert(stype->construction); + handle_requirement(pi, el, attr); + } + else if (xml_strcmp(el, "construction") == 0) { + assert(!stype->construction); + stype->construction = parse_construction(pi, el, attr); + } + else if (xml_strcmp(el, "coast") == 0) { + handle_coast(pi, el, attr); + } + else { + handle_bad_input(pi, el, NULL); } } - return NULL; } static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { @@ -697,6 +819,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char else if (xml_strcmp(el, "strings") == 0) { pi->type = EXP_STRINGS; } + else if (xml_strcmp(el, "races") == 0) { + pi->type = EXP_RACES; + } else { handle_bad_input(pi, el, NULL); } @@ -706,6 +831,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_BUILDINGS: start_buildings(pi, el, attr); break; + case EXP_SHIPS: + start_ships(pi, el, attr); + break; case EXP_RESOURCES: start_resources(pi, el, attr); break; @@ -762,6 +890,30 @@ static void end_resources(parseinfo *pi, const XML_Char *el) { } } +static void end_ships(parseinfo *pi, const XML_Char *el) { + ship_type *stype = (ship_type *)pi->object; + if (xml_strcmp(el, "construction") == 0) { + assert(stype); + assert(stype->construction); + if (nreqs > 0) { + construction *con = stype->construction; + con->materials = calloc(sizeof(requirement), nreqs + 1); + memcpy(con->materials, reqs, sizeof(requirement) * nreqs); + nreqs = 0; + } + } + else if (xml_strcmp(el, "ship") == 0) { + if (ncoasts > 0) { + stype->coasts = calloc(sizeof(const terrain_type *), ncoasts + 1); + memcpy(stype->coasts, coasts, sizeof(const terrain_type *) * ncoasts); + ncoasts = 0; + } + pi->object = NULL; + } + else if (xml_strcmp(el, "ships") == 0) { + pi->type = EXP_UNKNOWN; + } +} static void end_buildings(parseinfo *pi, const XML_Char *el) { /* stores the end of the building's stage list: */ @@ -769,6 +921,7 @@ static void end_buildings(parseinfo *pi, const XML_Char *el) { building_type *btype = (building_type *)pi->object; if (xml_strcmp(el, "construction") == 0) { + assert(btype); if (stage) { if (nreqs > 0) { construction *con = stage->construction; @@ -798,6 +951,7 @@ static void end_buildings(parseinfo *pi, const XML_Char *el) { memcpy(btype->modifiers, rmods, sizeof(resource_mod) * nrmods); nrmods = 0; } + pi->object = NULL; } else if (xml_strcmp(el, "buildings") == 0) { pi->type = EXP_UNKNOWN; @@ -808,6 +962,9 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { parseinfo *pi = (parseinfo *)data; switch (pi->type) { + case EXP_SHIPS: + end_ships(pi, el); + break; case EXP_BUILDINGS: end_buildings(pi, el); break; From 069047d0ac11568aa789fcb48d73e137d17560fd Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 22:32:05 +0200 Subject: [PATCH 125/231] uninitialized variable crash, seenspells. --- src/attributes/seenspell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index b6edd3d98..c2b9c7c75 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -46,7 +46,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. static int read_seenspells(variant *var, void *owner, struct gamedata *data) { - selist *ql; + selist *ql = NULL; storage *store = data->store; spell *sp = 0; char token[32]; From 5bcd8369af18008a93e35ecb8e71645cbab22cef Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 22:40:54 +0200 Subject: [PATCH 126/231] ignore sqlite setting errno --- src/kernel/db/sqlite.c | 16 +++++++++++++--- src/report.c | 22 +++++----------------- src/util/log.c | 8 ++++++++ src/util/log.h | 16 ++++++++++------ 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/kernel/db/sqlite.c b/src/kernel/db/sqlite.c index 965363223..b3090cca0 100644 --- a/src/kernel/db/sqlite.c +++ b/src/kernel/db/sqlite.c @@ -26,7 +26,8 @@ order_data *db_driver_order_load(int id) { order_data * od = NULL; int err; - + + ERRNO_CHECK(); if (g_order_tx_size > 0) { g_order_tx_size = 0; err = sqlite3_exec(g_db, "COMMIT", NULL, NULL, NULL); @@ -45,10 +46,12 @@ order_data *db_driver_order_load(int id) assert(bytes > 0); text = sqlite3_column_text(g_stmt_select, 0); odata_create(&od, 1+(size_t)bytes, (const char *)text); + ERRNO_CHECK(); return od; } } while (err == SQLITE_ROW); assert(err == SQLITE_DONE); + ERRNO_CHECK(); return NULL; } @@ -58,7 +61,9 @@ int db_driver_order_save(order_data *od) sqlite3_int64 id; assert(od && od->_str); - + + ERRNO_CHECK(); + if (g_order_batchsize > 0) { if (g_order_tx_size == 0) { err = sqlite3_exec(g_db, "BEGIN TRANSACTION", NULL, NULL, NULL); @@ -82,7 +87,7 @@ int db_driver_order_save(order_data *od) g_order_tx_size = 0; } } - + ERRNO_CHECK(); return (int)id; } @@ -91,6 +96,7 @@ void db_driver_open(void) int err; const char *dbname; + ERRNO_CHECK(); g_order_batchsize = config_get_int("game.dbbatch", 100); dbname = config_get("game.dbname"); if (!dbname) { @@ -108,16 +114,20 @@ void db_driver_open(void) assert(err == SQLITE_OK); err = sqlite3_prepare_v2(g_db, "SELECT data FROM orders WHERE id = ?", -1, &g_stmt_select, NULL); assert(err == SQLITE_OK); + ERRNO_CHECK(); } void db_driver_close(void) { int err; + ERRNO_CHECK(); err = sqlite3_finalize(g_stmt_select); assert(err == SQLITE_OK); err = sqlite3_finalize(g_stmt_insert); assert(err == SQLITE_OK); err = sqlite3_close(g_db); assert(err == SQLITE_OK); + ERRNO_CHECK(); } + diff --git a/src/report.c b/src/report.c index c0b84f181..adea79257 100644 --- a/src/report.c +++ b/src/report.c @@ -96,7 +96,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* libc includes */ #include #include -#include #include #include #include @@ -111,17 +110,6 @@ extern int *storms; extern int weeks_per_month; extern int months_per_year; -static void check_errno(const char * file, int line) { - if (errno) { - char zText[64]; - sprintf(zText, "error %d during report at %s:%d", errno, file, line); - perror(zText); - errno = 0; - } -} - -#define CHECK_ERRNO() check_errno(__FILE__, __LINE__) - static char *gamedate_season(const struct locale *lang) { static char buf[256]; /* FIXME: static return value */ @@ -2195,7 +2183,7 @@ report_plaintext(const char *filename, report_context * ctx, } ch = 0; - CHECK_ERRNO(); + ERRNO_CHECK(); for (a = a_find(f->attribs, &at_showitem); a && a->type == &at_showitem; a = a->next) { const item_type *itype = (const item_type *)a->data.v; @@ -2245,7 +2233,7 @@ report_plaintext(const char *filename, report_context * ctx, } } newline(out); - CHECK_ERRNO(); + ERRNO_CHECK(); centre(out, LOC(f->locale, "nr_alliances"), false); newline(out); @@ -2253,7 +2241,7 @@ report_plaintext(const char *filename, report_context * ctx, rpline(out); - CHECK_ERRNO(); + ERRNO_CHECK(); anyunits = 0; for (r = ctx->first; r != ctx->last; r = r->next) { @@ -2367,7 +2355,7 @@ report_plaintext(const char *filename, report_context * ctx, newline(out); rpline(out); - CHECK_ERRNO(); + ERRNO_CHECK(); } if (!is_monsters(f)) { if (!anyunits) { @@ -2379,7 +2367,7 @@ report_plaintext(const char *filename, report_context * ctx, } } fstream_done(&strm); - CHECK_ERRNO(); + ERRNO_CHECK(); return 0; } diff --git a/src/util/log.c b/src/util/log.c index 51479cb4a..4b29332a8 100644 --- a/src/util/log.c +++ b/src/util/log.c @@ -24,6 +24,14 @@ without prior permission by the authors of Eressea. #include #include +void errno_check(const char * file, int line) { + if (errno) { + log_info("errno is %d (%s) at %s:%d", + errno, strerror(errno), file, line); + errno = 0; + } +} + #ifdef STDIO_CP static int stdio_codepage = STDIO_CP; #else diff --git a/src/util/log.h b/src/util/log.h index 06d150751..15872d6dc 100644 --- a/src/util/log.h +++ b/src/util/log.h @@ -28,13 +28,17 @@ extern "C" { int log_level(struct log_t *log, int flags); void log_close(void); - extern void log_fatal(const char *format, ...); - extern void log_error(const char *format, ...); - extern void log_warning(const char *format, ...); - extern void log_debug(const char *format, ...); - extern void log_info(const char *format, ...); - extern void log_printf(FILE * ios, const char *format, ...); + void log_fatal(const char *format, ...); + void log_error(const char *format, ...); + void log_warning(const char *format, ...); + void log_debug(const char *format, ...); + void log_info(const char *format, ...); + void log_printf(FILE * ios, const char *format, ...); + void errno_check(const char *file, int line); +#define ERRNO_CHECK() errno_check(__FILE__, __LINE__) + + #define LOG_CPERROR 0x01 #define LOG_CPWARNING 0x02 #define LOG_CPINFO 0x04 From 34c6222b8f970b3edda4d616c34ee65ba4cdbf43 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 22:44:01 +0200 Subject: [PATCH 127/231] BUG 2436: Fix the E3 tactics bonus for ships. --- src/kernel/ship.c | 1 + src/kernel/ship.h | 4 +++- src/kernel/ship.test.c | 2 +- src/xmlreader.c | 19 ++++++++++++------- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/kernel/ship.c b/src/kernel/ship.c index 08eefbd12..def6dd1fa 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -127,6 +127,7 @@ ship_type *st_get_or_create(const char * name) { st = (ship_type *)calloc(sizeof(ship_type), 1); st->_name = str_strdup(name); st->storm = 1.0; + st->tac_bonus = 1.0; st_register(st); } return st; diff --git a/src/kernel/ship.h b/src/kernel/ship.h index 2ee1a6d3b..c726b4839 100644 --- a/src/kernel/ship.h +++ b/src/kernel/ship.h @@ -36,6 +36,8 @@ extern "C" { #define SFL_NOCOAST 0x04 #define SFL_SPEEDY 0x08 +#define SFL_DEFAULT 0 + typedef struct ship_type { char *_name; @@ -57,7 +59,7 @@ extern "C" { int at_bonus; /* Ver�ndert den Angriffsskill (default: 0) */ int df_bonus; /* Ver�ndert den Verteidigungskill (default: 0) */ - float tac_bonus; + double tac_bonus; struct terrain_type ** coasts; /* coast that this ship can land on */ diff --git a/src/kernel/ship.test.c b/src/kernel/ship.test.c index aa4dc5755..074876dd5 100644 --- a/src/kernel/ship.test.c +++ b/src/kernel/ship.test.c @@ -369,7 +369,7 @@ static void test_stype_defaults(CuTest *tc) { CuAssertPtrEquals(tc, 0, stype->coasts); CuAssertDblEquals(tc, 0.0, stype->damage, 0.0); CuAssertDblEquals(tc, 1.0, stype->storm, 0.0); - CuAssertDblEquals(tc, 0.0, stype->tac_bonus, 0.0); + CuAssertDblEquals(tc, 1.0, stype->tac_bonus, 0.01); CuAssertIntEquals(tc, 0, stype->cabins); CuAssertIntEquals(tc, 0, stype->cargo); CuAssertIntEquals(tc, 0, stype->combat); diff --git a/src/xmlreader.c b/src/xmlreader.c index dfb3b54ea..2108d1841 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -448,14 +448,19 @@ static int parse_ships(xmlDocPtr doc) for (child = node->children; child; child = child->next) { if (strcmp((const char *)child->name, "modifier") == 0) { - double value = xml_fvalue(child, "value", 0.0); propValue = xmlGetProp(child, BAD_CAST "type"); - if (strcmp((const char *)propValue, "tactics") == 0) - st->tac_bonus = (float)value; - else if (strcmp((const char *)propValue, "attack") == 0) - st->at_bonus = (int)value; - else if (strcmp((const char *)propValue, "defense") == 0) - st->df_bonus = (int)value; + if (strcmp((const char *)propValue, "tactics") == 0) { + st->tac_bonus = xml_fvalue(child, "factor", 1.0); + } + else { + int value = xml_ivalue(child, "value", 0); + if (strcmp((const char *)propValue, "attack") == 0) { + st->at_bonus = (int)value; + } + else if (strcmp((const char *)propValue, "defense") == 0) { + st->df_bonus = (int)value; + } + } xmlFree(propValue); } else if (strcmp((const char *)child->name, "construction") == 0) { From b31a1f798c3a05fdbcab39cffaadb1dfb199689f Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 23:00:28 +0200 Subject: [PATCH 128/231] BUG 2346: extract a test for ship tactics bonus. --- src/battle.c | 18 ++++++++++++------ src/battle.h | 1 + src/battle.test.c | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/battle.c b/src/battle.c index fb91a1998..01b865d61 100644 --- a/src/battle.c +++ b/src/battle.c @@ -1539,6 +1539,17 @@ static int get_tactics(const side * as, const side * ds) return result - defense; } +double tactics_chance(const unit *u, int skilldiff) { + double tacch = 0.1 * skilldiff; + if (fval(u->region->terrain, SEA_REGION)) { + const ship *sh = u->ship; + if (sh) { + tacch *= sh->type->tac_bonus; + } + } + return tacch; +} + static troop select_opponent(battle * b, troop at, int mindist, int maxdist) { fighter *af = at.fighter; @@ -1560,12 +1571,7 @@ static troop select_opponent(battle * b, troop at, int mindist, int maxdist) /* percentage chance to get this attack */ if (tactics > 0) { - double tacch = 0.1 * tactics; - if (fval(b->region->terrain, SEA_REGION)) { - ship *sh = at.fighter->unit->ship; - if (sh) - tacch *= sh->type->tac_bonus; - } + double tacch = tactics_chance(af->unit, tactics); if (!chance(tacch)) { dt.fighter = NULL; } diff --git a/src/battle.h b/src/battle.h index f2dd1fea3..c9429a6b3 100644 --- a/src/battle.h +++ b/src/battle.h @@ -270,6 +270,7 @@ extern "C" { const char *sidename(const struct side * s); void battle_message_faction(struct battle * b, struct faction * f, struct message *m); + double tactics_chance(const struct unit *u, int skilldiff); #ifdef __cplusplus } #endif diff --git a/src/battle.test.c b/src/battle.test.c index f293f967d..56ca24ac4 100644 --- a/src/battle.test.c +++ b/src/battle.test.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -665,6 +666,22 @@ static void test_drain_exp(CuTest *tc) test_teardown(); } +static void test_tactics_chance(CuTest *tc) { + unit *u; + ship_type *stype; + + test_setup(); + u = test_create_unit(test_create_faction(NULL), test_create_ocean(0, 0)); + CuAssertDblEquals(tc, 0.1, tactics_chance(u, 1), 0.01); + CuAssertDblEquals(tc, 0.3, tactics_chance(u, 3), 0.01); + stype = test_create_shiptype("brot"); + u->ship = test_create_ship(u->region, stype); + CuAssertDblEquals(tc, 0.2, tactics_chance(u, 2), 0.01); + stype->tac_bonus = 2.0; + CuAssertDblEquals(tc, 0.4, tactics_chance(u, 2), 0.01); + test_teardown(); +} + CuSuite *get_battle_suite(void) { CuSuite *suite = CuSuiteNew(); @@ -681,6 +698,7 @@ CuSuite *get_battle_suite(void) SUITE_ADD_TEST(suite, test_natural_armor); SUITE_ADD_TEST(suite, test_magic_resistance); SUITE_ADD_TEST(suite, test_projectile_armor); + SUITE_ADD_TEST(suite, test_tactics_chance); DISABLE_TEST(suite, test_drain_exp); return suite; } From 704148e4bd13d15183d8f58cbca83f25b55d51f0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 3 May 2018 23:04:32 +0200 Subject: [PATCH 129/231] more object types I haven't handled yet. --- src/exparse.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index 3e7e8b7a8..d9cf52bf8 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -47,6 +47,8 @@ enum { EXP_RACES, EXP_MESSAGES, EXP_STRINGS, + EXP_SPELLS, + EXP_SPELLBOOKS, }; typedef struct parseinfo { @@ -819,6 +821,12 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char else if (xml_strcmp(el, "strings") == 0) { pi->type = EXP_STRINGS; } + else if (xml_strcmp(el, "spells") == 0) { + pi->type = EXP_SPELLS; + } + else if (xml_strcmp(el, "spellbooks") == 0) { + pi->type = EXP_SPELLBOOKS; + } else if (xml_strcmp(el, "races") == 0) { pi->type = EXP_RACES; } From 82ba0e62d4e2641d37579e700ebf43919a2ab7ba Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 17:57:10 +0200 Subject: [PATCH 130/231] fix reading weapon damage. --- src/exparse.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index d9cf52bf8..aca7988fc 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -357,6 +357,24 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch ++pi->errors; } } + else if (xml_strcmp(el, "damage") == 0) { + weapon_type *wtype = rtype->wtype; + int i, pos = 0; + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "type") == 0) { + /* damage vs. rider(1) or not(0)? */ + if (xml_strcmp(attr[i + 1], "rider") == 0) { + pos = 1; + } + } + else if (xml_strcmp(attr[i], "value") == 0) { + wtype->damage[pos] = str_strdup(attr[i + 1]); + } + else { + handle_bad_input(pi, el, NULL); + } + } + } else { handle_bad_input(pi, el, NULL); } @@ -582,29 +600,6 @@ static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char ** pi->type = EXP_WEAPON; handle_weapon(pi, el, attr); } - else if (rtype->wtype) { - weapon_type *wtype = rtype->wtype; - if (xml_strcmp(el, "damage") == 0) { - int i, pos = 0; - for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], "type") == 0) { - /* damage vs. rider(1) or not(0)? */ - if (xml_strcmp(attr[i + 1], "rider") == 0) { - pos = 1; - } - } - else if (xml_strcmp(attr[i], "value") == 0) { - wtype->damage[pos] = str_strdup(attr[i + 1]); - } - else { - handle_bad_input(pi, el, NULL); - } - } - } - else { - handle_bad_input(pi, el, NULL); - } - } else { handle_bad_input(pi, el, NULL); } @@ -1028,9 +1023,9 @@ int exparse_readfile(const char * filename) { XML_SetUserData(xp, &pi); memset(&pi, 0, sizeof(pi)); for (;;) { - size_t len = (int) fread(buf, 1, sizeof(buf), F); + size_t len = (int)fread(buf, 1, sizeof(buf), F); int done; - + if (ferror(F)) { log_error("read error in %s", filename); err = -2; @@ -1039,9 +1034,9 @@ int exparse_readfile(const char * filename) { done = feof(F); if (XML_Parse(xp, buf, len, done) == XML_STATUS_ERROR) { log_error("parse error at line %" XML_FMT_INT_MOD " of %s: %" XML_FMT_STR, - XML_GetCurrentLineNumber(xp), - filename, - XML_ErrorString(XML_GetErrorCode(xp))); + XML_GetCurrentLineNumber(xp), + filename, + XML_ErrorString(XML_GetErrorCode(xp))); err = -1; break; } From 4e2171ace95932c48acff48dbf812e2e2bdf405d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 17:58:26 +0200 Subject: [PATCH 131/231] fix finding resources if xml is not processed in predetermined order. --- src/xmlreader.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 6f7447bae..6fc87115a 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -386,7 +386,7 @@ static int parse_buildings(xmlDocPtr doc) propValue = xmlGetProp(node, BAD_CAST "type"); assert(propValue != NULL); - mt->rtype = rt_find((const char *)propValue); + mt->rtype = rt_get_or_create((const char *)propValue); assert(mt->rtype != NULL); xmlFree(propValue); @@ -1219,12 +1219,7 @@ static int parse_spells(xmlDocPtr doc) xmlNodePtr node = result->nodesetval->nodeTab[k]; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue); - rtype = rt_find((const char *)propValue); - if (!rtype) { - log_error("spell %s uses unknown component %s.\n", sp->sname, (const char *)propValue); - xmlFree(propValue); - continue; - } + rtype = rt_get_or_create((const char *)propValue); component->type = rtype; xmlFree(propValue); component->amount = xml_ivalue(node, "amount", 1); @@ -1708,11 +1703,10 @@ static int parse_strings(xmlDocPtr doc) void register_xmlreader(void) { - xml_register_callback(parse_races); xml_register_callback(parse_resources); - xml_register_callback(parse_buildings); /* requires resources */ xml_register_callback(parse_ships); /* requires resources, terrains */ + xml_register_callback(parse_races); xml_register_callback(parse_equipment); /* requires resources */ xml_register_callback(parse_spells); /* requires resources */ From 85509cdf65de22280c184855e177308ec0688b77 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 18:41:59 +0200 Subject: [PATCH 132/231] fix some bugs in reading weapons. --- res/adamantium.xml | 4 ++-- res/core/resources/laen.xml | 6 +++--- src/exparse.c | 33 +++++++++++++++++++++++++-------- src/xmlreader.c | 2 ++ 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/res/adamantium.xml b/res/adamantium.xml index 2e2311fcd..2bea686fe 100644 --- a/res/adamantium.xml +++ b/res/adamantium.xml @@ -6,8 +6,8 @@ - - + + diff --git a/res/core/resources/laen.xml b/res/core/resources/laen.xml index 1c14c2eff..95362280f 100644 --- a/res/core/resources/laen.xml +++ b/res/core/resources/laen.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/src/exparse.c b/src/exparse.c index aca7988fc..d00839283 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -277,7 +277,27 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch assert(rtype && rtype->wtype); if (xml_strcmp(el, "function") == 0) { - ++pi->errors; + const XML_Char *name = NULL, *type = NULL; + int i; + + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "name") == 0) { + type = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "value") == 0) { + name = attr[i + 1]; + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + if (type && xml_strcmp(type, "attack") == 0) { + pf_generic fun = get_function(name); + rtype->wtype->attack = (wtype_attack)fun; + } + else { + handle_bad_input(pi, el, attr[i]); + } } else if (xml_strcmp(el, "modifier") == 0) { const XML_Char *type = NULL; @@ -354,7 +374,7 @@ static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Ch mod->race_mask = race_mask; } else { - ++pi->errors; + handle_bad_input(pi, el, NULL); } } else if (xml_strcmp(el, "damage") == 0) { @@ -566,14 +586,14 @@ static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char ** } } } + else if (xml_strcmp(el, "modifier") == 0) { + handle_modifier(pi, el, attr); + } else if (rtype->itype) { item_type *itype = rtype->itype; if (xml_strcmp(el, "construction") == 0) { itype->construction = parse_construction(pi, el, attr); } - else if (xml_strcmp(el, "modifier") == 0) { - handle_modifier(pi, el, attr); - } else if (xml_strcmp(el, "requirement") == 0) { assert(itype->construction); handle_requirement(pi, el, attr); @@ -866,9 +886,6 @@ static void end_weapon(parseinfo *pi, const XML_Char *el) { nwmods = 0; } } - else { - handle_bad_input(pi, el, NULL); - } } static void end_resources(parseinfo *pi, const XML_Char *el) { diff --git a/src/xmlreader.c b/src/xmlreader.c index 6fc87115a..41b8fef78 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1703,9 +1703,11 @@ static int parse_strings(xmlDocPtr doc) void register_xmlreader(void) { +#if 0 xml_register_callback(parse_resources); xml_register_callback(parse_buildings); /* requires resources */ xml_register_callback(parse_ships); /* requires resources, terrains */ +#endif xml_register_callback(parse_races); xml_register_callback(parse_equipment); /* requires resources */ From ad0f83dcca26add4449264ee8da87d71835ed3e5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 18:48:14 +0200 Subject: [PATCH 133/231] some xmlreader code still required that resources get loaded first. --- src/kernel/item.c | 15 +++++++-------- src/xmlreader.c | 14 ++++++++------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/kernel/item.c b/src/kernel/item.c index 843107737..8afc6a5a9 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -243,17 +243,16 @@ item_type *it_find(const char *zname) } item_type *it_get_or_create(resource_type *rtype) { - item_type * itype; assert(rtype); - itype = it_find(rtype->_name); - if (!itype) { + if (!rtype->itype) { + item_type * itype; itype = (item_type *)calloc(sizeof(item_type), 1); + itype->rtype = rtype; + rtype->uchange = res_changeitem; + rtype->itype = itype; + rtype->flags |= RTF_ITEM; } - itype->rtype = rtype; - rtype->uchange = res_changeitem; - rtype->itype = itype; - rtype->flags |= RTF_ITEM; - return itype; + return rtype->itype; } static void lt_register(luxury_type * ltype) diff --git a/src/xmlreader.c b/src/xmlreader.c index 41b8fef78..48e0717f6 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -864,10 +864,12 @@ static void add_items(equipment * eq, xmlNodeSetPtr nsetItems) xmlNodePtr node = nsetItems->nodeTab[i]; xmlChar *propValue; const struct item_type *itype; + struct resource_type *rtype; propValue = xmlGetProp(node, BAD_CAST "name"); assert(propValue != NULL); - itype = it_find((const char *)propValue); + rtype = rt_get_or_create((const char *)propValue); + itype = it_get_or_create(rtype); xmlFree(propValue); if (itype != NULL) { propValue = xmlGetProp(node, BAD_CAST "amount"); @@ -1705,14 +1707,14 @@ void register_xmlreader(void) { #if 0 xml_register_callback(parse_resources); - xml_register_callback(parse_buildings); /* requires resources */ - xml_register_callback(parse_ships); /* requires resources, terrains */ + xml_register_callback(parse_buildings); + xml_register_callback(parse_ships); #endif xml_register_callback(parse_races); - xml_register_callback(parse_equipment); /* requires resources */ + xml_register_callback(parse_equipment); - xml_register_callback(parse_spells); /* requires resources */ - xml_register_callback(parse_spellbooks); /* requires spells */ + xml_register_callback(parse_spells); + xml_register_callback(parse_spellbooks); xml_register_callback(parse_strings); xml_register_callback(parse_messages); From 53f8b39e6e55436f61c2fdbf756201d335db0d95 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 18:50:44 +0200 Subject: [PATCH 134/231] gcc and clang complain about unused function. --- src/xmlreader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 48e0717f6..347b3f6eb 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1705,7 +1705,7 @@ static int parse_strings(xmlDocPtr doc) void register_xmlreader(void) { -#if 0 +#ifdef _MSC_VER /* gcc and clang complain about unused function */ xml_register_callback(parse_resources); xml_register_callback(parse_buildings); xml_register_callback(parse_ships); From dca99ec79d2441ef68f580630a0f248d5e92f8c8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 4 May 2018 18:53:35 +0200 Subject: [PATCH 135/231] negative, sir! --- src/xmlreader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 347b3f6eb..79c1ea094 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1705,7 +1705,7 @@ static int parse_strings(xmlDocPtr doc) void register_xmlreader(void) { -#ifdef _MSC_VER /* gcc and clang complain about unused function */ +#ifndef _MSC_VER /* gcc and clang complain about unused function */ xml_register_callback(parse_resources); xml_register_callback(parse_buildings); xml_register_callback(parse_ships); From 3e2aa5b1a87390a6ea75c53f855f4a1917f25eca Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 5 May 2018 06:05:50 +0200 Subject: [PATCH 136/231] start ingesting spellbooks. --- src/exparse.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index d00839283..0e5e6e8bf 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -11,6 +11,7 @@ #include "kernel/race.h" #include "kernel/resources.h" #include "kernel/ship.h" +#include "kernel/spellbook.h" #include "kernel/terrain.h" #include "util/functions.h" @@ -272,6 +273,42 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } +static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + spellbook * sb = (spellbook *)pi->object; + if (xml_strcmp(el, "spellbook") == 0) { + const XML_Char *name = attr_get(attr, "name"); + + if (name) { + pi->object = sb = get_spellbook(name); + } + else { + handle_bad_input(pi, el, NULL); + } + } + if (xml_strcmp(el, "entry") == 0) { + int i, level; + const XML_Char *name = NULL; + + assert(sb); + for (i = 0; attr[i]; i += 2) { + if (xml_strcmp(attr[i], "name") == 0) { + name = attr[i + 1]; + } + else if (xml_strcmp(attr[i], "level") == 0) { + level = xml_int(attr[i + 1]); + } + else { + handle_bad_input(pi, el, attr[i]); + } + } + + handle_bad_input(pi, el, NULL); + } + else { + handle_bad_input(pi, el, NULL); + } +} + static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; @@ -863,6 +900,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_WEAPON: start_weapon(pi, el, attr); break; + case EXP_SPELLBOOKS: + start_spellbooks(pi, el, attr); + break; default: /* not implemented */ handle_bad_input(pi, el, NULL); From d568e7949033ba87da920d5b136dbf420ba444b5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 5 May 2018 07:38:11 +0200 Subject: [PATCH 137/231] spellbooks contain spellref, not spell *. for order-independent load from XML. --- src/attributes/seenspell.c | 13 ++++++------ src/attributes/seenspell.h | 2 +- src/battle.c | 2 +- src/bindings.c | 2 +- src/creport.c | 7 ++++--- src/kernel/spell.c | 41 ++++++++++++++++++++++++++++++------- src/kernel/spell.h | 6 +++++- src/kernel/spell.test.c | 3 ++- src/kernel/spellbook.c | 17 ++++++++++++--- src/kernel/spellbook.h | 6 ++++-- src/kernel/spellbook.test.c | 2 +- src/laws.c | 5 +++-- src/magic.c | 25 ++++++++++++---------- src/magic.test.c | 2 +- src/report.c | 4 ++-- src/reports.c | 3 ++- src/xmlreader.c | 14 +++++-------- 17 files changed, 101 insertions(+), 53 deletions(-) diff --git a/src/attributes/seenspell.c b/src/attributes/seenspell.c index c2b9c7c75..82bdf22ca 100644 --- a/src/attributes/seenspell.c +++ b/src/attributes/seenspell.c @@ -107,14 +107,14 @@ static int cmp_spell(const void *a, const void *b) { return strcmp(spa->sname, spb->sname); } -static bool set_seen(attrib **alist, struct spell *sp) { +static bool set_seen(attrib **alist, const struct spell *sp) { attrib *a = a_find(*alist, &at_seenspells); selist **sl; if (!a) { a = a_add(alist, a_new(&at_seenspells)); } sl = (selist **)&a->data.v; - return selist_set_insert(sl, sp, cmp_spell); + return selist_set_insert(sl, (void *)sp, cmp_spell); } static void upgrade_seenspell(attrib **alist, attrib *abegin) { @@ -123,7 +123,7 @@ static void upgrade_seenspell(attrib **alist, attrib *abegin) { ak = a_find(*alist, &at_seenspells); if (ak) alist = &ak; for (a = abegin; a && a->type == abegin->type; a = a->next) { - set_seen(alist, (struct spell *)a->data.v); + set_seen(alist, (const struct spell *)a->data.v); } } @@ -156,11 +156,12 @@ attrib_type at_reportspell = { "reportspell", NULL }; -void show_spell(faction *f, const spellbook_entry *sbe) +void show_spell(faction *f, spellbook_entry *sbe) { - if (!already_seen(f, sbe->sp)) { + const spell *sp = spellref_get(&sbe->spref); + if (!already_seen(f, sp)) { /* mark the spell as seen by this faction: */ - if (set_seen(&f->attribs, sbe->sp)) { + if (set_seen(&f->attribs, sp)) { /* add the spell to the report: */ attrib * a = a_new(&at_reportspell); a->data.v = (void *)sbe; diff --git a/src/attributes/seenspell.h b/src/attributes/seenspell.h index cdfb36e48..a8bb35c4d 100644 --- a/src/attributes/seenspell.h +++ b/src/attributes/seenspell.h @@ -6,7 +6,7 @@ struct spellbook_entry; struct faction; struct spell; -void show_spell(struct faction * f, const struct spellbook_entry *sbe); +void show_spell(struct faction * f, struct spellbook_entry *sbe); void reset_seen_spells(struct faction * f, const struct spell *sp); extern struct attrib_type at_reportspell; diff --git a/src/battle.c b/src/battle.c index 01b865d61..1e6692a68 100644 --- a/src/battle.c +++ b/src/battle.c @@ -1870,7 +1870,7 @@ static void do_extra_spell(troop at, const att * a) const spell *sp = spellref_get(a->data.sp); if (!sp) { - log_error("no such spell: '%s'", a->data.sp->name); + log_error("no such spell: '%s'", a->data.sp->_name); } else { assert(a->level > 0); diff --git a/src/bindings.c b/src/bindings.c index 5797f7cb5..f9f51ded3 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -860,7 +860,7 @@ static int tolua_get_spell_name(lua_State * L) static int tolua_get_spell_entry_name(lua_State * L) { spellbook_entry *self = (spellbook_entry*)tolua_tousertype(L, 1, 0); - lua_pushstring(L, self->sp->sname); + lua_pushstring(L, spellref_name(&self->spref)); return 1; } diff --git a/src/creport.c b/src/creport.c index bba824538..4fc1cdd99 100644 --- a/src/creport.c +++ b/src/creport.c @@ -758,7 +758,7 @@ static void cr_output_spells(stream *out, const unit * u, int maxlevel) for (ql = book->spells, qi = 0; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry * sbe = (spellbook_entry *)selist_get(ql, qi); if (sbe->level <= maxlevel) { - spell * sp = sbe->sp; + const spell *sp = spellref_get(&sbe->spref); const char *name = translate(mkname("spell", sp->sname), spell_name(sp, f->locale)); if (!header) { stream_printf(out, "SPRUECHE\n"); @@ -1083,7 +1083,7 @@ static void cr_find_address(FILE * F, const faction * uf, selist * addresses) /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ -static void cr_reportspell(FILE * F, spell * sp, int level, const struct locale *lang) +static void cr_reportspell(FILE * F, const spell * sp, int level, const struct locale *lang) { int k; const char *name = @@ -1673,7 +1673,8 @@ report_computer(const char *filename, report_context * ctx, const char *bom) a = a_find(f->attribs, &at_reportspell); while (a && a->type == &at_reportspell) { spellbook_entry *sbe = (spellbook_entry *)a->data.v; - cr_reportspell(F, sbe->sp, sbe->level, f->locale); + const spell *sp = spellref_get(&sbe->spref); + cr_reportspell(F, sp, sbe->level, f->locale); a = a->next; } for (a = a_find(f->attribs, &at_showitem); a && a->type == &at_showitem; diff --git a/src/kernel/spell.c b/src/kernel/spell.c index 785f270b3..41e56babd 100644 --- a/src/kernel/spell.c +++ b/src/kernel/spell.c @@ -180,19 +180,37 @@ struct spellref *spellref_create(spell *sp, const char *name) if (sp) { spref->sp = sp; - spref->name = str_strdup(sp->sname); + spref->_name = str_strdup(sp->sname); } else if (name) { - spref->name = str_strdup(name); + spref->_name = str_strdup(name); spref->sp = NULL; } return spref; } +void spellref_init(spellref *spref, spell *sp, const char *name) +{ + if (sp) { + spref->sp = sp; + spref->_name = str_strdup(sp->sname); + } + else if (name) { + spref->_name = str_strdup(name); + spref->sp = NULL; + } +} + +void spellref_done(spellref *spref) { + if (spref) { + free(spref->_name); + } +} + void spellref_free(spellref *spref) { if (spref) { - free(spref->name); + spellref_done(spref); free(spref); } } @@ -200,12 +218,21 @@ void spellref_free(spellref *spref) struct spell *spellref_get(struct spellref *spref) { if (!spref->sp) { - assert(spref->name); - spref->sp = find_spell(spref->name); + assert(spref->_name); + spref->sp = find_spell(spref->_name); if (spref->sp) { - free(spref->name); - spref->name = NULL; + free(spref->_name); + spref->_name = NULL; } } return spref->sp; } + +const char *spellref_name(const struct spellref *spref) +{ + if (spref->_name) { + return spref->_name; + } + assert(spref->sp); + return spref->sp->sname; +} diff --git a/src/kernel/spell.h b/src/kernel/spell.h index 17a565fa6..8b155f89b 100644 --- a/src/kernel/spell.h +++ b/src/kernel/spell.h @@ -43,7 +43,7 @@ extern "C" { } spell; typedef struct spellref { - char * name; + char * _name; struct spell *sp; } spellref; @@ -56,6 +56,10 @@ extern "C" { struct spellref *spellref_create(struct spell *sp, const char *name); void spellref_free(struct spellref *spref); struct spell *spellref_get(struct spellref *spref); + const char *spellref_name(const struct spellref *spref); + + void spellref_init(struct spellref *spref, struct spell *sp, const char *name); + void spellref_done(struct spellref *spref); int sp_antimagiczone(struct castorder *co); diff --git a/src/kernel/spell.test.c b/src/kernel/spell.test.c index 5502069d1..622780e20 100644 --- a/src/kernel/spell.test.c +++ b/src/kernel/spell.test.c @@ -58,8 +58,9 @@ static void test_spellref(CuTest *tc) ref = spellref_create(NULL, "hodor"); CuAssertPtrNotNull(tc, ref); CuAssertPtrEquals(tc, NULL, ref->sp); - CuAssertStrEquals(tc, "hodor", ref->name); + CuAssertStrEquals(tc, "hodor", ref->_name); CuAssertPtrEquals(tc, NULL, spellref_get(ref)); + CuAssertStrEquals(tc, "hodor", spellref_name(ref)); sp = create_spell("hodor"); CuAssertPtrNotNull(tc, sp); CuAssertPtrEquals(tc, sp, spellref_get(ref)); diff --git a/src/kernel/spellbook.c b/src/kernel/spellbook.c index ae5387f11..868f9757c 100644 --- a/src/kernel/spellbook.c +++ b/src/kernel/spellbook.c @@ -67,13 +67,23 @@ void write_spellbook(const struct spellbook *book, struct storage *store) if (book) { for (ql = book->spells, qi = 0; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - WRITE_TOK(store, sbe->sp->sname); + WRITE_TOK(store, spellref_name(&sbe->spref)); WRITE_INT(store, sbe->level); } } WRITE_TOK(store, "end"); } +void spellbook_addref(spellbook *sb, const char *name, int level) { + spellbook_entry * sbe; + + assert(sb && name && level > 0); + sbe = (spellbook_entry *)malloc(sizeof(spellbook_entry)); + spellref_init(&sbe->spref, NULL, name); + sbe->level = level; + selist_push(&sb->spells, sbe); +} + void spellbook_add(spellbook *sb, spell *sp, int level) { spellbook_entry * sbe; @@ -85,7 +95,7 @@ void spellbook_add(spellbook *sb, spell *sp, int level) } #endif sbe = (spellbook_entry *)malloc(sizeof(spellbook_entry)); - sbe->sp = sp; + spellref_init(&sbe->spref, sp, NULL); sbe->level = level; selist_push(&sb->spells, sbe); } @@ -98,6 +108,7 @@ void spellbook_clear(spellbook *sb) assert(sb); for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); + spellref_done(&sbe->spref); free(sbe); } selist_free(sb->spells); @@ -127,7 +138,7 @@ spellbook_entry * spellbook_get(spellbook *sb, const struct spell *sp) for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - if (sbe->sp==sp) { + if (spellref_get(&sbe->spref) == sp) { return sbe; } } diff --git a/src/kernel/spellbook.h b/src/kernel/spellbook.h index fb3438a8b..3894f9b44 100644 --- a/src/kernel/spellbook.h +++ b/src/kernel/spellbook.h @@ -19,17 +19,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_KRNL_SPELLBOOK_H #define H_KRNL_SPELLBOOK_H +#include "spell.h" + #ifdef __cplusplus extern "C" { #endif - struct spell; struct storage; struct gamedata; struct selist; typedef struct spellbook_entry { - struct spell *sp; + spellref spref; int level; } spellbook_entry; @@ -45,6 +46,7 @@ extern "C" { void write_spellbook(const struct spellbook *book, struct storage *store); void spellbook_add(spellbook *sbp, struct spell *sp, int level); + void spellbook_addref(spellbook *sb, const char *name, int level); int spellbook_foreach(spellbook *sb, int(*callback)(spellbook_entry *, void *), void * data); void spellbook_clear(spellbook *sb); spellbook_entry * spellbook_get(spellbook *sb, const struct spell *sp); diff --git a/src/kernel/spellbook.test.c b/src/kernel/spellbook.test.c index 37f20cced..22ea7c491 100644 --- a/src/kernel/spellbook.test.c +++ b/src/kernel/spellbook.test.c @@ -40,7 +40,7 @@ void test_named_spellbooks(CuTest * tc) sbe = spellbook_get(sb, sp); CuAssertPtrNotNull(tc, sbe); CuAssertIntEquals(tc, 1, sbe->level); - CuAssertPtrEquals(tc, sp, sbe->sp); + CuAssertPtrEquals(tc, sp, spellref_get(&sbe->spref)); spellbook_foreach(sb, count_spell_cb, &counter); CuAssertIntEquals(tc, 1, counter); diff --git a/src/laws.c b/src/laws.c index 1887d8657..b24fa5b3b 100644 --- a/src/laws.c +++ b/src/laws.c @@ -3298,8 +3298,9 @@ static void copy_spells(const spellbook * src, spellbook * dst, int maxlevel) for (qi = 0, ql = src->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry * sbe = (spellbook_entry *)selist_get(ql, qi); if (sbe->level <= maxlevel) { - if (!spellbook_get(dst, sbe->sp)) { - spellbook_add(dst, sbe->sp, sbe->level); + spell *sp = spellref_get(&sbe->spref); + if (!spellbook_get(dst, sp)) { + spellbook_add(dst, sp, sbe->level); } } } diff --git a/src/magic.c b/src/magic.c index 1865b4f9e..a00a29527 100644 --- a/src/magic.c +++ b/src/magic.c @@ -375,13 +375,16 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells sbe = 0; } else { - if (f->spellbook && spellbook_get(f->spellbook, sbe->sp)) { - /* already have this spell, remove it from the list of candidates */ - commonspells[spellno] = commonspells[--numspells]; - if (maxspell > numspells) { - maxspell = numspells; + if (f->spellbook) { + const spell *sp = spellref_get(&sbe->spref); + if (sp && spellbook_get(f->spellbook, sp)) { + /* already have this spell, remove it from the list of candidates */ + commonspells[spellno] = commonspells[--numspells]; + if (maxspell > numspells) { + maxspell = numspells; + } + sbe = 0; } - sbe = 0; } } } @@ -390,7 +393,7 @@ void pick_random_spells(faction * f, int level, spellbook * book, int num_spells if (!f->spellbook) { f->spellbook = create_spellbook(0); } - spellbook_add(f->spellbook, sbe->sp, sbe->level); + spellbook_add(f->spellbook, spellref_get(&sbe->spref), sbe->level); commonspells[spellno] = commonspells[--numspells]; } } @@ -2840,14 +2843,14 @@ static void select_spellbook(void **tokens, spellbook *sb, const struct locale * for (qi = 0, ql = sb->spells; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry *sbe = (spellbook_entry *)selist_get(ql, qi); - - const char *n = spell_name(sbe->sp, lang); + const spell *sp = spellref_get(&sbe->spref); + const char *n = spell_name(sp, lang); if (!n) { - log_error("no translation in locale %s for spell %s\n", locale_name(lang), sbe->sp->sname); + log_error("no translation in locale %s for spell %s\n", locale_name(lang), sp->sname); } else { variant token; - token.v = sbe->sp; + token.v = (void *)sp; addtoken((struct tnode **)tokens, n, token); } } diff --git a/src/magic.test.c b/src/magic.test.c index e68f3ca21..5533d93ec 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -86,7 +86,7 @@ static void test_spellbooks(CuTest * tc) CuAssertPtrNotNull(tc, sp); entry = spellbook_get(herp, sp); CuAssertPtrNotNull(tc, entry); - CuAssertPtrEquals(tc, sp, entry->sp); + CuAssertPtrEquals(tc, sp, spellref_get(&entry->spref)); test_teardown(); test_setup(); diff --git a/src/report.c b/src/report.c index adea79257..d894f1566 100644 --- a/src/report.c +++ b/src/report.c @@ -249,7 +249,7 @@ void nr_spell_syntax(struct stream *out, spellbook_entry * sbe, const struct loc char buf[4096]; char *bufp = buf; size_t size = sizeof(buf) - 1; - const spell * sp = sbe->sp; + const spell *sp = spellref_get(&sbe->spref); const char *params = sp->parameter; if (sp->sptyp & ISCOMBATSPELL) { @@ -439,7 +439,7 @@ void nr_spell(struct stream *out, spellbook_entry * sbe, const struct locale *la char buf[4096]; char *startp, *bufp = buf; size_t size = sizeof(buf) - 1; - const spell * sp = sbe->sp; + const spell *sp = spellref_get(&sbe->spref); newline(out); centre(out, spell_name(sp, lang), true); diff --git a/src/reports.c b/src/reports.c index f5b7f5531..da1c88bdc 100644 --- a/src/reports.c +++ b/src/reports.c @@ -870,6 +870,7 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf, for (header = 0, qi = 0; ql; selist_advance(&ql, &qi, 1)) { spellbook_entry * sbe = (spellbook_entry *)selist_get(ql, qi); + const spell *sp = spellref_get(&sbe->spref); if (sbe->level <= maxlevel) { if (!header) { n = snprintf(bufp, size, ", %s: ", LOC(lang, "nr_spells")); @@ -882,7 +883,7 @@ bufunit(const faction * f, const unit * u, seen_mode mode, char *buf, WARN_STATIC_BUFFER(); } /* TODO: no need to deref the spellref here (spref->name is good) */ - bufp = STRLCPY(bufp, spell_name(sbe->sp, lang), size); + bufp = STRLCPY(bufp, spell_name(sp, lang), size); } } diff --git a/src/xmlreader.c b/src/xmlreader.c index 2108d1841..cdaf6b809 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1093,17 +1093,12 @@ static int parse_spellbooks(xmlDocPtr doc) if (result->nodesetval->nodeNr > 0) { for (k = 0; k != result->nodesetval->nodeNr; ++k) { xmlNodePtr node = result->nodesetval->nodeTab[k]; - spell * sp = 0; int level = xml_ivalue(node, "level", -1); - propValue = xmlGetProp(node, BAD_CAST "spell"); - if (propValue) { - sp = find_spell((const char *)propValue); + if (level > 0 && (propValue = xmlGetProp(node, BAD_CAST "spell")) != NULL) { + spellbook_addref(sb, (const char *)propValue, level); xmlFree(propValue); } - if (sp && level > 0) { - spellbook_add(sb, sp, level); - } else { log_error("invalid entry at index '%d' in spellbook '%s'\n", k, sb->name); } @@ -1510,7 +1505,8 @@ static int parse_races(xmlDocPtr doc) if (attack->data.sp) { attack->level = xml_ivalue(node, "level", 0); if (attack->level <= 0) { - log_error("magical attack '%s' for race '%s' needs a level: %d\n", attack->data.sp->name, rc->_name, attack->level); + log_error("magical attack '%s' for race '%s' needs a level: %d\n", + spellref_name(attack->data.sp), rc->_name, attack->level); } } } @@ -1709,8 +1705,8 @@ void register_xmlreader(void) xml_register_callback(parse_ships); /* requires resources, terrains */ xml_register_callback(parse_equipment); /* requires resources */ - xml_register_callback(parse_spells); /* requires resources */ xml_register_callback(parse_spellbooks); /* requires spells */ + xml_register_callback(parse_spells); /* requires resources */ xml_register_callback(parse_strings); xml_register_callback(parse_messages); From dc3918f4a647d49389a57a3eed8957b640246121 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 5 May 2018 07:48:38 +0200 Subject: [PATCH 138/231] read spellbook (expat) --- src/exparse.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 0e5e6e8bf..bbb1155cc 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -285,13 +285,13 @@ static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XM handle_bad_input(pi, el, NULL); } } - if (xml_strcmp(el, "entry") == 0) { - int i, level; + else if (xml_strcmp(el, "entry") == 0) { + int i, level = 0; const XML_Char *name = NULL; assert(sb); for (i = 0; attr[i]; i += 2) { - if (xml_strcmp(attr[i], "name") == 0) { + if (xml_strcmp(attr[i], "spell") == 0) { name = attr[i + 1]; } else if (xml_strcmp(attr[i], "level") == 0) { @@ -301,8 +301,12 @@ static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XM handle_bad_input(pi, el, attr[i]); } } - - handle_bad_input(pi, el, NULL); + if (name && level > 0) { + spellbook_addref(sb, name, level); + } + else { + handle_bad_input(pi, el, NULL); + } } else { handle_bad_input(pi, el, NULL); @@ -876,8 +880,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char else if (xml_strcmp(el, "spells") == 0) { pi->type = EXP_SPELLS; } - else if (xml_strcmp(el, "spellbooks") == 0) { + else if (xml_strcmp(el, "spellbook") == 0) { pi->type = EXP_SPELLBOOKS; + start_spellbooks(pi, el, attr); } else if (xml_strcmp(el, "races") == 0) { pi->type = EXP_RACES; From cd2435dbb070f45fabd529c243919a5b01eb0670 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 09:00:00 +0200 Subject: [PATCH 139/231] spell xml does not define an index attribute --- res/core/spells.xml | 40 ++--- res/e3a/spells.xml | 270 ++++++++++++++++----------------- res/eressea/spells.xml | 330 ++++++++++++++++++++--------------------- src/xmlreader.c | 2 +- 4 files changed, 321 insertions(+), 321 deletions(-) diff --git a/res/core/spells.xml b/res/core/spells.xml index fba087855..7a6d9a13e 100644 --- a/res/core/spells.xml +++ b/res/core/spells.xml @@ -2,115 +2,115 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/res/e3a/spells.xml b/res/e3a/spells.xml index f3edbd9f6..c6f466eb4 100644 --- a/res/e3a/spells.xml +++ b/res/e3a/spells.xml @@ -3,99 +3,99 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -103,87 +103,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -191,185 +191,185 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -441,211 +441,211 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 7680f2f3b..2adc132e5 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -3,608 +3,608 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/xmlreader.c b/src/xmlreader.c index cdaf6b809..dcf51707b 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1166,7 +1166,7 @@ static int parse_spells(xmlDocPtr doc) xmlFree(propValue); /* level, rank and flags */ #endif - sp->rank = (char)xml_ivalue(node, "rank", -1); + sp->rank = (char)xml_ivalue(node, "rank", 0); if (xml_bvalue(node, "los", false)) sp->sptyp |= TESTCANSEE; /* must see or have contact */ if (!xml_bvalue(node, "target_global", false)) From a44085de7a25f5a19ac0d7aea2b471ba834b00b2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 13:57:28 +0200 Subject: [PATCH 140/231] spell flags, rearranged --- src/exparse.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/magic.h | 36 ++++++++++++++++++------------------ src/xmlreader.c | 4 ++-- 3 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index bbb1155cc..702c80557 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -273,6 +273,51 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } +static void XMLCALL start_spells(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + const char *flag_names[] = { + "far", "variable", "ocean", "ship", "los", + "unittarget", "shiptarget", "buildingtarget", "regiontarget", NULL }; + if (xml_strcmp(el, "spell") == 0) { + spell *sp; + const XML_Char *name = NULL, *syntax = NULL, *parameter = NULL; + int i, rank = 0, flags = 0; + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "name") == 0) { + name = val; + } + else if (xml_strcmp(key, "syntax") == 0) { + syntax = val; + } + else if (xml_strcmp(key, "parameters") == 0) { + parameter = val; + } + else if (xml_strcmp(key, "rank") == 0) { + rank = xml_int(val); + } + else if (xml_strcmp(key, "combat") == 0) { + int mode = PRECOMBATSPELL; + int k = xml_int(val); + if (k > 1 && k <= 3) { + mode = mode << (k - 1); + } + flags |= mode; + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(pi, el, attr[i]); + } + } + pi->object = sp = create_spell(name); + sp->rank = rank; + sp->syntax = str_strdup(syntax); + sp->parameter = str_strdup(parameter); + sp->sptyp = flags; + } + else { + handle_bad_input(pi, el, NULL); + } +} + static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { spellbook * sb = (spellbook *)pi->object; if (xml_strcmp(el, "spellbook") == 0) { @@ -908,6 +953,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_SPELLBOOKS: start_spellbooks(pi, el, attr); break; + case EXP_SPELLS: + start_spells(pi, el, attr); + break; default: /* not implemented */ handle_bad_input(pi, el, NULL); diff --git a/src/magic.h b/src/magic.h index 4a00a7b13..fd87428ae 100644 --- a/src/magic.h +++ b/src/magic.h @@ -154,28 +154,28 @@ extern "C" { #define FARCASTING (1<<0) /* ZAUBER [struct region x y] */ #define SPELLLEVEL (1<<1) /* ZAUBER [STUFE x] */ - /* ID's knnen zu drei unterschiedlichen Entitten gehren: Einheiten, - * Gebuden und Schiffen. */ -#define UNITSPELL (1<<2) /* ZAUBER .. [ ..] */ -#define SHIPSPELL (1<<3) /* ZAUBER .. [ ..] */ -#define BUILDINGSPELL (1<<4) /* ZAUBER .. [ ..] */ -#define REGIONSPELL (1<<5) /* wirkt auf struct region */ +#define OCEANCASTABLE (1<<2) /* Knnen auch nicht-Meermenschen auf + hoher See zaubern */ +#define ONSHIPCAST (1<<3) /* kann auch auf von Land ablegenden + Schiffen stehend gezaubert werden */ +#define TESTCANSEE (1<<4) /* alle Zielunits auf cansee prfen */ -#define PRECOMBATSPELL (1<<7) /* PRKAMPFZAUBER .. */ -#define COMBATSPELL (1<<8) /* KAMPFZAUBER .. */ -#define POSTCOMBATSPELL (1<<9) /* POSTKAMPFZAUBER .. */ + /* ID's knnen zu drei unterschiedlichen Entitten gehren: Einheiten, + * Gebuden und Schiffen. */ +#define UNITSPELL (1<<5) /* ZAUBER .. [ ..] */ +#define SHIPSPELL (1<<6) /* ZAUBER .. [ ..] */ +#define BUILDINGSPELL (1<<7) /* ZAUBER .. [ ..] */ +#define REGIONSPELL (1<<8) /* wirkt auf struct region */ + +#define PRECOMBATSPELL (1<<9) /* PRKAMPFZAUBER .. */ +#define COMBATSPELL (1<<10) /* KAMPFZAUBER .. */ +#define POSTCOMBATSPELL (1<<11) /* POSTKAMPFZAUBER .. */ #define ISCOMBATSPELL (PRECOMBATSPELL|COMBATSPELL|POSTCOMBATSPELL) -#define OCEANCASTABLE (1<<10) /* Knnen auch nicht-Meermenschen auf - hoher See zaubern */ -#define ONSHIPCAST (1<<11) /* kann auch auf von Land ablegenden - Schiffen stehend gezaubert werden */ - /* */ -#define NOTFAMILIARCAST (1<<12) -#define TESTRESISTANCE (1<<13) /* alle Zielobjekte (u, s, b, r) auf +#define TESTRESISTANCE (1<<12) /* alle Zielobjekte (u, s, b, r) auf Magieresistenz prfen */ -#define SEARCHLOCAL (1<<14) /* Ziel muss in der target_region sein */ -#define TESTCANSEE (1<<15) /* alle Zielunits auf cansee prfen */ +#define SEARCHLOCAL (1<<13) /* Ziel muss in der target_region sein */ +#define NOTFAMILIARCAST (1<<14) /* not used by XML? */ #define ANYTARGET (UNITSPELL|REGIONSPELL|BUILDINGSPELL|SHIPSPELL) /* wirkt auf alle objekttypen (unit, ship, building, region) */ /* Flag Spruchkostenberechnung: */ diff --git a/src/xmlreader.c b/src/xmlreader.c index 006c37a8a..9d910f6fe 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1174,7 +1174,7 @@ static int parse_spells(xmlDocPtr doc) sp->syntax = str_strdup((const char *)propValue); xmlFree(propValue); } - sp->rank = (char)xml_ivalue(node, "rank", 0); + sp->rank = (char)xml_ivalue(node, "rank", sp->rank); if (xml_bvalue(node, "los", false)) sp->sptyp |= TESTCANSEE; /* must see or have contact */ if (!xml_bvalue(node, "target_global", false)) @@ -1705,12 +1705,12 @@ void register_xmlreader(void) xml_register_callback(parse_resources); xml_register_callback(parse_buildings); xml_register_callback(parse_ships); + xml_register_callback(parse_spellbooks); #endif xml_register_callback(parse_races); xml_register_callback(parse_equipment); xml_register_callback(parse_spells); - xml_register_callback(parse_spellbooks); xml_register_callback(parse_strings); xml_register_callback(parse_messages); From adbf1098b91d3d885c6ae35d0e283ee336d98333 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 14:02:44 +0200 Subject: [PATCH 141/231] we fail tests when not reading spell components. --- src/exparse.c | 8 +++++++- src/xmlreader.c | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 702c80557..411741c05 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -277,7 +277,13 @@ static void XMLCALL start_spells(parseinfo *pi, const XML_Char *el, const XML_Ch const char *flag_names[] = { "far", "variable", "ocean", "ship", "los", "unittarget", "shiptarget", "buildingtarget", "regiontarget", NULL }; - if (xml_strcmp(el, "spell") == 0) { + + if (xml_strcmp(el, "resource") == 0) { + spell_component *spc = NULL; + (void)spc; + handle_bad_input(pi, el, NULL); + } + else if (xml_strcmp(el, "spell") == 0) { spell *sp; const XML_Char *name = NULL, *syntax = NULL, *parameter = NULL; int i, rank = 0, flags = 0; diff --git a/src/xmlreader.c b/src/xmlreader.c index 9d910f6fe..afb639f1a 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1706,11 +1706,11 @@ void register_xmlreader(void) xml_register_callback(parse_buildings); xml_register_callback(parse_ships); xml_register_callback(parse_spellbooks); + xml_register_callback(parse_spells); #endif xml_register_callback(parse_races); xml_register_callback(parse_equipment); - xml_register_callback(parse_spells); xml_register_callback(parse_strings); xml_register_callback(parse_messages); From cd2624de8acfa430f44ee5d4ecd78a27a1e77bd3 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 15:49:34 +0200 Subject: [PATCH 142/231] stop reallocation spell parameters. fix involuntary tree growth in test, message check. --- scripts/tests/e2/init.lua | 2 +- scripts/tests/e2/items.lua | 1 + scripts/tests/e2/spells.lua | 33 +++++++++++++++++++++++++++++++++ scripts/tests/spells.lua | 2 +- src/bind_faction.c | 1 + src/bindings.c | 29 ++++++++++++++++------------- src/laws.c | 7 ------- src/laws.h | 1 - src/magic.c | 32 +++++++++++--------------------- 9 files changed, 64 insertions(+), 44 deletions(-) diff --git a/scripts/tests/e2/init.lua b/scripts/tests/e2/init.lua index 9dd507671..e9c14ec61 100644 --- a/scripts/tests/e2/init.lua +++ b/scripts/tests/e2/init.lua @@ -1,6 +1,6 @@ +require 'tests.e2.spells' require 'tests.e2.e2features' require 'tests.e2.insects' -require 'tests.e2.spells' require 'tests.e2.buildings' require 'tests.e2.production' require 'tests.e2.adamantium' diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index e444a9c73..456262342 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -9,6 +9,7 @@ function setup() eressea.settings.set("rules.ship.storms", "0") eressea.settings.set("rules.encounters", "0") eressea.settings.set("magic.regeneration.enable", "0") + eressea.settings.set("rules.grow.formula", "0") eressea.settings.set("study.random_progress", "0") end diff --git a/scripts/tests/e2/spells.lua b/scripts/tests/e2/spells.lua index deeb2798c..53c86d413 100644 --- a/scripts/tests/e2/spells.lua +++ b/scripts/tests/e2/spells.lua @@ -12,6 +12,39 @@ function setup() eressea.settings.set("magic.fumble.enable", "0") end +function disable_pull_astral() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.magic = "gray" + u1:set_skill("magic", 6) + u1.aura = 1 + u1:add_spell("pull_astral") + u1:clear_orders() + u1:add_order("ZAUBERE Astraler~Ruf " .. itoa36(u2.id)) + -- process_orders() + -- assert_equal(1, f:count_msg_type('error194'), 'no target region') + -- assert_equal(1, f:count_msg_type('error209'), 'bad arguments') + u1:clear_orders() + + u1:add_order("ZAUBERE Astraler~Ruf 1 0 " .. itoa36(u2.id)) + process_orders() + assert_equal(1, f:count_msg_type('error194'), 'no target region') + assert_equal(0, f:count_msg_type('error209'), 'bad arguments') + assert_equal(1, f:count_msg_type('spellregionresists'), 'no such region') + + u1:add_order("ZAUBERE Astraler~Ruf 0 0 " .. itoa36(u2.id)) + process_orders() + assert_equal(0, f:count_msg_type('error194'), 'no target region') + assert_equal(0, f:count_msg_type('error209'), 'bad arguments') + assert_equal(0, f:count_msg_type('spellregionresists'), 'no such region') + for k, v in ipairs(f.messages) do + print(v) + end + assert_equal(u1, u2) +end + function test_shapeshift() local r = region.create(42, 0, "plain") local f = faction.create("demon", "noreply@eressea.de", "de") diff --git a/scripts/tests/spells.lua b/scripts/tests/spells.lua index de56472c3..28efb936a 100644 --- a/scripts/tests/spells.lua +++ b/scripts/tests/spells.lua @@ -21,7 +21,7 @@ function test_create_bogus() u:clear_orders() u:add_order("ZAUBERE 'Erschaffe Katastrophe'") process_orders() - assert_equal(f.messages[3], 'error173') -- HACKity HACK + assert_equal(1, f:count_msg_type('error173'), 'spell not found') end function test_create_roi() diff --git a/src/bind_faction.c b/src/bind_faction.c index c0875aae2..ac797093d 100644 --- a/src/bind_faction.c +++ b/src/bind_faction.c @@ -39,6 +39,7 @@ without prior permission by the authors of Eressea. #include #include +#include #include typedef struct helpmode { diff --git a/src/bindings.c b/src/bindings.c index f9f51ded3..3fda9b844 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -476,22 +476,17 @@ static int tolua_write_reports(lua_State * L) return 1; } -static int tolua_process_orders(lua_State * L) -{ - UNUSED_ARG(L); -#if 0 - order * ord = parse_order("@GIB xmis ALLES Gurgelkraut", default_locale); - assert(ord); - free_order(ord); - return 0; -#endif - processorders(); - return 0; -} - static int tolua_turn_begin(lua_State * L) { + faction *f; UNUSED_ARG(L); + for (f = factions; f; f = f->next) { + if (f->msgs) { + free_messagelist(f->msgs->begin); + free(f->msgs); + f->msgs = NULL; + } + } turn_begin(); return 0; } @@ -510,6 +505,14 @@ static int tolua_turn_end(lua_State * L) return 0; } +static int tolua_process_orders(lua_State * L) +{ + UNUSED_ARG(L); + tolua_turn_begin(L); + tolua_turn_process(L); + return tolua_turn_end(L); +} + static int tolua_write_passwords(lua_State * L) { int result = writepasswd(); diff --git a/src/laws.c b/src/laws.c index b24fa5b3b..9eb3795c6 100644 --- a/src/laws.c +++ b/src/laws.c @@ -4140,13 +4140,6 @@ void turn_end(void) update_spells(); } -void processorders(void) -{ - turn_begin(); - turn_process(); - turn_end(); -} - void update_subscriptions(void) { FILE *F; diff --git a/src/laws.h b/src/laws.h index 56ed9623b..ae2c712ca 100755 --- a/src/laws.h +++ b/src/laws.h @@ -53,7 +53,6 @@ extern "C" { int enter_building(struct unit *u, struct order *ord, int id, bool report); int enter_ship(struct unit *u, struct order *ord, int id, bool report); - void processorders(void); void turn_begin(void); void turn_process(void); void turn_end(void); diff --git a/src/magic.c b/src/magic.c index a00a29527..4c2df4023 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1822,7 +1822,7 @@ addparam_region(const char *const param[], spllprm ** spobjp, const unit * u, order * ord) { assert(param[0]); - if (param[1] == 0) { + if (param[1] == NULL) { /* Fehler: Zielregion vergessen */ cmistake(u, ord, 194, MSG_MAGIC); return -1; @@ -2014,13 +2014,13 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, /* im Endeffekt waren es evtl. nur p parameter (wegen TEMP) */ par->length = p; - if (fail || par->length < minlen) { + if (par->length < minlen) { cmistake(u, ord, 209, MSG_MAGIC); free_spellparameter(par); return NULL; } - return par; + return fail ? NULL : par; } struct unit * co_get_caster(const struct castorder * co) { @@ -2412,6 +2412,7 @@ static bool is_moving_ship(ship * sh) return false; } +#define MAX_PARAMETERS 8 static castorder *cast_cmd(unit * u, order * ord) { char token[128]; @@ -2612,33 +2613,22 @@ static castorder *cast_cmd(unit * u, order * ord) } /* Weitere Argumente zusammenbasteln */ if (sp->parameter) { - char **params = (char**)malloc(2 * sizeof(char *)); - int p = 0, size = 2; + char *params[MAX_PARAMETERS]; + int i, p = 0; for (;;) { s = gettoken(token, sizeof(token)); - if (!s || *s == 0) + if (!s || *s == 0) { break; - if (p + 1 >= size) { - char ** tmp; - tmp = (char**)realloc(params, sizeof(char *) * size * 2); - if (tmp) { - size *= 2; - params = tmp; - } - else { - log_error("error allocationg %d bytes: %s", size * 2, strerror(errno)); - break; - } } + assert(p + 1 < MAX_PARAMETERS); params[p++] = str_strdup(s); } - params[p] = 0; args = add_spellparameter(target_r, caster, sp->parameter, (const char *const *)params, p, ord); - for (p = 0; params[p]; ++p) - free(params[p]); - free(params); + for (i = 0; i != p; ++i) { + free(params[i]); + } if (args == NULL) { /* Syntax war falsch */ return 0; From 088747ea817bb04fc77916cf4504c3dbf1baa570 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 15:50:32 +0200 Subject: [PATCH 143/231] code style --- src/magic.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/magic.c b/src/magic.c index 4c2df4023..a8190dfa8 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2390,8 +2390,9 @@ unit *get_clone(const unit * u) attrib *a = a_find(u->attribs, &at_clone); if (a != NULL) { unit *uc = (unit *)a->data.v; - if (uc->number > 0) + if (uc->number > 0) { return uc; + } } return NULL; } @@ -2400,7 +2401,7 @@ static bool is_moving_ship(ship * sh) { const unit *u = ship_owner(sh); - if (u) + if (u) { switch (getkeyword(u->thisorder)) { case K_ROUTE: case K_MOVE: @@ -2409,6 +2410,7 @@ static bool is_moving_ship(ship * sh) default: return false; } + } return false; } From 5af775ba8799e323b04353323afcdbe76a049e7d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 16:35:23 +0200 Subject: [PATCH 144/231] prevent out-of-bounds read. --- src/magic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/magic.c b/src/magic.c index a8190dfa8..80f528de8 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1943,7 +1943,9 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, break; case 'r': /* Parameter sind zwei Regionskoordinaten innerhalb der "normalen" Plane */ - j = addparam_region(param + i, &spobj, u, ord); + if (i + 1 < size) { + j = addparam_region(param + i, &spobj, u, ord); + } ++c; break; case 'b': From 4d3718bab996ec5693bf7a9b0affe18c80f9d273 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 18:05:35 +0200 Subject: [PATCH 145/231] find out why t<=0 assert happens sometimes --- src/kernel/calendar.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/kernel/calendar.c b/src/kernel/calendar.c index df9f6c204..93722b5bc 100644 --- a/src/kernel/calendar.c +++ b/src/kernel/calendar.c @@ -4,7 +4,8 @@ #include "calendar.h" #include "move.h" /* storms */ -#include +#include "kernel/config.h" +#include "util/log.h" #include #include @@ -45,6 +46,10 @@ const gamedate *get_gamedate(int turn_now, gamedate * gd) int t = turn_now - first_turn(); assert(gd); + if (t<0) { + log_fatal("current turn %d is before first %d", + turn_now, first_turn()); + } assert(t>=0); gd->turn = turn_now; From 14f59e4bfe205cc254db59a5ca2502a3704ae022 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 19:02:47 +0200 Subject: [PATCH 146/231] functional tests for pull_astral spell. --- scripts/tests/e2/astral.lua | 63 +++++++++++++++++++++++++++++++++++++ scripts/tests/e2/init.lua | 53 ++++++++++++++++--------------- scripts/tests/e2/spells.lua | 33 ------------------- scripts/tests/spells.lua | 1 + src/bind_region.c | 21 +++++++++++++ src/magic.c | 44 +++++++++++++++----------- 6 files changed, 137 insertions(+), 78 deletions(-) create mode 100644 scripts/tests/e2/astral.lua diff --git a/scripts/tests/e2/astral.lua b/scripts/tests/e2/astral.lua new file mode 100644 index 000000000..d798767c2 --- /dev/null +++ b/scripts/tests/e2/astral.lua @@ -0,0 +1,63 @@ +require "lunit" + +module("tests.e2.astral", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("nmr.removenewbie", "0") + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("NewbieImmunity", "0") + eressea.settings.set("rules.food.flags", "4") + eressea.settings.set("rules.peasants.growth.factor", "0") + eressea.settings.set("magic.fumble.enable", "0") + eressea.settings.set("magic.regeneration.enable", "0") +end + +local function dump_messages(f) + for k, v in ipairs(f.messages) do + print(v) + end +end + +function test_pull_astral() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.magic = "gray" + u1:set_skill("magic", 6) + u1.aura = 0 + u1:add_spell("pull_astral") + + u1:clear_orders() + u1:add_order("ZAUBERE Astraler~Ruf " .. itoa36(u2.id)) + process_orders() + assert_equal(1, f:count_msg_type('error209'), 'syntax error') + u1:clear_orders() + + u1:clear_orders() + u1:add_order("ZAUBERE Astraler~Ruf 1 0 " .. itoa36(u2.id)) + process_orders() + assert_equal(0, f:count_msg_type('error209'), 'syntax error') + assert_equal(1, f:count_msg_type('error194'), 'target region') + + u1:clear_orders() + u1:add_order("ZAUBERE Astraler~Ruf 0 0 " .. itoa36(u2.id)) + u1.aura = 0 -- missing components + process_orders() + assert_equal(0, f:count_msg_type('error194'), 'target region') + assert_equal(1, f:count_msg_type('missing_components_list'), 'no components') + + u1.aura = 12 -- 2 Aura pro Stufe + process_orders() + assert_equal(1, f:count_msg_type('spellfail_astralonly'), 'astral space') + + u1.region = u1.region:get_astral('fog') + assert_equal('fog', u1.region.terrain) + process_orders() + assert_equal(0, f:count_msg_type('spellfail_astralonly'), 'astral space') + assert_equal(1, f:count_msg_type('send_astral'), 'astral space') + + assert_equal(u1.region, u2.region) +end + diff --git a/scripts/tests/e2/init.lua b/scripts/tests/e2/init.lua index e9c14ec61..59cb705e4 100644 --- a/scripts/tests/e2/init.lua +++ b/scripts/tests/e2/init.lua @@ -1,26 +1,27 @@ -require 'tests.e2.spells' -require 'tests.e2.e2features' -require 'tests.e2.insects' -require 'tests.e2.buildings' -require 'tests.e2.production' -require 'tests.e2.adamantium' -require 'tests.e2.undead' -require 'tests.e2.shiplanding' -require 'tests.e2.movement' -require 'tests.e2.destroy' -require 'tests.e2.guard' -require 'tests.e2.stealth' -require 'tests.e2.items' -require 'tests.e2.ships' -require 'tests.items' -require 'tests.economy' -require 'tests.orders' -require 'tests.common' -require 'tests.report' -require 'tests.storage' -require 'tests.magicbag' -require 'tests.process' -require 'tests.xmas' -require 'tests.production' -require 'tests.spells' -require 'tests.undead' +require 'tests.e2.astral' +-- require 'tests.e2.spells' +-- require 'tests.e2.e2features' +-- require 'tests.e2.insects' +-- require 'tests.e2.buildings' +-- require 'tests.e2.production' +-- require 'tests.e2.adamantium' +-- require 'tests.e2.undead' +-- require 'tests.e2.shiplanding' +-- require 'tests.e2.movement' +-- require 'tests.e2.destroy' +-- require 'tests.e2.guard' +-- require 'tests.e2.stealth' +-- require 'tests.e2.items' +-- require 'tests.e2.ships' +-- require 'tests.items' +-- require 'tests.economy' +-- require 'tests.orders' +-- require 'tests.common' +-- require 'tests.report' +-- require 'tests.storage' +-- require 'tests.magicbag' +-- require 'tests.process' +-- require 'tests.xmas' +-- require 'tests.production' +-- require 'tests.spells' +-- require 'tests.undead' diff --git a/scripts/tests/e2/spells.lua b/scripts/tests/e2/spells.lua index 53c86d413..deeb2798c 100644 --- a/scripts/tests/e2/spells.lua +++ b/scripts/tests/e2/spells.lua @@ -12,39 +12,6 @@ function setup() eressea.settings.set("magic.fumble.enable", "0") end -function disable_pull_astral() - local r = region.create(0, 0, "plain") - local f = faction.create("human") - local u1 = unit.create(f, r, 1) - local u2 = unit.create(f, r, 1) - u1.magic = "gray" - u1:set_skill("magic", 6) - u1.aura = 1 - u1:add_spell("pull_astral") - u1:clear_orders() - u1:add_order("ZAUBERE Astraler~Ruf " .. itoa36(u2.id)) - -- process_orders() - -- assert_equal(1, f:count_msg_type('error194'), 'no target region') - -- assert_equal(1, f:count_msg_type('error209'), 'bad arguments') - u1:clear_orders() - - u1:add_order("ZAUBERE Astraler~Ruf 1 0 " .. itoa36(u2.id)) - process_orders() - assert_equal(1, f:count_msg_type('error194'), 'no target region') - assert_equal(0, f:count_msg_type('error209'), 'bad arguments') - assert_equal(1, f:count_msg_type('spellregionresists'), 'no such region') - - u1:add_order("ZAUBERE Astraler~Ruf 0 0 " .. itoa36(u2.id)) - process_orders() - assert_equal(0, f:count_msg_type('error194'), 'no target region') - assert_equal(0, f:count_msg_type('error209'), 'bad arguments') - assert_equal(0, f:count_msg_type('spellregionresists'), 'no such region') - for k, v in ipairs(f.messages) do - print(v) - end - assert_equal(u1, u2) -end - function test_shapeshift() local r = region.create(42, 0, "plain") local f = faction.create("demon", "noreply@eressea.de", "de") diff --git a/scripts/tests/spells.lua b/scripts/tests/spells.lua index 28efb936a..27a5424f7 100644 --- a/scripts/tests/spells.lua +++ b/scripts/tests/spells.lua @@ -8,6 +8,7 @@ function setup() eressea.settings.set("NewbieImmunity", "0") eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.encounters", "0") + eressea.settings.set("magic.fumble.enable", "0") eressea.settings.set("magic.regeneration.enable", "0") end diff --git a/src/bind_region.c b/src/bind_region.c index a87b6f856..e041fba77 100644 --- a/src/bind_region.c +++ b/src/bind_region.c @@ -8,6 +8,7 @@ #include "bind_building.h" #include "chaos.h" +#include "teleport.h" #include #include @@ -561,6 +562,24 @@ static int tolua_region_getkey(lua_State * L) return 1; } +static int tolua_region_getastral(lua_State * L) +{ + region *r = (region *)tolua_tousertype(L, 1, 0); + region *rt = r_standard_to_astral(r); + + if (!rt) { + const char *tname = tolua_tostring(L, 2, 0); + plane *pl = get_astralplane(); + rt = new_region(real2tp(r->x), real2tp(r->y), pl, 0); + if (tname) { + const terrain_type *terrain = get_terrain(tname); + terraform_region(rt, terrain); + } + } + tolua_pushusertype(L, rt, TOLUA_CAST "region"); + return 1; +} + static int tolua_region_setkey(lua_State * L) { region *self = (region *)tolua_tousertype(L, 1, 0); @@ -772,6 +791,8 @@ void tolua_region_open(lua_State * L) tolua_variable(L, TOLUA_CAST "owner", &tolua_region_get_owner, &tolua_region_set_owner); + tolua_function(L, TOLUA_CAST "get_astral", tolua_region_getastral); + tolua_function(L, TOLUA_CAST "get_key", tolua_region_getkey); tolua_function(L, TOLUA_CAST "set_key", tolua_region_setkey); } diff --git a/src/magic.c b/src/magic.c index 80f528de8..f95a6a2a3 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1819,12 +1819,12 @@ static int addparam_building(const char *const param[], spllprm ** spobjp) static int addparam_region(const char *const param[], spllprm ** spobjp, const unit * u, - order * ord) + order * ord, message **err) { assert(param[0]); if (param[1] == NULL) { /* Fehler: Zielregion vergessen */ - cmistake(u, ord, 194, MSG_MAGIC); + *err = msg_error(u, ord, 194); return -1; } else { @@ -1846,7 +1846,7 @@ addparam_region(const char *const param[], spllprm ** spobjp, const unit * u, } else { /* Fehler: Zielregion vergessen */ - cmistake(u, ord, 194, MSG_MAGIC); + *err = msg_error(u, ord, 194); return -1; } return 2; @@ -1855,7 +1855,7 @@ addparam_region(const char *const param[], spllprm ** spobjp, const unit * u, static int addparam_unit(const char *const param[], spllprm ** spobjp, const unit * u, - order * ord) + order * ord, message **err) { spllprm *spobj; int i = 0; @@ -1865,7 +1865,7 @@ addparam_unit(const char *const param[], spllprm ** spobjp, const unit * u, if (isparam(param[0], u->faction->locale, P_TEMP)) { if (param[1] == NULL) { /* Fehler: Ziel vergessen */ - cmistake(u, ord, 203, MSG_MAGIC); + *err = msg_error(u, ord, 203); return -1; } ++i; @@ -1883,7 +1883,7 @@ addparam_unit(const char *const param[], spllprm ** spobjp, const unit * u, static spellparameter *add_spellparameter(region * target_r, unit * u, const char *syntax, const char *const param[], int size, struct order *ord) { - bool fail = false; + struct message *err = NULL; int i = 0; int p = 0; const char *c; @@ -1919,7 +1919,7 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, } par->param = malloc(size * sizeof(spllprm *)); - while (!fail && *c && i < size && param[i] != NULL) { + while (!err && *c && i < size && param[i] != NULL) { spllprm *spobj = NULL; int j = -1; switch (*c) { @@ -1938,13 +1938,13 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, break; case 'u': /* Parameter ist eine Einheit, evtl. TEMP */ - j = addparam_unit(param + i, &spobj, u, ord); + j = addparam_unit(param + i, &spobj, u, ord, &err); ++c; break; case 'r': /* Parameter sind zwei Regionskoordinaten innerhalb der "normalen" Plane */ if (i + 1 < size) { - j = addparam_region(param + i, &spobj, u, ord); + j = addparam_region(param + i, &spobj, u, ord, &err); } ++c; break; @@ -1979,7 +1979,7 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, break; case P_UNIT: if (i < size) { - j = addparam_unit(param + i, &spobj, u, ord); + j = addparam_unit(param + i, &spobj, u, ord, &err); ++c; } break; @@ -2005,8 +2005,10 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, j = -1; break; } - if (j < 0) - fail = true; + if (j < 0 && !err) { + /* syntax error */ + err = msg_error(u, ord, 209); + } else { if (spobj != NULL) par->param[p++] = spobj; @@ -2014,15 +2016,19 @@ static spellparameter *add_spellparameter(region * target_r, unit * u, } } - /* im Endeffekt waren es evtl. nur p parameter (wegen TEMP) */ + /* im Endeffekt waren es evtl. nur p parameter (weniger weil TEMP nicht gilt) */ par->length = p; - if (par->length < minlen) { - cmistake(u, ord, 209, MSG_MAGIC); - free_spellparameter(par); - return NULL; - } - return fail ? NULL : par; + if (!err && p < minlen) { + /* syntax error */ + err = msg_error(u, ord, 209); + } + if (err) { + ADDMSG(&u->faction->msgs, err); + free_spellparameter(par); + par = NULL; + } + return par; } struct unit * co_get_caster(const struct castorder * co) { From cfe21e7e1d23a813763e8fddd1dc30e356b15169 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 19:07:20 +0200 Subject: [PATCH 147/231] re-enable tests, allow more spell arguments. a list of ships, units, etc can be long! --- scripts/tests/e2/init.lua | 52 +++++++++++++++++++-------------------- src/magic.c | 2 +- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/scripts/tests/e2/init.lua b/scripts/tests/e2/init.lua index 59cb705e4..22195a1f4 100644 --- a/scripts/tests/e2/init.lua +++ b/scripts/tests/e2/init.lua @@ -1,27 +1,27 @@ require 'tests.e2.astral' --- require 'tests.e2.spells' --- require 'tests.e2.e2features' --- require 'tests.e2.insects' --- require 'tests.e2.buildings' --- require 'tests.e2.production' --- require 'tests.e2.adamantium' --- require 'tests.e2.undead' --- require 'tests.e2.shiplanding' --- require 'tests.e2.movement' --- require 'tests.e2.destroy' --- require 'tests.e2.guard' --- require 'tests.e2.stealth' --- require 'tests.e2.items' --- require 'tests.e2.ships' --- require 'tests.items' --- require 'tests.economy' --- require 'tests.orders' --- require 'tests.common' --- require 'tests.report' --- require 'tests.storage' --- require 'tests.magicbag' --- require 'tests.process' --- require 'tests.xmas' --- require 'tests.production' --- require 'tests.spells' --- require 'tests.undead' +require 'tests.e2.spells' +require 'tests.e2.e2features' +require 'tests.e2.insects' +require 'tests.e2.buildings' +require 'tests.e2.production' +require 'tests.e2.adamantium' +require 'tests.e2.undead' +require 'tests.e2.shiplanding' +require 'tests.e2.movement' +require 'tests.e2.destroy' +require 'tests.e2.guard' +require 'tests.e2.stealth' +require 'tests.e2.items' +require 'tests.e2.ships' +require 'tests.items' +require 'tests.economy' +require 'tests.orders' +require 'tests.common' +require 'tests.report' +require 'tests.storage' +require 'tests.magicbag' +require 'tests.process' +require 'tests.xmas' +require 'tests.production' +require 'tests.spells' +require 'tests.undead' diff --git a/src/magic.c b/src/magic.c index f95a6a2a3..892c78e68 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2422,7 +2422,7 @@ static bool is_moving_ship(ship * sh) return false; } -#define MAX_PARAMETERS 8 +#define MAX_PARAMETERS 32 static castorder *cast_cmd(unit * u, order * ord) { char token[128]; From 68de367a98e97c2a2756f762c0c6c4abf0cfb231 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 6 May 2018 19:27:22 +0200 Subject: [PATCH 148/231] print an error instead of asserting. --- src/magic.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/magic.c b/src/magic.c index 892c78e68..e6bb36002 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2624,14 +2624,17 @@ static castorder *cast_cmd(unit * u, order * ord) /* Weitere Argumente zusammenbasteln */ if (sp->parameter) { char *params[MAX_PARAMETERS]; - int i, p = 0; - for (;;) { + int i, p; + for (p = 0; p != MAX_PARAMETERS; ++p) { s = gettoken(token, sizeof(token)); if (!s || *s == 0) { break; } - assert(p + 1 < MAX_PARAMETERS); - params[p++] = str_strdup(s); + params[p] = str_strdup(s); + } + if (p == MAX_PARAMETERS) { + log_error("%s: MAX_PARAMETERS (%d) too small to CAST %s, parsing stopped early.", + unitname(u), MAX_PARAMETERS, sp->sname); } args = add_spellparameter(target_r, caster, sp->parameter, From 674640133066ddbe466098d1f57c30dafb84f774 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 7 May 2018 20:22:02 +0200 Subject: [PATCH 149/231] BUG 2437: fetch_astral should have no aura cost when given bad units. --- scripts/tests/e2/astral.lua | 28 ++++++++++++++++++++++++++++ src/spells.c | 4 +++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/scripts/tests/e2/astral.lua b/scripts/tests/e2/astral.lua index d798767c2..0764f6c56 100644 --- a/scripts/tests/e2/astral.lua +++ b/scripts/tests/e2/astral.lua @@ -19,6 +19,34 @@ local function dump_messages(f) end end +function test_fetch_astral() + local r = region.create(0, 0, "plain") + local f = faction.create("human") + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1.magic = "gray" + u1:set_skill("magic", 6) + u1.aura = 0 + u1:add_spell("fetch_astral") + + u1:clear_orders() + u1:add_order("ZAUBERE Ruf~der~Realitaet " .. itoa36(u2.id)) + process_orders() + assert_equal(1, f:count_msg_type('missing_components_list'), 'no components') + + u1.aura = 12 -- 2 Aura pro Stufe + process_orders() + assert_equal(12, u1.aura) + assert_equal(1, f:count_msg_type('spellfail_astralonly'), 'astral space') + + u1.name = 'Xolgrim' + u1.aura = 12 -- 2 Aura pro Stufe + u2.region = u2.region:get_astral('fog') + process_orders() + assert_equal(0, u1.aura) + assert_equal(u1.region, u2.region) +end + function test_pull_astral() local r = region.create(0, 0, "plain") local f = faction.create("human") diff --git a/src/spells.c b/src/spells.c index 57807ae83..bd2c8ea1a 100644 --- a/src/spells.c +++ b/src/spells.c @@ -5311,7 +5311,7 @@ int sp_fetchastral(castorder * co) { int n; unit *mage = co->magician.u; - int cast_level = co->level; + int cast_level = 0; spellparameter *pa = co->par; double power = co->force; int remaining_cap = (int)((power - 3) * 1500); @@ -5343,6 +5343,7 @@ int sp_fetchastral(castorder * co) "spellfail_astralonly", "")); continue; } + if (rtl != NULL) free_regionlist(rtl); rtl = astralregions(u->region, NULL); @@ -5359,6 +5360,7 @@ int sp_fetchastral(castorder * co) ro = u->region; } + cast_level = co->level; /* at least one unit could have been teleported */ if (is_cursed(ro->attribs, &ct_astralblock)) { ADDMSG(&mage->faction->msgs, msg_feedback(mage, co->order, "spellfail_astralblock", "")); From 4bcaaa5f793899bf0f20998bd17893a8c5e69083 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 7 May 2018 20:24:59 +0200 Subject: [PATCH 150/231] remove debug code --- scripts/tests/e2/astral.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/tests/e2/astral.lua b/scripts/tests/e2/astral.lua index 0764f6c56..efed6345f 100644 --- a/scripts/tests/e2/astral.lua +++ b/scripts/tests/e2/astral.lua @@ -39,8 +39,6 @@ function test_fetch_astral() assert_equal(12, u1.aura) assert_equal(1, f:count_msg_type('spellfail_astralonly'), 'astral space') - u1.name = 'Xolgrim' - u1.aura = 12 -- 2 Aura pro Stufe u2.region = u2.region:get_astral('fog') process_orders() assert_equal(0, u1.aura) From ccf09770e3018c5ecc694c1aaf47be5de99092ee Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 8 May 2018 21:43:13 +0200 Subject: [PATCH 151/231] rename global target flag, invert logic --- res/eressea/spells.xml | 4 ++-- src/magic.c | 13 +++++++------ src/magic.h | 2 +- src/xmlreader.c | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 2adc132e5..859dea5bb 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -411,10 +411,10 @@ - + - + diff --git a/src/magic.c b/src/magic.c index e6bb36002..1b41b87af 100644 --- a/src/magic.c +++ b/src/magic.c @@ -1475,7 +1475,7 @@ verify_ship(region * r, unit * mage, const spell * sp, spllprm * spobj, { ship *sh = findship(spobj->data.i); - if (sh != NULL && sh->region != r && (sp->sptyp & SEARCHLOCAL)) { + if (sh != NULL && sh->region != r && (sp->sptyp & GLOBALTARGET) == 0) { /* Burg muss in gleicher Region sein */ sh = NULL; } @@ -1498,7 +1498,7 @@ verify_building(region * r, unit * mage, const spell * sp, spllprm * spobj, { building *b = findbuilding(spobj->data.i); - if (b != NULL && b->region != r && (sp->sptyp & SEARCHLOCAL)) { + if (b != NULL && b->region != r && (sp->sptyp & GLOBALTARGET) == 0) { /* Burg muss in gleicher Region sein */ b = NULL; } @@ -1552,14 +1552,15 @@ verify_unit(region * r, unit * mage, const spell * sp, spllprm * spobj, default: assert(!"shouldn't happen, this"); } - if (u != NULL && (sp->sptyp & SEARCHLOCAL)) { - if (u->region != r) - u = NULL; - else if (sp->sptyp & TESTCANSEE) { + if (u != NULL) { + if (u->region == r) { if (!cansee(mage->faction, r, u, 0) && !ucontact(u, mage)) { u = NULL; } } + else if ((sp->sptyp & GLOBALTARGET) == 0) { + u = NULL; + } } if (u == NULL) { diff --git a/src/magic.h b/src/magic.h index ae43fd5af..9118a546b 100644 --- a/src/magic.h +++ b/src/magic.h @@ -174,7 +174,7 @@ extern "C" { #define NOTFAMILIARCAST (1<<12) #define TESTRESISTANCE (1<<13) /* alle Zielobjekte (u, s, b, r) auf Magieresistenz prfen */ -#define SEARCHLOCAL (1<<14) /* Ziel muss in der target_region sein */ +#define GLOBALTARGET (1<<14) /* Ziel muss in der target_region sein */ #define TESTCANSEE (1<<15) /* alle Zielunits auf cansee prfen */ #define ANYTARGET (UNITSPELL|REGIONSPELL|BUILDINGSPELL|SHIPSPELL) /* wirkt auf alle objekttypen (unit, ship, building, region) */ diff --git a/src/xmlreader.c b/src/xmlreader.c index dcf51707b..35b4b328e 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1169,8 +1169,6 @@ static int parse_spells(xmlDocPtr doc) sp->rank = (char)xml_ivalue(node, "rank", 0); if (xml_bvalue(node, "los", false)) sp->sptyp |= TESTCANSEE; /* must see or have contact */ - if (!xml_bvalue(node, "target_global", false)) - sp->sptyp |= SEARCHLOCAL; /* must be in same region */ if (xml_bvalue(node, "ship", false)) sp->sptyp |= ONSHIPCAST; if (xml_bvalue(node, "ocean", false)) @@ -1180,6 +1178,8 @@ static int parse_spells(xmlDocPtr doc) if (xml_bvalue(node, "variable", false)) sp->sptyp |= SPELLLEVEL; + if (xml_bvalue(node, "globaltarget", false)) + sp->sptyp |= GLOBALTARGET; /* target need not be in same region */ if (xml_bvalue(node, "buildingtarget", false)) sp->sptyp |= BUILDINGSPELL; if (xml_bvalue(node, "shiptarget", false)) From b197bb395d48b5d5223006c9c4e59d31f5b0aeae Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 8 May 2018 23:06:33 +0200 Subject: [PATCH 152/231] parse spell components. --- src/exparse.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++---- src/magic.h | 12 ++++----- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 411741c05..bc7218383 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -273,15 +273,50 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } +#define MAX_COMPONENTS 8 +static spell_component components[MAX_COMPONENTS]; +static int ncomponents; + static void XMLCALL start_spells(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "far", "variable", "ocean", "ship", "los", - "unittarget", "shiptarget", "buildingtarget", "regiontarget", NULL }; + "unittarget", "shiptarget", "buildingtarget", "regiontarget", "globaltarget", NULL }; if (xml_strcmp(el, "resource") == 0) { - spell_component *spc = NULL; - (void)spc; - handle_bad_input(pi, el, NULL); + spell_component *spc; + int i; + + assert(ncomponents < MAX_COMPONENTS); + spc = components + ncomponents; + spc->cost = SPC_FIX; + ++ncomponents; + memset(spc, 0, sizeof(spell_component)); + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "name") == 0) { + spc->type = rt_get_or_create(val); + } + else if (xml_strcmp(key, "amount") == 0) { + spc->amount = xml_int(val); + } + else if (xml_strcmp(key, "cost") == 0) { + if (xml_strcmp(val, "level") == 0) { + spc->cost = SPC_LEVEL; + } + else if (xml_strcmp(val, "linear") == 0) { + spc->cost = SPC_LINEAR; + } + else if (xml_strcmp(val, "fixed") == 0) { + spc->cost = SPC_FIX; + } + else { + handle_bad_input(pi, key, val); + } + } + else { + handle_bad_input(pi, el, key); + } + } } else if (xml_strcmp(el, "spell") == 0) { spell *sp; @@ -962,14 +997,33 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_SPELLS: start_spells(pi, el, attr); break; + case EXP_UNKNOWN: + handle_bad_input(pi, el, NULL); + break; default: /* not implemented */ handle_bad_input(pi, el, NULL); + return; } } ++pi->depth; } +static void end_spells(parseinfo *pi, const XML_Char *el) { + if (xml_strcmp(el, "spells") == 0) { + pi->type = EXP_UNKNOWN; + } + else if (xml_strcmp(el, "spell") == 0) { + spell *sp = (spell *)pi->object; + if (ncomponents > 0) { + sp->components = calloc(sizeof(spell_component), ncomponents + 1); + memcpy(sp->components, components, sizeof(spell_component) * ncomponents); + ncomponents = 0; + } + pi->object = NULL; + } +} + static void end_weapon(parseinfo *pi, const XML_Char *el) { resource_type *rtype = (resource_type *)pi->object; assert(rtype && rtype->wtype); @@ -1093,6 +1147,9 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { case EXP_WEAPON: end_weapon(pi, el); break; + case EXP_SPELLS: + end_spells(pi, el); + break; default: if (pi->depth == 1) { pi->object = NULL; @@ -1160,7 +1217,9 @@ int exparse_readfile(const char * filename) { break; } } - assert(pi.depth == 0); + if (pi.depth != 0) { + err = -3; + } XML_ParserFree(xp); fclose(F); if (err != 0) { diff --git a/src/magic.h b/src/magic.h index b76bcfa75..654673245 100644 --- a/src/magic.h +++ b/src/magic.h @@ -166,15 +166,15 @@ extern "C" { #define SHIPSPELL (1<<6) /* ZAUBER .. [ ..] */ #define BUILDINGSPELL (1<<7) /* ZAUBER .. [ ..] */ #define REGIONSPELL (1<<8) /* wirkt auf struct region */ +#define GLOBALTARGET (1<<9) /* Ziel kann ausserhalb der region sein */ -#define PRECOMBATSPELL (1<<9) /* PRKAMPFZAUBER .. */ -#define COMBATSPELL (1<<10) /* KAMPFZAUBER .. */ -#define POSTCOMBATSPELL (1<<11) /* POSTKAMPFZAUBER .. */ +#define PRECOMBATSPELL (1<<10) /* PRKAMPFZAUBER .. */ +#define COMBATSPELL (1<<11) /* KAMPFZAUBER .. */ +#define POSTCOMBATSPELL (1<<12) /* POSTKAMPFZAUBER .. */ #define ISCOMBATSPELL (PRECOMBATSPELL|COMBATSPELL|POSTCOMBATSPELL) -#define TESTRESISTANCE (1<<12) /* alle Zielobjekte (u, s, b, r) auf - Magieresistenz prfen */ -#define GLOBALTARGET (1<<13) /* Ziel muss in der target_region sein */ + +#define TESTRESISTANCE (1<<13) /* Zielobjekte auf Magieresistenz prfen. not used in XML? */ #define NOTFAMILIARCAST (1<<14) /* not used by XML? */ #define ANYTARGET (UNITSPELL|REGIONSPELL|BUILDINGSPELL|SHIPSPELL) /* wirkt auf alle objekttypen (unit, ship, building, region) */ From ae3c0b099f85e1cbb6ea2c32214570545461707d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 8 May 2018 23:10:51 +0200 Subject: [PATCH 153/231] spells do not have a function element in XML --- conf/e2/config.json | 1 + conf/e3/config.json | 1 + res/e3a/spells.xml | 8 -------- res/eressea/spells.xml | 9 --------- src/kernel/faction.c | 2 +- 5 files changed, 3 insertions(+), 18 deletions(-) diff --git a/conf/e2/config.json b/conf/e2/config.json index 6450e9d54..b5ed2e68c 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -28,6 +28,7 @@ ], "settings": { "game.name" : "Eressea", + "game.mailcmd" : "ERESSEA", "game.id" : 2, "orders.default": "work", "NewbieImmunity": 8, diff --git a/conf/e3/config.json b/conf/e3/config.json index b5f9aed5c..ad7a44b2f 100644 --- a/conf/e3/config.json +++ b/conf/e3/config.json @@ -43,6 +43,7 @@ ], "settings": { "game.name" : "Eressea", + "game.mailcmd" : "ERESSEA", "game.id" : 3, "orders.default": "work", "database.gameid": 7, diff --git a/res/e3a/spells.xml b/res/e3a/spells.xml index c6f466eb4..94d7cbc08 100644 --- a/res/e3a/spells.xml +++ b/res/e3a/spells.xml @@ -68,7 +68,6 @@ - @@ -113,7 +112,6 @@ - @@ -213,7 +211,6 @@ - @@ -290,7 +287,6 @@ - @@ -311,7 +307,6 @@ - @@ -489,7 +484,6 @@ - @@ -580,7 +574,6 @@ - @@ -619,7 +612,6 @@ - diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 859dea5bb..4b9251691 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -16,11 +16,9 @@ - - @@ -290,7 +288,6 @@ - @@ -326,7 +323,6 @@ - @@ -356,7 +352,6 @@ - @@ -504,7 +499,6 @@ - @@ -537,7 +531,6 @@ - @@ -552,13 +545,11 @@ - - diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 865d0f2a9..43c25d440 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -237,7 +237,7 @@ faction *addfaction(const char *email, const char *password, if (check_email(email) == 0) { faction_setemail(f, email); } else { - log_warning("Invalid email address for faction %s: %s\n", itoa36(f->no), email?email:""); + log_info("Invalid email address for faction %s: %s\n", itoa36(f->no), email?email:""); faction_setemail(f, NULL); } From 3f9b3219fef0b5bf565561bd33ce61571306b403 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 8 May 2018 23:22:05 +0200 Subject: [PATCH 154/231] BUG 2348: bad XML --- res/eressea/spells.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/eressea/spells.xml b/res/eressea/spells.xml index 4b9251691..1931a4c74 100644 --- a/res/eressea/spells.xml +++ b/res/eressea/spells.xml @@ -313,8 +313,8 @@ - - + + From 9e6ae0edc139c2c8a741c7127f4abf8ef2008985 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 9 May 2018 07:14:56 +0200 Subject: [PATCH 155/231] make str_strdup more forgiving --- src/util/strings.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/strings.c b/src/util/strings.c index 81fdc3713..ab85328ab 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -218,6 +218,7 @@ unsigned int wang_hash(unsigned int a) } char *str_strdup(const char *s) { + if (s == NULL) return NULL; #ifdef HAVE_STRDUP return strdup(s); #elif defined(_MSC_VER) From 8c7b890f3e5e9a10a18362d3d8d304441c91c645 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 9 May 2018 20:56:38 +0200 Subject: [PATCH 156/231] set the default unarmed modifiers for races. --- res/e3a/races.xml | 98 +++++++++++++++--------------- res/eressea/races.xml | 134 ++++++++++++++++++++--------------------- src/kernel/race.c | 2 + src/kernel/race.test.c | 2 + src/xmlreader.c | 4 +- 5 files changed, 122 insertions(+), 118 deletions(-) diff --git a/res/e3a/races.xml b/res/e3a/races.xml index bb70fa3df..7bb80edc0 100644 --- a/res/e3a/races.xml +++ b/res/e3a/races.xml @@ -4,11 +4,11 @@ - + - + @@ -31,7 +31,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -71,8 +71,8 @@ - @@ -101,7 +101,7 @@ - + @@ -120,7 +120,7 @@ - - + @@ -164,7 +164,7 @@ - - + @@ -218,7 +218,7 @@ - + @@ -239,7 +239,7 @@ - + @@ -260,7 +260,7 @@ - + @@ -283,7 +283,7 @@ - + @@ -306,7 +306,7 @@ - + @@ -328,7 +328,7 @@ - + @@ -354,7 +354,7 @@ - + @@ -376,7 +376,7 @@ - + @@ -400,7 +400,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -471,7 +471,7 @@ - + @@ -493,7 +493,7 @@ - + @@ -520,7 +520,7 @@ - + @@ -543,7 +543,7 @@ - + @@ -565,7 +565,7 @@ - + @@ -589,21 +589,21 @@ - + - + - + - + @@ -651,56 +651,56 @@ - + - + - + - + - + - + - + - + - + - - + @@ -736,7 +736,7 @@ - + @@ -754,7 +754,7 @@ - + @@ -771,7 +771,7 @@ - + @@ -787,7 +787,7 @@ - + @@ -801,7 +801,7 @@ - + @@ -816,7 +816,7 @@ - + @@ -830,12 +830,12 @@ - + - + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 21ff5b028..b1f105f98 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -2,16 +2,16 @@ - - + @@ -27,7 +27,7 @@ - + @@ -60,7 +60,7 @@ - + @@ -88,7 +88,7 @@ - + @@ -115,7 +115,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -173,7 +173,7 @@ - + @@ -203,7 +203,7 @@ - + @@ -237,7 +237,7 @@ - + @@ -267,7 +267,7 @@ - + @@ -299,7 +299,7 @@ - + @@ -329,7 +329,7 @@ - + @@ -358,7 +358,7 @@ - + @@ -388,7 +388,7 @@ - + @@ -417,7 +417,7 @@ - + @@ -448,7 +448,7 @@ - + @@ -479,7 +479,7 @@ - + @@ -508,7 +508,7 @@ - + @@ -540,7 +540,7 @@ - + @@ -570,22 +570,22 @@ - + - + - + - + @@ -617,7 +617,7 @@ - + @@ -649,60 +649,60 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -712,7 +712,7 @@ - + @@ -722,7 +722,7 @@ - + @@ -733,12 +733,12 @@ - + - + @@ -756,7 +756,7 @@ - + @@ -781,7 +781,7 @@ - + @@ -813,7 +813,7 @@ - + @@ -841,7 +841,7 @@ - + @@ -871,7 +871,7 @@ - + @@ -901,7 +901,7 @@ - + @@ -925,7 +925,7 @@ - + @@ -958,11 +958,11 @@ - + - + @@ -970,7 +970,7 @@ - + @@ -984,7 +984,7 @@ - + @@ -1001,7 +1001,7 @@ - + @@ -1017,7 +1017,7 @@ - + @@ -1032,7 +1032,7 @@ - + @@ -1045,7 +1045,7 @@ - + @@ -1059,7 +1059,7 @@ - + @@ -1072,11 +1072,11 @@ - + - + @@ -1086,8 +1086,8 @@ - + @@ -1116,7 +1116,7 @@ - + @@ -1142,7 +1142,7 @@ - + @@ -1173,7 +1173,7 @@ - + @@ -1203,7 +1203,7 @@ - + diff --git a/src/kernel/race.c b/src/kernel/race.c index ac81f7f78..8a89f73df 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -363,6 +363,8 @@ race *rc_create(const char *zName) rc->regaura = 1.0F; rc->speed = 1.0F; rc->battle_flags = 0; + rc->at_default = -2; + rc->df_default = -2; if (strchr(zName, ' ') != NULL) { log_error("race '%s' has an invalid name. remove spaces\n", zName); assert(strchr(zName, ' ') == NULL); diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index dcbe26e0e..0e2aa24f6 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -59,6 +59,8 @@ static void test_rc_defaults(CuTest *tc) { CuAssertIntEquals(tc, 0, rc->armor); CuAssertIntEquals(tc, 0, rc->at_bonus); CuAssertIntEquals(tc, 0, rc->df_bonus); + CuAssertIntEquals(tc, -2, rc->df_default); + CuAssertIntEquals(tc, -2, rc->at_default); CuAssertIntEquals(tc, 0, rc->battle_flags); CuAssertIntEquals(tc, PERSON_WEIGHT, rc->weight); test_teardown(); diff --git a/src/xmlreader.c b/src/xmlreader.c index 35b4b328e..7f51a7853 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1324,8 +1324,8 @@ static int parse_races(xmlDocPtr doc) } } - rc->at_default = (char)xml_ivalue(node, "unarmedattack", -2); - rc->df_default = (char)xml_ivalue(node, "unarmeddefense", -2); + rc->at_default = (char)xml_ivalue(node, "unarmedattack", rc->at_default); + rc->df_default = (char)xml_ivalue(node, "unarmeddefense", rc->df_default); rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus); rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus); From c05a65b881587ff66ef268997fa5351bc9c0b527 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 9 May 2018 22:16:30 +0200 Subject: [PATCH 157/231] expat parses (most of) races. fix canteach flag in XML. --- res/e3a/races.xml | 76 ++++++++-------- res/eressea.dtd | 190 +++++++++++++++++++++++++++++++++++++++ res/eressea/races.xml | 95 ++++++++++---------- res/races/dragon.xml | 2 +- res/races/goblin-3.xml | 2 +- res/races/halfling.xml | 2 +- src/exparse.c | 196 ++++++++++++++++++++++++++++++++++++++++- src/kernel/race.c | 15 ++-- src/kernel/race.h | 11 ++- src/kernel/race.test.c | 4 +- src/xmlreader.c | 22 ++--- 11 files changed, 498 insertions(+), 117 deletions(-) create mode 100644 res/eressea.dtd diff --git a/res/e3a/races.xml b/res/e3a/races.xml index bb70fa3df..00d34e58a 100644 --- a/res/e3a/races.xml +++ b/res/e3a/races.xml @@ -8,7 +8,7 @@ - + @@ -192,7 +192,7 @@ - + @@ -218,7 +218,7 @@ - + @@ -239,7 +239,7 @@ - + @@ -260,7 +260,7 @@ - + @@ -283,7 +283,7 @@ - + @@ -306,7 +306,7 @@ - + @@ -328,7 +328,7 @@ - + @@ -354,7 +354,7 @@ - + @@ -376,7 +376,7 @@ - + @@ -400,7 +400,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -448,7 +448,7 @@ - + @@ -471,7 +471,7 @@ - + @@ -493,7 +493,7 @@ - + @@ -520,7 +520,7 @@ - + @@ -543,7 +543,7 @@ - + @@ -565,7 +565,7 @@ - + @@ -589,15 +589,15 @@ - + - + - + @@ -651,28 +651,28 @@ - + - + - + - + - + @@ -687,14 +687,14 @@ - + - + @@ -703,14 +703,14 @@ - + @@ -736,7 +736,7 @@ - + @@ -754,7 +754,7 @@ - + @@ -771,7 +771,7 @@ - + @@ -787,7 +787,7 @@ - + @@ -801,7 +801,7 @@ - + @@ -816,7 +816,7 @@ - + @@ -830,12 +830,12 @@ - + - + diff --git a/res/eressea.dtd b/res/eressea.dtd new file mode 100644 index 000000000..c58ea5f33 --- /dev/null +++ b/res/eressea.dtd @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 21ff5b028..eb85b6900 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -11,9 +11,8 @@ - + - @@ -27,7 +26,7 @@ - + @@ -60,7 +59,7 @@ - + @@ -88,7 +87,7 @@ - + @@ -115,7 +114,7 @@ - + @@ -144,7 +143,7 @@ - + @@ -173,7 +172,7 @@ - + @@ -203,7 +202,7 @@ - + @@ -237,7 +236,7 @@ - + @@ -267,7 +266,7 @@ - + @@ -299,7 +298,7 @@ - + @@ -329,7 +328,7 @@ - + @@ -358,7 +357,7 @@ - + @@ -388,7 +387,7 @@ - + @@ -417,7 +416,7 @@ - + @@ -448,7 +447,7 @@ - + @@ -479,7 +478,7 @@ - + @@ -508,7 +507,7 @@ - + @@ -540,7 +539,7 @@ - + @@ -570,16 +569,16 @@ - + - + + regaura="1.000000" weight="100" capacity="540" speed="1.000000" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" canteach="no" invinciblenonmagic="yes"> @@ -649,28 +648,28 @@ - + - + - + - + - + @@ -684,25 +683,25 @@ - + - + - + - + @@ -712,7 +711,7 @@ - + @@ -722,7 +721,7 @@ - + @@ -733,7 +732,7 @@ - + @@ -783,7 +782,7 @@ - + @@ -925,7 +924,7 @@ - + @@ -962,7 +961,7 @@ - + @@ -970,7 +969,7 @@ - + @@ -984,7 +983,7 @@ - + @@ -1001,7 +1000,7 @@ - + @@ -1017,7 +1016,7 @@ - + @@ -1032,7 +1031,7 @@ - + @@ -1045,7 +1044,7 @@ - + @@ -1059,7 +1058,7 @@ - + @@ -1072,11 +1071,11 @@ - + - + @@ -1203,7 +1202,7 @@ - + diff --git a/res/races/dragon.xml b/res/races/dragon.xml index 7e0da2056..c9692cd9b 100644 --- a/res/races/dragon.xml +++ b/res/races/dragon.xml @@ -3,7 +3,7 @@ diff --git a/res/races/goblin-3.xml b/res/races/goblin-3.xml index 636f8cc29..9eb7ea835 100644 --- a/res/races/goblin-3.xml +++ b/res/races/goblin-3.xml @@ -7,7 +7,7 @@ speed="1.0" hp="16" damage="1d5" unarmedattack="-2" unarmeddefense="0" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes" healing="2.0"> - + diff --git a/res/races/halfling.xml b/res/races/halfling.xml index 3628d2b35..1f326056f 100644 --- a/res/races/halfling.xml +++ b/res/races/halfling.xml @@ -1,7 +1,7 @@ - + diff --git a/src/exparse.c b/src/exparse.c index bc7218383..44455888a 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -128,7 +128,19 @@ static void handle_bad_input(parseinfo *pi, const XML_Char *el, const XML_Char * static bool handle_flag(int *flags, const XML_Char **pair, const char *names[]) { int i; for (i = 0; names[i]; ++i) { - if (xml_strcmp(pair[0], names[i]) == 0) { + const char * name = names[i]; + if (name[0] == '!') { + if (xml_strcmp(pair[0], name+1) == 0) { + if (xml_bool(pair[1])) { + *flags &= ~(1 << i); + } + else { + *flags |= (1 << i); + } + return true; + } + } + else if (xml_strcmp(pair[0], name) == 0) { if (xml_bool(pair[1])) { *flags |= (1 << i); } @@ -865,6 +877,173 @@ static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Cha } } +static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + race *rc = (race *)pi->object; + const char *flag_names[] = { + "!playerrace", "killpeasants", "scarepeasants", "!cansteal", + "moverandom", "cannotmove", "learn", "fly", "swim", "walk", + "!canlearn", "!canteach", "horse", "desert", "illusionary", + "absorbpeasants", "noheal", "noweapons", "shapeshift", + "shapeshiftany", "undead", "dragon", "coastal", "unarmedguard", + "cansail", "invisible", "shipspeed", "moveattack", "migrants", NULL }; + const char *bflag_names[] = { + "equipment", "noblock", "resistpierce", "resistcut", "resistbash", + "invinciblenonmagic", "noattack", NULL }; + const char *eflag_names[] = { + "giveperson", "giveunit", "getitem", "recruitethereal", + "recruitunlimited", "stonegolem", "irongolem", NULL }; + + if (xml_strcmp(el, "attack") == 0) { + assert(rc); + } + else if (xml_strcmp(el, "familiar") == 0) { + assert(rc); + } + else if (xml_strcmp(el, "skill") == 0) { + const XML_Char *name = NULL; + int i, speed = 0, mod = 0; + + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "name") == 0) { + name = val; + } + else if (xml_strcmp(key, "modifier") == 0) { + mod = xml_int(val); + } + else if (xml_strcmp(key, "speed") == 0) { + speed = xml_int(val); + } + else { + handle_bad_input(pi, el, key); + } + } + if (name) { + skill_t sk = findskill(name); + if (sk != NOSKILL) { + rc->bonus[sk] = (char)mod; + if (speed != 0) { + set_study_speed(rc, sk, speed); + } + } + } + } + else if (xml_strcmp(el, "param") == 0) { + const XML_Char *key = attr_get(attr, "name"), *val = attr_get(attr, "value"); + if (key && val) { + rc_set_param(rc, key, val); + } + } + else if (xml_strcmp(el, "ai") == 0) { + /* AI flags are cumulative to race flags. XML format is dumb */ + int i, flags = 0; + assert(rc); + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "splitsize") == 0) { + rc->splitsize = xml_int(val); + } + else if (xml_strcmp(key, "scare") == 0) { + rc_set_param(rc, "scare", val); + } + else if (!handle_flag(&flags, attr + i, flag_names)) { + handle_bad_input(pi, el, key); + } + } + rc->flags |= flags; + } + else if (xml_strcmp(el, "race") == 0) { + const XML_Char *name; + + name = attr_get(attr, "name"); + if (name) { + assert(!rc); + pi->object = rc = rc_get_or_create(name); + int i; + + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "maxaura") == 0) { + rc->maxaura = (int)(100 * xml_float(val)); + } + else if (xml_strcmp(key, "magres") == 0) { + /* specified in percent: */ + rc->magres = frac_make(xml_int(val), 100); + } + else if (xml_strcmp(key, "healing") == 0) { + rc->healing = (int)(xml_float(val) * 100); + } + else if (xml_strcmp(key, "regaura") == 0) { + rc->regaura = xml_float(val); + } + else if (xml_strcmp(key, "recruitcost") == 0) { + rc->recruitcost = xml_int(val); + } + else if (xml_strcmp(key, "maintenance") == 0) { + rc->maintenance = xml_int(val); + } + else if (xml_strcmp(key, "income") == 0) { + rc->income = xml_int(val); + } + else if (xml_strcmp(key, "weight") == 0) { + rc->weight = xml_int(val); + } + else if (xml_strcmp(key, "capacity") == 0) { + rc->capacity = xml_int(val); + } + else if (xml_strcmp(key, "speed") == 0) { + rc->speed = xml_float(val); + } + else if (xml_strcmp(key, "hp") == 0) { + rc->hitpoints = xml_int(val); + } + else if (xml_strcmp(key, "ac") == 0) { + rc->armor = xml_int(val); + } + else if (xml_strcmp(key, "damage") == 0) { + rc->def_damage = str_strdup(val); + } + else if (xml_strcmp(key, "unarmedattack") == 0) { + rc->at_default = xml_int(val); + } + else if (xml_strcmp(key, "unarmeddefense") == 0) { + rc->df_default = xml_int(val); + } + else if (xml_strcmp(key, "attackmodifier") == 0) { + rc->at_bonus = xml_int(val); + } + else if (xml_strcmp(key, "defensemodifier") == 0) { + rc->df_bonus = xml_int(val); + } + else if (xml_strcmp(key, "studyspeed") == 0) { + int study_speed = xml_int(val); + if (study_speed != 0) { + skill_t sk; + for (sk = 0; sk < MAXSKILLS; ++sk) { + set_study_speed(rc, sk, study_speed); + } + } + + } + else if (!handle_flag(&rc->flags, attr + i, flag_names)) { + if (!handle_flag(&rc->battle_flags, attr + i, bflag_names)) { + if (!handle_flag(&rc->ec_flags, attr + i, eflag_names)) { + /* we already handled the name earlier: */ + if (xml_strcmp(key, "name") != 0) { + handle_bad_input(pi, el, attr[i]); + } + } + } + } + } + } + } + else { + assert(rc); + handle_bad_input(pi, el, NULL); + } +} + static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "nodestroy", "nobuild", "unique", "decay", "magic", "namechange", "fort", "oneperturn", NULL }; if (xml_strcmp(el, "building") == 0) { @@ -979,6 +1158,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char } else { switch (pi->type) { + case EXP_RACES: + start_races(pi, el, attr); + break; case EXP_BUILDINGS: start_buildings(pi, el, attr); break; @@ -1063,6 +1245,15 @@ static void end_resources(parseinfo *pi, const XML_Char *el) { } } +static void end_races(parseinfo *pi, const XML_Char *el) { + if (xml_strcmp(el, "race") == 0) { + pi->object = NULL; + } + else if (xml_strcmp(el, "races") == 0) { + pi->type = EXP_UNKNOWN; + } +} + static void end_ships(parseinfo *pi, const XML_Char *el) { ship_type *stype = (ship_type *)pi->object; if (xml_strcmp(el, "construction") == 0) { @@ -1135,6 +1326,9 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { parseinfo *pi = (parseinfo *)data; switch (pi->type) { + case EXP_RACES: + end_races(pi, el); + break; case EXP_SHIPS: end_ships(pi, el); break; diff --git a/src/kernel/race.c b/src/kernel/race.c index ac81f7f78..596f1527f 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -451,6 +451,12 @@ int rc_herb_trade(const struct race *rc) return 500; } +void set_study_speed(race *rc, skill_t sk, int modifier) { + if (!rc->study_speed) + rc->study_speed = calloc(1, MAXSKILLS); + rc->study_speed[sk] = (char)modifier; +} + const race *rc_otherrace(const race *rc) { variant *v = rc_getoption(rc, RCO_OTHER); @@ -466,18 +472,13 @@ void rc_set_param(struct race *rc, const char *key, const char *value) { if (strcmp(key, "recruit_multi") == 0) { rc->recruit_multi = atof(value); } - else if (strcmp(key, "migrants.formula") == 0) { - if (value[0] == '1') { - rc->flags |= RCF_MIGRANTS; - } - } else if (strcmp(key, "other_race")==0) { rc_setoption(rc, RCO_OTHER, value); } - else if (strcmp(key, "ai.scare")==0) { + else if (strcmp(key, "scare")==0) { rc_setoption(rc, RCO_SCARE, value); } - else if (strcmp(key, "hunger.damage")==0) { + else if (strcmp(key, "hunger_damage")==0) { rc_setoption(rc, RCO_HUNGER, value); } else if (strcmp(key, "armor.stamina")==0) { diff --git a/src/kernel/race.h b/src/kernel/race.h index 7c38eec57..51c99e0f0 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -129,7 +129,7 @@ extern "C" { int weight; int capacity; int income; - float speed; + double speed; int hitpoints; char *def_damage; int armor; @@ -229,9 +229,11 @@ extern "C" { #define RCF_CANSAIL (1<<24) /* Einheit darf Schiffe betreten */ #define RCF_INVISIBLE (1<<25) /* not visible in any report */ #define RCF_SHIPSPEED (1<<26) /* race gets +1 on shipspeed */ -#define RCF_MIGRANTS (1<<27) /* may have migrant units (human bonus) */ -#define RCF_FAMILIAR (1<<28) /* may be a familiar */ -#define RCF_ATTACK_MOVED (1<<29) /* may attack if it has moved */ +#define RCF_ATTACK_MOVED (1<<27) /* may attack if it has moved */ +#define RCF_MIGRANTS (1<<28) /* may have migrant units (human bonus) */ +#define RCF_FAMILIAR (1<<29) /* may be a familiar */ + +#define RCF_DEFAULT (RCF_NOSTEAL|RCF_CANSAIL|RCF_NOLEARN) /* Economic flags */ #define ECF_GIVEPERSON (1<<2) /* �bergibt Personen */ @@ -271,6 +273,7 @@ extern "C" { const char *raceprefix(const struct unit *u); void register_race_function(race_func, const char *); + void set_study_speed(struct race *rc, skill_t sk, int modifier); #ifdef __cplusplus } #endif diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index dcbe26e0e..9a118bc74 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -113,9 +113,9 @@ static void test_rc_set_param(CuTest *tc) { rc_set_param(rc, "migrants.formula", "1"); CuAssertIntEquals(tc, RCF_MIGRANTS, rc->flags&RCF_MIGRANTS); CuAssertIntEquals(tc, MIGRANTS_LOG10, rc_migrants_formula(rc)); - rc_set_param(rc, "ai.scare", "400"); + rc_set_param(rc, "scare", "400"); CuAssertIntEquals(tc, 400, rc_scare(rc)); - rc_set_param(rc, "hunger.damage", "1d10+12"); + rc_set_param(rc, "hunger_damage", "1d10+12"); CuAssertStrEquals(tc, "1d10+12", rc_hungerdamage(rc)); test_teardown(); } diff --git a/src/xmlreader.c b/src/xmlreader.c index 3fd6c1b7b..b26bff66c 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1256,7 +1256,7 @@ static void parse_ai(race * rc, xmlNodePtr node) propValue = xmlGetProp(node, BAD_CAST "scare"); if (propValue) { - rc_set_param(rc, "ai.scare", (const char *)propValue); + rc_set_param(rc, "scare", (const char *)propValue); xmlFree(propValue); } rc->splitsize = xml_ivalue(node, "splitsize", 0); @@ -1270,12 +1270,6 @@ static void parse_ai(race * rc, xmlNodePtr node) rc->flags |= RCF_ATTACK_MOVED; } -static void set_study_speed(race *rc, skill_t sk, int modifier) { - if (!rc->study_speed) - rc->study_speed = calloc(1, MAXSKILLS); - rc->study_speed[sk] = (char)modifier; -} - static int parse_races(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -1319,7 +1313,7 @@ static int parse_races(xmlDocPtr doc) rc->income = xml_ivalue(node, "income", rc->income); rc->speed = (float)xml_fvalue(node, "speed", rc->speed); rc->hitpoints = xml_ivalue(node, "hp", rc->hitpoints); - rc->armor = (char)xml_ivalue(node, "ac", rc->armor); + rc->armor = xml_ivalue(node, "ac", rc->armor); study_speed_base = xml_ivalue(node, "studyspeed", 0); if (study_speed_base != 0) { for (sk = 0; sk < MAXSKILLS; ++sk) { @@ -1332,14 +1326,18 @@ static int parse_races(xmlDocPtr doc) rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus); rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus); + if (!xml_bvalue(node, "canteach", true)) + rc->flags |= RCF_NOTEACH; + if (!xml_bvalue(node, "cansteal", true)) + rc->flags |= RCF_NOSTEAL; + if (!xml_bvalue(node, "canlearn", true)) + rc->flags |= RCF_NOLEARN; if (!xml_bvalue(node, "playerrace", false)) { assert(rc->recruitcost == 0); rc->flags |= RCF_NPC; } if (xml_bvalue(node, "scarepeasants", false)) rc->flags |= RCF_SCAREPEASANTS; - if (!xml_bvalue(node, "cansteal", true)) - rc->flags |= RCF_NOSTEAL; if (xml_bvalue(node, "cansail", true)) rc->flags |= RCF_CANSAIL; if (xml_bvalue(node, "cannotmove", false)) @@ -1356,10 +1354,6 @@ static int parse_races(xmlDocPtr doc) rc->flags |= RCF_SWIM; if (xml_bvalue(node, "walk", false)) rc->flags |= RCF_WALK; - if (!xml_bvalue(node, "canlearn", true)) - rc->flags |= RCF_NOLEARN; - if (!xml_bvalue(node, "canteach", true)) - rc->flags |= RCF_NOTEACH; if (xml_bvalue(node, "horse", false)) rc->flags |= RCF_HORSE; if (xml_bvalue(node, "desert", false)) From 48a4de0768df37545e5efc41827fe5797e4cde16 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 07:01:46 +0200 Subject: [PATCH 158/231] parse race/attack data --- src/exparse.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index 44455888a..e266d55ce 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -877,6 +877,8 @@ static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Cha } } +static int nattacks; + static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { race *rc = (race *)pi->object; const char *flag_names[] = { @@ -894,7 +896,33 @@ static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Cha "recruitunlimited", "stonegolem", "irongolem", NULL }; if (xml_strcmp(el, "attack") == 0) { + int i; + struct att * at; assert(rc); + at = rc->attack + nattacks; + at->type = AT_NONE; + ++nattacks; + if (nattacks >= RACE_ATTACKS) { + log_fatal("too many attacks for race '%s'\n", rc->_name); + } + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "type") == 0) { + at->type = xml_int(val); + } + else if (xml_strcmp(key, "flags") == 0) { + at->flags = xml_int(val); + } + else if (xml_strcmp(key, "level") == 0) { + at->level = xml_int(val); + } + else if (xml_strcmp(key, "damage") == 0) { + at->data.dice = str_strdup(val); + } + else if (xml_strcmp(key, "spell") == 0) { + at->data.sp = spellref_create(NULL, val); + } + } } else if (xml_strcmp(el, "familiar") == 0) { assert(rc); @@ -1246,7 +1274,11 @@ static void end_resources(parseinfo *pi, const XML_Char *el) { } static void end_races(parseinfo *pi, const XML_Char *el) { + race *rc = (race *)pi->object; if (xml_strcmp(el, "race") == 0) { + assert(rc); + rc->attack[nattacks].type = AT_NONE; + nattacks = 0; pi->object = NULL; } else if (xml_strcmp(el, "races") == 0) { From 2a213d93020eecb91bc4dc4b36da83adb46b954e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 18:03:47 +0200 Subject: [PATCH 159/231] try to analyze intermittent bug on travis --- scripts/tests/e3/buildings.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/tests/e3/buildings.lua b/scripts/tests/e3/buildings.lua index 709e7df74..e642c1aa7 100644 --- a/scripts/tests/e3/buildings.lua +++ b/scripts/tests/e3/buildings.lua @@ -41,6 +41,11 @@ function test_build_watch() u:add_order("MACHE Wache") process_orders() assert_not_nil(u.building) + if 5 ~= u.building.size then + for k,v in f.messages do + print(v) + end + end assert_equal(5, u.building.size) u:set_skill("building", 2) From b0012eeae07498801e69fbdc371e2bca5cd50f03 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 20:02:53 +0200 Subject: [PATCH 160/231] familiars do not need the default value in XML (bad XML). --- res/e3a/races.xml | 14 +++++++------- res/eressea/races.xml | 24 ++++++++++++------------ res/races/aquarian.xml | 2 +- res/races/cat.xml | 2 +- res/races/demon.xml | 2 +- res/races/dwarf.xml | 2 +- res/races/elf.xml | 2 +- res/races/goblin-3.xml | 2 +- res/races/goblin.xml | 2 +- res/races/halfling.xml | 2 +- res/races/human.xml | 2 +- res/races/insect.xml | 2 +- res/races/orc.xml | 2 +- res/races/troll.xml | 2 +- src/xmlreader.c | 8 +------- 15 files changed, 32 insertions(+), 38 deletions(-) diff --git a/res/e3a/races.xml b/res/e3a/races.xml index 7bb80edc0..2386a5ea9 100644 --- a/res/e3a/races.xml +++ b/res/e3a/races.xml @@ -40,7 +40,7 @@ - + @@ -67,7 +67,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -138,7 +138,7 @@ - + @@ -160,7 +160,7 @@ - + @@ -186,7 +186,7 @@ - + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index b1f105f98..67d84c763 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -20,7 +20,7 @@ - + @@ -749,7 +749,7 @@ - + @@ -774,7 +774,7 @@ - + @@ -806,7 +806,7 @@ - + @@ -834,7 +834,7 @@ - + @@ -864,7 +864,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -918,7 +918,7 @@ - + @@ -1109,7 +1109,7 @@ - + @@ -1135,7 +1135,7 @@ - + @@ -1166,7 +1166,7 @@ - + @@ -1196,7 +1196,7 @@ - + diff --git a/res/races/aquarian.xml b/res/races/aquarian.xml index 19fd3aee7..4950d60d1 100644 --- a/res/races/aquarian.xml +++ b/res/races/aquarian.xml @@ -10,7 +10,7 @@ - + diff --git a/res/races/cat.xml b/res/races/cat.xml index 5986c223c..2e0f73dcf 100644 --- a/res/races/cat.xml +++ b/res/races/cat.xml @@ -17,7 +17,7 @@ - + diff --git a/res/races/demon.xml b/res/races/demon.xml index 69d98145f..21a1f289d 100644 --- a/res/races/demon.xml +++ b/res/races/demon.xml @@ -27,7 +27,7 @@ recruitethereal="yes" equipment="yes" healing="1.5"> - + diff --git a/res/races/dwarf.xml b/res/races/dwarf.xml index 043b76aa7..4f2719649 100644 --- a/res/races/dwarf.xml +++ b/res/races/dwarf.xml @@ -23,7 +23,7 @@ - + diff --git a/res/races/elf.xml b/res/races/elf.xml index 683ee823b..968ad22f2 100644 --- a/res/races/elf.xml +++ b/res/races/elf.xml @@ -18,7 +18,7 @@ - + diff --git a/res/races/goblin-3.xml b/res/races/goblin-3.xml index 636f8cc29..ad83ee7f0 100644 --- a/res/races/goblin-3.xml +++ b/res/races/goblin-3.xml @@ -21,7 +21,7 @@ getitem="yes" equipment="yes" healing="2.0"> - + diff --git a/res/races/goblin.xml b/res/races/goblin.xml index 84d2c5079..ec224a0c7 100644 --- a/res/races/goblin.xml +++ b/res/races/goblin.xml @@ -21,7 +21,7 @@ healing="2.0"> - + diff --git a/res/races/halfling.xml b/res/races/halfling.xml index 3628d2b35..5c17e4a4f 100644 --- a/res/races/halfling.xml +++ b/res/races/halfling.xml @@ -24,7 +24,7 @@ - + diff --git a/res/races/human.xml b/res/races/human.xml index f91ba7daf..00c11f8a6 100644 --- a/res/races/human.xml +++ b/res/races/human.xml @@ -7,7 +7,7 @@ - + diff --git a/res/races/insect.xml b/res/races/insect.xml index 75e16f7af..b783f047a 100644 --- a/res/races/insect.xml +++ b/res/races/insect.xml @@ -20,7 +20,7 @@ - + diff --git a/res/races/orc.xml b/res/races/orc.xml index a0033759a..47754152a 100644 --- a/res/races/orc.xml +++ b/res/races/orc.xml @@ -22,7 +22,7 @@ - + diff --git a/res/races/troll.xml b/res/races/troll.xml index 9168a6d0e..7d3f18551 100644 --- a/res/races/troll.xml +++ b/res/races/troll.xml @@ -27,7 +27,7 @@ healing="1.5"> - + diff --git a/src/xmlreader.c b/src/xmlreader.c index 7f51a7853..0f7b40b93 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1464,13 +1464,7 @@ static int parse_races(xmlDocPtr doc) assert(propValue != NULL); frc = rc_get_or_create((const char *)propValue); frc->flags |= RCF_FAMILIAR; - if (xml_bvalue(node, "default", false)) { - rc->familiars[k] = rc->familiars[0]; - rc->familiars[0] = frc; - } - else { - rc->familiars[k] = frc; - } + rc->familiars[k] = frc; xmlFree(propValue); } else { From 94769a66f88c0ed7bef3e474b7f20cfe005af66d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 20:18:40 +0200 Subject: [PATCH 161/231] teach vs canteach mixup --- res/eressea/races.xml | 2 +- src/xmlreader.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 67d84c763..e6dd7f58d 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -6,7 +6,7 @@ regaura="0" weight="500" capacity="200" equipment="no" speed="1" hp="1000" ac="4" damage="2d4" unarmedattack="10" unarmeddefense="10" attackmodifier="8" defensemodifier="8" - fly="no" walk="no" canteach="no" getitem="yes"> + fly="no" walk="no" teach="no" getitem="yes"> diff --git a/src/xmlreader.c b/src/xmlreader.c index 0f7b40b93..fe6f18e1f 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1355,7 +1355,7 @@ static int parse_races(xmlDocPtr doc) rc->flags |= RCF_WALK; if (!xml_bvalue(node, "canlearn", true)) rc->flags |= RCF_NOLEARN; - if (!xml_bvalue(node, "canteach", true)) + if (!xml_bvalue(node, "teach", true)) rc->flags |= RCF_NOTEACH; if (xml_bvalue(node, "horse", false)) rc->flags |= RCF_HORSE; From 85cf8da383e3c229a39921b9c6292b7d09cf8f93 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 20:37:37 +0200 Subject: [PATCH 162/231] rename canteach/canlearn to teach/learn race/function is never used (and there is no namedragon function). --- res/e3a/races.xml | 78 ++++++++++++++++---------------- res/eressea/races.xml | 94 +++++++++++++++++++-------------------- res/races/dragon.xml | 3 +- res/races/wyrm.xml | 1 - res/races/youngdragon.xml | 1 - src/exparse.c | 34 +++++++++++++- src/xmlreader.c | 6 +-- 7 files changed, 123 insertions(+), 94 deletions(-) diff --git a/res/e3a/races.xml b/res/e3a/races.xml index 07322d521..2fa889160 100644 --- a/res/e3a/races.xml +++ b/res/e3a/races.xml @@ -8,7 +8,7 @@ - + @@ -192,7 +192,7 @@ - + @@ -218,7 +218,7 @@ - + @@ -239,7 +239,7 @@ - + @@ -260,7 +260,7 @@ - + @@ -283,7 +283,7 @@ - + @@ -306,7 +306,7 @@ - + @@ -328,7 +328,7 @@ - + @@ -354,7 +354,7 @@ - + @@ -376,7 +376,7 @@ - + @@ -400,7 +400,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -448,7 +448,7 @@ - + @@ -471,7 +471,7 @@ - + @@ -493,7 +493,7 @@ - + @@ -520,7 +520,7 @@ - + @@ -543,7 +543,7 @@ - + @@ -565,7 +565,7 @@ - + @@ -589,15 +589,15 @@ - + - + - + @@ -651,34 +651,34 @@ - + - + - + - + - + - + @@ -687,14 +687,14 @@ - + - + @@ -703,14 +703,14 @@ - + @@ -736,7 +736,7 @@ - + @@ -754,7 +754,7 @@ - + @@ -771,7 +771,7 @@ - + @@ -787,7 +787,7 @@ - + @@ -801,7 +801,7 @@ - + @@ -816,7 +816,7 @@ - + @@ -830,12 +830,12 @@ - + - + diff --git a/res/eressea/races.xml b/res/eressea/races.xml index 851d89de6..1acffa872 100644 --- a/res/eressea/races.xml +++ b/res/eressea/races.xml @@ -6,7 +6,7 @@ regaura="0" weight="500" capacity="200" equipment="no" speed="1" hp="1000" ac="4" damage="2d4" unarmedattack="10" unarmeddefense="10" attackmodifier="8" defensemodifier="8" - fly="no" walk="no" canteach="no" getitem="yes"> + fly="no" walk="no" teach="no" getitem="yes"> @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -87,7 +87,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -143,7 +143,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -202,7 +202,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -266,7 +266,7 @@ - + @@ -298,7 +298,7 @@ - + @@ -328,7 +328,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -387,7 +387,7 @@ - + @@ -416,7 +416,7 @@ - + @@ -447,7 +447,7 @@ - + @@ -478,7 +478,7 @@ - + @@ -507,7 +507,7 @@ - + @@ -539,7 +539,7 @@ - + @@ -569,16 +569,16 @@ - + - + + regaura="1.000000" weight="100" capacity="540" speed="1.000000" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" invinciblenonmagic="yes"> @@ -648,34 +648,34 @@ - + - + - + - + - + - + @@ -683,25 +683,25 @@ - + - + - + - + @@ -711,7 +711,7 @@ - + @@ -721,7 +721,7 @@ - + @@ -732,7 +732,7 @@ - + @@ -924,7 +924,7 @@ - + @@ -961,7 +961,7 @@ - + @@ -969,7 +969,7 @@ - + @@ -983,7 +983,7 @@ - + @@ -1000,7 +1000,7 @@ - + @@ -1016,7 +1016,7 @@ - + @@ -1031,7 +1031,7 @@ - + @@ -1044,7 +1044,7 @@ - + @@ -1058,7 +1058,7 @@ - + @@ -1071,11 +1071,11 @@ - + - + @@ -1202,7 +1202,7 @@ - + diff --git a/res/races/dragon.xml b/res/races/dragon.xml index c9692cd9b..7625b914f 100644 --- a/res/races/dragon.xml +++ b/res/races/dragon.xml @@ -3,10 +3,9 @@ - diff --git a/res/races/wyrm.xml b/res/races/wyrm.xml index df2008a80..c69ca2953 100644 --- a/res/races/wyrm.xml +++ b/res/races/wyrm.xml @@ -7,7 +7,6 @@ damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" dragon="yes" income="5000"> - diff --git a/res/races/youngdragon.xml b/res/races/youngdragon.xml index d8b3d366f..bbfdb5a9f 100644 --- a/res/races/youngdragon.xml +++ b/res/races/youngdragon.xml @@ -6,7 +6,6 @@ damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" dragon="yes" income="150"> - diff --git a/src/exparse.c b/src/exparse.c index e266d55ce..943b80741 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -878,13 +878,14 @@ static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Cha } static int nattacks; +static int nfamiliars; static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { race *rc = (race *)pi->object; const char *flag_names[] = { "!playerrace", "killpeasants", "scarepeasants", "!cansteal", "moverandom", "cannotmove", "learn", "fly", "swim", "walk", - "!canlearn", "!canteach", "horse", "desert", "illusionary", + "!learn", "!teach", "horse", "desert", "illusionary", "absorbpeasants", "noheal", "noweapons", "shapeshift", "shapeshiftany", "undead", "dragon", "coastal", "unarmedguard", "cansail", "invisible", "shipspeed", "moveattack", "migrants", NULL }; @@ -922,10 +923,31 @@ static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Cha else if (xml_strcmp(key, "spell") == 0) { at->data.sp = spellref_create(NULL, val); } + else { + handle_bad_input(pi, el, key); + } } } else if (xml_strcmp(el, "familiar") == 0) { + race *frc = NULL; + int i; + assert(rc); + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "race") == 0) { + frc = rc_get_or_create(val); + frc->flags |= RCF_FAMILIAR; + } + else { + handle_bad_input(pi, el, key); + } + } + if (frc) { + if (nfamiliars < MAXMAGIETYP) { + rc->familiars[nfamiliars++] = frc; + } + } } else if (xml_strcmp(el, "skill") == 0) { const XML_Char *name = NULL; @@ -983,6 +1005,9 @@ static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Cha else if (xml_strcmp(el, "race") == 0) { const XML_Char *name; + nfamiliars = 0; + nattacks = 0; + name = attr_get(attr, "name"); if (name) { assert(!rc); @@ -1279,6 +1304,13 @@ static void end_races(parseinfo *pi, const XML_Char *el) { assert(rc); rc->attack[nattacks].type = AT_NONE; nattacks = 0; + if (nfamiliars > 0 && nfamiliars < MAXMAGIETYP) { + int i; + for (i = nfamiliars - 1; i != MAXMAGIETYP; ++i) { + rc->familiars[i] = rc->familiars[nfamiliars - 1]; + } + } + nfamiliars = 0; pi->object = NULL; } else if (xml_strcmp(el, "races") == 0) { diff --git a/src/xmlreader.c b/src/xmlreader.c index 53a8c1365..cf63a3ccb 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1326,11 +1326,11 @@ static int parse_races(xmlDocPtr doc) rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus); rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus); - if (!xml_bvalue(node, "canteach", true)) + if (!xml_bvalue(node, "teach", true)) rc->flags |= RCF_NOTEACH; if (!xml_bvalue(node, "cansteal", true)) rc->flags |= RCF_NOSTEAL; - if (!xml_bvalue(node, "canlearn", true)) + if (!xml_bvalue(node, "learn", true)) rc->flags |= RCF_NOLEARN; if (!xml_bvalue(node, "playerrace", false)) { assert(rc->recruitcost == 0); @@ -1695,8 +1695,8 @@ void register_xmlreader(void) xml_register_callback(parse_ships); xml_register_callback(parse_spellbooks); xml_register_callback(parse_spells); -#endif xml_register_callback(parse_races); +#endif xml_register_callback(parse_equipment); From 5de2a9e2aef1f5c72dd5ac8ca0f4951ef9ff3769 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 21:05:51 +0200 Subject: [PATCH 163/231] fix ec_flags parsing (irongolem, etc) --- src/kernel/race.c | 2 +- src/kernel/race.h | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kernel/race.c b/src/kernel/race.c index fa872778c..e77929fbf 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -310,7 +310,7 @@ static race *rc_find_i(const char *name) for (i = 0; rc_depr[i]; i += 2) { if (strcmp(name, rc_depr[i]) == 0) { rc = rc_find_i(rc_depr[i + 1]); - log_warning("a reference was made to the retired race '%s', returning '%s'.", name, rc->_name); + log_info("a reference was made to the retired race '%s', returning '%s'.", name, rc->_name); break; } } diff --git a/src/kernel/race.h b/src/kernel/race.h index 51c99e0f0..202b84d4b 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -236,13 +236,13 @@ extern "C" { #define RCF_DEFAULT (RCF_NOSTEAL|RCF_CANSAIL|RCF_NOLEARN) /* Economic flags */ -#define ECF_GIVEPERSON (1<<2) /* �bergibt Personen */ -#define ECF_GIVEUNIT (1<<3) /* Einheiten an andere Partei �bergeben */ -#define ECF_GETITEM (1<<4) /* nimmt Gegenst�nde an */ -#define ECF_REC_ETHEREAL (1<<7) /* Rekrutiert aus dem Nichts */ -#define ECF_REC_UNLIMITED (1<<8) /* Rekrutiert ohne Limit */ -#define ECF_STONEGOLEM (1<<9) /* race gets stonegolem properties */ -#define ECF_IRONGOLEM (1<<10) /* race gets irongolem properties */ +#define ECF_GIVEPERSON (1<<0) /* �bergibt Personen */ +#define ECF_GIVEUNIT (1<<1) /* Einheiten an andere Partei �bergeben */ +#define ECF_GETITEM (1<<2) /* nimmt Gegenst�nde an */ +#define ECF_REC_ETHEREAL (1<<3) /* Rekrutiert aus dem Nichts */ +#define ECF_REC_UNLIMITED (1<<4) /* Rekrutiert ohne Limit */ +#define ECF_STONEGOLEM (1<<5) /* race gets stonegolem properties */ +#define ECF_IRONGOLEM (1<<6) /* race gets irongolem properties */ /* Battle-Flags */ #define BF_EQUIPMENT (1<<0) /* Kann Ausr�stung benutzen */ From 9e16ebc01ad199165eeec4a633ae3e69351601c1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 22:00:23 +0200 Subject: [PATCH 164/231] all kinds of race flag breakage repaired. but now, humans suddenly can't build a ship in E2? --- src/exparse.c | 2 +- src/jsonconf.c | 7 +++---- src/jsonconf.test.c | 6 +++--- src/kernel/race.c | 1 + src/kernel/race.h | 6 +++--- src/monsters.test.c | 14 +++++++++----- src/spy.test.c | 3 +++ src/tests.c | 2 +- src/xmlreader.c | 4 ++-- 9 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index 943b80741..b016c89df 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -883,7 +883,7 @@ static int nfamiliars; static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { race *rc = (race *)pi->object; const char *flag_names[] = { - "!playerrace", "killpeasants", "scarepeasants", "!cansteal", + "playerrace", "killpeasants", "scarepeasants", "!cansteal", "moverandom", "cannotmove", "learn", "fly", "swim", "walk", "!learn", "!teach", "horse", "desert", "illusionary", "absorbpeasants", "noheal", "noweapons", "shapeshift", diff --git a/src/jsonconf.c b/src/jsonconf.c index 51727fe52..29881d6cf 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -480,17 +480,16 @@ static void json_ship(cJSON *json, ship_type *st) { static void json_race(cJSON *json, race *rc) { cJSON *child; const char *flags[] = { - "npc", "killpeasants", "scarepeasants", + "player", "killpeasants", "scarepeasants", "nosteal", "moverandom", "cannotmove", "learn", "fly", "swim", "walk", "nolearn", "noteach", "horse", "desert", "illusionary", "absorbpeasants", "noheal", "noweapons", "shapeshift", "", "undead", "dragon", - "coastal", "", "cansail", 0 + "coastal", "", "cansail", NULL }; const char *ecflags[] = { - "", "keepitem", "giveperson", - "giveunit", "getitem", 0 + "giveperson", "giveunit", "getitem", NULL }; if (json->type != cJSON_Object) { log_error("race %s is not a json object: %d", json->string, json->type); diff --git a/src/jsonconf.test.c b/src/jsonconf.test.c index 482337e40..7c15b63f1 100644 --- a/src/jsonconf.test.c +++ b/src/jsonconf.test.c @@ -56,7 +56,7 @@ static void check_flag(CuTest *tc, const char *name, int flag) { static void test_flags(CuTest *tc) { test_setup(); - check_flag(tc, "npc", RCF_NPC); + check_flag(tc, "player", RCF_PLAYABLE); check_flag(tc, "scarepeasants", RCF_SCAREPEASANTS); check_flag(tc, "nosteal", RCF_NOSTEAL); check_flag(tc, "noheal", RCF_NOHEAL); @@ -181,7 +181,7 @@ static void test_races(CuTest * tc) "\"income\" : 30," "\"hp\" : 5," "\"ac\" : 6," - "\"flags\" : [ \"npc\", \"walk\", \"undead\" ]" + "\"flags\" : [ \"player\", \"walk\", \"undead\" ]" "}}}"; cJSON *json = cJSON_Parse(data); const struct race *rc; @@ -195,7 +195,7 @@ static void test_races(CuTest * tc) CuAssertPtrNotNull(tc, races); rc = rc_find("orc"); CuAssertPtrNotNull(tc, rc); - CuAssertIntEquals(tc, RCF_NPC | RCF_WALK | RCF_UNDEAD, rc->flags); + CuAssertIntEquals(tc, RCF_PLAYABLE | RCF_WALK | RCF_UNDEAD, rc->flags); CuAssertStrEquals(tc, "1d4", rc->def_damage); CuAssertTrue(tc, frac_equal(frac_one, rc->magres)); CuAssertIntEquals(tc, 200, rc->maxaura); diff --git a/src/kernel/race.c b/src/kernel/race.c index e77929fbf..ecdb7ae3d 100644 --- a/src/kernel/race.c +++ b/src/kernel/race.c @@ -356,6 +356,7 @@ race *rc_create(const char *zName) rc->magres.sa[1] = 1; rc->hitpoints = 1; + rc->flags = RCF_DEFAULT; rc->weight = PERSON_WEIGHT; rc->capacity = 540; rc->income = 20; diff --git a/src/kernel/race.h b/src/kernel/race.h index 202b84d4b..de0fd92e0 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -202,7 +202,7 @@ extern "C" { int rc_get_mask(char *list); /* Flags. Do not reorder these without changing json_race() in jsonconf.c */ -#define RCF_NPC (1<<0) /* cannot be the race for a player faction (and other limits?) */ +#define RCF_PLAYABLE (1<<0) /* cannot be the race for a player faction (and other limits?) */ #define RCF_KILLPEASANTS (1<<1) /* a monster that eats peasants */ #define RCF_SCAREPEASANTS (1<<2) /* a monster that scares peasants out of the hex */ #define RCF_NOSTEAL (1<<3) /* this race has high stealth, but is not allowed to steal */ @@ -233,7 +233,7 @@ extern "C" { #define RCF_MIGRANTS (1<<28) /* may have migrant units (human bonus) */ #define RCF_FAMILIAR (1<<29) /* may be a familiar */ -#define RCF_DEFAULT (RCF_NOSTEAL|RCF_CANSAIL|RCF_NOLEARN) +#define RCF_DEFAULT 0 /* Economic flags */ #define ECF_GIVEPERSON (1<<0) /* �bergibt Personen */ @@ -256,7 +256,7 @@ extern "C" { const char *racename(const struct locale *lang, const struct unit *u, const race * rc); -#define playerrace(rc) (!((rc)->flags & RCF_NPC)) +#define playerrace(rc) ((rc)->flags & RCF_PLAYABLE) #define dragonrace(rc) ((rc)->flags & RCF_DRAGON) #define humanoidrace(rc) (((rc)->flags & RCF_UNDEAD) || (rc)==get_race(RC_DRACOID) || playerrace(rc)) #define illusionaryrace(rc) ((rc)->flags & RCF_ILLUSIONARY) diff --git a/src/monsters.test.c b/src/monsters.test.c index 409b86dfe..8fe9a6b7f 100644 --- a/src/monsters.test.c +++ b/src/monsters.test.c @@ -55,12 +55,16 @@ static void create_monsters(unit **up, unit **um) { test_create_horse(); default_locale = test_create_locale(); fp = test_create_faction(NULL); + fm = get_or_create_monsters(); + fset(fm, FFL_NOIDLEOUT); + assert(fval(fm, FFL_NPC)); + assert(fval(fm, FFL_NOIDLEOUT)); + assert(rc_find(fm->race->_name)); rc = rc_get_or_create(fm->race->_name); - fset(rc, RCF_UNARMEDGUARD|RCF_NPC|RCF_DRAGON); - fset(fm, FFL_NOIDLEOUT); - assert(fval(fm, FFL_NPC) && fval(fm->race, RCF_UNARMEDGUARD) && fval(fm->race, RCF_NPC) && fval(fm, FFL_NOIDLEOUT)); + fset(rc, RCF_UNARMEDGUARD|RCF_DRAGON); + assert(!fval(fm->race, RCF_PLAYABLE)); test_create_region(-1, 0, test_create_terrain("ocean", SEA_REGION | SWIM_INTO | FLY_INTO)); test_create_region(1, 0, 0); @@ -261,12 +265,12 @@ static void test_spawn_seaserpent(CuTest *tc) { race *rc; test_setup(); rc = test_create_race("seaserpent"); - rc->flags |= RCF_NPC; + rc->flags &= ~RCF_PLAYABLE; r = test_create_region(0, 0, NULL); f = test_create_faction(NULL); u = spawn_seaserpent(r, f); CuAssertPtrNotNull(tc, u); - CuAssertPtrEquals(tc, 0, u->_name); + CuAssertPtrEquals(tc, NULL, u->_name); test_teardown(); } diff --git a/src/spy.test.c b/src/spy.test.c index c6a74822c..3c4503c98 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -196,7 +196,10 @@ static void test_setstealth_demon_bad(CuTest *tc) { lang = test_create_locale(); rc = test_create_race("demon"); u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL)); + rc = test_create_race("smurf"); + rc->flags &= ~RCF_PLAYABLE; + init_races(lang); u->thisorder = create_order(K_SETSTEALTH, lang, racename(lang, u, rc)); setstealth_cmd(u, u->thisorder); diff --git a/src/tests.c b/src/tests.c index 696baf447..ad9f8eddf 100644 --- a/src/tests.c +++ b/src/tests.c @@ -43,7 +43,7 @@ struct race *test_create_race(const char *name) rc->maintenance = 10; rc->hitpoints = 20; rc->maxaura = 100; - rc->flags |= RCF_WALK; + rc->flags |= (RCF_WALK|RCF_PLAYABLE); rc->ec_flags |= ECF_GETITEM; rc->battle_flags = BF_EQUIPMENT; return rc; diff --git a/src/xmlreader.c b/src/xmlreader.c index cf63a3ccb..b0a0aafcc 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1332,9 +1332,9 @@ static int parse_races(xmlDocPtr doc) rc->flags |= RCF_NOSTEAL; if (!xml_bvalue(node, "learn", true)) rc->flags |= RCF_NOLEARN; - if (!xml_bvalue(node, "playerrace", false)) { + if (xml_bvalue(node, "playerrace", false)) { assert(rc->recruitcost == 0); - rc->flags |= RCF_NPC; + rc->flags |= RCF_PLAYABLE; } if (xml_bvalue(node, "scarepeasants", false)) rc->flags |= RCF_SCAREPEASANTS; From 84bc08a38116d650546fdd046948d4ed28773ad7 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 22:10:26 +0200 Subject: [PATCH 165/231] all races can be on a boat by default. but now MAKETEMP is broken. prefer assert_(not_)nil over assert_(not_)equal --- scripts/tests/common.lua | 32 ++++++++++++++++---------------- scripts/tests/e2/production.lua | 4 ++-- src/kernel/race.h | 2 +- src/kernel/race.test.c | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/scripts/tests/common.lua b/scripts/tests/common.lua index b77606266..511f275db 100644 --- a/scripts/tests/common.lua +++ b/scripts/tests/common.lua @@ -155,7 +155,7 @@ end function test_pure() local r = region.create(0, 0, "plain") - assert_not_equal(nil, r) + assert_not_nil(r) assert_equal(r, get_region(0, 0)) end @@ -170,21 +170,21 @@ function test_read_write() assert_equal(r.terrain, "plain") result = eressea.write_game("test.dat") assert_equal(result, 0) - assert_not_equal(get_region(0, 0), nil) - assert_not_equal(get_faction(fno), nil) - assert_not_equal(get_unit(uno), nil) + assert_not_nil(get_region(0, 0)) + assert_not_nil(get_faction(fno)) + assert_not_nil(get_unit(uno)) r = nil f = nil u = nil eressea.free_game() - assert_equal(get_region(0, 0), nil) - assert_equal(nil, get_faction(fno)) - assert_equal(nil, get_unit(uno)) + assert_nil(get_region(0, 0)) + assert_nil(get_faction(fno)) + assert_nil(get_unit(uno)) result = eressea.read_game("test.dat") assert_equal(0, result) - assert_not_equal(nil, get_region(0, 0)) - assert_not_equal(nil, get_faction(fno)) - assert_not_equal(nil, get_unit(uno)) + assert_not_nil(get_region(0, 0)) + assert_not_nil(get_faction(fno)) + assert_not_nil(get_unit(uno)) end function test_descriptions() @@ -238,7 +238,7 @@ function test_gmtool() selections=selections+1 end assert_equal(2, selections) - assert_equal(nil, gmtool.get_cursor()) + assert_nil(gmtool.get_cursor()) gmtool.close() end @@ -568,7 +568,7 @@ function test_coordinate_translation() local pe = plane.create(1, -8761, 3620, 23, 23) -- eternath local r = region.create(1000, 1000, "plain") local f = create_faction('human') - assert_not_equal(nil, r) + assert_not_nil(r) assert_equal(r.x, 1000) assert_equal(r.y, 1000) local nx, ny = plane.normalize(pl, r.x, r.y) @@ -634,8 +634,8 @@ end -- segfault above function test_config() - assert_not_equal(nil, config.basepath) - assert_not_equal(nil, config.locales) + assert_not_nil(config.basepath) + assert_not_nil(config.locales) end local function _test_create_laen() @@ -827,9 +827,9 @@ function test_swim_and_die() process_orders() r.terrain = "ocean" u = get_unit(uid) - assert_not_equal(get_unit(uid), nil) + assert_not_nil(get_unit(uid)) process_orders() - assert_equal(get_unit(uid), nil) + assert_nil(get_unit(uid)) end function test_ride_with_horse() diff --git a/scripts/tests/e2/production.lua b/scripts/tests/e2/production.lua index 5070d02f6..852d8f629 100644 --- a/scripts/tests/e2/production.lua +++ b/scripts/tests/e2/production.lua @@ -101,14 +101,14 @@ function test_build_boat_low_skill() u:add_item("log", 10) u:add_order("MACHE BOOT") process_orders() - assert_not_equal(nil, u.ship) + assert_not_nil(u.ship) assert_equal(4, u.ship.size) assert_equal(6, u:get_item('log')) end function test_build_boat_high_skill() local r = region.create(0, 0, "plain") - local f = faction.create("human", "build@example.com") + local f = faction.create("human", "skillz@example.com") local u = unit.create(f, r, 1) u:set_skill("shipcraft", 5) -- humans get +1 u:add_item("log", 10) diff --git a/src/kernel/race.h b/src/kernel/race.h index de0fd92e0..65cb0cf73 100644 --- a/src/kernel/race.h +++ b/src/kernel/race.h @@ -233,7 +233,7 @@ extern "C" { #define RCF_MIGRANTS (1<<28) /* may have migrant units (human bonus) */ #define RCF_FAMILIAR (1<<29) /* may be a familiar */ -#define RCF_DEFAULT 0 +#define RCF_DEFAULT RCF_CANSAIL /* Economic flags */ #define ECF_GIVEPERSON (1<<0) /* �bergibt Personen */ diff --git a/src/kernel/race.test.c b/src/kernel/race.test.c index e1c255ef2..ac0609a69 100644 --- a/src/kernel/race.test.c +++ b/src/kernel/race.test.c @@ -50,7 +50,7 @@ static void test_rc_defaults(CuTest *tc) { CuAssertDblEquals(tc, 1.0, rc->recruit_multi, 0.0); CuAssertDblEquals(tc, 1.0, rc->regaura, 0.0); CuAssertDblEquals(tc, 1.0, rc->speed, 0.0); - CuAssertIntEquals(tc, 0, rc->flags); + CuAssertIntEquals(tc, RCF_DEFAULT, rc->flags); CuAssertIntEquals(tc, 0, rc->recruitcost); CuAssertIntEquals(tc, 0, rc->maintenance); CuAssertIntEquals(tc, 540, rc->capacity); From 89ecc54bdd809604d3fe98eace262f9daa250460 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 10 May 2018 22:20:28 +0200 Subject: [PATCH 166/231] deal with jsonconf defaults. --- scripts/tests/laws.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/tests/laws.lua b/scripts/tests/laws.lua index 3a724a440..6dc37daf7 100644 --- a/scripts/tests/laws.lua +++ b/scripts/tests/laws.lua @@ -6,7 +6,7 @@ function setup() eressea.free_game() conf = [[{ "races": { - "human" : {} + "human" : { "flags" : [ "player" ] } }, "terrains" : { "plain": { "flags" : [ "land", "walk", "sail" ] } @@ -61,7 +61,7 @@ end function test_make_temp() local r = region.create(0, 0, "plain") - local f1 = faction.create("human", "owner@eressea.de", "de") + local f1 = faction.create("human", "temp@eressea.de", "de") local u1 = unit.create(f1, r, 10) local u, u2 From ac73052dc15549a096337f5302254c10fca66b56 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 11 May 2018 06:05:28 +0200 Subject: [PATCH 167/231] autoseed code is never used in lua scripts (they have their own autoseed implementation). --- src/bindings.c | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/bindings.c b/src/bindings.c index 3fda9b844..e08b0850f 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -47,7 +47,6 @@ #include "monsters.h" #include "market.h" -#include #include #include @@ -154,25 +153,6 @@ int tolua_itemlist_next(lua_State * L) return 0; } -static int tolua_autoseed(lua_State * L) -{ - const char *filename = tolua_tostring(L, 1, 0); - int new_island = tolua_toboolean(L, 2, 0); - newfaction *players = read_newfactions(filename); - if (players != NULL) { - while (players) { - int n = listlen(players); - int k = (n + ISLANDSIZE - 1) / ISLANDSIZE; - k = n / k; - n = autoseed(&players, k, new_island ? 0 : TURNS_PER_ISLAND); - if (n == 0) { - break; - } - } - } - return 0; -} - static int tolua_getkey(lua_State * L) { const char *name = tolua_tostring(L, 1, 0); @@ -1068,7 +1048,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "update_owners", tolua_update_owners); tolua_function(L, TOLUA_CAST "learn_skill", tolua_learn_skill); tolua_function(L, TOLUA_CAST "create_curse", tolua_create_curse); - tolua_function(L, TOLUA_CAST "autoseed", tolua_autoseed); tolua_function(L, TOLUA_CAST "get_key", tolua_getkey); tolua_function(L, TOLUA_CAST "set_key", tolua_setkey); tolua_function(L, TOLUA_CAST "translate", &tolua_translate); From 7b1038b0b1c11a4d8b68b5f2b5add2f9651d1fb1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 11 May 2018 06:06:31 +0200 Subject: [PATCH 168/231] this equipment callback is never used in our lua scripts, and we want to use equipment less. --- src/bindings.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/bindings.c b/src/bindings.c index e08b0850f..a8581f2d1 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -403,23 +403,6 @@ static int tolua_equipunit(lua_State * L) return 0; } -static int tolua_equipment_setitem(lua_State * L) -{ - int result = -1; - const char *eqname = tolua_tostring(L, 1, 0); - const char *iname = tolua_tostring(L, 2, 0); - const char *value = tolua_tostring(L, 3, 0); - if (iname != NULL) { - const struct item_type *itype = it_find(iname); - if (itype != NULL) { - equipment_setitem(get_or_create_equipment(eqname), itype, value); - result = 0; - } - } - lua_pushinteger(L, result); - return 1; -} - static int tolua_spawn_braineaters(lua_State * L) { float chance = (float)tolua_tonumber(L, 1, 0); @@ -1036,7 +1019,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "set_turn", &tolua_set_turn); tolua_function(L, TOLUA_CAST "get_turn", &tolua_get_turn); tolua_function(L, TOLUA_CAST "get_season", tolua_get_season); - tolua_function(L, TOLUA_CAST "equipment_setitem", tolua_equipment_setitem); tolua_function(L, TOLUA_CAST "equip_unit", tolua_equipunit); tolua_function(L, TOLUA_CAST "atoi36", tolua_atoi36); tolua_function(L, TOLUA_CAST "itoa36", tolua_itoa36); From 7e6688552ba5f1b1ce8dc61914d3737bd1c34384 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 11 May 2018 21:30:26 +0200 Subject: [PATCH 169/231] create a callback mechanism for equipment. --- src/bindings.c | 2 +- src/economy.c | 2 +- src/kernel/callbacks.h | 3 + src/kernel/equipment.c | 131 +++++++++++++++++++----------------- src/kernel/equipment.h | 15 +++-- src/kernel/equipment.test.c | 28 +++++++- src/kernel/save.c | 2 +- src/magic.c | 7 +- src/monsters.c | 8 +-- src/randenc.c | 4 +- src/teleport.c | 2 +- src/xmlreader.c | 3 +- 12 files changed, 122 insertions(+), 85 deletions(-) diff --git a/src/bindings.c b/src/bindings.c index a8581f2d1..4444a5515 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -399,7 +399,7 @@ static int tolua_equipunit(lua_State * L) const char *eqname = tolua_tostring(L, 2, 0); int mask = (int)tolua_tonumber(L, 3, EQUIP_ALL); assert(u && mask > 0); - equip_unit_mask(u, get_equipment(eqname), mask); + equip_unit_mask(u, eqname, mask); return 0; } diff --git a/src/economy.c b/src/economy.c index a41b4525e..5fbb0111c 100644 --- a/src/economy.c +++ b/src/economy.c @@ -263,7 +263,7 @@ void add_recruits(unit * u, int number, int wanted) len = snprintf(equipment, sizeof(equipment), "new_%s", u_race(u)->_name); if (len > 0 && (size_t)len < sizeof(equipment)) { - equip_unit(unew, get_equipment(equipment)); + equip_unit(unew, equipment); } if (unew != u) { transfermen(unew, u, unew->number); diff --git a/src/kernel/callbacks.h b/src/kernel/callbacks.h index dcdf6ac90..1977cd284 100644 --- a/src/kernel/callbacks.h +++ b/src/kernel/callbacks.h @@ -19,6 +19,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_KRNL_CALLBACKS_H #define H_KRNL_CALLBACKS_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -31,6 +33,7 @@ extern "C" { struct resource_type; struct callback_struct { + bool (*equip_unit)(struct unit *u, const char *eqname, int mask); int (*cast_spell)(struct castorder *co, const char *fname); int (*use_item)(struct unit *u, const struct item_type *itype, int amount, struct order *ord); diff --git a/src/kernel/equipment.c b/src/kernel/equipment.c index 99c0bba7b..7b1af07f9 100644 --- a/src/kernel/equipment.c +++ b/src/kernel/equipment.c @@ -21,11 +21,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "equipment.h" /* kernel includes */ -#include "item.h" -#include "unit.h" +#include "callbacks.h" #include "faction.h" +#include "item.h" #include "race.h" #include "spell.h" +#include "unit.h" /* util includes */ #include @@ -88,80 +89,90 @@ equipment_setitem(equipment * eq, const item_type * itype, const char *value) } void -equipment_setcallback(struct equipment *eq, -void(*callback) (const struct equipment *, struct unit *)) +equipment_setcallback(struct equipment *eq, equip_callback_fun callback) { eq->callback = callback; } -void equip_unit(struct unit *u, const struct equipment *eq) +bool equip_unit(struct unit *u, const char *eqname) { - equip_unit_mask(u, eq, EQUIP_ALL); + return equip_unit_mask(u, eqname, EQUIP_ALL); } -void equip_unit_mask(struct unit *u, const struct equipment *eq, int mask) +bool equip_unit_mask(struct unit *u, const char *eqname, int mask) { + const equipment * eq = get_equipment(eqname); if (eq) { + equip_unit_set(u, eq, mask); + return true; + } + if (callbacks.equip_unit) { + return callbacks.equip_unit(u, eqname, mask); + } + return false; +} - if (mask & EQUIP_SKILLS) { - int sk; - for (sk = 0; sk != MAXSKILLS; ++sk) { - if (eq->skills[sk] != NULL) { - int i = dice_rand(eq->skills[sk]); - if (i > 0) { - set_level(u, (skill_t)sk, i); - if (sk == SK_STAMINA) { - u->hp = unit_max_hp(u) * u->number; - } - } - } - } - } - - if (mask & EQUIP_SPELLS) { - if (eq->spells) { - selist * ql = eq->spells; - int qi; - sc_mage * mage = get_mage_depr(u); - - for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { - lazy_spell *sbe = (lazy_spell *)selist_get(ql, qi); - spell *sp = spellref_get(sbe->spref); - unit_add_spell(u, mage, sp, sbe->level); - } - } - } - - if (mask & EQUIP_ITEMS) { - itemdata *idata; - for (idata = eq->items; idata != NULL; idata = idata->next) { - int i = u->number * dice_rand(idata->value); +void equip_unit_set(struct unit *u, const equipment *eq, int mask) +{ + if (mask & EQUIP_SKILLS) { + int sk; + for (sk = 0; sk != MAXSKILLS; ++sk) { + if (eq->skills[sk] != NULL) { + int i = dice_rand(eq->skills[sk]); if (i > 0) { - i_add(&u->items, i_new(idata->itype, i)); - } - } - } - - if (eq->subsets) { - int i; - for (i = 0; eq->subsets[i].sets; ++i) { - if (chance(eq->subsets[i].chance)) { - double rnd = (1 + rng_int() % 1000) / 1000.0; - int k; - for (k = 0; eq->subsets[i].sets[k].set; ++k) { - if (rnd <= eq->subsets[i].sets[k].chance) { - equip_unit_mask(u, eq->subsets[i].sets[k].set, mask); - break; - } - rnd -= eq->subsets[i].sets[k].chance; + set_level(u, (skill_t)sk, i); + if (sk == SK_STAMINA) { + u->hp = unit_max_hp(u) * u->number; } } } } + } - if (mask & EQUIP_SPECIAL) { - if (eq->callback) - eq->callback(eq, u); + if (mask & EQUIP_SPELLS) { + if (eq->spells) { + selist * ql = eq->spells; + int qi; + sc_mage * mage = get_mage_depr(u); + + for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { + lazy_spell *sbe = (lazy_spell *)selist_get(ql, qi); + spell *sp = spellref_get(sbe->spref); + unit_add_spell(u, mage, sp, sbe->level); + } + } + } + + if (eq->items && mask & EQUIP_ITEMS) { + itemdata *idata; + for (idata = eq->items; idata != NULL; idata = idata->next) { + int i = u->number * dice_rand(idata->value); + if (i > 0) { + i_add(&u->items, i_new(idata->itype, i)); + } + } + } + + if (eq->subsets) { + int i; + for (i = 0; eq->subsets[i].sets; ++i) { + if (chance(eq->subsets[i].chance)) { + double rnd = (1 + rng_int() % 1000) / 1000.0; + int k; + for (k = 0; eq->subsets[i].sets[k].set; ++k) { + if (rnd <= eq->subsets[i].sets[k].chance) { + equip_unit_set(u, eq->subsets[i].sets[k].set, mask); + break; + } + rnd -= eq->subsets[i].sets[k].chance; + } + } + } + } + + if (mask & EQUIP_SPECIAL) { + if (eq->callback) { + eq->callback(eq, u); } } } diff --git a/src/kernel/equipment.h b/src/kernel/equipment.h index 9fbffe67f..5ba1a4182 100644 --- a/src/kernel/equipment.h +++ b/src/kernel/equipment.h @@ -21,6 +21,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "skill.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -44,12 +46,14 @@ extern "C" { subsetitem *sets; } subset; + typedef void(*equip_callback_fun) (const struct equipment *, struct unit *); + typedef struct equipment { struct itemdata *items; char *skills[MAXSKILLS]; struct selist *spells; struct subset *subsets; - void(*callback) (const struct equipment *, struct unit *); + equip_callback_fun callback; } equipment; void equipment_done(void); @@ -64,18 +68,17 @@ extern "C" { void equipment_setskill(struct equipment *eq, skill_t sk, const char *value); void equipment_addspell(struct equipment *eq, const char *name, int level); - void equipment_setcallback(struct equipment *eq, - void(*callback) (const struct equipment *, struct unit *)); + void equipment_setcallback(struct equipment *eq, equip_callback_fun callback); - void equip_unit(struct unit *u, const struct equipment *eq); #define EQUIP_SKILLS (1<<1) #define EQUIP_SPELLS (1<<2) #define EQUIP_ITEMS (1<<3) #define EQUIP_SPECIAL (1<<4) #define EQUIP_ALL (0xFF) - void equip_unit_mask(struct unit *u, const struct equipment *eq, - int mask); void equip_items(struct item **items, const struct equipment *eq); + void equip_unit_set(struct unit *u, const struct equipment *eq, int mask); + bool equip_unit_mask(struct unit *u, const char *eqname, int mask); + bool equip_unit(struct unit *u, const char *eqname); #ifdef __cplusplus } diff --git a/src/kernel/equipment.test.c b/src/kernel/equipment.test.c index 1a1bbfdf1..c09945865 100644 --- a/src/kernel/equipment.test.c +++ b/src/kernel/equipment.test.c @@ -2,6 +2,7 @@ #include "magic.h" +#include #include #include #include @@ -35,7 +36,7 @@ static void test_equipment(CuTest * tc) equipment_addspell(eq, sp->sname, 1); u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); - equip_unit_mask(u, eq, EQUIP_ALL); + equip_unit_set(u, eq, EQUIP_ALL); CuAssertIntEquals(tc, 1, i_get(u->items, it_horses)); CuAssertIntEquals(tc, 5, get_level(u, SK_MAGIC)); @@ -69,10 +70,35 @@ static void test_get_equipment(CuTest * tc) test_teardown(); } +static bool equip_test(unit *u, const char *name, int mask) { + if (mask & EQUIP_ITEMS) { + i_change(&u->items, it_find("horse"), 1); + return true; + } + return false; +} + +static void test_equipment_callback(CuTest *tc) { + unit *u; + item_type *itype; + test_setup(); + itype = test_create_horse(); + u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); + CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_ITEMS)); + CuAssertPtrEquals(tc, NULL, u->items); + callbacks.equip_unit = equip_test; + CuAssertTrue(tc, equip_unit(u, "horse")); + CuAssertIntEquals(tc, 1, i_get(u->items, itype)); + CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_SPELLS)); + CuAssertIntEquals(tc, 1, i_get(u->items, itype)); + test_teardown(); +} + CuSuite *get_equipment_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_equipment); SUITE_ADD_TEST(suite, test_get_equipment); + SUITE_ADD_TEST(suite, test_equipment_callback); return suite; } diff --git a/src/kernel/save.c b/src/kernel/save.c index 858cd7040..c1c8010d1 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -1349,7 +1349,7 @@ static void fix_familiars(void) { log_error("%s seems to be a familiar with no spells.", unitname(u)); /* magical familiar, no spells */ - equip_unit_mask(u, eq, EQUIP_SPELLS); + equip_unit_set(u, eq, EQUIP_SPELLS); } } } diff --git a/src/magic.c b/src/magic.c index 1b41b87af..1f1ec9c26 100644 --- a/src/magic.c +++ b/src/magic.c @@ -2181,18 +2181,13 @@ void remove_familiar(unit * mage) void create_newfamiliar(unit * mage, unit * fam) { /* skills and spells: */ - const struct equipment *eq; char eqname[64]; const race *rc = u_race(fam); set_familiar(mage, fam); snprintf(eqname, sizeof(eqname), "fam_%s", rc->_name); - eq = get_equipment(eqname); - if (eq != NULL) { - equip_unit(fam, eq); - } - else { + if (!equip_unit(fam, eqname)) { log_info("could not perform initialization for familiar %s.\n", rc->_name); } /* TODO: Diese Attribute beim Tod des Familiars entfernen: */ diff --git a/src/monsters.c b/src/monsters.c index 9d113c0e9..db70bebfc 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -612,7 +612,7 @@ static void recruit_dracoids(unit * dragon, int size) name_unit(un); change_money(dragon, -un->number * 50); - equip_unit(un, get_equipment("new_dracoid")); + equip_unit(un, "new_dracoid"); unit_setstatus(un, ST_FIGHT); for (weapon = un->items; weapon; weapon = weapon->next) { @@ -864,7 +864,7 @@ static int nrand(int start, int sub) unit *spawn_seaserpent(region *r, faction *f) { unit *u = create_unit(r, f, 1, get_race(RC_SEASERPENT), 0, NULL, NULL); fset(u, UFL_ISNEW | UFL_MOVED); - equip_unit(u, get_equipment("seed_seaserpent")); + equip_unit(u, "seed_seaserpent"); return u; } @@ -903,7 +903,7 @@ void spawn_dragons(void) u = create_unit(r, monsters, nrand(30, 20) + 1, get_race(RC_DRAGON), 0, NULL, NULL); } fset(u, UFL_ISNEW | UFL_MOVED); - equip_unit(u, get_equipment("seed_dragon")); + equip_unit(u, "seed_dragon"); log_debug("spawning %d %s in %s.\n", u->number, LOC(default_locale, @@ -965,7 +965,7 @@ void spawn_undead(void) fset(u, UFL_ISNEW | UFL_MOVED); if ((rc == get_race(RC_SKELETON) || rc == get_race(RC_ZOMBIE)) && rng_int() % 10 < 4) { - equip_unit(u, get_equipment("rising_undead")); + equip_unit(u, "rising_undead"); } for (i = 0; i < MAXSKILLS; i++) { diff --git a/src/randenc.c b/src/randenc.c index 9630d6e85..709702513 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -265,7 +265,7 @@ static void get_villagers(region * r, unit * u) u); leave(newunit, true); fset(newunit, UFL_ISNEW | UFL_MOVED); - equip_unit(newunit, get_equipment("rand_villagers")); + equip_unit(newunit, "rand_villagers"); } static void get_allies(region * r, unit * u) @@ -352,7 +352,7 @@ static void get_allies(region * r, unit * u) newunit = create_unit(r, u->faction, number, u->faction->race, 0, LOC(u->faction->locale, name), u); - equip_unit(newunit, get_equipment(equip)); + equip_unit(newunit, equip); u_setfaction(newunit, u->faction); set_racename(&newunit->attribs, get_racename(u->attribs)); diff --git a/src/teleport.c b/src/teleport.c index 439b44955..36634c5cd 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -181,7 +181,7 @@ void spawn_braineaters(float chance) if (next-- == 0) { u = create_unit(r, f, 1 + rng_int() % 10 + rng_int() % 10, rc_brain, 0, NULL, NULL); - equip_unit(u, get_equipment("seed_braineater")); + equip_unit(u, "seed_braineater"); next = rng_int() % (int)(chance * 100); } diff --git a/src/xmlreader.c b/src/xmlreader.c index fe6f18e1f..5b6f7d8c1 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -875,8 +875,7 @@ static void add_callbacks(equipment * eq, xmlNodeSetPtr nsetItems) if (propValue != NULL) { fun = get_function((const char *)propValue); if (fun) { - equipment_setcallback(eq, (void(*)(const struct equipment *, - struct unit *))fun); + equipment_setcallback(eq, (equip_callback_fun)fun); } xmlFree(propValue); } From b12050ac2a6e4bd3c13753226f7ef2e7516d5d08 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 12 May 2018 18:25:44 +0200 Subject: [PATCH 170/231] lua callback for equip_unit --- src/helpers.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/helpers.c b/src/helpers.c index 3b966785b..170ca2969 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -162,6 +162,36 @@ static void push_param(lua_State * L, char c, spllprm * param) } } +/** callback to use lua functions isntead of equipment */ +static bool lua_equipunit(unit *u, const char *eqname, int mask) { + lua_State *L = (lua_State *)global.vm_state; + bool result = false; + static bool disabled = false; + + if (disabled) { + return false; + } + lua_getglobal(L, "equip_unit"); + if (lua_isfunction(L, -1)) { + tolua_pushusertype(L, u, TOLUA_CAST "unit"); + lua_pushstring(L, eqname); + lua_pushinteger(L, mask); + if (lua_pcall(L, 3, 1, 0) != 0) { + const char *error = lua_tostring(L, -1); + log_error("equip(%s) with '%s/%d': %s.\n", unitname(u), eqname, mask, error); + lua_pop(L, 1); + } + else { + result = (bool)lua_toboolean(L, -1); + lua_pop(L, 1); + } + } + else { + disabled = true; + } + return result; +} + /** callback to use lua for spell functions */ static int lua_callspell(castorder * co, const char *fname) { @@ -346,6 +376,7 @@ void register_tolua_helpers(void) at_register(&at_direction); at_deprecate("lcbuilding", building_action_read); + callbacks.equip_unit = lua_equipunit; callbacks.cast_spell = lua_callspell; callbacks.use_item = use_item_callback; callbacks.produce_resource = produce_resource_lua; From 271352d0ba27ca73a7ec7d3641644b4465d5bb42 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 12 May 2018 19:10:40 +0200 Subject: [PATCH 171/231] create a lua module that can handle simple euipments. lua test for equip_unit, with callbacks. --- conf/e2/config.json | 1 - scripts/eressea/e2/init.lua | 2 +- scripts/eressea/e3/init.lua | 2 +- scripts/eressea/equipment.lua | 50 +++++++++++++++++++++++++++++++++++ scripts/tests/config.lua | 39 +++++++++++++++------------ scripts/tests/e2/init.lua | 1 + scripts/tests/e3/init.lua | 1 + scripts/tests/init.lua | 1 - src/bind_unit.c | 12 +++++++++ src/bindings.c | 12 --------- 10 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 scripts/eressea/equipment.lua diff --git a/conf/e2/config.json b/conf/e2/config.json index b5ed2e68c..ddf6b9dd3 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -6,7 +6,6 @@ "config://conf/e2/locales.json", "config://conf/e2/terrains.json", "config://conf/e2/items.json", - "config://conf/e2/rules.xml", "config://res/core/ships.xml", "config://res/core/common/buildings.xml", "config://res/eressea/buildings.xml", diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index 722078741..ba6c9895b 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -11,8 +11,8 @@ return { require('eressea.tunnels'), require('eressea.ponnuki'), require('eressea.astral'), --- require('eressea.locales'), require('eressea.jsreport'), require('eressea.ents'), + require('eressea.equipment'), require('eressea.cursed') } diff --git a/scripts/eressea/e3/init.lua b/scripts/eressea/e3/init.lua index f7402268c..0b1d21664 100644 --- a/scripts/eressea/e3/init.lua +++ b/scripts/eressea/e3/init.lua @@ -5,7 +5,7 @@ eressea.log.debug("rules for game E3") return { require('eressea'), require('eressea.xmasitems'), - -- require('eressea.markets'), require('eressea.frost'), + require('eressea.equipment'), require('eressea.ents') } diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua new file mode 100644 index 000000000..d3ef5ccbb --- /dev/null +++ b/scripts/eressea/equipment.lua @@ -0,0 +1,50 @@ +-- Equipment + +local sets = { + ['first_unit'] = { + ['items'] = { + ['money'] = 2500, + ['log'] = 10, + ['stone'] = 4 + } + }, + ['seed_unit'] = { + ['items'] = { + ['log'] = 50, + ['stone'] = 50, + ['iron'] = 50, + ['laen'] = 10, + ['sword'] = 1, + ['mallorn'] = 10, + ['skillpotion'] = 5, + ['lifepotion'] = 5, + ['money'] = 20000 + }, + ['skills'] = { + ['perception'] = 30, + ['melee'] = 1 + } + } +} + +function equip_unit(u, name, flags) + set = sets[name] + if set then + items = set['items'] + if items then + for k,v in pairs(items) do + u:add_item(k, v) + end + end + skills = set['skills'] + if skills then + for k,v in pairs(skills) do + u:set_skill(k, v) + end + end + return true + end + return false +end + +return nil diff --git a/scripts/tests/config.lua b/scripts/tests/config.lua index a83b64350..a3104a6b6 100644 --- a/scripts/tests/config.lua +++ b/scripts/tests/config.lua @@ -8,27 +8,32 @@ end function test_read_race() local f - eressea.free_game() assert_not_nil(eressea.config) eressea.config.parse('{ "races": { "orc" : {}}}') f = faction.create("orc", "orc@example.com", "en") assert_not_nil(f) end -function disable_test_read_ship() - local s - eressea.free_game() - assert_not_nil(eressea.config) - conf = [[{ - "ships": { - "boat" : { - "construction" : { - "maxsize" : 20 - } - } - } - }]] - eressea.config.parse(conf); - s = ship.create(nil, "boat") - assert_not_nil(s) +function test_seed_unit() + local r = region.create(0, 0, "plain") + local f = faction.create('human') + local u = unit.create(f, r, 1) + u:equip('seed_unit') + assert_equal(20000, u:get_item('money')) + assert_equal(50, u:get_item('log')) + assert_equal(50, u:get_item('stone')) + assert_equal(1, u:get_skill('melee')) +end + +function test_seed_elf() + local r = region.create(0, 0, "plain") + local f = faction.create('human') + local u = unit.create(f, r, 1) + -- quirk: independent of the race, seed_elf contains a fairyboot + u:equip('seed_elf') + assert_equal(1, u:get_item('fairyboot')) + -- all humans start in a building: + assert_not_nil(u.building) + assert_equal('castle', u.building.type) + assert_equal(10, u.building.size) end diff --git a/scripts/tests/e2/init.lua b/scripts/tests/e2/init.lua index 22195a1f4..5c942fc74 100644 --- a/scripts/tests/e2/init.lua +++ b/scripts/tests/e2/init.lua @@ -13,6 +13,7 @@ require 'tests.e2.guard' require 'tests.e2.stealth' require 'tests.e2.items' require 'tests.e2.ships' +require 'tests.config' require 'tests.items' require 'tests.economy' require 'tests.orders' diff --git a/scripts/tests/e3/init.lua b/scripts/tests/e3/init.lua index 04b7da4a2..7d30d347f 100644 --- a/scripts/tests/e3/init.lua +++ b/scripts/tests/e3/init.lua @@ -6,6 +6,7 @@ require 'tests.e3.parser' require 'tests.e3.morale' require 'tests.e3.items' require 'tests.e3.production' +require 'tests.config' require 'tests.spells' require 'tests.economy' require 'tests.orders' diff --git a/scripts/tests/init.lua b/scripts/tests/init.lua index c933d4e69..a01e1c75c 100644 --- a/scripts/tests/init.lua +++ b/scripts/tests/init.lua @@ -1,5 +1,4 @@ -- new tests 2014-06-11 -require 'tests.config' require 'tests.faction' require 'tests.locale' require 'tests.movement' diff --git a/src/bind_unit.c b/src/bind_unit.c index 2ae39bf20..e0fa9f86b 100644 --- a/src/bind_unit.c +++ b/src/bind_unit.c @@ -17,6 +17,7 @@ #include #include #include +#include "kernel/equipment.h" #include #include #include @@ -962,6 +963,16 @@ static int tolua_event_get(lua_State * L) return 0; } +static int tolua_equipunit(lua_State * L) +{ + unit *u = (unit *)tolua_tousertype(L, 1, 0); + const char *eqname = tolua_tostring(L, 2, 0); + int mask = (int)tolua_tonumber(L, 3, EQUIP_ALL); + assert(u && mask > 0); + equip_unit_mask(u, eqname, mask); + return 0; +} + void tolua_unit_open(lua_State * L) { /* register user types */ @@ -1062,6 +1073,7 @@ void tolua_unit_open(lua_State * L) tolua_variable(L, TOLUA_CAST "hp_max", tolua_unit_get_hpmax, 0); tolua_variable(L, TOLUA_CAST "aura_max", tolua_unit_get_auramax, 0); + tolua_function(L, TOLUA_CAST "equip", tolua_equipunit); tolua_function(L, TOLUA_CAST "show", tolua_bufunit); } tolua_endmodule(L); diff --git a/src/bindings.c b/src/bindings.c index 4444a5515..72a2db782 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -9,7 +9,6 @@ #include "kernel/alliance.h" #include "kernel/building.h" #include "kernel/curse.h" -#include "kernel/equipment.h" #include "kernel/unit.h" #include "kernel/terrain.h" #include "kernel/messages.h" @@ -393,16 +392,6 @@ static int tolua_get_nmrs(lua_State * L) return 1; } -static int tolua_equipunit(lua_State * L) -{ - unit *u = (unit *)tolua_tousertype(L, 1, 0); - const char *eqname = tolua_tostring(L, 2, 0); - int mask = (int)tolua_tonumber(L, 3, EQUIP_ALL); - assert(u && mask > 0); - equip_unit_mask(u, eqname, mask); - return 0; -} - static int tolua_spawn_braineaters(lua_State * L) { float chance = (float)tolua_tonumber(L, 1, 0); @@ -1019,7 +1008,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "set_turn", &tolua_set_turn); tolua_function(L, TOLUA_CAST "get_turn", &tolua_get_turn); tolua_function(L, TOLUA_CAST "get_season", tolua_get_season); - tolua_function(L, TOLUA_CAST "equip_unit", tolua_equipunit); tolua_function(L, TOLUA_CAST "atoi36", tolua_atoi36); tolua_function(L, TOLUA_CAST "itoa36", tolua_itoa36); tolua_function(L, TOLUA_CAST "dice_roll", tolua_dice_rand); From 298e220cfd0fafb6624a69eb97bde766e2276090 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 12 May 2018 19:18:25 +0200 Subject: [PATCH 172/231] Oh. E3 hat kein autoseed, ergo kein seed_elf equipment? --- scripts/tests/e3/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/tests/e3/init.lua b/scripts/tests/e3/init.lua index 7d30d347f..04b7da4a2 100644 --- a/scripts/tests/e3/init.lua +++ b/scripts/tests/e3/init.lua @@ -6,7 +6,6 @@ require 'tests.e3.parser' require 'tests.e3.morale' require 'tests.e3.items' require 'tests.e3.production' -require 'tests.config' require 'tests.spells' require 'tests.economy' require 'tests.orders' From 40125bb75e2b098a229d2ad7f42112fc877f0148 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 12 May 2018 20:52:10 +0200 Subject: [PATCH 173/231] translate seed_%race% equipment from xml to lua. --- res/eressea/equipment.xml | 67 ------------------------ scripts/eressea/equipment.lua | 97 +++++++++++++++++++++++++++++++++-- src/bindings.c | 9 +++- src/races/races.c | 5 +- src/races/races.h | 1 + src/xmlreader.c | 26 ---------- 6 files changed, 104 insertions(+), 101 deletions(-) diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index 94d0deb07..d64a5e3e4 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -1,73 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index d3ef5ccbb..ffe910e7a 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -24,24 +24,115 @@ local sets = { ['perception'] = 30, ['melee'] = 1 } + }, + ['seed_dwarf'] = { + ['items'] = { + ['axe'] = 1, + ['chainmail'] = 1, + }, + ['skills'] = { + ['melee'] = 1 + } + }, + ['seed_elf'] = { + ['items'] = { + ['fairyboot'] = 1, + }, + ['callback'] = equip_newunits + }, + ['seed_orc'] = { + ['skills'] = { + ['polearm'] = 4, + ['melee'] = 4, + ['crossbow'] = 4, + ['catapult'] = 4, + ['bow'] = 4, + } + }, + ['seed_goblin'] = { + ['items'] = { + ['roi'] = 1 + }, + ['callback'] = equip_newunits + }, + ['seed_human'] = { + ['callback'] = equip_newunits + }, + ['seed_troll'] = { + ['items'] = { + ['stone'] = 50, + }, + ['skills'] = { + ['building'] = 1, + ['perception'] = 3, + } + }, + ['seed_demon'] = { + ['skills'] = { + ['stamina'] = 15 + } + }, + ['seed_insect'] = { + ['items'] = { + ['nestwarmth'] =9 + } + }, + ['seed_halfling'] = { + ['items'] = { + ['horse'] = 2, + ['cart'] = 1, + ['balm'] = 5, + ['spice'] = 5, + ['myrrh'] = 5, + ['jewel'] = 5, + ['oil'] = 5, + ['silk'] = 5, + ['incense'] = 5 + }, + ['skills'] = { + ['trade'] = 1, + ['riding'] = 2 + } + }, + ['seed_cat'] = { + ['items'] = { + ['roi'] = 1 + }, + ['callback'] = equip_newunits + }, + ['seed_aquarian'] = { + ['skills'] = { + ['sailing'] = 1 + }, + ['callback'] = equip_newunits } } function equip_unit(u, name, flags) - set = sets[name] + local set = sets[name] if set then - items = set['items'] + local items = set['items'] if items then for k,v in pairs(items) do u:add_item(k, v) end end - skills = set['skills'] + local skills = set['skills'] if skills then for k,v in pairs(skills) do u:set_skill(k, v) end end + local spells = set['spells'] + if spells then + for k, v in ipairs(spells) do + u:add_spell(v) + end + end + local callback = set['callback'] + if callback and type(callback) == 'function' then + callback(u) + end return true end return false diff --git a/src/bindings.c b/src/bindings.c index 72a2db782..bbea46e60 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -23,6 +23,7 @@ #include "kernel/save.h" #include "kernel/spell.h" #include "kernel/spellbook.h" +#include "races/races.h" #include "bind_unit.h" #include "bind_storage.h" @@ -845,8 +846,13 @@ static int init_data(const char *filename) return 0; } +static int tolua_equip_newunits(lua_State * L) { + unit *u = (unit *)tolua_tousertype(L, 1, 0); + equip_newunits(u); + return 0; +} -int tolua_read_xml(lua_State * L) +static int tolua_read_xml(lua_State * L) { const char *filename = tolua_tostring(L, 1, "config.xml"); lua_pushinteger(L, init_data(filename)); @@ -1023,6 +1029,7 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "translate", &tolua_translate); tolua_function(L, TOLUA_CAST "spells", tolua_get_spells); tolua_function(L, TOLUA_CAST "read_xml", tolua_read_xml); + tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits); } tolua_endmodule(L); return 1; } diff --git a/src/races/races.c b/src/races/races.c index 92a3d3e3d..120a15dd9 100644 --- a/src/races/races.c +++ b/src/races/races.c @@ -12,7 +12,6 @@ #include "races.h" #include -#include #include #include #include @@ -36,7 +35,7 @@ void age_skeleton(struct unit *u); void age_zombie(struct unit *u); void age_ghoul(struct unit *u); -static void equip_newunits(const struct equipment *eq, struct unit *u) +void equip_newunits(struct unit *u) { struct region *r = u->region; const struct resource_type *rtype; @@ -81,8 +80,6 @@ static void equip_newunits(const struct equipment *eq, struct unit *u) * in die jeweilige Rassendefiniton eingebunden */ void register_races(void) { - register_function((pf_generic)equip_newunits, "equip_newunits"); - /* function age for race->age() */ register_function((pf_generic)age_undead, "age_undead"); register_function((pf_generic)age_skeleton, "age_skeleton"); diff --git a/src/races/races.h b/src/races/races.h index ea7be1337..78c8b062f 100644 --- a/src/races/races.h +++ b/src/races/races.h @@ -18,6 +18,7 @@ extern "C" { void register_races(void); void make_undead_unit(struct unit *); + void equip_newunits(struct unit *u); #ifdef __cplusplus } diff --git a/src/xmlreader.c b/src/xmlreader.c index 5b6f7d8c1..cbae06f58 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -862,27 +862,6 @@ static void add_items(equipment * eq, xmlNodeSetPtr nsetItems) } } -static void add_callbacks(equipment * eq, xmlNodeSetPtr nsetItems) -{ - if (nsetItems != NULL && nsetItems->nodeNr > 0) { - int i; - for (i = 0; i != nsetItems->nodeNr; ++i) { - xmlNodePtr node = nsetItems->nodeTab[i]; - xmlChar *propValue; - pf_generic fun; - - propValue = xmlGetProp(node, BAD_CAST "name"); - if (propValue != NULL) { - fun = get_function((const char *)propValue); - if (fun) { - equipment_setcallback(eq, (equip_callback_fun)fun); - } - xmlFree(propValue); - } - } - } -} - static void add_spells(equipment * eq, xmlNodeSetPtr nsetItems) { if (nsetItems != NULL && nsetItems->nodeNr > 0) { @@ -1021,11 +1000,6 @@ static int parse_equipment(xmlDocPtr doc) xpath->node = node; - xpathResult = xmlXPathEvalExpression(BAD_CAST "callback", xpath); - assert(!eq->callback); - add_callbacks(eq, xpathResult->nodesetval); - xmlXPathFreeObject(xpathResult); - xpathResult = xmlXPathEvalExpression(BAD_CAST "item", xpath); assert(!eq->items); add_items(eq, xpathResult->nodesetval); From 79bc22b617a3745a1dbe56e4a5e7740c8747d8c6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 12 May 2018 22:12:14 +0200 Subject: [PATCH 174/231] fatal error my a$$ . the gamedat check is killing tests for no discernible reason. --- src/kernel/calendar.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kernel/calendar.c b/src/kernel/calendar.c index 93722b5bc..e028580ff 100644 --- a/src/kernel/calendar.c +++ b/src/kernel/calendar.c @@ -47,7 +47,8 @@ const gamedate *get_gamedate(int turn_now, gamedate * gd) assert(gd); if (t<0) { - log_fatal("current turn %d is before first %d", + t = 0; + log_error("current turn %d is before first %d", turn_now, first_turn()); } assert(t>=0); From 666d5715ab3c85acfc9f9b9114e931d6854a2b98 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 13:03:47 +0200 Subject: [PATCH 175/231] BUG 2439 Strassenbau Fehlermeldung (Region/Richtung). --- res/core/messages.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index b810b8a43..5b703589d 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -8188,8 +8188,8 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Region gibt es keine Brücken und Straßen mehr zu bauen." - "$unit($unit) in $region($region): '$order($command)' - The roads and bridges in this region are complete." + "$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen." + "$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete." From 4240e142a596e099f613cc9f9a4859ba8584b49a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 16:13:33 +0200 Subject: [PATCH 176/231] BUG 2440: the random encounters code was completely unused. --- res/core/de/strings.xml | 106 -------------- res/core/messages.xml | 17 --- res/eressea/equipment.xml | 157 -------------------- scripts/eressea/equipment.lua | 2 +- scripts/run-tests-e2.lua | 1 - scripts/run-tests-e3.lua | 1 - scripts/tests/common.lua | 2 - scripts/tests/e2/adamantium.lua | 1 - scripts/tests/e2/items.lua | 1 - scripts/tests/items.lua | 1 - scripts/tests/study.lua | 1 - scripts/tests/undead.lua | 1 - src/kernel/region.c | 4 - src/kernel/region.h | 3 +- src/laws.c | 5 - src/randenc.c | 250 +------------------------------- src/randenc.h | 1 - src/settings.h | 1 - 18 files changed, 3 insertions(+), 552 deletions(-) diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 8207e0aec..2be2f04e4 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -7100,112 +7100,6 @@ Furious peasants - - Söldner - Mercenaries - - - - Sumpfbewohner - Swamp people - - - - Waldbewohner - Woodsmen - - - - Nomaden - Nomads - - - - Eisleute - Ice people - - - - Bergbewohner - Mountain people - - - - Magie der Elemente - Magic of the Elements - - - - Schwerter, Armbrüste, Langbögen - Swords, Crossbows and Longbows - - - - Gorms Almanach der Rationellen Kriegsführung - Gorm's Almanach of Rational War - - - - Katamarane, Koggen, Karavellen - The dragonship, the caravell and the longboat - - - - Wege der Sterne - Ways of the Start - - - - Nadishahs Kleine Gift- und Kräuterkunde - Nadishah's collected lore on poisonous and beneficial herbs - - - - Mandricks Kompendium der Alchemie - Mandrick's alchemistic compendium - - - - Die Konstruktion der Burgen und Schlösser von Zentralandune - - - - Die Esse - - - - Über die Gewinnung von Erzen - - - - Barinions Lieder, eine Einführung für Unbedarfte - - - - die Ruine eines alten Tempels - the ruins of an ancient temple - - - - eine alte Burgruine - the ruins of a castle - - - - ein zerfallenes Bauernhaus - a dilapitated farm - - - - eine Leiche am Wegesrand - a corpse by the wayside - - - - eine Leiche am Wegesrand - a corpse by the wayside - - Feuerdrache fire dragon diff --git a/res/core/messages.xml b/res/core/messages.xml index 5b703589d..371369dbf 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -7991,23 +7991,6 @@ "A message from $unit($unit): '$message'" - - - - - - "Plötzlich stolpert $unit($unit) über einige $localize($name). Nach kurzem Zögern entschließen die $localize($name), sich Deiner Partei anzuschließen." - "$unit($unit) stumbles upon $localize($name). After short hesitation, $localize($name) agrees to join your faction." - - - - - - - "$unit($unit) entdeckt ein kleines Dorf. Die meisten Häuser wurden durch einen über die Ufer getretenen Fluß zerstört. Eine Gruppe der verzweifelten Menschen schließt sich deiner Partei an." - "$unit($unit) discovers a small village. Most of the houses have been destroyed by flooding, and a group of the distressed villagers join your faction." - - "Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier." "An angry mob forms and hunts practitioners of the dark arts." diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index d64a5e3e4..d0f37a404 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -1,163 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index ffe910e7a..d7fa9d43a 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -105,7 +105,7 @@ local sets = { ['sailing'] = 1 }, ['callback'] = equip_newunits - } + }, } function equip_unit(u, name, flags) diff --git a/scripts/run-tests-e2.lua b/scripts/run-tests-e2.lua index 2672b7ef2..b5f18c7f7 100644 --- a/scripts/run-tests-e2.lua +++ b/scripts/run-tests-e2.lua @@ -22,7 +22,6 @@ eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.ship.damage.nocrew", "0") eressea.settings.set("rules.ship.drifting", "0") eressea.settings.set("rules.ship.storms", "0") -eressea.settings.set("rules.encounters", "0") eressea.settings.set("nmr.timeout", "0") eressea.settings.set("NewbieImmunity", "0") rules = require('eressea.' .. config.rules) diff --git a/scripts/run-tests-e3.lua b/scripts/run-tests-e3.lua index 9ad78a81f..3332df306 100644 --- a/scripts/run-tests-e3.lua +++ b/scripts/run-tests-e3.lua @@ -23,7 +23,6 @@ eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.ship.damage.nocrew", "0") eressea.settings.set("rules.ship.drifting", "0") eressea.settings.set("rules.ship.storms", "0") -eressea.settings.set("rules.encounters", "0") eressea.settings.set("nmr.timeout", "0") eressea.settings.set("NewbieImmunity", "0") rules = require('eressea.' .. config.rules) diff --git a/scripts/tests/common.lua b/scripts/tests/common.lua index b77606266..40604d7a9 100644 --- a/scripts/tests/common.lua +++ b/scripts/tests/common.lua @@ -33,7 +33,6 @@ function setup() eressea.settings.set("nmr.timeout", "0") eressea.settings.set("NewbieImmunity", "0") eressea.settings.set("rules.food.flags", "4") - eressea.settings.set("rules.encounters", "0") eressea.settings.set("rules.peasants.growth", "1") eressea.settings.set("study.random_progress", "0") end @@ -968,7 +967,6 @@ module("tests.parser", package.seeall, lunit.testcase) function setup() eressea.free_game() eressea.settings.set("rules.food.flags", "4") -- FOOD_IS_FREE - eressea.settings.set("rules.encounters", "0") eressea.settings.set("rules.move.owner_leave", "0") end diff --git a/scripts/tests/e2/adamantium.lua b/scripts/tests/e2/adamantium.lua index de9a2312f..a893d32d5 100644 --- a/scripts/tests/e2/adamantium.lua +++ b/scripts/tests/e2/adamantium.lua @@ -7,7 +7,6 @@ function setup() eressea.settings.set("nmr.timeout", "0") eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.ship.storms", "0") - eressea.settings.set("rules.encounters", "0") end local function create_faction(race) diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index 456262342..99b32cc52 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -7,7 +7,6 @@ function setup() eressea.settings.set("nmr.timeout", "0") eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.ship.storms", "0") - eressea.settings.set("rules.encounters", "0") eressea.settings.set("magic.regeneration.enable", "0") eressea.settings.set("rules.grow.formula", "0") eressea.settings.set("study.random_progress", "0") diff --git a/scripts/tests/items.lua b/scripts/tests/items.lua index 60bbf100f..f4d8657c6 100644 --- a/scripts/tests/items.lua +++ b/scripts/tests/items.lua @@ -8,7 +8,6 @@ function setup() eressea.settings.set("NewbieImmunity", "0") eressea.settings.set("rules.food.flags", "4") eressea.settings.set("rules.ship.storms", "0") - eressea.settings.set("rules.encounters", "0") eressea.settings.set("magic.regeneration.enable", "0") end diff --git a/scripts/tests/study.lua b/scripts/tests/study.lua index 2a713dd43..14d4ce1d6 100644 --- a/scripts/tests/study.lua +++ b/scripts/tests/study.lua @@ -36,7 +36,6 @@ function test_study_expensive() local f = faction.create("human", "test@example.com", "de") local u = unit.create(f, r, 1) eressea.settings.set("skills.cost.alchemy", "50") - eressea.settings.set("rules.encounters", "0") u:add_order("LERNEN Alchemie") u:add_item("money", 50) process_orders() diff --git a/scripts/tests/undead.lua b/scripts/tests/undead.lua index 0c9f609f1..a3c541afa 100644 --- a/scripts/tests/undead.lua +++ b/scripts/tests/undead.lua @@ -7,7 +7,6 @@ function setup() eressea.settings.set("nmr.timeout", "0") eressea.settings.set("NewbieImmunity", "0") eressea.settings.set("rules.food.flags", "4") - eressea.settings.set("rules.encounters", "0") eressea.settings.set("rules.peasants.growth", "1") eressea.settings.set("study.random_progress", "0") eressea.settings.set("GiveRestriction", "0") diff --git a/src/kernel/region.c b/src/kernel/region.c index 790a8341c..0709ba761 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -1091,7 +1091,6 @@ void terraform_region(region * r, const terrain_type * terrain) rsethorses(r, 0); rsetpeasants(r, 0); rsetmoney(r, 0); - freset(r, RF_ENCOUNTER); freset(r, RF_MALLORN); return; } @@ -1195,9 +1194,6 @@ void terraform_region(region * r, const terrain_type * terrain) fset(r, RF_MALLORN); else freset(r, RF_MALLORN); - if (rng_int() % 100 < ENCCHANCE) { - fset(r, RF_ENCOUNTER); - } } } diff --git a/src/kernel/region.h b/src/kernel/region.h index d37da2290..9543658d9 100644 --- a/src/kernel/region.h +++ b/src/kernel/region.h @@ -42,7 +42,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define RF_UNUSED_7 (1<<7) #define RF_UNUSED_8 (1<<8) -#define RF_ENCOUNTER (1<<9) /* persistent */ #define RF_MAPPER_HIGHLIGHT (1<<10) #define RF_LIGHTHOUSE (1<<11) /* this region may contain a lighthouse */ #define RF_MIGRATION (1<<13) @@ -58,7 +57,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define RF_ALL 0xFFFFFF -#define RF_SAVEMASK (RF_CHAOTIC|RF_MALLORN|RF_BLOCKED|RF_ENCOUNTER|RF_GUARDED|RF_LIGHTHOUSE) +#define RF_SAVEMASK (RF_CHAOTIC|RF_MALLORN|RF_BLOCKED|RF_GUARDED|RF_LIGHTHOUSE) struct message; struct message_list; struct rawmaterial; diff --git a/src/laws.c b/src/laws.c index 9eb3795c6..c8b6e3734 100644 --- a/src/laws.c +++ b/src/laws.c @@ -4040,11 +4040,6 @@ void init_processor(void) p += 10; add_proc_order(p, K_GUARD, guard_on_cmd, 0, "Bewache (an)"); - if (config_get_int("rules.encounters", 0)) { - p += 10; - add_proc_global(p, encounters, "Zufallsbegegnungen"); - } - p += 10; add_proc_unit(p, monster_kills_peasants, "Monster fressen und vertreiben Bauern"); diff --git a/src/randenc.c b/src/randenc.c index 709702513..d7184af83 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -168,254 +168,6 @@ static bool improve_all(faction * f, skill_t sk, int by_weeks) return result; } -void find_manual(region * r, unit * u) -{ - char zLocation[32]; - char zBook[32]; - skill_t skill = NOSKILL; - message *msg; - - switch (rng_int() % 36) { - case 0: - skill = SK_MAGIC; - break; - case 1: - case 2: - case 3: - case 4: - skill = SK_WEAPONSMITH; - break; - case 5: - case 6: - skill = SK_TACTICS; - break; - case 7: - case 8: - case 9: - case 10: - skill = SK_SHIPBUILDING; - break; - case 11: - case 12: - case 13: - case 14: - skill = SK_SAILING; - break; - case 15: - case 16: - case 17: - skill = SK_HERBALISM; - break; - case 18: - case 19: - skill = SK_ALCHEMY; - break; - case 20: - case 21: - case 22: - case 23: - skill = SK_BUILDING; - break; - case 24: - case 25: - case 26: - case 27: - skill = SK_ARMORER; - break; - case 28: - case 29: - case 30: - case 31: - skill = SK_MINING; - break; - case 32: - case 33: - case 34: - case 35: - skill = SK_ENTERTAINMENT; - break; - } - - snprintf(zLocation, sizeof(zLocation), "manual_location_%d", - (int)(rng_int() % 4)); - snprintf(zBook, sizeof(zLocation), "manual_title_%s", skillnames[skill]); - - msg = msg_message("find_manual", "unit location book", u, zLocation, zBook); - if (msg) { - r_addmessage(r, u->faction, msg); - msg_release(msg); - } - - if (!improve_all(u->faction, skill, 3)) { - increase_skill(u, skill, 9); - } -} - -static void get_villagers(region * r, unit * u) -{ - unit *newunit; - message *msg = msg_message("encounter_villagers", "unit", u); - const char *name = LOC(u->faction->locale, "villagers"); - - r_addmessage(r, u->faction, msg); - msg_release(msg); - - newunit = - create_unit(r, u->faction, rng_int() % 20 + 3, u->faction->race, 0, name, - u); - leave(newunit, true); - fset(newunit, UFL_ISNEW | UFL_MOVED); - equip_unit(newunit, "rand_villagers"); -} - -static void get_allies(region * r, unit * u) -{ - unit *newunit = NULL; - const char *name; - const char *equip; - int number; - message *msg; - - assert(u->number); - - switch (rterrain(r)) { - case T_PLAIN: - if (!r_isforest(r)) { - if (get_money(u) / u->number < 100 + rng_int() % 200) - return; - name = "random_plain_men"; - equip = "rand_plain"; - number = rng_int() % 8 + 2; - break; - } - else { - if (effskill(u, SK_LONGBOW, r) < 3 - && effskill(u, SK_HERBALISM, r) < 2 - && effskill(u, SK_MAGIC, r) < 2) { - return; - } - name = "random_forest_men"; - equip = "rand_forest"; - number = rng_int() % 6 + 2; - } - break; - - case T_SWAMP: - if (effskill(u, SK_MELEE, r) <= 1) { - return; - } - name = "random_swamp_men"; - equip = "rand_swamp"; - number = rng_int() % 6 + 2; - break; - - case T_DESERT: - if (effskill(u, SK_RIDING, r) <= 2) { - return; - } - name = "random_desert_men"; - equip = "rand_desert"; - number = rng_int() % 12 + 2; - break; - - case T_HIGHLAND: - if (effskill(u, SK_MELEE, r) <= 1) { - return; - } - name = "random_highland_men"; - equip = "rand_highland"; - number = rng_int() % 8 + 2; - break; - - case T_MOUNTAIN: - if (effskill(u, SK_MELEE, r) <= 1 || effskill(u, SK_TRADE, r) <= 2) { - return; - } - name = "random_mountain_men"; - equip = "rand_mountain"; - number = rng_int() % 6 + 2; - break; - - case T_GLACIER: - if (effskill(u, SK_MELEE, r) <= 1 || effskill(u, SK_TRADE, r) <= 1) { - return; - } - name = "random_glacier_men"; - equip = "rand_glacier"; - number = rng_int() % 4 + 2; - break; - - default: - return; - } - - newunit = - create_unit(r, u->faction, number, u->faction->race, 0, - LOC(u->faction->locale, name), u); - equip_unit(newunit, equip); - - u_setfaction(newunit, u->faction); - set_racename(&newunit->attribs, get_racename(u->attribs)); - if (u_race(u)->flags & RCF_SHAPESHIFT) { - newunit->irace = u->irace; - } - if (fval(u, UFL_ANON_FACTION)) - fset(newunit, UFL_ANON_FACTION); - fset(newunit, UFL_ISNEW); - - msg = msg_message("encounter_allies", "unit name", u, name); - r_addmessage(r, u->faction, msg); - msg_release(msg); -} - -static void encounter(region * r, unit * u) -{ - if (!fval(r, RF_ENCOUNTER)) - return; - freset(r, RF_ENCOUNTER); - if (rng_int() % 100 >= ENCCHANCE) - return; - switch (rng_int() % 3) { - case 0: - find_manual(r, u); - break; - case 1: - get_villagers(r, u); - break; - case 2: - get_allies(r, u); - break; - } -} - -void encounters(void) -{ - region *r; - - for (r = regions; r; r = r->next) { - if (fval(r->terrain, LAND_REGION) && fval(r, RF_ENCOUNTER)) { - int c = 0; - unit *u; - for (u = r->units; u; u = u->next) { - c += u->number; - } - - if (c > 0) { - int i = 0; - int n = rng_int() % c; - - for (u = r->units; u; u = u->next) { - if (i + u->number > n) - break; - i += u->number; - } - assert(u && u->number); - encounter(r, u); - } - } - } -} - void drown(region * r) { if (fval(r->terrain, SEA_REGION)) { @@ -611,7 +363,7 @@ static void move_icebergs(void) } } -void create_icebergs(void) +static void create_icebergs(void) { region *r; const struct terrain_type *t_iceberg, *t_sleep; diff --git a/src/randenc.h b/src/randenc.h index cc799db5f..3814a520d 100644 --- a/src/randenc.h +++ b/src/randenc.h @@ -30,7 +30,6 @@ extern "C" { #define PLAGUE_HEALCHANCE 0.25 /* Wahrscheinlichkeit Heilung */ #define PLAGUE_HEALCOST 30 /* Heilkosten */ void plagues(struct region *r); - void encounters(void); void randomevents(void); #ifdef __cplusplus diff --git a/src/settings.h b/src/settings.h index 0a017dd7a..57edb1566 100644 --- a/src/settings.h +++ b/src/settings.h @@ -31,6 +31,5 @@ /* Gebaeudegroesse = Minimalbelagerer */ #define SIEGEFACTOR 2 -#define ENCCHANCE 10 /* %-Chance fuer einmalige Zufallsbegegnung */ #define BAGCAPACITY 20000 /* soviel passt in einen Bag of Holding */ #define PERSON_WEIGHT 1000 /* weight of a "normal" human unit */ From c223542ced15ad2e23635f86d9d8e179078a9de2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 16:17:03 +0200 Subject: [PATCH 177/231] kill an unused macro. --- src/randenc.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/randenc.c b/src/randenc.c index d7184af83..a55f2c445 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -515,9 +515,8 @@ static void icebergs(void) move_icebergs(); } -#define HERBS_ROT /* herbs owned by units have a chance to rot. */ #define HERBROTCHANCE 5 /* Verrottchance f�r Kr�uter (ifdef HERBS_ROT) */ -#ifdef HERBS_ROT + static void rotting_herbs(void) { region *r; @@ -550,7 +549,6 @@ static void rotting_herbs(void) } } } -#endif void randomevents(void) { @@ -594,9 +592,7 @@ void randomevents(void) } chaos_update(); -#ifdef HERBS_ROT rotting_herbs(); -#endif dissolve_units(); } From 1d7318d9b6979ca8eed0d22b21ceaa190a4a3a63 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 20:33:45 +0200 Subject: [PATCH 178/231] test that new orcs have weapon skills. --- scripts/tests/e2/e2features.lua | 13 +++++++++++++ scripts/tests/e3/rules.lua | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 8fea1641a..573e3e0df 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -444,3 +444,16 @@ function test_faction_anonymous() assert_equal(get_name(u) .. ", 1 Mensch, aggressiv.", u:show(f)) assert_equal(get_name(u) .. ", " .. get_name(f) .. ", 1 Mensch.", u:show(f2)) end + +function test_new_orc_has_skills() + local f = faction.create('orc') + local r = region.create(0, 0, 'plain') + local u = unit.create(f, r) + u:add_item('money', 400) + u.number = 0 + u:add_order("REKRUTIEREN 2") + process_orders() + assert_equal(2, u.number) + assert_equal(1, u:get_skill('polearm')) + assert_equal(1, u:get_skill('melee')) +end diff --git a/scripts/tests/e3/rules.lua b/scripts/tests/e3/rules.lua index 5120fb747..6d3e56d1a 100644 --- a/scripts/tests/e3/rules.lua +++ b/scripts/tests/e3/rules.lua @@ -1026,3 +1026,17 @@ function test_demons_using_mallornlance() end assert_true(u.guard) end + +function test_new_orc_has_no_skills() +-- orcs in E2 get starting skills, but in E3 they do not + local f = faction.create('orc') + local r = region.create(0, 0, 'plain') + local u = unit.create(f, r) + u:add_item('money', 400) + u.number = 0 + u:add_order("REKRUTIEREN 2") + process_orders() + assert_equal(2, u.number) + assert_equal(0, u:get_skill('polearm')) + assert_equal(0, u:get_skill('melee')) +end From a741eaca97cea047632518e79b9e2042a6c67f0d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 21:23:54 +0200 Subject: [PATCH 179/231] equip new orcs in e2 with lua and a hacky callback. --- res/eressea/equipment.xml | 5 --- scripts/eressea/equipment.lua | 83 +++++++++++++++++++++-------------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index d0f37a404..a03aba2ce 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -36,11 +36,6 @@ - - - - - diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index d7fa9d43a..423fc0280 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -1,6 +1,46 @@ --- Equipment +-- forward declaration required: +local sets = {} -local sets = { +local function equip_new_orc(u, flags) + local eqname = 'orc_' .. config.rules + local set = sets[eqname] + if set then + return equip_unit(u, eqname, flags) + end + return false +end + +function equip_unit(u, name, flags) + local set = sets[name] + if set then + local items = set['items'] + if items then + for k,v in pairs(items) do + u:add_item(k, v) + end + end + local skills = set['skills'] + if skills then + for k,v in pairs(skills) do + u:set_skill(k, v) + end + end + local spells = set['spells'] + if spells then + for k, v in ipairs(spells) do + u:add_spell(v) + end + end + local callback = set['callback'] + if callback and type(callback) == 'function' then + callback(u, flags) + end + return true + end + return false +end + +sets = { ['first_unit'] = { ['items'] = { ['money'] = 2500, @@ -25,6 +65,15 @@ local sets = { ['melee'] = 1 } }, + ['new_orc'] = { + ['callback'] = equip_new_orc + }, + ['orc_e2'] = { + ['skills'] = { + ['polearm'] = 1, + ['melee'] = 1 + } + }, ['seed_dwarf'] = { ['items'] = { ['axe'] = 1, @@ -108,34 +157,4 @@ local sets = { }, } -function equip_unit(u, name, flags) - local set = sets[name] - if set then - local items = set['items'] - if items then - for k,v in pairs(items) do - u:add_item(k, v) - end - end - local skills = set['skills'] - if skills then - for k,v in pairs(skills) do - u:set_skill(k, v) - end - end - local spells = set['spells'] - if spells then - for k, v in ipairs(spells) do - u:add_spell(v) - end - end - local callback = set['callback'] - if callback and type(callback) == 'function' then - callback(u) - end - return true - end - return false -end - return nil From 2be0e9bd410def15e0a1bfafec809a7d26a4742a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 21:58:01 +0200 Subject: [PATCH 180/231] customize equipment for each game, in Lua. no more equipment.xml for e3 --- conf/e3/config.json | 1 - res/e3a/equipment.xml | 11 ---- res/eressea/equipment.xml | 5 -- scripts/eressea/e2/init.lua | 22 ++++++-- scripts/eressea/e3/init.lua | 12 ++++- scripts/eressea/equipment.lua | 98 +++++++++++++++++------------------ 6 files changed, 77 insertions(+), 72 deletions(-) delete mode 100644 res/e3a/equipment.xml diff --git a/conf/e3/config.json b/conf/e3/config.json index ad7a44b2f..0cd2c1606 100644 --- a/conf/e3/config.json +++ b/conf/e3/config.json @@ -8,7 +8,6 @@ "config://conf/e3/items.json", "config://conf/e3/races.json", "config://res/e3a/familiars.xml", - "config://res/e3a/equipment.xml", "config://res/e3a/ships.xml", "config://res/e3a/buildings.xml", "config://res/e3a/spells.xml", diff --git a/res/e3a/equipment.xml b/res/e3a/equipment.xml deleted file mode 100644 index d8c529d8a..000000000 --- a/res/e3a/equipment.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index a03aba2ce..2a39a5295 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -36,11 +36,6 @@ - - - - - diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index ba6c9895b..4ef2212c0 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -1,5 +1,22 @@ require 'eressea.spells' -eressea.log.debug("rules for game E2") +eressea.log.debug('rules for game E2') + +local equipment = require('eressea.equipment') +local sets = { + ['new_orc'] = { + ['skills'] = { + ['polearm'] = 1, + ['melee'] = 1 + } + }, + ['spo_seaserpent'] = { + ['items'] = { + ['dragonblood'] = 6, + ['seaserpenthead'] = 1 + } + } +} +equipment.add_multiple(sets) return { require('eressea'), @@ -13,6 +30,5 @@ return { require('eressea.astral'), require('eressea.jsreport'), require('eressea.ents'), - require('eressea.equipment'), - require('eressea.cursed') + require('eressea.cursed'), } diff --git a/scripts/eressea/e3/init.lua b/scripts/eressea/e3/init.lua index 0b1d21664..a19049512 100644 --- a/scripts/eressea/e3/init.lua +++ b/scripts/eressea/e3/init.lua @@ -2,10 +2,20 @@ require 'eressea.spells' eressea.log.debug("rules for game E3") +local equipment = require('eressea.equipment') +local sets = { + ['spo_seaserpent'] = { + ['items'] = { + ['dragonblood'] = 2, + ['seaserpenthead'] = 1 + } + } +} +equipment.add_multiple(sets) + return { require('eressea'), require('eressea.xmasitems'), require('eressea.frost'), - require('eressea.equipment'), require('eressea.ents') } diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index 423fc0280..b85fd587b 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -1,46 +1,7 @@ -- forward declaration required: -local sets = {} -local function equip_new_orc(u, flags) - local eqname = 'orc_' .. config.rules - local set = sets[eqname] - if set then - return equip_unit(u, eqname, flags) - end - return false -end - -function equip_unit(u, name, flags) - local set = sets[name] - if set then - local items = set['items'] - if items then - for k,v in pairs(items) do - u:add_item(k, v) - end - end - local skills = set['skills'] - if skills then - for k,v in pairs(skills) do - u:set_skill(k, v) - end - end - local spells = set['spells'] - if spells then - for k, v in ipairs(spells) do - u:add_spell(v) - end - end - local callback = set['callback'] - if callback and type(callback) == 'function' then - callback(u, flags) - end - return true - end - return false -end - -sets = { +local self = {} +local mysets = { ['first_unit'] = { ['items'] = { ['money'] = 2500, @@ -65,15 +26,6 @@ sets = { ['melee'] = 1 } }, - ['new_orc'] = { - ['callback'] = equip_new_orc - }, - ['orc_e2'] = { - ['skills'] = { - ['polearm'] = 1, - ['melee'] = 1 - } - }, ['seed_dwarf'] = { ['items'] = { ['axe'] = 1, @@ -157,4 +109,48 @@ sets = { }, } -return nil +function equip_unit(u, name, flags) + local set = mysets[name] + if set then + local items = set['items'] + if items then + for k,v in pairs(items) do + u:add_item(k, v) + end + end + local skills = set['skills'] + if skills then + for k,v in pairs(skills) do + u:set_skill(k, v) + end + end + local spells = set['spells'] + if spells then + for k, v in ipairs(spells) do + u:add_spell(v) + end + end + local callback = set['callback'] + if callback and type(callback) == 'function' then + callback(u, flags) + end + return true + end + return false +end + +self.add = function(name, set) + mysets[name] = set +end + +self.add_multiple = function(sets) + for name, v in pairs(sets) do + mysets[name] = v + end +end + +self.get = function(name) + return mysets[name] +end + +return self From cadb374ab8c7b6717bc8f2b83698ba1090334282 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 13 May 2018 22:01:51 +0200 Subject: [PATCH 181/231] re-add accidentally deleted undead and dracoid equipment. --- res/eressea/equipment.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index 2a39a5295..6cad51e88 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -36,6 +36,28 @@ + + + + + + + + + + + + + + + + + + + + + + From 40a2a6735a29a5ec73df848424d23befa7882e35 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 14 May 2018 04:42:59 +0200 Subject: [PATCH 182/231] mac build fix, dragon spoils equipment in Lua --- res/eressea/equipment.xml | 14 -------------- scripts/eressea/e2/init.lua | 23 +++++++++++++++++++++++ src/randenc.c | 13 ------------- src/tests.c | 1 + 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml index 2a39a5295..306187c2f 100644 --- a/res/eressea/equipment.xml +++ b/res/eressea/equipment.xml @@ -1,20 +1,6 @@ - - - - - - - - - - - - - - diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index 4ef2212c0..93dbfeea9 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -14,6 +14,29 @@ local sets = { ['dragonblood'] = 6, ['seaserpenthead'] = 1 } + }, + ['spo_dragon'] = { + ['items'] = { + ['dragonblood'] = 4, + ['seaserpenthead'] = 1 + } + }, + ['spo_dragon'] = { + ['items'] = { + ['dragonblood'] = 4, + ['dragonhead'] = 1 + } + }, + ['spo_youngdragon'] = { + ['items'] = { + ['dragonblood'] = 1 + } + }, + ['spo_wyrm'] = { + ['items'] = { + ['dragonblood'] = 10, + ['dragonhead'] = 1 + } } } equipment.add_multiple(sets) diff --git a/src/randenc.c b/src/randenc.c index a55f2c445..7de49b9e2 100644 --- a/src/randenc.c +++ b/src/randenc.c @@ -155,19 +155,6 @@ static void dissolve_units(void) remove_empty_units(); } -static bool improve_all(faction * f, skill_t sk, int by_weeks) -{ - unit *u; - bool result = false; - for (u = f->units; u; u = u->nextF) { - if (has_skill(u, sk)) { - increase_skill(u, sk, by_weeks); - result = true; - } - } - return result; -} - void drown(region * r) { if (fval(r->terrain, SEA_REGION)) { diff --git a/src/tests.c b/src/tests.c index e3799c1b5..336cb5231 100644 --- a/src/tests.c +++ b/src/tests.c @@ -257,6 +257,7 @@ void test_setup_test(CuTest *tc, const char *file, int line) { else { log_debug("start test in %s:%d", file, line); } + errno = 0; } void test_teardown(void) From e46cfa5e77dedeae3f70edc6c0c0c4e263ce99a5 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 14 May 2018 22:01:32 +0200 Subject: [PATCH 183/231] remove even more equipment xml to Lua only familiars still TBD, I think. --- conf/e2/config.json | 1 - conf/e2/rules.xml | 27 --------------- res/eressea/equipment.xml | 49 -------------------------- scripts/eressea/e2/init.lua | 61 +++++++++++++++++++++++++++++++++ scripts/eressea/equipment.lua | 2 +- scripts/eressea/xmlconf.lua | 2 -- scripts/tests/e2/e2features.lua | 29 ++++++++++++++++ 7 files changed, 91 insertions(+), 80 deletions(-) delete mode 100644 conf/e2/rules.xml delete mode 100644 res/eressea/equipment.xml diff --git a/conf/e2/config.json b/conf/e2/config.json index ddf6b9dd3..ba974c414 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -13,7 +13,6 @@ "config://res/eressea/races.xml", "config://res/eressea/artrewards.xml", "config://res/eressea/familiars.xml", - "config://res/eressea/equipment.xml", "config://res/eressea/spells.xml", "config://res/eressea/spellbooks/gray.xml", "config://res/eressea/spellbooks/gwyrrd.xml", diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml deleted file mode 100644 index 002c34960..000000000 --- a/conf/e2/rules.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/eressea/equipment.xml b/res/eressea/equipment.xml deleted file mode 100644 index f9951a42e..000000000 --- a/res/eressea/equipment.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index 93dbfeea9..24f679e17 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -1,8 +1,15 @@ require 'eressea.spells' eressea.log.debug('rules for game E2') +math.randomseed(rng.random()) + local equipment = require('eressea.equipment') local sets = { + ['seed_faction'] = { + ['items'] = { + ['adamantium'] = 1 + } + }, ['new_orc'] = { ['skills'] = { ['polearm'] = 1, @@ -37,8 +44,62 @@ local sets = { ['dragonblood'] = 10, ['dragonhead'] = 1 } + }, + ['seed_dragon'] = { + ['skills'] = { + ['magic'] = 4, + ['stealth'] = 1, + ['stamina'] = 1, + }, + ['callback'] = function(u) + u:add_item('money', u.number * (math.random(500)+99)) + u:set_skill('perception', math.random(3)) + end + }, + ['seed_braineater'] = { + ['skills'] = { + ['stealth'] = 1, + ['perception'] = 1, + } + }, + ['seed_seaserpent'] = { + ['skills'] = { + ['magic'] = 4, + ['stealth'] = 2, + ['stamina'] = 1, + ['perception'] = 3, + } + }, + ['rising_undead'] = { + ['items'] = { + ['rustysword'] = 1 + }, + ['callback'] = function(u) + if (math.random(2)==1) then + u:add_item('rustychainmail', u.number) + end + if (math.random(3)==1) then + u:add_item('rustyshield', u.number) + end + end + }, + ['new_dracoid'] = { + ['callback'] = function(u) + local pick = math.random(3) + if pick==1 then + u:set_skill('melee', math.random(4)+2) + u:add_item('sword', u.number) + elseif pick==2 then + u:set_skill('polearm', math.random(4)+2) + u:add_item('spear', u.number) + else + u:set_skill('bow', math.random(3)+1) + u:add_item('bow', u.number) + end + end } } + equipment.add_multiple(sets) return { diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index b85fd587b..a2999284d 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -115,7 +115,7 @@ function equip_unit(u, name, flags) local items = set['items'] if items then for k,v in pairs(items) do - u:add_item(k, v) + u:add_item(k, v * u.number) end end local skills = set['skills'] diff --git a/scripts/eressea/xmlconf.lua b/scripts/eressea/xmlconf.lua index 756d3c18a..335845177 100644 --- a/scripts/eressea/xmlconf.lua +++ b/scripts/eressea/xmlconf.lua @@ -3,8 +3,6 @@ local rules = 'conf' if config.rules then rules = rules .. '/' .. config.rules assert(0 == eressea.config.read(rules .. '/config.json', config.install), "could not read JSON data") --- assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") --- assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?") end eressea.game.reset() diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 573e3e0df..776537671 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -457,3 +457,32 @@ function test_new_orc_has_skills() assert_equal(1, u:get_skill('polearm')) assert_equal(1, u:get_skill('melee')) end + +function test_new_dracoid() + local f = faction.create('human') + local r = region.create(0, 0, 'plain') + local u = unit.create(f, r, 'dracoid') + u.number = 2 + u:equip("new_dracoid") + assert_equal(2, u.number) + item = nil + if u:get_skill('bow') > 1 then + item = 'bow' + elseif u:get_skill('polearm') > 1 then + item = 'spear' + elseif u:get_skill('melee') > 1 then + item = 'sword' + end + assert_not_nil(item) + assert_equal(u.number, u:get_item(item)) +end + +function test_rising_undead() + local f = faction.create('human') + local r = region.create(0, 0, 'plain') + local u = unit.create(f, r, 'undead') + u.number = 2 + u:equip("rising_undead") + assert_equal(2, u.number) + assert_equal(u.number, u:get_item('rustysword')) +end From 9dd38a6593ffe255b44d3668fe75866ab442001c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 15 May 2018 06:58:07 +0200 Subject: [PATCH 184/231] convert E2 familiars from XML to Lua --- conf/e2/config.json | 1 - res/eressea/familiars.xml | 133 --------------------------- scripts/eressea/e2/familiars.lua | 153 +++++++++++++++++++++++++++++++ scripts/eressea/e2/init.lua | 1 + scripts/eressea/equipment.lua | 16 ++-- scripts/run-turn.lua | 2 + scripts/tests/e2/spells.lua | 12 +++ 7 files changed, 176 insertions(+), 142 deletions(-) delete mode 100644 res/eressea/familiars.xml create mode 100644 scripts/eressea/e2/familiars.lua diff --git a/conf/e2/config.json b/conf/e2/config.json index ba974c414..ebc385adf 100644 --- a/conf/e2/config.json +++ b/conf/e2/config.json @@ -12,7 +12,6 @@ "config://res/buildings/castle.xml", "config://res/eressea/races.xml", "config://res/eressea/artrewards.xml", - "config://res/eressea/familiars.xml", "config://res/eressea/spells.xml", "config://res/eressea/spellbooks/gray.xml", "config://res/eressea/spellbooks/gwyrrd.xml", diff --git a/res/eressea/familiars.xml b/res/eressea/familiars.xml deleted file mode 100644 index 112a82420..000000000 --- a/res/eressea/familiars.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/eressea/e2/familiars.lua b/scripts/eressea/e2/familiars.lua new file mode 100644 index 000000000..720cb81eb --- /dev/null +++ b/scripts/eressea/e2/familiars.lua @@ -0,0 +1,153 @@ +local sets = { + ['fam_lynx'] = { + ['skills'] = { + ['espionage'] = 1, + ['magic'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + } + }, + ['fam_tunnelworm'] = { + ['skills'] = { + ['forestry'] = 1, + ['magic'] = 1, + ['mining'] = 1, + ['stamina'] = 1, + } + }, + ['fam_eagle'] = { + ['skills'] = { + ['magic'] = 1, + ['perception'] = 1, + } + }, + ['fam_rat'] = { + ['skills'] = { + ['magic'] = 1, + ['espionage'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + ['stamina'] = 6, + } + }, + ['fam_owl'] = { + ['skills'] = { + ['magic'] = 1, + ['espionage'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + } + }, + ['fam_direwolf'] = { + ['skills'] = { + ['magic'] = 1, + ['perception'] = 1, + } + }, + ['fam_hellcat'] = { + ['skills'] = { + ['magic'] = 1, + ['perception'] = 1, + } + }, + ['fam_tiger'] = { + ['skills'] = { + ['magic'] = 1, + ['perception'] = 1, + } + }, + ['fam_songdragon'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['flee'] = 2, + ['sleep'] = 7, + ['frighten'] = 8, + }, + }, + ['fam_ghost'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['steal_aura'] = 6, + ['summonundead'] = 6, + ['frighten'] = 8, + }, + }, + ['fam_fairy'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['appeasement'] = 1, + ['calm_monster'] = 6, + ['seduction'] = 6, + }, + }, + ['fam_unicorn'] = { + ['skills'] = { + ['magic'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + }, + ['spells'] = { + ['resist_magic'] = 3, + ['song_of_peace'] = 12, + ['calm_monster'] = 6, + ['heroic_song'] = 5, + ['song_of_healing'] = 3, + ['appeasement'] = 2, + }, + }, + ['fam_imp'] = { + ['skills'] = { + ['magic'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + ['espionage'] = 1, + ['taxation'] = 1, + }, + ['spells'] = { + ['steal_aura'] = 6, + ['shapeshift'] = 3, + ['seduction'] = 6, + }, + }, + ['fam_dreamcat'] = { + ['skills'] = { + ['magic'] = 1, + ['stealth'] = 1, + ['perception'] = 1, + ['espionage'] = 1, + ['taxation'] = 1, + }, + ['spells'] = { + ['shapeshift'] = 3, + ['transferauratraum'] = 3, + }, + }, + ['fam_nymph'] = { + ['skills'] = { + ['magic'] = 1, + ['bow'] = 1, + ['herbalism'] = 1, + ['training'] = 1, + ['riding'] = 1, + ['espionage'] = 1, + ['stealth'] = 1, + ['entertainment'] = 1, + ['perception'] = 1, + }, + ['spells'] = { + ['seduction'] = 6, + ['calm_monster'] = 3, + ['song_of_confusion'] = 4, + ['appeasement'] = 1, + }, + }, +} + +local equipment = require('eressea.equipment') +equipment.add_multiple(sets) diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index 24f679e17..52636d207 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -115,4 +115,5 @@ return { require('eressea.jsreport'), require('eressea.ents'), require('eressea.cursed'), + require('eressea.e2.familiars') } diff --git a/scripts/eressea/equipment.lua b/scripts/eressea/equipment.lua index a2999284d..6e4ccfc9b 100644 --- a/scripts/eressea/equipment.lua +++ b/scripts/eressea/equipment.lua @@ -114,20 +114,20 @@ function equip_unit(u, name, flags) if set then local items = set['items'] if items then - for k,v in pairs(items) do - u:add_item(k, v * u.number) + for name, count in pairs(items) do + u:add_item(name, count * u.number) end end local skills = set['skills'] if skills then - for k,v in pairs(skills) do - u:set_skill(k, v) + for name, level in pairs(skills) do + u:set_skill(name, level) end end local spells = set['spells'] if spells then - for k, v in ipairs(spells) do - u:add_spell(v) + for name, level in ipairs(spells) do + u:add_spell(name, level) end end local callback = set['callback'] @@ -144,8 +144,8 @@ self.add = function(name, set) end self.add_multiple = function(sets) - for name, v in pairs(sets) do - mysets[name] = v + for name, set in pairs(sets) do + mysets[name] = set end end diff --git a/scripts/run-turn.lua b/scripts/run-turn.lua index 34340d43c..62d48ec51 100644 --- a/scripts/run-turn.lua +++ b/scripts/run-turn.lua @@ -183,6 +183,8 @@ if file_exists('execute.lock') then assert(false) end +math.randomseed(rng.random()) + local path = 'scripts' if config.install then path = config.install .. '/' .. path diff --git a/scripts/tests/e2/spells.lua b/scripts/tests/e2/spells.lua index deeb2798c..a9f49d2b8 100644 --- a/scripts/tests/e2/spells.lua +++ b/scripts/tests/e2/spells.lua @@ -124,3 +124,15 @@ function test_familiar() end end end + +function test_familiar_lynx() + local r = region.create(0, 0, 'plain') + local f = faction.create('human') + local u = unit.create(f, r) + u.race = 'lynx' + u:equip('fam_lynx') + assert_equal(1, u:get_skill('stealth')) + assert_equal(1, u:get_skill('espionage')) + assert_equal(1, u:get_skill('magic')) + assert_equal(1, u:get_skill('perception')) +end From 269030082c560543d65e2caf14713d199f08e2e2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Tue, 15 May 2018 21:51:47 +0200 Subject: [PATCH 185/231] remove struct equipment from the code entirely. --- conf/e3/config.json | 1 - res/e3a/familiars.xml | 105 ------------ scripts/eressea/e3/familiars.lua | 127 ++++++++++++++ scripts/eressea/e3/init.lua | 3 +- src/battle.c | 6 +- src/bind_monsters.c | 1 - src/helpers.c | 1 - src/kernel/config.c | 2 - src/kernel/equipment.c | 273 ------------------------------- src/kernel/equipment.h | 46 ------ src/kernel/equipment.test.c | 96 +++-------- src/kernel/faction.c | 6 +- src/kernel/save.c | 25 +-- src/magic.test.c | 42 ++--- src/tests.c | 1 - src/xmlreader.c | 194 ---------------------- 16 files changed, 174 insertions(+), 755 deletions(-) delete mode 100644 res/e3a/familiars.xml create mode 100644 scripts/eressea/e3/familiars.lua diff --git a/conf/e3/config.json b/conf/e3/config.json index 0cd2c1606..c1fa2725c 100644 --- a/conf/e3/config.json +++ b/conf/e3/config.json @@ -7,7 +7,6 @@ "config://conf/e3/terrains.json", "config://conf/e3/items.json", "config://conf/e3/races.json", - "config://res/e3a/familiars.xml", "config://res/e3a/ships.xml", "config://res/e3a/buildings.xml", "config://res/e3a/spells.xml", diff --git a/res/e3a/familiars.xml b/res/e3a/familiars.xml deleted file mode 100644 index b30c733ed..000000000 --- a/res/e3a/familiars.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/eressea/e3/familiars.lua b/scripts/eressea/e3/familiars.lua new file mode 100644 index 000000000..00f3b537d --- /dev/null +++ b/scripts/eressea/e3/familiars.lua @@ -0,0 +1,127 @@ +eressea.log.debug("rules for game E3") + +local equipment = require('eressea.equipment') +local sets = { + ['fam_lynx'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_eagle'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_direwolf'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_owl'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_hellcat'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_tiger'] = { + ['skills'] = { + ['magic'] = 1, + } + }, + ['fam_rat'] = { + ['skills'] = { + ['magic'] = 1, + ['stamina'] = 6, + } + }, + ['fam_tunnelworm'] = { + ['skills'] = { + ['magic'] = 1, + ['mining'] = 1, + ['forestry'] = 1, + ['stamina'] = 1, + } + }, + ['fam_dreamcat'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['shapeshift'] = 3, + ['transferauratraum'] = 3, + } + }, + ['fam_imp'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['shapeshift'] = 3, + ['seduction'] = 6, + ['steal_aura'] = 6, + } + }, + ['fam_ghost'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['steal_aura'] = 6, + ['summonundead'] = 6, + ['frighten'] = 8, + } + }, + ['fam_fairy'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['appeasement'] = 1, + ['seduction'] = 6, + ['calm_monster'] = 6, + } + }, + ['fam_songdragon'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['flee'] = 2, + ['sleep'] = 7, + ['frighten'] = 8, + } + }, + ['fam_unicorn'] = { + ['skills'] = { + ['magic'] = 1, + }, + ['spells'] = { + ['appeasement'] = 1, + ['song_of_healing'] = 2, + ['resist_magic'] = 3, + ['heroic_song'] = 5, + ['calm_monster'] = 6, + ['song_of_peace'] = 12, + } + }, + ['fam_nymph'] = { + ['skills'] = { + ['magic'] = 1, + ['bow'] = 1, + ['training'] = 1, + ['riding'] = 1, + }, + ['spells'] = { + ['appeasement'] = 1, + ['song_of_confusion'] = 4, + ['calm_monster'] = 6, + ['seduction'] = 6, + } + }, +} + +equipment.add_multiple(sets) diff --git a/scripts/eressea/e3/init.lua b/scripts/eressea/e3/init.lua index a19049512..b72d569aa 100644 --- a/scripts/eressea/e3/init.lua +++ b/scripts/eressea/e3/init.lua @@ -17,5 +17,6 @@ return { require('eressea'), require('eressea.xmasitems'), require('eressea.frost'), - require('eressea.ents') + require('eressea.ents'), + require('eressea.e3.familiars'), } diff --git a/src/battle.c b/src/battle.c index 1e6692a68..b69bab5d6 100644 --- a/src/battle.c +++ b/src/battle.c @@ -916,17 +916,13 @@ void kill_troop(troop dt) rmtroop(dt); if (!df->alive) { char eqname[64]; - const struct equipment *eq; const race *rc = u_race(du); item *drops = item_spoil(rc, du->number - df->run.number); if (drops != NULL) { i_merge(&du->items, &drops); } sprintf(eqname, "spo_%s", rc->_name); - eq = get_equipment(eqname); - if (eq != NULL) { - equip_items(&du->items, eq); - } + equip_unit_mask(du, eqname, EQUIP_ITEMS); } } diff --git a/src/bind_monsters.c b/src/bind_monsters.c index 76afffc15..af630bb41 100644 --- a/src/bind_monsters.c +++ b/src/bind_monsters.c @@ -7,7 +7,6 @@ #include -#include #include #include #include diff --git a/src/helpers.c b/src/helpers.c index 170ca2969..8acabd97c 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -31,7 +31,6 @@ without prior permission by the authors of Eressea. #include #include #include -#include #include #include #include diff --git a/src/kernel/config.c b/src/kernel/config.c index 8c7e64afe..54d030b76 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -30,7 +30,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "connection.h" #include "building.h" #include "direction.h" -#include "equipment.h" #include "faction.h" #include "group.h" #include "item.h" @@ -564,7 +563,6 @@ void kernel_done(void) attrib_done(); item_done(); message_done(); - equipment_done(); reports_done(); curses_done(); crmessage_done(); diff --git a/src/kernel/equipment.c b/src/kernel/equipment.c index 7b1af07f9..39e59bf43 100644 --- a/src/kernel/equipment.c +++ b/src/kernel/equipment.c @@ -41,59 +41,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include -void equipment_setskill(equipment * eq, skill_t sk, const char *value) -{ - if (eq != NULL) { - if (value != NULL) { - eq->skills[sk] = str_strdup(value); - } - else if (eq->skills[sk]) { - free(eq->skills[sk]); - } - } -} - -typedef struct lazy_spell { - struct spellref *spref; - int level; -} lazy_spell; - -void equipment_addspell(equipment * eq, const char * name, int level) -{ - if (eq) { - lazy_spell *ls = malloc(sizeof(lazy_spell)); - ls->spref = spellref_create(NULL, name); - ls->level = level; - selist_push(&eq->spells, ls); - } -} - -void -equipment_setitem(equipment * eq, const item_type * itype, const char *value) -{ - if (eq != NULL) { - if (itype != NULL) { - itemdata *idata = eq->items; - while (idata && idata->itype != itype) { - idata = idata->next; - } - if (idata == NULL) { - idata = (itemdata *)malloc(sizeof(itemdata)); - idata->itype = itype; - idata->value = str_strdup(value); - idata->next = eq->items; - eq->items = idata; - } - } - } -} - -void -equipment_setcallback(struct equipment *eq, equip_callback_fun callback) -{ - eq->callback = callback; -} - bool equip_unit(struct unit *u, const char *eqname) { return equip_unit_mask(u, eqname, EQUIP_ALL); @@ -101,228 +48,8 @@ bool equip_unit(struct unit *u, const char *eqname) bool equip_unit_mask(struct unit *u, const char *eqname, int mask) { - const equipment * eq = get_equipment(eqname); - if (eq) { - equip_unit_set(u, eq, mask); - return true; - } if (callbacks.equip_unit) { return callbacks.equip_unit(u, eqname, mask); } return false; } - -void equip_unit_set(struct unit *u, const equipment *eq, int mask) -{ - if (mask & EQUIP_SKILLS) { - int sk; - for (sk = 0; sk != MAXSKILLS; ++sk) { - if (eq->skills[sk] != NULL) { - int i = dice_rand(eq->skills[sk]); - if (i > 0) { - set_level(u, (skill_t)sk, i); - if (sk == SK_STAMINA) { - u->hp = unit_max_hp(u) * u->number; - } - } - } - } - } - - if (mask & EQUIP_SPELLS) { - if (eq->spells) { - selist * ql = eq->spells; - int qi; - sc_mage * mage = get_mage_depr(u); - - for (qi = 0; ql; selist_advance(&ql, &qi, 1)) { - lazy_spell *sbe = (lazy_spell *)selist_get(ql, qi); - spell *sp = spellref_get(sbe->spref); - unit_add_spell(u, mage, sp, sbe->level); - } - } - } - - if (eq->items && mask & EQUIP_ITEMS) { - itemdata *idata; - for (idata = eq->items; idata != NULL; idata = idata->next) { - int i = u->number * dice_rand(idata->value); - if (i > 0) { - i_add(&u->items, i_new(idata->itype, i)); - } - } - } - - if (eq->subsets) { - int i; - for (i = 0; eq->subsets[i].sets; ++i) { - if (chance(eq->subsets[i].chance)) { - double rnd = (1 + rng_int() % 1000) / 1000.0; - int k; - for (k = 0; eq->subsets[i].sets[k].set; ++k) { - if (rnd <= eq->subsets[i].sets[k].chance) { - equip_unit_set(u, eq->subsets[i].sets[k].set, mask); - break; - } - rnd -= eq->subsets[i].sets[k].chance; - } - } - } - } - - if (mask & EQUIP_SPECIAL) { - if (eq->callback) { - eq->callback(eq, u); - } - } -} - -void equip_items(struct item **items, const struct equipment *eq) -{ - if (eq) { - itemdata *idata; - - for (idata = eq->items; idata != NULL; idata = idata->next) { - int i = dice_rand(idata->value); - if (i > 0) { - i_add(items, i_new(idata->itype, i)); - } - } - if (eq->subsets) { - int i; - for (i = 0; eq->subsets[i].sets; ++i) { - if (chance(eq->subsets[i].chance)) { - double rnd = (1 + rng_int() % 1000) / 1000.0; - int k; - for (k = 0; eq->subsets[i].sets[k].set; ++k) { - if (rnd <= eq->subsets[i].sets[k].chance) { - equip_items(items, eq->subsets[i].sets[k].set); - break; - } - rnd -= eq->subsets[i].sets[k].chance; - } - } - } - } - } -} - -void free_ls(void *arg) { - lazy_spell *ls = (lazy_spell*)arg; - spellref_free(ls->spref); - free(ls); -} - -static critbit_tree cb_equipments = { 0 }; - -#define EQNAMELEN 24 - -typedef struct eq_entry { - char key[EQNAMELEN]; - equipment *value; -} eq_entry; - -typedef struct name_cb_data { - const equipment *find; - const char *result; -} name_cb_data; - - -static int equipment_name_cb(const void * match, const void * key, size_t keylen, void *cbdata) { - const eq_entry *ent = (const eq_entry *)match; - name_cb_data *query = (name_cb_data *)cbdata; - if (ent->value == query->find) { - query->result = ent->key; - return 1; - } - return 0; -} - -const char *equipment_name(const struct equipment *eq) -{ - name_cb_data data; - - data.find = eq; - data.result = NULL; - cb_foreach(&cb_equipments, "", 0, equipment_name_cb, &data); - return data.result; -} - -equipment *get_equipment(const char *eqname) -{ - const void *match; - - if (strlen(eqname) >= EQNAMELEN) { - log_warning("equipment name is longer than %d bytes: %s", EQNAMELEN - 1, eqname); - return NULL; - } - - match = cb_find_str(&cb_equipments, eqname); - if (match) { - const eq_entry *ent = (const eq_entry *)match; - return ent->value; - } - return NULL; -} - -equipment *create_equipment(const char *eqname) -{ - size_t len = strlen(eqname); - eq_entry ent; - - if (len >= EQNAMELEN) { - log_error("equipment name is longer than %d bytes: %s", EQNAMELEN-1, eqname); - len = EQNAMELEN-1; - } - memset(ent.key, 0, EQNAMELEN); - memcpy(ent.key, eqname, len); - - ent.value = (equipment *)calloc(1, sizeof(equipment)); - - cb_insert(&cb_equipments, &ent, sizeof(ent)); - return ent.value; -} - -equipment *get_or_create_equipment(const char *eqname) -{ - equipment *eq = get_equipment(eqname); - if (!eq) { - return create_equipment(eqname); - } - return eq; -} - -static void free_equipment(equipment *eq) { - int i; - if (eq->spells) { - selist_foreach(eq->spells, free_ls); - selist_free(eq->spells); - } - while (eq->items) { - itemdata *next = eq->items->next; - free(eq->items->value); - free(eq->items); - eq->items = next; - } - if (eq->subsets) { - for (i = 0; eq->subsets[i].sets; ++i) { - free(eq->subsets[i].sets); - } - free(eq->subsets); - } - for (i = 0; i != MAXSKILLS; ++i) { - free(eq->skills[i]); - } -} - -static int free_equipment_cb(const void * match, const void * key, size_t keylen, void *cbdata) { - const eq_entry * ent = (const eq_entry *)match; - free_equipment(ent->value); - free(ent->value); - return 0; -} - -void equipment_done(void) { - cb_foreach(&cb_equipments, "", 0, free_equipment_cb, 0); - cb_clear(&cb_equipments); -} diff --git a/src/kernel/equipment.h b/src/kernel/equipment.h index 5ba1a4182..7c95b8f67 100644 --- a/src/kernel/equipment.h +++ b/src/kernel/equipment.h @@ -19,64 +19,18 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifndef H_KRNL_EQUIPMENT_H #define H_KRNL_EQUIPMENT_H -#include "skill.h" - #include #ifdef __cplusplus extern "C" { #endif - struct spell; - struct item; struct unit; - typedef struct itemdata { - const struct item_type *itype; - char *value; - struct itemdata *next; - } itemdata; - - typedef struct subsetitem { - struct equipment *set; - float chance; - } subsetitem; - - typedef struct subset { - float chance; - subsetitem *sets; - } subset; - - typedef void(*equip_callback_fun) (const struct equipment *, struct unit *); - - typedef struct equipment { - struct itemdata *items; - char *skills[MAXSKILLS]; - struct selist *spells; - struct subset *subsets; - equip_callback_fun callback; - } equipment; - - void equipment_done(void); - - const char *equipment_name(const struct equipment *eq); - struct equipment *get_or_create_equipment(const char *eqname); - struct equipment *get_equipment(const char *eqname); - struct equipment *create_equipment(const char *eqname); - - void equipment_setitem(struct equipment *eq, - const struct item_type *itype, const char *value); - void equipment_setskill(struct equipment *eq, skill_t sk, - const char *value); - void equipment_addspell(struct equipment *eq, const char *name, int level); - void equipment_setcallback(struct equipment *eq, equip_callback_fun callback); - #define EQUIP_SKILLS (1<<1) #define EQUIP_SPELLS (1<<2) #define EQUIP_ITEMS (1<<3) #define EQUIP_SPECIAL (1<<4) #define EQUIP_ALL (0xFF) - void equip_items(struct item **items, const struct equipment *eq); - void equip_unit_set(struct unit *u, const struct equipment *eq, int mask); bool equip_unit_mask(struct unit *u, const char *eqname, int mask); bool equip_unit(struct unit *u, const char *eqname); diff --git a/src/kernel/equipment.test.c b/src/kernel/equipment.test.c index c09945865..331625c14 100644 --- a/src/kernel/equipment.test.c +++ b/src/kernel/equipment.test.c @@ -11,86 +11,40 @@ #include #include +static unit *eq_unit; +static const char *eq_name; +static int eq_mask; + +static bool equip_callback(unit *u, const char *eqname, int mask) { + eq_unit = u; + eq_name = eqname; + eq_mask = mask; + return true; +} + static void test_equipment(CuTest * tc) { - equipment * eq; + callbacks.equip_unit = equip_callback; unit * u; - const item_type * it_horses; - spell *sp; - sc_mage * mage; test_setup(); - test_create_race("human"); - enable_skill(SK_MAGIC, true); - it_horses = test_create_itemtype("horse"); - CuAssertPtrNotNull(tc, it_horses); - sp = create_spell("testspell"); - CuAssertPtrNotNull(tc, sp); - - CuAssertPtrEquals(tc, 0, get_equipment("herpderp")); - eq = get_or_create_equipment("herpderp"); - CuAssertPtrEquals(tc, eq, get_equipment("herpderp")); - - equipment_setitem(eq, it_horses, "1"); - equipment_setskill(eq, SK_MAGIC, "5"); - equipment_addspell(eq, sp->sname, 1); u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); - equip_unit_set(u, eq, EQUIP_ALL); - CuAssertIntEquals(tc, 1, i_get(u->items, it_horses)); - CuAssertIntEquals(tc, 5, get_level(u, SK_MAGIC)); + CuAssertIntEquals(tc, true, equip_unit_mask(u, "hodor", EQUIP_ALL)); + CuAssertIntEquals(tc, EQUIP_ALL, eq_mask); + CuAssertPtrEquals(tc, u, eq_unit); + CuAssertStrEquals(tc, "hodor", eq_name); - mage = get_mage_depr(u); - CuAssertPtrNotNull(tc, mage); - CuAssertPtrNotNull(tc, mage->spellbook); - CuAssertTrue(tc, u_hasspell(u, sp)); - test_teardown(); -} + CuAssertIntEquals(tc, true, equip_unit_mask(u, "foobar", EQUIP_ITEMS)); + CuAssertIntEquals(tc, EQUIP_ITEMS, eq_mask); + CuAssertPtrEquals(tc, u, eq_unit); + CuAssertStrEquals(tc, "foobar", eq_name); -static void test_get_equipment(CuTest * tc) -{ - equipment * eq; + CuAssertIntEquals(tc, true, equip_unit(u, "unknown")); + CuAssertIntEquals(tc, EQUIP_ALL, eq_mask); + CuAssertPtrEquals(tc, u, eq_unit); + CuAssertStrEquals(tc, "unknown", eq_name); - test_setup(); - eq = create_equipment("catapultammo123"); - CuAssertPtrNotNull(tc, eq); - CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq)); - eq = get_equipment("catapultammo123"); - CuAssertPtrNotNull(tc, eq); - CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq)); - eq = get_equipment("catapult"); - CuAssertPtrEquals(tc, NULL, eq); - eq = create_equipment("catapult"); - CuAssertPtrNotNull(tc, eq); - CuAssertPtrEquals(tc, eq, get_equipment("catapult")); - CuAssertStrEquals(tc, "catapult", equipment_name(eq)); - eq = get_equipment("catapultammo123"); - CuAssertPtrNotNull(tc, eq); - CuAssertStrEquals(tc, "catapultammo123", equipment_name(eq)); - test_teardown(); -} - -static bool equip_test(unit *u, const char *name, int mask) { - if (mask & EQUIP_ITEMS) { - i_change(&u->items, it_find("horse"), 1); - return true; - } - return false; -} - -static void test_equipment_callback(CuTest *tc) { - unit *u; - item_type *itype; - test_setup(); - itype = test_create_horse(); - u = test_create_unit(test_create_faction(NULL), test_create_plain(0, 0)); - CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_ITEMS)); - CuAssertPtrEquals(tc, NULL, u->items); - callbacks.equip_unit = equip_test; - CuAssertTrue(tc, equip_unit(u, "horse")); - CuAssertIntEquals(tc, 1, i_get(u->items, itype)); - CuAssertTrue(tc, !equip_unit_mask(u, "horse", EQUIP_SPELLS)); - CuAssertIntEquals(tc, 1, i_get(u->items, itype)); test_teardown(); } @@ -98,7 +52,5 @@ CuSuite *get_equipment_suite(void) { CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_equipment); - SUITE_ADD_TEST(suite, test_get_equipment); - SUITE_ADD_TEST(suite, test_equipment_callback); return suite; } diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 43c25d440..bc08ba010 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -285,7 +285,6 @@ unit *addplayer(region * r, faction * f) { unit *u; const char * name; - const struct equipment* eq; assert(r->land); if (rpeasants(r) < PEASANT_MIN) { @@ -296,10 +295,7 @@ unit *addplayer(region * r, faction * f) faction_setorigin(f, 0, r->x, r->y); u = create_unit(r, f, 1, f->race, 0, NULL, NULL); name = config_get("rules.equip_first"); - eq = get_equipment(name ? name : "first_unit"); - if (eq) { - equip_items(&u->items, eq); - } + equip_unit(u, name ? name : "first_unit"); u->hp = unit_max_hp(u) * u->number; fset(u, UFL_ISNEW); if (f->race == get_race(RC_DAEMON)) { diff --git a/src/kernel/save.c b/src/kernel/save.c index c1c8010d1..b43d9bd5d 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -27,7 +27,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "building.h" #include "calendar.h" #include "connection.h" -#include "equipment.h" #include "faction.h" #include "group.h" #include "item.h" @@ -1331,29 +1330,7 @@ static void fix_familiars(void) { /* unit is potentially a familiar */ attrib * a = a_find(u->attribs, &at_mage); attrib * am = a_find(u->attribs, &at_familiarmage); - if (am) { - sc_mage *mage = a ? (sc_mage *)a->data.v : NULL; - /* a familiar */ - if (!mage) { - log_error("%s seems to be a familiar with no magic.", - unitname(u)); - mage = create_mage(u, M_GRAY); - } - if (!mage->spellbook) { - char eqname[32]; - equipment *eq; - - snprintf(eqname, sizeof(eqname), "fam_%s", u->_race->_name); - eq = get_equipment(eqname); - if (eq && eq->spells) { - log_error("%s seems to be a familiar with no spells.", - unitname(u)); - /* magical familiar, no spells */ - equip_unit_set(u, eq, EQUIP_SPELLS); - } - } - } - else if (a) { + if (!am && a) { /* not a familiar, but magical */ attrib * ae = a_find(u->attribs, &at_eventhandler); if (ae) { diff --git a/src/magic.test.c b/src/magic.test.c index 5533d93ec..95c2d250d 100644 --- a/src/magic.test.c +++ b/src/magic.test.c @@ -4,6 +4,7 @@ #include "teleport.h" #include "give.h" +#include #include #include #include @@ -556,39 +557,32 @@ static void test_familiar_age(CuTest *tc) { test_teardown(); } +static unit *eq_unit; +static char *eq_name; +static int eq_mask; + +static bool equip_callback(unit *u, const char *eqname, int mask) { + eq_unit = u; + eq_name = str_strdup(eqname); + eq_mask = mask; + return true; +} + static void test_familiar_equip(CuTest *tc) { unit *mag, *u; - equipment *eq; - const item_type * itype; - spell *sp; - sc_mage * mage; test_setup(); - - itype = test_create_itemtype("horse"); - CuAssertPtrNotNull(tc, itype); - sp = create_spell("testspell"); - CuAssertPtrNotNull(tc, sp); - - eq = get_or_create_equipment("fam_human"); - equipment_setitem(eq, itype, "1"); - equipment_setskill(eq, SK_ENTERTAINMENT, "5"); - equipment_addspell(eq, sp->sname, 1); - + callbacks.equip_unit = equip_callback; mag = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); u = test_create_unit(mag->faction, test_create_region(0, 0, NULL)); + CuAssertStrEquals(tc, "human", u->_race->_name); set_familiar(mag, u); create_newfamiliar(mag, u); - CuAssertIntEquals(tc, 1, i_get(u->items, itype)); - CuAssertIntEquals(tc, 5, get_level(u, SK_ENTERTAINMENT)); - CuAssertIntEquals(tc, 0, get_level(u, SK_MAGIC)); - mage = get_mage(u); - CuAssertPtrNotNull(tc, mage); - CuAssertPtrNotNull(tc, mage->spellbook); - set_level(u, SK_MAGIC, 1); - CuAssertPtrEquals(tc, mage, get_mage_depr(u)); - CuAssertTrue(tc, u_hasspell(u, sp)); + CuAssertIntEquals(tc, EQUIP_ALL, eq_mask); + CuAssertPtrEquals(tc, u, eq_unit); + CuAssertStrEquals(tc, "fam_human", eq_name); + free(eq_name); test_teardown(); } diff --git a/src/tests.c b/src/tests.c index 336cb5231..d69651b82 100644 --- a/src/tests.c +++ b/src/tests.c @@ -212,7 +212,6 @@ static void test_reset(void) { free_config(); default_locale = 0; calendar_cleanup(); - equipment_done(); close_orders(); free_special_directions(); free_locales(); diff --git a/src/xmlreader.c b/src/xmlreader.c index cbae06f58..c3f3ac5fd 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -16,7 +16,6 @@ without prior permission by the authors of Eressea. #include "xmlreader.h" #include "kernel/building.h" -#include "kernel/equipment.h" #include "kernel/item.h" #include "kernel/messages.h" #include "kernel/race.h" @@ -838,198 +837,6 @@ static int parse_resources(xmlDocPtr doc) return results; } -static void add_items(equipment * eq, xmlNodeSetPtr nsetItems) -{ - if (nsetItems != NULL && nsetItems->nodeNr > 0) { - int i; - for (i = 0; i != nsetItems->nodeNr; ++i) { - xmlNodePtr node = nsetItems->nodeTab[i]; - xmlChar *propValue; - const struct item_type *itype; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - itype = it_find((const char *)propValue); - xmlFree(propValue); - if (itype != NULL) { - propValue = xmlGetProp(node, BAD_CAST "amount"); - if (propValue != NULL) { - equipment_setitem(eq, itype, (const char *)propValue); - xmlFree(propValue); - } - } - } - } -} - -static void add_spells(equipment * eq, xmlNodeSetPtr nsetItems) -{ - if (nsetItems != NULL && nsetItems->nodeNr > 0) { - int i; - for (i = 0; i != nsetItems->nodeNr; ++i) { - xmlNodePtr node = nsetItems->nodeTab[i]; - xmlChar *propValue; - int level; - const char *name; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - name = (const char *)propValue; - level = xml_ivalue(node, "level", 0); - if (level > 0) { - equipment_addspell(eq, name, level); - } - else { - log_error("spell '%s' for equipment-set '%s' has no level\n", name, equipment_name(eq)); - } - xmlFree(propValue); - } - } -} - -static void add_skills(equipment * eq, xmlNodeSetPtr nsetSkills) -{ - if (nsetSkills != NULL && nsetSkills->nodeNr > 0) { - int i; - for (i = 0; i != nsetSkills->nodeNr; ++i) { - xmlNodePtr node = nsetSkills->nodeTab[i]; - xmlChar *propValue; - skill_t sk; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - sk = findskill((const char *)propValue); - if (sk == NOSKILL) { - log_error("unknown skill '%s' in equipment-set %s\n", (const char *)propValue, equipment_name(eq)); - xmlFree(propValue); - } - else { - xmlFree(propValue); - propValue = xmlGetProp(node, BAD_CAST "level"); - if (propValue != NULL) { - equipment_setskill(eq, sk, (const char *)propValue); - xmlFree(propValue); - } - } - } - } -} - -static void -add_subsets(xmlDocPtr doc, equipment * eq, xmlNodeSetPtr nsetSubsets) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - if (nsetSubsets != NULL && nsetSubsets->nodeNr > 0) { - int i; - - eq->subsets = calloc(nsetSubsets->nodeNr + 1, sizeof(subset)); - for (i = 0; i != nsetSubsets->nodeNr; ++i) { - xmlXPathObjectPtr xpathResult; - xmlNodePtr node = nsetSubsets->nodeTab[i]; - xmlChar *propValue; - - eq->subsets[i].chance = 1.0f; - propValue = xmlGetProp(node, BAD_CAST "chance"); - if (propValue != NULL) { - eq->subsets[i].chance = (float)atof((const char *)propValue); - xmlFree(propValue); - } - xpath->node = node; - xpathResult = xmlXPathEvalExpression(BAD_CAST "set", xpath); - if (xpathResult->nodesetval) { - xmlNodeSetPtr nsetSets = xpathResult->nodesetval; - float totalChance = 0.0f; - - if (nsetSets->nodeNr > 0) { - int set; - eq->subsets[i].sets = - calloc(nsetSets->nodeNr + 1, sizeof(subsetitem)); - for (set = 0; set != nsetSets->nodeNr; ++set) { - xmlNodePtr nodeSet = nsetSets->nodeTab[set]; - float chance = 1.0f; - - propValue = xmlGetProp(nodeSet, BAD_CAST "chance"); - if (propValue != NULL) { - chance = (float)atof((const char *)propValue); - xmlFree(propValue); - } - totalChance += chance; - - propValue = xmlGetProp(nodeSet, BAD_CAST "name"); - assert(propValue != NULL); - eq->subsets[i].sets[set].chance = chance; - eq->subsets[i].sets[set].set = - get_or_create_equipment((const char *)propValue); - xmlFree(propValue); - } - } - if (totalChance > 1.0f) { - log_error("total chance exceeds 1.0: %f in equipment set %s.\n", totalChance, equipment_name(eq)); - } - } - xmlXPathFreeObject(xpathResult); - } - } - xmlXPathFreeContext(xpath); -} - -static int parse_equipment(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr xpathRaces; - int result = 0; - - /* reading eressea/equipment/set */ - xpathRaces = xmlXPathEvalExpression(BAD_CAST "/eressea/equipment/set", xpath); - if (xpathRaces->nodesetval) { - xmlNodeSetPtr nsetRaces = xpathRaces->nodesetval; - int i; - - result += nsetRaces->nodeNr; - for (i = 0; i != nsetRaces->nodeNr; ++i) { - xmlNodePtr node = nsetRaces->nodeTab[i]; - xmlChar *propName = xmlGetProp(node, BAD_CAST "name"); - - if (propName != NULL) { - equipment *eq = get_equipment((const char *)propName); - xmlXPathObjectPtr xpathResult; - - if (!eq) { - eq = create_equipment((const char *)propName); - } - - xpath->node = node; - - xpathResult = xmlXPathEvalExpression(BAD_CAST "item", xpath); - assert(!eq->items); - add_items(eq, xpathResult->nodesetval); - xmlXPathFreeObject(xpathResult); - - xpathResult = xmlXPathEvalExpression(BAD_CAST "spell", xpath); - assert(!eq->spells); - add_spells(eq, xpathResult->nodesetval); - xmlXPathFreeObject(xpathResult); - - xpathResult = xmlXPathEvalExpression(BAD_CAST "skill", xpath); - add_skills(eq, xpathResult->nodesetval); - xmlXPathFreeObject(xpathResult); - - xpathResult = xmlXPathEvalExpression(BAD_CAST "subset", xpath); - assert(!eq->subsets); - add_subsets(doc, eq, xpathResult->nodesetval); - xmlXPathFreeObject(xpathResult); - - xmlFree(propName); - } - } - } - - xmlXPathFreeObject(xpathRaces); - xmlXPathFreeContext(xpath); - - return result; -} - static int parse_spellbooks(xmlDocPtr doc) { xmlXPathContextPtr xpath = xmlXPathNewContext(doc); @@ -1670,7 +1477,6 @@ void register_xmlreader(void) xml_register_callback(parse_buildings); /* requires resources */ xml_register_callback(parse_ships); /* requires resources, terrains */ - xml_register_callback(parse_equipment); /* requires resources */ xml_register_callback(parse_spellbooks); /* requires spells */ xml_register_callback(parse_spells); /* requires resources */ From 064a0872ed22ae20b83ce37358cc75d4a5afe364 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 16 May 2018 21:33:29 +0200 Subject: [PATCH 186/231] Export strings to .po files (WIP). --- scripts/export.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 scripts/export.lua diff --git a/scripts/export.lua b/scripts/export.lua new file mode 100644 index 000000000..050c163e1 --- /dev/null +++ b/scripts/export.lua @@ -0,0 +1,16 @@ +local path = 'scripts' +if config.install then + path = config.install .. '/' .. path +end +package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua' +require 'eressea' +require 'eressea.xmlconf' -- read xml data + +local rules = {} +if config.rules then + rules = require('eressea.' .. config.rules) + eressea.log.info('loaded ' .. #rules .. ' modules for ' .. config.rules) +else + eressea.log.warning('no rule modules loaded, specify a game in eressea.ini or with -r') +end +export_locales() From 0f3e3c9e3821efae35c25abbb65522955d4ede3b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 16 May 2018 21:58:02 +0200 Subject: [PATCH 187/231] po file exporter, also for messages. --- src/bindings.c | 21 ++++++++++++++ src/util/language.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ src/util/language.h | 5 ++++ src/util/nrmessage.c | 11 ++++++++ src/util/nrmessage.h | 2 ++ 5 files changed, 106 insertions(+) diff --git a/src/bindings.c b/src/bindings.c index bbea46e60..276fe1dd4 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -913,6 +914,25 @@ static int lua_rng_default(lua_State *L) { return 0; } +static void export_locale(const struct locale *lang, const char *name) { + char fname[64]; + FILE * F; + + sprintf(fname, "strings.%s.po", name); + F = fopen(fname, "wt"); + if (F) { + export_strings(lang, F); + export_messages(lang, F); + fclose(F); + } +} + +static int tolua_export_locales(lua_State *L) { + UNUSED_ARG(L); + locale_foreach(export_locale); + return 0; +} + void tolua_bind_open(lua_State * L); int tolua_bindings_open(lua_State * L, const dictionary *inifile) @@ -1030,6 +1050,7 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "spells", tolua_get_spells); tolua_function(L, TOLUA_CAST "read_xml", tolua_read_xml); tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits); + tolua_function(L, TOLUA_CAST "export_locales", tolua_export_locales); } tolua_endmodule(L); return 1; } diff --git a/src/util/language.c b/src/util/language.c index 52d934beb..c0e8fe55d 100644 --- a/src/util/language.c +++ b/src/util/language.c @@ -221,6 +221,66 @@ void locale_setstring(locale * lang, const char *key, const char *value) } } +static const char *escape_str(const char *in, FILE *F) { + while (*in) { + char buffer[64]; + size_t len = 0; + char *out = buffer; + while (sizeof(buffer) > len + 2) { + if (*in == '\0') break; + if (strchr("\\\"", *in) != NULL) { + *out++ = '\\'; + ++len; + } + *out++ = *in++; + ++len; + } + if (len > 0) { + fwrite(buffer, 1, len, F); + } + } + return in; +} + +void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt) { + if (ctxt) { + fputs("msgctxt \"", F); + escape_str(ctxt, F); + fputs("\"\nmsgid \"", F); + escape_str(id, F); + } + else { + fputs("msgid \"", F); + escape_str(id, F); + } + fputs("\"\nmsgstr \"", F); + escape_str(str, F); + fputs("\"\n\n", F); +} + +void export_strings(const struct locale * lang, FILE *F) { + int i; + + for (i = 0; i != SMAXHASH; ++i) { + const struct locale_str *find = lang->strings[i]; + while (find) { + const char *dcolon = strstr(find->key, "::"); + if (dcolon) { + size_t len = dcolon - find->key; + char ctxname[16]; + assert(sizeof(ctxname) > len); + memcpy(ctxname, find->key, len); + ctxname[len] = '\0'; + po_write_msg(F, dcolon + 2, find->str, ctxname); + } + else { + po_write_msg(F, find->key, find->str, NULL); + } + find = find->nexthash; + } + } +} + const char *locale_name(const locale * lang) { return lang ? lang->name : "(null)"; @@ -316,6 +376,13 @@ void *get_translation(const struct locale *lang, const char *str, int index) { return NULL; } +void locale_foreach(void(*callback)(const struct locale *, const char *)) { + const locale * lang; + for (lang = locales; lang; lang = lang->next) { + callback(lang, lang->name); + } +} + const char *localenames[] = { "de", "en", NULL diff --git a/src/util/language.h b/src/util/language.h index 36bc58378..155fea9c8 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define MY_LOCALE_H #include +#include #ifdef __cplusplus extern "C" { @@ -56,6 +57,10 @@ extern "C" { void make_locales(const char *str); + void locale_foreach(void(*callback)(const struct locale *lang, const char *name)); + void export_strings(const struct locale * lang, FILE *F); + void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt); + #define LOC(lang, s) (lang?locale_string(lang, s, true):s) enum { diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 376731713..0f8dbb9d0 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -190,3 +190,14 @@ void free_nrmesssages(void) { } } } + +void export_messages(const struct locale * lang, FILE *F) { + int i; + for (i = 0; i != NRT_MAXHASH; ++i) { + nrmessage_type *nrt = nrtypes[i]; + while (nrt) { + po_write_msg(F, nrt->mtype->name, nrt->string, "message"); + nrt = nrt->next; + } + } +} diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index 6cc02bfe2..7234d5b2a 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -14,6 +14,7 @@ #define H_UTIL_NRMESSAGE #include +#include #ifdef __cplusplus extern "C" { @@ -46,6 +47,7 @@ extern "C" { int nr_level(const struct message *msg); const char *nr_section(const struct message *msg); + void export_messages(const struct locale * lang, FILE *F); /* before: * fogblock;movement:0;de;{unit} konnte von {region} nicht nach {$dir direction} ausreisen, der Nebel war zu dicht. * after: From 35c3d4cda0be599f84d21bdc57029331c0c87791 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 10:43:23 +0200 Subject: [PATCH 188/231] export messages and strings into separate .po files commit the exported files. --- res/translations/messages.de.po | 5595 +++++++++++++++++++++++++++ res/translations/messages.en.po | 5595 +++++++++++++++++++++++++++ res/translations/strings.de.po | 6312 +++++++++++++++++++++++++++++++ res/translations/strings.en.po | 5601 +++++++++++++++++++++++++++ src/bindings.c | 9 +- src/util/nrmessage.c | 4 +- src/util/nrmessage.h | 9 +- 7 files changed, 23113 insertions(+), 12 deletions(-) create mode 100644 res/translations/messages.de.po create mode 100644 res/translations/messages.en.po create mode 100644 res/translations/strings.de.po create mode 100644 res/translations/strings.en.po diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po new file mode 100644 index 000000000..3a9ee2ed0 --- /dev/null +++ b/res/translations/messages.de.po @@ -0,0 +1,5595 @@ +msgid "homestone_effect" +msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\"" + +msgid "homestone_effect" +msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\"" + +msgid "nogive_reserved" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has this item, but all $int($reservation) $resource($resource,$reservation) are reserved.\"" + +msgid "nogive_reserved" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand zwar, aber sämtliche $int($reservation) $resource($resource,$reservation) sind reserviert.\"" + +msgid "recruit" +msgstr "\"$unit($unit) in $region($region) recruits $int($amount) of $int($want) people.\"" + +msgid "recruit" +msgstr "\"$unit($unit) in $region($region) rekrutiert $int($amount) von $int($want) Personen.\"" + +msgid "sp_dreamreading_effect" +msgstr "\"$unit($mage) is lost in the dreams of $unit($unit) and gets a glimps into $region($region).\"" + +msgid "sp_dreamreading_effect" +msgstr "\"$unit($mage) verliert sich in die Träume von $unit($unit) und erhält einen Eindruck von $region($region).\"" + +msgid "analyse_ship_age" +msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for, about $int($months) more weeks.\"" + +msgid "analyse_ship_age" +msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "curseinfo::sparkle_2" +msgstr "\"$unit($unit) is haunted by terrbile nightmares. ($int36($id))\"" + +msgid "curseinfo::sparkle_2" +msgstr "\"$unit($unit) wird von bösen Alpträumen geplagt. ($int36($id))\"" + +msgid "absorbpeasants" +msgstr "\"$int($amount) peasants become $race($race,0) and join the ranks of $unit($unit).\"" + +msgid "absorbpeasants" +msgstr "\"$int($amount) Bauern werden zu $race($race,0) und schliessen sich $unit($unit) an.\"" + +msgid "unholypower_effect" +msgstr "\"$unit($mage) tranforms $unit($target) to $race($race,0).\"" + +msgid "unholypower_effect" +msgstr "\"$unit($mage) verwandelt $unit($target) in $race($race,0).\"" + +msgid "give_person" +msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to $unit($target).\"" + +msgid "give_person" +msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an $unit($target).\"" + +msgid "rust_effect_2" +msgstr "\"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty.\"" + +msgid "rust_effect_2" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde. Der magischen Regen lässt alles Eisen rosten.\"" + +msgid "heroes_maxed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction already has $int($count) of $int($max) heroes.\"" + +msgid "heroes_maxed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits $int($count) von $int($max) Helden.\"" + +msgid "error_build_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires a skill of at least $int($value) to build.\"" + +msgid "error_build_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um das zu bauen, braucht man ein Talent von mindestens $int($value).\"" + +msgid "analyse_building_age" +msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" + +msgid "analyse_building_age" +msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "curseinfo::auraboost_1" +msgstr "\"$unit($unit) finds it difficult to gather its magical energies. ($int36($id))\"" + +msgid "curseinfo::auraboost_1" +msgstr "\"$unit($unit) hat Schwierigkeiten seine magischen Energien zu sammeln. ($int36($id))\"" + +msgid "harbor_trade" +msgstr "\"$unit($unit) received $resources($items) from the $ship($ship).\"" + +msgid "harbor_trade" +msgstr "\"$unit($unit) erhielt $resources($items) von der $ship($ship).\"" + +msgid "reduce_spell" +msgstr "\"In $region($region), anti-magic from $unit($self) reduces the effect of $unit($mage)'s spell.\"" + +msgid "reduce_spell" +msgstr "\"$unit($self) schwächt in $region($region) einen Zauber von $unit.dative($mage) durch Antimagie ab.\"" + +msgid "raised" +msgstr "\"$unit($unit) breeds $int($amount) horses.\"" + +msgid "raised" +msgstr "\"$unit($unit) züchtet $int($amount) Pferde.\"" + +msgid "speed_time_effect" +msgstr "\"In $region($region), $unit($unit) bends time for $int($amount) men.\"" + +msgid "speed_time_effect" +msgstr "\"In $region($region) dehnt $unit($unit) die Zeit für $int($amount) Personen.\"" + +msgid "error199" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a familiar.\"" + +msgid "error199" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Vertrauten.\"" + +msgid "error195" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" + +msgid "error195" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" + +msgid "healall" +msgstr "\"Life itself touches the world and all beings are healed.\"" + +msgid "healall" +msgstr "\"Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt.\"" + +msgid "build_required" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required).\"" + +msgid "build_required" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required).\"" + +msgid "newbie_immunity_error" +msgstr "\"A faction must be at least $int($turns) weeks old before it can be attacked or stolen from.\"" + +msgid "newbie_immunity_error" +msgstr "\"Eine Partei muß mindestens $int($turns) Wochen alt sein, bevor sie angegriffen oder bestohlen werden kann.\"" + +msgid "error191" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in forests.\"" + +msgid "error191" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in Wäldern.\"" + +msgid "error156" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many alchemists in the faction.\"" + +msgid "error156" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Alchemisten in der Partei.\"" + +msgid "error266" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only functions in the entry hall.\"" + +msgid "error266" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der Eingangshalle.\"" + +msgid "error81" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must first guard the region.\"" + +msgid "error81" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit muß zuerst die Region bewachen.\"" + +msgid "hornofpeace_u_nosuccess" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No region could be pacified.\"" + +msgid "hornofpeace_u_nosuccess" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine Region konnte befriedet werden.\"" + +msgid "error70" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by a non-allied faction.\"" + +msgid "error70" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von Nichtalliierten bewacht.\"" + +msgid "error92" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no normal forest in this region.\"" + +msgid "error92" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keinen normalen Wald.\"" + +msgid "error262" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot have any more wyrms.\"" + +msgid "error262" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei kann keine weiteren Wyrme besitzen.\"" + +msgid "massive_overload" +msgstr "\"The $ship($ship) is massively overloaded and is damaged heavily.\"" + +msgid "massive_overload" +msgstr "\"Die $ship($ship) ist zu stark überladen und wird stark beschädigt.\"" + +msgid "curseinfo::shipspeedup" +msgstr "\"The winds seem to favor this ship. ($int36($id))\"" + +msgid "curseinfo::shipspeedup" +msgstr "\"Die Winde scheinen dieses Schiff besonders zu beguenstigen. ($int36($id))\"" + +msgid "error152" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit jumps over board and drowns.\"" + +msgid "error152" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit springt über Bord und ertrinkt.\"" + +msgid "error108" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No herbs could be found.\"" + +msgid "error108" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es sind keine Kräuter zu finden.\"" + +msgid "spellfail::contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit $unit($target) did not contact us.\"" + +msgid "spellfail::contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "error214" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit is not a magician.\"" + +msgid "error214" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist kein Magier.\"" + +msgid "patzer6" +msgstr "\"A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'\"" + +msgid "patzer6" +msgstr "\"Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'\"" + +msgid "lucky_item" +msgstr "\"$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount).\"" + +msgid "lucky_item" +msgstr "\"$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount).\"" + +msgid "error104" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This metal can be excavated only in a mine.\"" + +msgid "error104" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Metall kann nur in einem Bergwerk abgebaut werden.\"" + +msgid "error100" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here is a skilled ship builder.\"" + +msgid "error100" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier ist gelernter Schiffbauer.\"" + +msgid "curseinfo::gooddream" +msgstr "\"The people in this region have sweet dreams. ($int36($id))\"" + +msgid "curseinfo::gooddream" +msgstr "\"Die Leute haben schöne Träume. ($int36($id))\"" + +msgid "error2" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot guard off shore.\"" + +msgid "error2" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf hoher See kann man nicht bewachen.\"" + +msgid "nr_stat_maxentertainment" +msgstr "\"entertainment: max. $int($max) silver\"" + +msgid "nr_stat_maxentertainment" +msgstr "\"Unterhaltung: max. $int($max) Silber\"" + +msgid "blessedstonecircle_effect" +msgstr "\"$unit($mage) blesses $building($building).\"" + +msgid "blessedstonecircle_effect" +msgstr "\"$unit($mage) weiht $building($building).\"" + +msgid "income_tax_reduced" +msgstr "\"$unit($unit) collects taxes of$if($eq($wanted,$amount),\"\",\" only\") $int($amount) silver$if($eq($wanted,$amount),\"\",\" instead of $int($wanted) silver\") \") in $region($region).\"" + +msgid "income_tax_reduced" +msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber ein.\"" + +msgid "curseinfo::holyground" +msgstr "\"The undead turn away from this region. ($int36($id))\"" + +msgid "curseinfo::holyground" +msgstr "\"Untote schrecken vor dieser Region zurück. ($int36($id))\"" + +msgid "changemail" +msgstr "\"Address has been changed to '$value'.\"" + +msgid "changemail" +msgstr "\"Die Reportadresse wurde auf ${value} geändert.\"" + +msgid "song_of_peace_effect_0" +msgstr "\"The marvelous singing of $unit($mage) enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" + +msgid "song_of_peace_effect_0" +msgstr "\"Die Gesangskunst von $unit($mage) begeistert die Leute. Die friedfertige Stimmung des Lieds überträgt sich auf alle Zuhörer. Einige werfen ihre Waffen weg.\"" + +msgid "emptyeog" +msgstr "\"There is no more laen left in $region($region).\"" + +msgid "emptyeog" +msgstr "\"Die Laenader in $region($region) ist erschöpft.\"" + +msgid "entrise" +msgstr "\"In $region($region), the Lords of the Trees have risen.\"" + +msgid "entrise" +msgstr "\"In $region($region) erschienen die Herren der Bäume.\"" + +msgid "victory_murder_cfulfilled" +msgstr "\"Attention: $faction($faction) has fulfilled the victory condition and will be declared winner in $if($eq($remain,1),\"one week\",\"$int($remain) weeks\").\"" + +msgid "victory_murder_cfulfilled" +msgstr "\"Achtung: $faction($faction) hat die Siegbedingungen erfüllt und wird in $if($eq($remain,1),\"einer Woche\",\"$int($remain) Wochen\") zum Sieger erklärt werden.\"" + +msgid "headache_effect_1" +msgstr "\"$unit($unit) has a splitting headache and can hardly remember last week. Except that it all started in the tavern...\"" + +msgid "headache_effect_1" +msgstr "\"$unit($unit) hat höllische Kopfschmerzen und kann sich an die vergangene Woche nicht mehr erinnern. Nur noch daran, wie alles mit einer fröhlichen Feier in irgendeiner Taverne anfing....\"" + +msgid "feedback_no_contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us.\"" + +msgid "feedback_no_contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "sailforbiddendir" +msgstr "\"The crew of the $ship($ship) refuses to travel to the $direction($direction).\"" + +msgid "sailforbiddendir" +msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen.\"" + +msgid "receive" +msgstr "\"$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit).\"" + +msgid "receive" +msgstr "\"$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit).\"" + +msgid "missing_feedback" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Internal Error: Message '$name' is undefined.\"" + +msgid "missing_feedback" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Interner Fehler: Meldung '$name' nicht definiert.\"" + +msgid "thiefdiscover" +msgstr "\"$unit($target) caught $unit($unit) in attempted theft.\"" + +msgid "thiefdiscover" +msgstr "\"$unit($target) ertappte $unit($unit) beim versuchten Diebstahl.\"" + +msgid "museumgiveback" +msgstr "\"In $region($region), $unit($unit) received $resources($items) from $unit($sender)\"" + +msgid "museumgiveback" +msgstr "\"In $region($region) erhielt $unit($unit) von $unit.dative($sender) $resources($items)\"" + +msgid "curseinfo::sparkle_17" +msgstr "\"A dark and mysterious fairy appears before $unit($unit). She is of bewitching beauty. ($int36($id))\"" + +msgid "curseinfo::sparkle_17" +msgstr "\"Eine dunkle Fee erscheint $unit($unit) im Schlaf. Sie ist von schauriger Schönheit. ($int36($id))\"" + +msgid "caldera_handle_0" +msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" + +msgid "caldera_handle_0" +msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" + +msgid "researchherb_none" +msgstr "\"$unit($unit) could not find any herbs in $region($region).\"" + +msgid "researchherb_none" +msgstr "\"$unit($unit) in $region($region) kann keine Kräuter finden.\"" + +msgid "moveblockedbyguard" +msgstr "\"$unit($unit) was kept in $region($region) by $unit($guard).\"" + +msgid "moveblockedbyguard" +msgstr "\"$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten.\"" + +msgid "cast_frighten_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were intimidated.\"" + +msgid "cast_frighten_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden eingeschüchtert.\"" + +msgid "curseinfo::Feuerwand" +msgstr "A wall of fire blocks entry and exit. ($int36($id))" + +msgid "curseinfo::Feuerwand" +msgstr "Eine Feuerwand blockiert die Ein- und Ausreise. ($int36($id))" + +msgid "renamed_building_notseen" +msgstr "\"$building($building) in $region($region) received a nickname.\"" + +msgid "renamed_building_notseen" +msgstr "\"$building($building) in $region($region) bekommt einen Spitznamen.\"" + +msgid "heroes_race" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be heroes.\"" + +msgid "heroes_race" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können keine Helden erwählen.\"" + +msgid "summon_effect" +msgstr "\"$unit($mage) summons $int($amount) $race($race,$amount).\"" + +msgid "summon_effect" +msgstr "\"$unit($mage) beschwört $int($amount) $race($race,$amount).\"" + +msgid "error28" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasant morale is low.\"" + +msgid "error28" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern sind schlecht gelaunt.\"" + +msgid "error39" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has not yet learned espionage.\"" + +msgid "error39" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Spionage gelernt.\"" + +msgid "destroy_magic_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician could not destroy any curse.\"" + +msgid "destroy_magic_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier konnte keinen Fluch zerstören.\"" + +msgid "cast_auraleak_effect" +msgstr "\"$unit($mage) in $region($region) caused a tear in the fabric of magic, that sucked all magical energies out of the region.\"" + +msgid "cast_auraleak_effect" +msgstr "\"$unit($mage) rief in $region($region) einen Riss in dem Gefüge der Magie hervor, der alle magische Kraft aus der Region riss.\"" + +msgid "newbie_info_game" +msgstr "Remember to send your orders to $email with the subject ${subject}." + +msgid "newbie_info_game" +msgstr "Bitte denke daran, deine Befehle mit dem Betreff $subject an $email zu senden." + +msgid "mob_warning" +msgstr "\"An angry mob forms and hunts practitioners of the dark arts.\"" + +msgid "mob_warning" +msgstr "\"Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier.\"" + +msgid "dissolve_units_5" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) disappeared in the night.\"" + +msgid "dissolve_units_5" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verschwand\", \"verschwanden\") über Nacht.\"" + +msgid "fleescared" +msgstr "\"$int($amount) peasants fled in fear of $unit($unit).\"" + +msgid "fleescared" +msgstr "\"$int($amount) Bauern flohen aus Furcht vor $unit($unit).\"" + +msgid "drought_effect_3" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds. The drought permanently alters the region.\"" + +msgid "drought_effect_3" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt. Die Dürre verändert die Region für immer.\"" + +msgid "spellfail_pump" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Despite intense questioning, $unit($target) did not have anything to tell about $region($tregion).\"" + +msgid "spellfail_pump" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wusste trotz intensivem Verhör nichts über $region($tregion) zu berichten.\"" + +msgid "maintenance_nowork" +msgstr "\"$building($building) was nonfunctional because upkeep could not be paid at the beginning of the week.\"" + +msgid "maintenance_nowork" +msgstr "\"$building($building) hat diese Woche nicht funktioniert, da zu Beginn der Woche der Unterhalt nicht gezahlt werden konnte.\"" + +msgid "error_spell_on_flying_ship" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is far too dangerous to put this spell on the flying ship $ship($ship).\"" + +msgid "error_spell_on_flying_ship" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, diesen Zauber auf das fliegende Schiff $ship($ship) zu legen.\"" + +msgid "error275" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings cannot be built here.\"" + +msgid "error275" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Gebäude errichten.\"" + +msgid "error165" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit.\"" + +msgid "error165" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht.\"" + +msgid "siege_catapults" +msgstr "\"$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction.\"" + +msgid "siege_catapults" +msgstr "\"$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an.\"" + +msgid "curseinfo::magicstreet" +msgstr "\"The roads are extremely dry and well-kept. ($int36($id))\"" + +msgid "curseinfo::magicstreet" +msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))\"" + +msgid "curseinfo::sparkle_13" +msgstr "\"A group of vultures circles above $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_13" +msgstr "\"Über $unit($unit) zieht eine Gruppe Geier ihre Kreise. ($int36($id))\"" + +msgid "error161" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" + +msgid "error161" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit besitzt den Trank nicht.\"" + +msgid "error271" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot attack here.\"" + +msgid "error271" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden angreifen.\"" + +msgid "renamed_faction_notseen" +msgstr "\"Your faction received a nickname.\"" + +msgid "renamed_faction_notseen" +msgstr "\"Die Partei bekommt einen Spitznamen.\"" + +msgid "error227" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A herbalism skill of 7 or higher is required.\"" + +msgid "error227" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht ein Einheit mindestens Kräuterkunde 7.\"" + +msgid "error117" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot produce that.\"" + +msgid "error117" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann das nicht herstellen.\"" + +msgid "sp_depression_effect" +msgstr "\"$unit($mage) causes great sadness among the peasants of $region($region).\"" + +msgid "sp_depression_effect" +msgstr "\"$unit($mage) sorgt in $region($region) für Trübsal unter den Bauern.\"" + +msgid "sp_mindblast_effect" +msgstr "\"$unit($mage) casts $spell($spell). $int($amount) warriors lose their memories, $int($dead) were killed.\"" + +msgid "sp_mindblast_effect" +msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren Erinnerungen, $int($dead) wurden getötet.\"" + +msgid "error113" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Item to be handed over was not supplied.\"" + +msgid "error113" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nichts angegeben, was wir übergeben sollen.\"" + +msgid "undeadrise" +msgstr "\"The dead rise from their graves in $region($region).\"" + +msgid "undeadrise" +msgstr "\"In $region($region) erhoben sich die Toten aus den Gräbern.\"" + +msgid "reanimate_effect_0" +msgstr "\"$unit($mage) begins a ritual of resurrection. $int($amount) warriors rise from the dead.\"" + +msgid "reanimate_effect_0" +msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung. $int($amount) Krieger stehen von den Toten auf.\"" + +msgid "error223" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot guard.\"" + +msgid "error223" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht bewachen.\"" + +msgid "sp_confusion_effect_1" +msgstr "\"$unit($mage) begins a mysterious chant. Great confusion sweeps through the ranks of the enemy.\"" + +msgid "sp_confusion_effect_1" +msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" + +msgid "itemcloak" +msgstr "\"$unit($mage) shrouds the equipment of $unit($target) in shadows.\"" + +msgid "itemcloak" +msgstr "\"$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($target).\"" + +msgid "error5" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" + +msgid "error5" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" + +msgid "tactics_lost" +msgstr "\"$unit($unit) lured the enemy into an ambush.\"" + +msgid "tactics_lost" +msgstr "\"$unit($unit) konnte dem Gegner eine Falle stellen.\"" + +msgid "error_lowstealth" +msgstr "\"$unit($unit) in $region($region): '$order($command)' -The unit cannot hide that well.\"" + +msgid "error_lowstealth" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht so gut tarnen.\"" + +msgid "chaosgate_effect_1" +msgstr "\"$unit($mage) opens a chaos gate.\"" + +msgid "chaosgate_effect_1" +msgstr "\"$unit($mage) öffnet ein Chaostor.\"" + +msgid "shipsail" +msgstr "\"The $ship($ship) sails from $region($from) to $region($to).\"" + +msgid "shipsail" +msgstr "\"Die $ship($ship) segelt von $region($from) nach $region($to).\"" + +msgid "magicresistance_unit" +msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" + +msgid "magicresistance_unit" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" + +msgid "destroy_partial" +msgstr "\"$unit($unit) tears down parts of $building($building).\"" + +msgid "destroy_partial" +msgstr "\"$unit($unit) reißt einen Teil von $building($building) ein.\"" + +msgid "nr_stat_morale" +msgstr "\"peasant morale: $int($morale)\"" + +msgid "nr_stat_morale" +msgstr "\"Moral der Bauern: $int($morale)\"" + +msgid "changemail_invalid" +msgstr "\"Address not changed, '$value' is an invalid email.\"" + +msgid "changemail_invalid" +msgstr "\"Die Reportadresse wurde nicht geändert, '${value}' ist keine gültige email.\"" + +msgid "block_spell" +msgstr "\"In $region($region), anti-magic from $unit($self) blocks the spell of $unit($mage).\"" + +msgid "block_spell" +msgstr "\"Antimagie von $unit.dative($self) blockiert in $region($region) einen Zauber von $unit.dative($mage).\"" + +msgid "enter_overload" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot go aboard, the ship would be overloaded.\"" + +msgid "enter_overload" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen, da sie das Schiff überladen würde.\"" + +msgid "herbfound" +msgstr "\"$unit($unit) in $region($region) finds $int($amount) $resource($herb,$amount).\"" + +msgid "herbfound" +msgstr "\"$unit($unit) in $region($region) findet $int($amount) $resource($herb,$amount).\"" + +msgid "maintenance" +msgstr "\"$unit($unit) pays the maintenance for $building($building).\"" + +msgid "maintenance" +msgstr "\"$unit($unit) bezahlt den Unterhalt von $building($building).\"" + +msgid "heroes_cost" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has $int($have) of $int($cost) silver required.\"" + +msgid "heroes_cost" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nur $int($have) von $int($cost) benötigtem Silber.\"" + +msgid "error36" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this item.\"" + +msgid "error36" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand nicht.\"" + +msgid "error58" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know how to entertain.\"" + +msgid "error58" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nicht, wie man gaukelt.\"" + +msgid "magiccreate_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) creates $int($amount) ${object}.\"" + +msgid "magiccreate_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) erschafft $int($amount) ${object}.\"" + +msgid "error25" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevents this from happening.\"" + +msgid "error25" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Fluch verhindert das.\"" + +msgid "error47" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our allies.\"" + +msgid "error47" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit uns alliiert.\"" + +msgid "error69" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region is guarded.\"" + +msgid "error69" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird bewacht.\"" + +msgid "overrun_by_iceberg" +msgstr "\"The $ship($ship) has been damaged by a collision with an iceberg.\"" + +msgid "overrun_by_iceberg" +msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg beschädigt.\"" + +msgid "song_of_peace_effect_1" +msgstr "\"A wondrous song fills the air and enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" + +msgid "song_of_peace_effect_1" +msgstr "\"In der Luft liegt ein wunderschönes Lied, dessen friedfertiger Stimmung sich niemand entziehen kann. Einige Leute werfen sogar ihre Waffen weg.\"" + +msgid "error99" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not want to be transported.\"" + +msgid "error99" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit will nicht transportiert werden.\"" + +msgid "disrupt_astral" +msgstr "\"$unit($unit) is sent from the astral plain to $region($region).\"" + +msgid "disrupt_astral" +msgstr "\"$unit($unit) wird aus der astralen Ebene nach $region($region) geschleudert.\"" + +msgid "curseinfo::badmagicresistancezone" +msgstr "\"The magical resistance of some units in this region was weakened. ($int36($id))\"" + +msgid "curseinfo::badmagicresistancezone" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde geschwächt. ($int36($id))\"" + +msgid "error288" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - How much shall we tear down?\"" + +msgid "error288" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wieviel sollen wir einreißen?\"" + +msgid "curseinfo::badlearn" +msgstr "\"People in this region suffer from insomnia. ($int36($id))\"" + +msgid "curseinfo::badlearn" +msgstr "\"Alle Leute in der Region haben Schlafstörungen. ($int36($id))\"" + +msgid "error_nopeasants" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no peasants in this region.\"" + +msgid "error_nopeasants" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Bauern.\"" + +msgid "spellregionresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region could not be charmed.\"" + +msgid "spellregionresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region konnte nicht verzaubert werden.\"" + +msgid "curseinfo::calmmonster" +msgstr "This enchantment appears to make the unit well-disposed towards a particular faction. ($int36($id))" + +msgid "curseinfo::calmmonster" +msgstr "Dieser Beeinflussungszauber scheint die Einheit einem ganz bestimmten Volk wohlgesonnen zu machen. ($int36($id))" + +msgid "error169" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know this spell.\"" + +msgid "error169" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Zauber kennt die Einheit nicht.\"" + +msgid "error174" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only makes sense in combat.\"" + +msgid "error174" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber ist nur im Kampf sinnvoll.\"" + +msgid "error284" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Undead can only be affected once by this spell.\"" + +msgid "error284" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein.\"" + +msgid "growtree_effect" +msgstr "$if($isnull($mage),\"An unknown magician\",$unit($mage)) created a holy forest of $int($amount) young trees." + +msgid "growtree_effect" +msgstr "$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen." + +msgid "error280" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muss erst die Spezialeigenschaft erworben werden.\"" + +msgid "curseinfo::shipnodrift_0" +msgstr "\"A silvery shimmer surrounds the $ship($ship). ($int36($id))\"" + +msgid "curseinfo::shipnodrift_0" +msgstr "\"Ein silberner Schimmer umgibt die $ship($ship). ($int36($id))\"" + +msgid "error170" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasants did not accept this gracious gift.\"" + +msgid "error170" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern nehmen dieses großzügige Geschenk nicht an.\"" + +msgid "dumbeffect" +msgstr "\"$unit($unit) eats a duncebuns and forgets $int($weeks) weeks worth of $skill($skill).\"" + +msgid "dumbeffect" +msgstr "\"$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill).\"" + +msgid "renamed_ship_seen" +msgstr "\"$ship($ship) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_ship_seen" +msgstr "\"Die $ship($ship) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "error126" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sell this.\"" + +msgid "error126" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht verkaufen.\"" + +msgid "error236" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not finished yet.\"" + +msgid "error236" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist noch nicht fertig gebaut.\"" + +msgid "error_unit_size" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units may not have more than $int($maxsize) members.\"" + +msgid "error_unit_size" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten dürfen nicht mehr als $int($maxsize) Personen enthalten.\"" + +msgid "error232" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This type of unit cannot enter a building.\"" + +msgid "error232" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Gebäude betreten.\"" + +msgid "error122" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can only breed horses in a stable.\"" + +msgid "error122" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde kann man nur in einer Pferdezucht züchten.\"" + +msgid "error307" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We snotlings is too stupid fer dat!\"" + +msgid "error307" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Snotlinge sind zu dumm, um auf den Feldern zu arbeiten.\"" + +msgid "godcurse_destroy_ship" +msgstr "\"Her sailors sick from the poisened ocean, planks, rudder und sails corroded by the waters of the cursed ocean, the $ship($ship) finally succumbs to her destiny and sinks.\"" + +msgid "godcurse_destroy_ship" +msgstr "\"Die Mannschaft krank vom vergifteten Wasser, Planken, Ruder und Segel zerfressen von den Wassern des verfluchten Meeres, ergibt sich die $ship($ship) in ihr Schicksal und sinkt.\"" + +msgid "too_many_units_in_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A faction may not consist of more than $int($allowed) units.\"" + +msgid "too_many_units_in_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei darf nicht aus mehr als $int($allowed) Einheiten bestehen.\"" + +msgid "entermaelstrom" +msgstr "\"The $ship($ship) sails into the maelstrom of $region($region) and takes $int($damage) damage$if($sink,\". The ship sinks\",\"\").\"" + +msgid "entermaelstrom" +msgstr "\"Die $ship($ship) fährt in den Mahlstrom von $region($region) und nimmt $int($damage) Schaden$if($sink,\" und sinkt\",\"\").\"" + +msgid "error303" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No trade is possible in this region.\"" + +msgid "error303" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region kann man nichts verkaufen.\"" + +msgid "patzer3" +msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), a sudden disturbance ripples through the magical realm and a terrible force attempts to drag the magician to another dimension. However, with a final effort of strength, $unit($unit) manages to save himself.\"" + +msgid "patzer3" +msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern, scheint plötzlich ein Beben durch die magische Essenz zu laufen und ein furchtbarer Sog versucht $unit($unit) in eine andere Dimension zu ziehen. Mit letzter Kraft gelingt es $unit($unit) sich zu retten.\"" + +msgid "heat_effect" +msgstr "\"$unit($mage) puts protection from cold on $unit($target).\"" + +msgid "heat_effect" +msgstr "\"$unit($mage) belegt $unit($target) mit einem Kälteschutz.\"" + +msgid "gbdream_noteach" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is an active spell in this region that prevents this.\"" + +msgid "gbdream_noteach" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Zauber in dieser Region verhindert das.\"" + +msgid "path_effect" +msgstr "\"$unit($mage) creates dry and well-repaired roads in $region($region).\"" + +msgid "path_effect" +msgstr "\"$unit($mage) sorgt für trockene Straßen in $region($region).\"" + +msgid "summonshadow_effect" +msgstr "\"$unit($mage) summons $int($number) demons from the realm of shadows.\"" + +msgid "summonshadow_effect" +msgstr "\"$unit($mage) beschwört $int($number) Dämonen aus dem Reich der Schatten.\"" + +msgid "error8" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That is useless.\"" + +msgid "error8" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist sinnlos.\"" + +msgid "eathorse" +msgstr "\"$unit($unit) ate $int($amount) horses.\"" + +msgid "eathorse" +msgstr "\"$unit($unit) verspeiste $int($amount) Pferde.\"" + +msgid "confusion_result" +msgstr "\"$unit($mage) summons a fog of confusion.\"" + +msgid "confusion_result" +msgstr "\"$unit($mage) beschwört einen Schleier der Verwirrung.\"" + +msgid "resource_missing" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires $resource($missing,0).\"" + +msgid "resource_missing" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu benötigt man $resource($missing,0).\"" + +msgid "give_person_peasants" +msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to the local peasants.\"" + +msgid "give_person_peasants" +msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an die Bauern.\"" + +msgid "curseinfo::magicwalls" +msgstr "\"These walls appear to have grown straight out of the earth. ($int36($id))\"" + +msgid "curseinfo::magicwalls" +msgstr "\"Diese Mauern wirken, als wären sie direkt aus der Erde gewachsen und nicht erbaut. ($int36($id))\"" + +msgid "sp_clone_effect" +msgstr "\"$unit($mage) creates a clone.\"" + +msgid "sp_clone_effect" +msgstr "\"$unit($mage) erschafft einen Klon.\"" + +msgid "enemy_discovers_spy_msg" +msgstr "\"$unit($unit) was spotted sinking $ship($ship).\"" + +msgid "enemy_discovers_spy_msg" +msgstr "\"$unit($unit) wurde beim versenken von $ship($ship) entdeckt.\"" + +msgid "curseinfo::nocostbuilding" +msgstr "\"Time cannot touch these walls. ($int36($id))\"" + +msgid "curseinfo::nocostbuilding" +msgstr "\"Der Zahn der Zeit kann diesen Mauern nichts anhaben. ($int36($id))\"" + +msgid "income_fishing" +msgstr "\"In $region($region), $unit($unit) catches fish worth $int($amount) silver.\"" + +msgid "income_fishing" +msgstr "\"$unit($unit) fängt in $region($region) Fische im Wert von $int($amount) Silber.\"" + +msgid "analyse_unit_noage" +msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_unit_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "buildingcrash" +msgstr "\"$building($building) in $region($region) collapses.$if($road,\" The collapse ruined half of the road.\",\"\")$if($opfer,\" There are $int($opfer) casualties.\",\"\")\"" + +msgid "buildingcrash" +msgstr "\"In $region($region) stürzte $building($building) ein.$if($road,\" Beim Einsturz wurde die halbe Straße vernichtet.\",\"\")$if($opfer,\" $int($opfer) Opfer $if($eq($opfer,1),\"ist\",\"sind\") zu beklagen.\",\"\")\"" + +msgid "alliance::kickattempt" +msgstr "\"$int($votes) members of $alliance($alliance) tried to kick you out of the alliance.\"" + +msgid "alliance::kickattempt" +msgstr "\"$int($votes) Mitglieder von $alliance($alliance) haben versucht, Deine Partei aus der Allianz auszuschliessen.\"" + +msgid "becomewyrm" +msgstr "\"$unit($mage) turns into a wyrm.\"" + +msgid "becomewyrm" +msgstr "\"$unit($mage) verwandelt sich in einen Wyrm.\"" + +msgid "casualties" +msgstr "\"$unit($unit) lost $int($fallen) people$if($alive,\", $int($alive) survived\",\"\")$if($run,\" and $int($run) fled$if($isnull($runto),\"\",\" to $region($runto)\")\",\"\").\"" + +msgid "casualties" +msgstr "\"$unit($unit) verlor $int($fallen) Personen$if($alive,\", $int($alive) überlebten\",\"\")$if($run,\" und $int($run) flohen$if($isnull($runto),\"\",\" nach $region($runto)\")\",\"\").\"" + +msgid "lineup_battle" +msgstr "\"Units before turn $int($turn):\"" + +msgid "lineup_battle" +msgstr "\"Einheiten vor der $int($turn). Runde:\"" + +msgid "feedback_give_forbidden" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot give anything to this unit.\"" + +msgid "feedback_give_forbidden" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Einheit kann nichts gegeben werden.\"" + +msgid "babbler_effect" +msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told everyone the story of his entire life.\"" + +msgid "babbler_effect" +msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl die ganze Taverne mit seiner Lebensgeschichte unterhalten zu haben.\"" + +msgid "babbler_resist" +msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told $unit($mage) the story of his entire life.\"" + +msgid "babbler_resist" +msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl $unit($mage) seine ganze Lebensgeschichte erzählt zu haben.\"" + +msgid "tidalwave_kill" +msgstr "\"A tidal wave wipes out $region($region) and kills $unit($unit).\"" + +msgid "tidalwave_kill" +msgstr "\"Eine gewaltige Flutwelle verschlingt $unit($unit) in $region($region).\"" + +msgid "error14" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is off shore.\"" + +msgid "error14" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist auf hoher See.\"" + +msgid "renamed_notseen" +msgstr "\"$unit($renamed) in $region($region) received a nickname.\"" + +msgid "renamed_notseen" +msgstr "\"$unit($renamed) in $region($region) bekommt einen Spitznamen.\"" + +msgid "curseinfo::goodmagicresistancezone" +msgstr "\"The magical resistance of some units in this region was boosted. ($int36($id))\"" + +msgid "curseinfo::goodmagicresistancezone" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde gestärkt. ($int36($id))\"" + +msgid "error66" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction could not be found.\"" + +msgid "error66" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei wurde nicht gefunden.\"" + +msgid "error88" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is lacking materials for building the ship.\"" + +msgid "error88" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genügend Materialien für den Schiffbau.\"" + +msgid "error55" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot move.\"" + +msgid "error55" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht fortbewegen.\"" + +msgid "error77" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The skill could not be recognized.\"" + +msgid "error77" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent wurde nicht erkannt.\"" + +msgid "error178" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No magic sphere was supplied.\"" + +msgid "error178" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Magiegebiet angegeben.\"" + +msgid "error297" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings on the ocean may not be entered.\"" + +msgid "error297" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude auf dem Ozean können nicht betreten werden.\"" + +msgid "generous_effect_1" +msgstr "\"A touring minstrel entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" + +msgid "generous_effect_1" +msgstr "\"Die Darbietungen eines fahrenden Gauklers begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" + +msgid "unit_unarmed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "unit_unarmed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "error293" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Verbände können nur zwischen Einheiten derselben Partei gebildet werden.\"" + +msgid "error183" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" + +msgid "error183" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" + +msgid "error_nograves" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no graves in $region($target).\"" + +msgid "error_nograves" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In $region($target) sind keine Gräber.\"" + +msgid "error139" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Different types do not mix.\"" + +msgid "error139" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unterschiedliche Typen können nicht gemischt werden.\"" + +msgid "error249" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot sail into the open seas.\"" + +msgid "error249" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann nicht aufs offene Meer hinaus segeln.\"" + +msgid "killedbygm" +msgstr "\"$unit($unit) in $region($region) was removed by a GM: \\\"$string\\\".\"" + +msgid "killedbygm" +msgstr "\"$unit($unit) wurde in $region($region) von einem GM gelöscht: \\\"$string\\\".\"" + +msgid "spellfail_distance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That region is too far away.\"" + +msgid "spellfail_distance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region ist zu weit entfernt.\"" + +msgid "error245" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already named.\"" + +msgid "error245" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat schon einen Namen.\"" + +msgid "sp_chaosrow_effect_0" +msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub, but order is restored quickly.\"" + +msgid "sp_chaosrow_effect_0" +msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" + +msgid "error135" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown option.\"" + +msgid "error135" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Option.\"" + +msgid "error131" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a tunnel before building roads through glaciers.\"" + +msgid "error131" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden.\"" + +msgid "error241" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction must be at least 81 weeks old to restart with a new race.\"" + +msgid "error241" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 81 Wochen alt sein, um einen Neustart mit einer anderen Rasse zu versuchen.\"" + +msgid "feedback_unit_not_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit could not be found.\"" + +msgid "feedback_unit_not_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wurde nicht gefunden.\"" + +msgid "error206" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is alrady a spell on that building.\"" + +msgid "error206" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Gebäude liegt bereits so ein Zauber.\"" + +msgid "error316" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Without ingredients an alchemist can not produce anything.\"" + +msgid "error316" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne Zutaten kann ein Alchemist nichts herstellen.\"" + +msgid "error312" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes may not be mixed with normal people.\"" + +msgid "error312" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht mit anderen Personen gemischt werden.\"" + +msgid "mallorn_effect" +msgstr "\"The power of $unit($mage) flows into the ground and the trees which survived the spell appear much stronger now.\"" + +msgid "mallorn_effect" +msgstr "\"$unit($mage) läßt einen Teil seiner selbst in die Erde fliessen. Die Bäume, die Transformation überlebt haben, erscheinen nun viel kräftiger.\"" + +msgid "useflamingsword" +msgstr "\"$int($amount) fighters of $unit($unit) are using their flaming sword.\"" + +msgid "useflamingsword" +msgstr "\"$int($amount) Krieger von $unit($unit) benutzen ihre Flammenschwerter.\"" + +msgid "error202" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a valid race.\"" + +msgid "error202" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine gültige Rasse.\"" + +msgid "curseinfo::magicrunes_building" +msgstr "\"The walls of $building($building) are inscribed with strange runes. ($int36($id))\"" + +msgid "curseinfo::magicrunes_building" +msgstr "\"Auf den Mauern von $building($building) erkennt man seltsame Runen. ($int36($id))\"" + +msgid "analyse_unit_fail" +msgstr "\"It appears to $unit($mage) that $unit($unit) is charmed, but no details have been revealed.\"" + +msgid "analyse_unit_fail" +msgstr "\"$unit($mage) meint, dass $unit($unit) verzaubert ist, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "spellunitresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) resists the spell.\"" + +msgid "spellunitresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) widersteht dem Zauber.\"" + +msgid "give_peasants" +msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants.\"" + +msgid "give_peasants" +msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern.\"" + +msgid "leftship" +msgstr "\"$unit($unit) has just landed and cannot continue moving to $region($region).\"" + +msgid "leftship" +msgstr "\"$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen.\"" + +msgid "astral_appear" +msgstr "\"$unit($unit) appears.\"" + +msgid "astral_appear" +msgstr "\"$unit($unit) erscheint plötzlich.\"" + +msgid "magicresistance_effect" +msgstr "\"$unit($unit) is briefly surrounded by a magical light.\"" + +msgid "magicresistance_effect" +msgstr "\"$unit($unit) wird kurz von einem magischen Licht umhüllt.\"" + +msgid "siege" +msgstr "\"$building($building) is under siege by $unit($unit).\"" + +msgid "siege" +msgstr "\"$unit($unit) belagert $building($building).\"" + +msgid "missing_force" +msgstr "\"$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level).\"" + +msgid "missing_force" +msgstr "\"$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern.\"" + +msgid "shipdestroy_partial" +msgstr "\"$unit($unit) in $region($region) damages the $ship($ship).\"" + +msgid "shipdestroy_partial" +msgstr "\"$unit($unit) in $region($region) beschädigt die $ship($ship).\"" + +msgid "forget" +msgstr "\"$unit($unit) forgets $skill($skill).\"" + +msgid "forget" +msgstr "\"$unit($unit) vergisst $skill($skill).\"" + +msgid "spell_astral_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell can only be cast on the astral plane.\"" + +msgid "spell_astral_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur im Astralraum gezaubert werden.\"" + +msgid "sp_movecastle_fail_0" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental is too small to carry the building.\"" + +msgid "sp_movecastle_fail_0" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen.\"" + +msgid "summonundead_effect_1" +msgstr "\"$unit($mage) calls $int($amount) undead from their graves in $region($region).\"" + +msgid "summonundead_effect_1" +msgstr "\"$unit($mage) erweckt in $region($region) $int($amount) Untote aus ihren Gräbern.\"" + +msgid "drown" +msgstr "\"$unit($unit) drowns in $region($region).\"" + +msgid "drown" +msgstr "\"$unit($unit) ertrinkt in $region($region).\"" + +msgid "travel" +msgstr "\"$unit($unit) $if($eq($mode,1),\"rides\", \"walks\") from $region($start) to $region($end)$if($isnull($regions),\"\",\" by way of $trail($regions)\").\"" + +msgid "travel" +msgstr "\"$unit($unit) $if($eq($mode,1),\"reitet\", \"wandert\") von $region($start) nach $region($end).$if($isnull($regions),\"\",\" Dabei wurde $trail($regions) durchquert.\")\"" + +msgid "curseinfo::skill_1" +msgstr "\"$unit($unit) is incredibly skilled at $skill($skill). ($int36($id))\"" + +msgid "curseinfo::skill_1" +msgstr "\"$unit($unit) ist ungewöhnlich geschickt in $skill($skill). ($int36($id))\"" + +msgid "error11" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is still off shore.\"" + +msgid "error11" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff befindet sich auf hoher See.\"" + +msgid "error33" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in our castle.\"" + +msgid "error33" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht in unserer Burg.\"" + +msgid "error22" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown command.\"" + +msgid "error22" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl wurde nicht erkannt.\"" + +msgid "error44" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is off shore.\"" + +msgid "error44" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf hoher See.\"" + +msgid "spydetect" +msgstr "\"$unit($target) feels watched$if($isnull($spy),\"\",\" by $unit($spy)\").\"" + +msgid "spydetect" +msgstr "\"$unit($target) fühlt sich $if($isnull($spy),\"\",\"durch $unit($spy) \")beobachtet.\"" + +msgid "income_trade" +msgstr "\"$unit($unit) earned $int($amount) silver in $region($region) by selling luxury items.\"" + +msgid "income_trade" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch den Verkauf von Luxusgütern.\"" + +msgid "error74" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot give anybody away.\"" + +msgid "error74" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kann niemanden weggeben.\"" + +msgid "error96" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody in this unit can be transferred.\"" + +msgid "error96" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Einheit gibt es niemanden, den man transferieren könnte.\"" + +msgid "error187" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has moved.\"" + +msgid "error187" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie sich bewegt hat.\"" + +msgid "error85" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No email address was supplied.\"" + +msgid "error85" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde keine Emailadresse angegeben.\"" + +msgid "starvation" +msgstr "\"$unit($unit) loses $int($dead) of $int($add($live,$dead)) people due to starvation in $region($region).\"" + +msgid "starvation" +msgstr "\"$unit($unit) verliert in $region($region) $int($dead) von $int($add($live,$dead)) Personen durch Unterernährung.\"" + +msgid "error258" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The target unit is invalid.\"" + +msgid "error258" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zieleinheit ist ungültig.\"" + +msgid "curseinfo::fogtrap" +msgstr "\"Heavy fog makes it impossible to leave the region. ($int36($id))\"" + +msgid "curseinfo::fogtrap" +msgstr "\"Dichte Nebel bedecken diese Woche die Region. Keine Einheit schafft es, diese Nebel zu durchdringen und die Region zu verlassen. ($int36($id))\"" + +msgid "error148" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of a castle.\"" + +msgid "error148" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Burgherr.\"" + +msgid "poison_damage" +msgstr "\"$unit($unit) is taking poison damage in $region($region).\"" + +msgid "poison_damage" +msgstr "\"$unit($unit) nimmt Schaden durch den Giftelementar in $region($region).\"" + +msgid "error144" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board a ship.\"" + +msgid "error144" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf keinem Schiff.\"" + +msgid "magicboost_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The Spheres of Chaos return a part of his power to the magician.\"" + +msgid "magicboost_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Sphären des Chaos geben dem Magier einen Teil ihrer Kraft.\"" + +msgid "error254" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid aura specification or not enough aura.\"" + +msgid "error254" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft oder zuwenig Aura.\"" + +msgid "error250" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not enough karma.\"" + +msgid "error250" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht genug Karma.\"" + +msgid "error140" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is neither in a castle nor on board a ship.\"" + +msgid "error140" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich weder in einer Burg noch auf einem Schiff.\"" + +msgid "error215" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot reach the astral plane from here.\"" + +msgid "error215" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Von hier aus kann man die astrale Ebene nicht erreichen.\"" + +msgid "destroy_ship_4" +msgstr "\"$ship($ship) wurde zerstört.\"" + +msgid "destroy_ship_4" +msgstr "\"$ship($ship) was destroyed.\"" + +msgid "error211" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already under this spell.\"" + +msgid "error211" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff liegt bereits so ein Zauber.\"" + +msgid "forestfire_effect" +msgstr "\"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall victim to the flames.\"" + +msgid "forestfire_effect" +msgstr "\"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer.\"" + +msgid "error101" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can construct a building.\"" + +msgid "error101" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann ein Gebäude errichten.\"" + +msgid "orcgrowth" +msgstr "\"$unit($unit) breeds $int($amount) new $race($race,$amount).\"" + +msgid "orcgrowth" +msgstr "\"$unit($unit) vermehrt sich um $int($amount) $race($race,$amount).\"" + +msgid "sp_wolfhowl_effect" +msgstr "\"$unit($mage) calls for the help of $int($amount) $race($race, $amount).\"" + +msgid "sp_wolfhowl_effect" +msgstr "\"$unit($mage) ruft $int($amount) $race($race, $amount) zu Hilfe.\"" + +msgid "tidalwave" +msgstr "\"A tidal wave wipes out $region($region) and all who lived there.\"" + +msgid "tidalwave" +msgstr "\"Eine gewaltige Flutwelle verschlingt $region($region) und alle Bewohner.\"" + +msgid "cast_hero_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their moral boosted.\"" + +msgid "cast_hero_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden moralisch gestärkt.\"" + +msgid "detectforbidden" +msgstr "\"$unit($unit) refuses to travel to $region($region).\"" + +msgid "detectforbidden" +msgstr "\"$unit($unit) weigert sich, nach $region($region) zu reisen.\"" + +msgid "parse_error" +msgstr "\"$unit($unit): '$command' - Parse error, unknown command.\"" + +msgid "parse_error" +msgstr "\"$unit($unit): '$command' - Dieser Befehl ist unbekannt.\"" + +msgid "fogblock" +msgstr "\"$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense.\"" + +msgid "fogblock" +msgstr "\"$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht.\"" + +msgid "curseinfo::antimagiczone" +msgstr "\"Dieser Zauber scheint magische Energien irgendwie abzuleiten und so alle in der Region gezauberten Sprüche in ihrer Wirkung zu schwächen oder ganz zu verhindern. ($int36($id))\"" + +msgid "curseinfo::antimagiczone" +msgstr "\"A spell is deflecting magical energies and weakening all other spells cast in the region. ($int36($id))\"" + +msgid "nr_market_sale" +msgstr "\"The local market offers $resource($product,0) at a price of $int($price) silver.\"" + +msgid "nr_market_sale" +msgstr "\"Auf dem Markt wird für $resource($product,0) $int($price) Silber verlangt.\"" + +msgid "stealfail" +msgstr "\"$unit($unit) could not sneak close enough to $unit($target).\"" + +msgid "stealfail" +msgstr "\"$unit($unit) gelang es nicht, sich nahe genug an $unit($target) heranzuschleichen.\"" + +msgid "section_battle" +msgstr "\"\"" + +msgid "section_battle" +msgstr "\"\"" + +msgid "sp_disturbingdreams_effect" +msgstr "\"$unit($mage) disturbs everyone's dreams in $region($region).\"" + +msgid "sp_disturbingdreams_effect" +msgstr "\"$unit($mage) sorgt für schlechten Schlaf in $region($region).\"" + +msgid "spy_discovered_msg" +msgstr "\"$unit($unit) caught $unit($saboteur) trying to sink $ship($ship).\"" + +msgid "spy_discovered_msg" +msgstr "\"$unit($unit) entdeckte $unit($saboteur) beim Versenken von $ship($ship).\"" + +msgid "wrongpasswd" +msgstr "\"Your orders had the wrong password (${password}).\"" + +msgid "wrongpasswd" +msgstr "\"Deine Befehle hatten ein falsches Passwort (${password}).\"" + +msgid "curseinfo::sparkle_9" +msgstr "\"A large green snake offers $unit($unit) a fine-looking apple. ($int36($id))\"" + +msgid "curseinfo::sparkle_9" +msgstr "\"$unit($unit) bekommt von einer Schlange einen Apfel angeboten. ($int36($id))\"" + +msgid "birthday_firework_noname" +msgstr "\"A large firework, visible all over the sky, has been started in $region($region).\"" + +msgid "birthday_firework_noname" +msgstr "\"In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "skill_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires the skill $skill($skill).\"" + +msgid "skill_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu braucht man das Talent $skill($skill).\"" + +msgid "renamed_seen" +msgstr "\"$unit($renamed) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_seen" +msgstr "\"$unit($renamed) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "analyse_unit_nospell" +msgstr "\"It appears to $unit($mage) that $unit($target) is not charmed.\"" + +msgid "analyse_unit_nospell" +msgstr "\"$unit($mage) meint, dass auf $unit($target) kein Zauber liegt.\"" + +msgid "army_report" +msgstr "\"Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors.\"" + +msgid "army_report" +msgstr "\"Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende.\"" + +msgid "receive_person" +msgstr "\"$unit($target) receives $int($amount) person$if($eq($amount,1),\"\",\"s\") from $unit($unit).\"" + +msgid "receive_person" +msgstr "\"$unit($target) erhält $int($amount) Person$if($eq($amount,1),\"\",\"en\") von $unit($unit).\"" + +msgid "donation" +msgstr "\"$faction($from) donates $int($amount) silver to $faction($to).\"" + +msgid "donation" +msgstr "\"$faction($from) gibt ein Almosen von $int($amount) Silber an $faction($to).\"" + +msgid "scunicorn" +msgstr "\"$int($amount) $resource($rtype,$amount) $if($eq($amount,1),\"joins\",\"join\") $unit($unit).\"" + +msgid "scunicorn" +msgstr "\"$unit($unit) $if($eq($amount,1),\"schließt\",\"schließen\") sich $int($amount) $resource($rtype,$amount) an.\"" + +msgid "try_astral" +msgstr "\"$unit($unit) tried but failed to send $unit($target) to another world.\"" + +msgid "try_astral" +msgstr "\"$unit($unit) versuchte erfolglos, $unit($target) in eine andere Welt zu schleudern.\"" + +msgid "error196" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a forest region.\"" + +msgid "error196" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine Waldregion.\"" + +msgid "objmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on ${target}.\"" + +msgid "objmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) verzaubert ${target}.\"" + +msgid "puttorest" +msgstr "\"$unit($mage) redeems the tormented souls of the dead.\"" + +msgid "puttorest" +msgstr "\"$unit($mage) erlöst die gequälten Seelen der Toten.\"" + +msgid "error41" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" + +msgid "error41" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" + +msgid "error30" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The message does not contain text.\"" + +msgid "error30" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Botschaft enthält keinen Text.\"" + +msgid "error52" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute more long orders.\"" + +msgid "error52" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren langen Befehle ausführen.\"" + +msgid "recruit_effect" +msgstr "\"$unit($mage) managed to recruit $int($amount) $if($eq($amount,1),\"peasant\",\"peasants\").\"" + +msgid "recruit_effect" +msgstr "\"$unit($mage) konnte $int($amount) $if($eq($amount,1),\"Bauer\",\"Bauern\") anwerben.\"" + +msgid "spell_failed" +msgstr "\"$unit($unit) tries to cast $spell($spell), but the spell fails!\"" + +msgid "spell_failed" +msgstr "\"$unit($unit) versucht $spell($spell) zu zaubern, doch der Zauber schlägt fehl!\"" + +msgid "error157" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has a different magic sphere.\"" + +msgid "error157" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat ein anderes Magiegebiet.\"" + +msgid "auratransfer_success" +msgstr "\"$unit($unit) transfers $int($aura) aura to $unit($target).\"" + +msgid "auratransfer_success" +msgstr "\"$unit($unit) transferiert $int($aura) Aura auf $unit($target).\"" + +msgid "error267" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only a single person can use the ticket.\"" + +msgid "error267" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur eine Einzelperson kann das Ticket benutzen.\"" + +msgid "error263" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This good is not produced here.\"" + +msgid "error263" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut wird hier produziert.\"" + +msgid "error153" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit joins the local peasants.\"" + +msgid "error153" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit schließt sich den Bauern an.\"" + +msgid "error_onlandonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be on land.\"" + +msgid "error_onlandonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit muß sich an Land befinden.\"" + +msgid "error_herorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Heroes cannot recruit.\"" + +msgid "error_herorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Helden können nicht rekrutieren.\"" + +msgid "error109" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if a castle, a ship, a region, or a unit is supposed to be named.\"" + +msgid "error109" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Einheit, eine Region oder eine Partei benannt werden soll.\"" + +msgid "msg_event" +msgstr "\"$string\"" + +msgid "msg_event" +msgstr "\"$string\"" + +msgid "error224" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot cast spells.\"" + +msgid "error224" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht zaubern.\"" + +msgid "piratesawvictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") in $region($region) made $direction($dir) a target.\"" + +msgid "piratesawvictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) entdeckt ein Opfer im $direction($dir).\"" + +msgid "spyreport_items" +msgstr "\"$unit($target) carries $resources($items)\"" + +msgid "spyreport_items" +msgstr "\"Im Gepäck von $unit($target) sind $resources($items).\"" + +msgid "curseinfo::shipnodrift_1" +msgstr "\"The $ship($ship) is blessed with favourable winds$if($lt($duration,3),\", but the spell is starting to wear thin\",\"\"). ($int36($id))\"" + +msgid "curseinfo::shipnodrift_1" +msgstr "\"Die $ship($ship) ist mit gutem Wind gesegnet$if($lt($duration,3),\", doch der Zauber beginnt sich bereits aufzulösen\",\"\"). ($int36($id))\"" + +msgid "error105" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Empty units can not be handed over.\"" + +msgid "error105" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Leere Einheiten können nicht übergeben werden.\"" + +msgid "curseinfo::sparkle_7" +msgstr "\"The women of the nearby village cast furtive looks at $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_7" +msgstr "\"Die Frauen des nahegelegenen Dorfes bewundern $unit($unit) verstohlen. ($int36($id))\"" + +msgid "error110" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if description is for a castle, a ship, a region, or a unit.\"" + +msgid "error110" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Region oder eine Einheit beschrieben werden soll.\"" + +msgid "curseinfo::sparkle_18" +msgstr "\"The stench of decay is poring from all the orifices of $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_18" +msgstr "\"Fäulnisgeruch dringt $unit($unit) aus allen Körperöffnungen. ($int36($id))\"" + +msgid "error_captain_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The captain needs a sailing skill of at least $int($value), to command $ship($ship).\"" + +msgid "error_captain_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Kapitän muß ein Segeltalent von mindestens $int($value) haben, um $ship($ship) zu befehligen.\"" + +msgid "error220" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No one could be seen in the astral fog.\"" + +msgid "error220" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Im astralen Nebel konnte niemand entdeckt werden.\"" + +msgid "arena_enter" +msgstr "\"A portal opens in $region($region). A voice calls: 'Welcome to the Plane of Challenge'. $unit($unit) walks through the gate to another world.\"" + +msgid "arena_enter" +msgstr "\"In $region($region) öffnet sich ein Portal. Eine Stimme ertönt, und spricht: 'Willkommen in der Ebene der Herausforderung'. $unit($unit) durchschreitet das Tor zu einer anderen Welt.\"" + +msgid "stealfatal" +msgstr "\"$unit($unit) was caught by $unit($target) in attempted theft.\"" + +msgid "stealfatal" +msgstr "\"$unit($unit) wurde von $unit.dative($target) beim versuchten Diebstahl ertappt.\"" + +msgid "analyse_unit_age" +msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)' that will last for about $int($months) more weeks.\"" + +msgid "analyse_unit_age" +msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "sp_permtransfer_effect" +msgstr "\"$unit($mage) sacrifices $int($amount) aura for $unit($target).\"" + +msgid "sp_permtransfer_effect" +msgstr "\"$unit($mage) opfert $unit($target) $int($amount) Aura.\"" + +msgid "shipfly" +msgstr "\"The $ship($ship) flies from $region($from) to $region($to).\"" + +msgid "shipfly" +msgstr "\"Die $ship($ship) fliegt von $region($from) nach $region($to).\"" + +msgid "curseinfo::unit_unknown" +msgstr "\"An unknown spell lies on this unit. ($int36($id))\"" + +msgid "curseinfo::unit_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf der Einheit. ($int36($id))\"" + +msgid "force_leave_ship" +msgstr "$unit($owner) asks $unit($unit) to leave $ship($ship)." + +msgid "force_leave_ship" +msgstr "$unit($owner) bittet $unit($unit), $ship($ship) zu verlassen." + +msgid "dissolve_units_1" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) returned to the fields.\"" + +msgid "dissolve_units_1" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"kehrte auf seine\", \"kehrten auf ihre\") Felder zurück.\"" + +msgid "hornofpeace_r_nosuccess" +msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing, but nobody here gets into the mood.\"" + +msgid "hornofpeace_r_nosuccess" +msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes, doch niemand hier lässt sich von Stimmung anstecken.\"" + +msgid "malnourish" +msgstr "\"$unit($unit) is weakened due to malnourishment.\"" + +msgid "malnourish" +msgstr "\"$unit($unit) in $region($region) wird durch unzureichende Nahrung geschwächt.\"" + +msgid "iceberg_land" +msgstr "\"The iceberg $region($region) drifts onto a coast.\"" + +msgid "iceberg_land" +msgstr "\"Der Eisberg $region($region) treibt an eine Küste.\"" + +msgid "produce_lowskill" +msgstr "\"$unit($unit) in $region($region) is not proficient enough to produce $resource($resource,0).\"" + +msgid "produce_lowskill" +msgstr "\"$unit($unit) in $region($region) hat ein zu niedriges Talent, um $resource($resource,0) abzubauen.\"" + +msgid "income_steal_reduced" +msgstr "\"$unit($unit) steals only $int($amount) silver instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") in $region($region).\"" + +msgid "income_steal_reduced" +msgstr "\"$unit($unit) klaut in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" + +msgid "error_cannotmake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot produce this.\"" + +msgid "error_cannotmake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht machen.\"" + +msgid "meow" +msgstr "\"Meeoooooow...\"" + +msgid "meow" +msgstr "\"Miiauuuuuu...\"" + +msgid "spelltargetnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell could not find a target.\"" + +msgid "spelltargetnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Ziel gefunden.\"" + +msgid "curseinfo::fumble" +msgstr "\"$unit($unit) can hardly focus on anything. ($int36($id))\"" + +msgid "curseinfo::fumble" +msgstr "\"$unit($unit) kann sich kaum konzentrieren. ($int36($id))\"" + +msgid "curseinfo::sparkle_14" +msgstr "\"The head of $unit($unit) has turned into a madly grinning skull. ($int36($id))\"" + +msgid "curseinfo::sparkle_14" +msgstr "\"Der Kopf von $unit($unit) hat sich in einen grinsenden Totenschädel verwandelt. ($int36($id))\"" + +msgid "reanimate_effect_1" +msgstr "\"$unit($mage) begins a ritual of resurrection augmented by a $resource($item,1). $int($amount) warriors rise from the dead.\"" + +msgid "reanimate_effect_1" +msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Krieger stehen von den Toten auf.\"" + +msgid "analyse_building_nospell" +msgstr "\"It appears to $unit($mage) that $building($building) is not charmed.\"" + +msgid "analyse_building_nospell" +msgstr "\"$unit($mage) meint, dass auf $building($building) kein Zauber liegt.\"" + +msgid "magicresistance_building" +msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" + +msgid "magicresistance_building" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" + +msgid "race_notake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) will not accept anything.\"" + +msgid "race_notake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) nehmen nichts an.\"" + +msgid "cast_drainlife_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their life energy drained.\"" + +msgid "cast_drainlife_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurde ihre Lebenskraft entzogen.\"" + +msgid "headache_effect_0" +msgstr "\"$unit($mage) invites $unit($unit) for a few too many drinks and a massive hangover.\"" + +msgid "headache_effect_0" +msgstr "\"$unit($mage) verschafft $unit($unit) einige feuchtfröhliche Stunden mit heftigen Nachwirkungen.\"" + +msgid "unholypower_limitedeffect" +msgstr "\"$unit($mage) transforms $int($amount) from $unit($target) into $race($race,0).\"" + +msgid "unholypower_limitedeffect" +msgstr "\"$unit($mage) verwandelt $int($amount) aus $unit($target) in $race($race,0).\"" + +msgid "income_work_reduced" +msgstr "\"$unit($unit) works in $region($region) for a wage of $int($amount) $if($eq($wanted,$amount),\"\",\" out of $int($wanted)\") silver.\"" + +msgid "income_work_reduced" +msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" + +msgid "maintenancespecialfail" +msgstr "\"$unit($unit) lacks $resource($item,0) to operate $building($building).\"" + +msgid "maintenancespecialfail" +msgstr "\"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building).\"" + +msgid "healing_effect_1" +msgstr "\"$unit($mage) sees after the wounded and heals $int($amount). A $resource($item,1) improves the spell.\"" + +msgid "healing_effect_1" +msgstr "\"$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Verwundete werden geheilt.\"" + +msgid "error276" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here.\"" + +msgid "error276" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen.\"" + +msgid "error166" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle.\"" + +msgid "error166" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern.\"" + +msgid "chaosgate_effect_2" +msgstr "\"A vortex of blinding light appears.\"" + +msgid "chaosgate_effect_2" +msgstr "\"Ein Wirbel aus blendendem Licht erscheint.\"" + +msgid "birthday_firework_local" +msgstr "\"A large firework in honor of ${name} is visible all over the sky.\"" + +msgid "birthday_firework_local" +msgstr "\"Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "hornofpeace_u_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) regions have been pacified.\"" + +msgid "hornofpeace_u_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) Regionen wurden befriedet.\"" + +msgid "error71" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The given direction was not recognized.\"" + +msgid "error71" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung wurde nicht erkannt.\"" + +msgid "error93" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a port in this region.\"" + +msgid "error93" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es schon einen Hafen.\"" + +msgid "no_attack_after_advance" +msgstr "\"'$order($command)' - $unit($unit) marched into $region($region) during the last turn and is too exhausted to attack.\"" + +msgid "no_attack_after_advance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist noch zu erschöpft vom Einmarsch um zu attackieren.\"" + +msgid "error82" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number.\"" + +msgid "error82" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer.\"" + +msgid "error60" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is under siege.\"" + +msgid "error60" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert.\"" + +msgid "error162" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed.\"" + +msgid "error162" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt.\"" + +msgid "error272" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Horses are not allowed inside.\"" + +msgid "error272" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde müssen leider draußen bleiben.\"" + +msgid "warn_dropout" +msgstr "\"Warning: $faction($faction) has not been sending in orders for $int($turns) turns and may be leaving the game soon.\"" + +msgid "warn_dropout" +msgstr "\"Achtung: $faction($faction) hat seit $int($turns) Wochen keine Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel ausscheiden.\"" + +msgid "arena_leave_fail" +msgstr "\"The attempt to use wings of the gryphon failed. $unit($unit) could not leave the Plane of Challenge.\"" + +msgid "arena_leave_fail" +msgstr "\"Der Versuch, die Greifenschwingen zu benutzen, schlug fehl. $unit($unit) konnte die Ebene der Herausforderung nicht verlassen.\"" + +msgid "battle_critical" +msgstr "\"$int36($unit.id($unit))/$int($index) does critical damage.\"" + +msgid "battle_critical" +msgstr "\"$int36($unit.id($unit))/$int($index) erzielt einen kritischen Treffer.\"" + +msgid "error_spell_on_ship_already" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a spell on $ship($ship).\"" + +msgid "error_spell_on_ship_already" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf $ship($ship) liegt beeits ein Zauber.\"" + +msgid "error228" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only normal characters can collect taxes.\"" + +msgid "error228" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur normale Personen können Steuern eintreiben.\"" + +msgid "birthday_firework_noname_local" +msgstr "\"A large firework is visible all over the sky.\"" + +msgid "birthday_firework_noname_local" +msgstr "\"$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "error118" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot produce that.\"" + +msgid "error118" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann die Einheit nicht herstellen.\"" + +msgid "curseinfo::sparkle_10" +msgstr "\"A unicorn touches $unit($unit) with its horn and vanishes into the forest quickly after. ($int36($id))\"" + +msgid "curseinfo::sparkle_10" +msgstr "\"Ein Einhorn berührt $unit($unit) mit seinem Horn und verschwindet kurz darauf im Unterholz. ($int36($id))\"" + +msgid "error114" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is not valid.\"" + +msgid "error114" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist nicht im gültigen Bereich.\"" + +msgid "error233" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Swimmers cannot enter ships.\"" + +msgid "error233" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Schiffe betreten.\"" + +msgid "iceberg_create" +msgstr "\"The glacier in $region($region) breaks up and drifts away.\"" + +msgid "iceberg_create" +msgstr "\"Der Gletscher von $region($region) bricht und treibt davon.\"" + +msgid "chaos_disease" +msgstr "\"$unit($unit) is stricken by a strange disease.\"" + +msgid "chaos_disease" +msgstr "\"$unit($unit) scheint von einer seltsamen Krankheit befallen.\"" + +msgid "error1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are not enough experienced sailors on board the ship.\"" + +msgid "error1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.\"" + +msgid "sp_icastle_effect" +msgstr "\"Flabbergasted, the peasants of $region($region) behold a new building.\"" + +msgid "sp_icastle_effect" +msgstr "\"Verwundert blicken die Bauern von $region($region) auf ein neues Gebäude.\"" + +msgid "curseinfo::godcurse" +msgstr "\"This region was cursed by the gods. Stinking vapors billow over the dead ground and hideous creatures move about the country. The wells are poisened and the edible plants are covered by a pink fungus. Noone can live here for long. ($int36($id))\"" + +msgid "curseinfo::godcurse" +msgstr "\"Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen über die tote Erde und furchtbare Kreaturen ziehen über das Land. Die Brunnen sind vergiftet, und die wenigen essbaren Früchte sind von einem rosa Pilz überzogen. Niemand kann hier lange überleben. ($int36($id))\"" + +msgid "recruit_archetype" +msgstr "\"$unit($unit) recruits $int($amount) $localize($archetype).\"" + +msgid "recruit_archetype" +msgstr "\"$unit($unit) rekrutiert $int($amount) $localize($archetype).\"" + +msgid "tactics_won" +msgstr "\"$unit($unit) surprises the enemies.\"" + +msgid "tactics_won" +msgstr "\"$unit($unit) überrascht den Gegner.\"" + +msgid "raindance_effect" +msgstr "\"$if($isnull($mage),\"an unseen magician\",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields.\"" + +msgid "raindance_effect" +msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen.\"" + +msgid "mistake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" + +msgid "mistake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" + +msgid "income_tax" +msgstr "\"$unit($unit) collects taxes of $int($amount) silver in $region($region).\"" + +msgid "income_tax" +msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount) Silber ein.\"" + +msgid "give_person_ocean" +msgstr "\"$unit($unit) drowns $int($amount).\"" + +msgid "give_person_ocean" +msgstr "\"$unit($unit) ertränkt $int($amount) Person$if($eq($amount,1),\"\",\"en\").\"" + +msgid "error_no_tax_skill" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not now how to tax.\"" + +msgid "error_no_tax_skill" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht geschult im Eintreiben von Steuern.\"" + +msgid "sparkle_effect" +msgstr "\"$unit($mage) puts a spell on $unit($target).\"" + +msgid "sparkle_effect" +msgstr "\"$unit($mage) belegt $unit($target) mit einem Zauber.\"" + +msgid "error18" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is too heavily loaded to sail.\"" + +msgid "error18" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist zu schwer beladen, um in See zu stechen.\"" + +msgid "sp_raisepeasants_effect" +msgstr "\"$unit($mage) incites a revolt among $int($amount) peasants of $region($region).\"" + +msgid "sp_raisepeasants_effect" +msgstr "\"$unit($mage) wiegelt in $region($region) $int($amount) Bauern zum Aufstand auf.\"" + +msgid "pump_effect" +msgstr "\"$unit($mage) questions $unit($unit) about $region($tregion).\"" + +msgid "pump_effect" +msgstr "\"$unit($mage) horcht $unit($unit) über $region($tregion) aus.\"" + +msgid "curseinfo::sparkle_5" +msgstr "\"A haunting melody fills the air, and $unit($unit) dances until late into the night. ($int36($id))\"" + +msgid "curseinfo::sparkle_5" +msgstr "\"Eine Melodie erklingt, und $unit($unit) tanzt bis spät in die Nacht hinein. ($int36($id))\"" + +msgid "dragon_growl" +msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"I smell\", \"We smell\") something in $region($target)\\\".\"" + +msgid "dragon_growl" +msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"Ich rieche\", \"Wir riechen\") etwas in $region($target)\\\".\"" + +msgid "produce" +msgstr "\"$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") $resource($resource,$amount).\"" + +msgid "produce" +msgstr "\"$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),\"\",\" von $int($wanted)\") $resource($resource,$wanted).\"" + +msgid "income_work" +msgstr "\"In $region($region), $unit($unit) works for a wage of $int($amount) silver.\"" + +msgid "income_work" +msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount) Silber.\"" + +msgid "nr_stat_people" +msgstr "\"people: $int($max)\"" + +msgid "nr_stat_people" +msgstr "\"Personen: $int($max)\"" + +msgid "destroy_curse_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell is not strong enough to destroy the curse ($id) on ${target}.\"" + +msgid "destroy_curse_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber ist nicht stark genug, um den Fluch ($id) auf ${target} zu zerstören.\"" + +msgid "detectocean" +msgstr "\"$unit($unit) discovered that $region($region) is $localize($terrain).\"" + +msgid "detectocean" +msgstr "\"$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist.\"" + +msgid "spell_resist" +msgstr "\"$unit($unit) manages to cast $spell($spell), but the spell seems to have no effect.\"" + +msgid "spell_resist" +msgstr "\"$unit($unit) gelingt es $spell($spell) zu zaubern, doch der Spruch zeigt keine Wirkung.\"" + +msgid "shipdestroy" +msgstr "\"$unit($unit) sunk $ship($ship) in $region($region).\"" + +msgid "shipdestroy" +msgstr "\"$unit($unit) in $region($region) versenkt die $ship($ship).\"" + +msgid "destroy_ship_3" +msgstr "\"Es wurde versucht, $ship($ship) zu zerstören.\"" + +msgid "destroy_ship_3" +msgstr "\"Somebody attempted to destroy $ship($ship).\"" + +msgid "error289" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What should we disguise as?\"" + +msgid "error289" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wie sollen wir uns tarnen?\"" + +msgid "spellbuildingnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be located.\"" + +msgid "spellbuildingnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) wurde nicht gefunden.\"" + +msgid "error179" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this magic sphere.\"" + +msgid "error179" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Magiegebiet kann die Einheit nicht lernen.\"" + +msgid "sp_migranten" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) has become one of our kind.\"" + +msgid "sp_migranten" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wird von uns aufgenommen.\"" + +msgid "error175" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell while standing on a moving ship.\"" + +msgid "error175" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht auf einem sich bewegenden Schiff stehend zaubern.\"" + +msgid "error285" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit knows no recipes for potions.\"" + +msgid "error285" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kennt keine Trankrezepte.\"" + +msgid "dissolve_units_4" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned to dust.\"" + +msgid "dissolve_units_4" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"zerfiel\", \"zerfielen\") zu Staub.\"" + +msgid "error281" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What race did you want the jihad to be against?\"" + +msgid "error281" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen welche Rasse soll der Jihad ausgerufen werden?\"" + +msgid "error171" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This combat spell does not exist.\"" + +msgid "error171" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Kampfzauber gibt es nicht.\"" + +msgid "astral_disappear" +msgstr "\"$unit($unit) disappears.\"" + +msgid "astral_disappear" +msgstr "\"$unit($unit) wird durchscheinend und verschwindet.\"" + +msgid "error127" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction cannot hire so many strangers.\"" + +msgid "error127" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann Deine Partei nicht aufnehmen.\"" + +msgid "drought_effect_2" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds.\"" + +msgid "drought_effect_2" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt.\"" + +msgid "usepotion" +msgstr "\"$unit($unit) uses $resource($potion,1).\"" + +msgid "usepotion" +msgstr "\"$unit($unit) benutzt $resource($potion,1).\"" + +msgid "error237" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are riots in this region.\"" + +msgid "error237" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region befindet sich in Aufruhr.\"" + +msgid "error90" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have travel with us.\"" + +msgid "error90" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit fährt nicht mit uns.\"" + +msgid "orcified" +msgstr "\"People in $region($region) flee because of too many orcs.\"" + +msgid "orcified" +msgstr "\"Vor den vielen Orks in $region($region) fliehen die anderen Einwohner.\"" + +msgid "plant_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - At least $skill($skill) $int($minskill) is needed for planting $resource($product,0).\"" + +msgid "plant_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu pflanzen.\"" + +msgid "renamed_ship_notseen" +msgstr "\"$ship($ship) in $region($region) received a nickname.\"" + +msgid "renamed_ship_notseen" +msgstr "\"Die $ship($ship) in $region($region) bekommt einen Spitznamen.\"" + +msgid "error123" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have such a thing.\"" + +msgid "error123" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas hat die Einheit nicht.\"" + +msgid "error308" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This skill cannot be raised any higher.\"" + +msgid "error308" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann nicht höher gelernt werden.\"" + +msgid "spyreport_faction" +msgstr "\"$unit($target) belongs to $faction($faction).\"" + +msgid "spyreport_faction" +msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\"" + +msgid "ship_drift" +msgstr "\"The ship $ship($ship) drifts to the $direction($dir).\"" + +msgid "ship_drift" +msgstr "\"Die $ship($ship) treibt nach $direction($dir).\"" + +msgid "error_max_magicians" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more than $int($amount) magicians in your faction.\"" + +msgid "error_max_magicians" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Magier pro Partei geben.\"" + +msgid "error304" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units of a faction that can't be attacked may not guard.\"" + +msgid "error304" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen.\"" + +msgid "error300" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid synonym.\"" + +msgid "error300" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Synonym.\"" + +msgid "error4" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already completed.\"" + +msgid "error4" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist bereits fertig.\"" + +msgid "curseinfo::magicstreetwarn" +msgstr "\"The roads are extremely dry and well-kept, but some areas show the first signs of potholes reappearing. ($int36($id))\"" + +msgid "curseinfo::magicstreetwarn" +msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar, doch an manchen Stellen bilden sich wieder die erste Schlammlöcher. ($int36($id))\"" + +msgid "moveblocked" +msgstr "\"$unit($unit) discovers that there is no route going $direction($direction).\"" + +msgid "moveblocked" +msgstr "\"$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt.\"" + +msgid "nr_market_info_p" +msgstr "\"The local market offers $resource($p1,0) and $resource($p2,0).\"" + +msgid "nr_market_info_p" +msgstr "\"Auf dem Markt werden $resource($p1,0) und $resource($p2,0) feilgeboten.\"" + +msgid "stealeffect" +msgstr "\"In $region($region), thieves stole $int($amount) silver from $unit($unit).\"" + +msgid "stealeffect" +msgstr "\"$unit($unit) wurden in $region($region) $int($amount) Silberstücke geklaut.\"" + +msgid "curseinfo::calm_1" +msgstr "\"$unit($unit) likes $faction($faction). ($int36($id))\"" + +msgid "curseinfo::calm_1" +msgstr "\"$unit($unit) scheint $faction($faction) zu mögen. ($int36($id))\"" + +msgid "plant" +msgstr "\"$unit($unit) plants $int($amount) $resource($herb,$amount) in $region($region).\"" + +msgid "plant" +msgstr "\"$unit($unit) pflanzt in $region($region) $int($amount) $resource($herb,$amount).\"" + +msgid "nr_region_owner" +msgstr "\"The region is owned by $faction($faction).\"" + +msgid "nr_region_owner" +msgstr "\"Die Region ist im Besitz von $faction($faction).\"" + +msgid "analyse_region_nospell" +msgstr "\"It appears to $unit($mage) that $region($region) is not charmed.\"" + +msgid "analyse_region_nospell" +msgstr "\"$unit($mage) meint, dass auf $region($region) kein Zauber liegt.\"" + +msgid "one_circle_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has already chosen a magical school.\"" + +msgid "one_circle_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits ein Magiegebiet.\"" + +msgid "race_nosteal" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot steal anything.\"" + +msgid "race_nosteal" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts stehelen.\"" + +msgid "error26" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items to buy is missing.\"" + +msgid "error26" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu kaufender Produkte fehlt.\"" + +msgid "error48" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "error48" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "sailfail" +msgstr "\"The $ship($ship) could not leave $region($region).\"" + +msgid "sailfail" +msgstr "\"Die $ship($ship) konnte $region($region) nicht verlassen.\"" + +msgid "error15" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has not yet been completed.\"" + +msgid "error15" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist noch nicht fertig gebaut.\"" + +msgid "error37" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" + +msgid "error37" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Trank nicht.\"" + +msgid "error59" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know anything about herbalism.\"" + +msgid "error59" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nichts über Botanik.\"" + +msgid "ent_effect" +msgstr "\"$unit($mage) animates $int($amount) trees.\"" + +msgid "ent_effect" +msgstr "\"$unit($mage) belebt $int($amount) Bäume.\"" + +msgid "error89" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Money offer is missing.\"" + +msgid "error89" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Geldgebot fehlt.\"" + +msgid "nr_header_date" +msgstr "\"Report for $game, $date\"" + +msgid "nr_header_date" +msgstr "\"Report für $game, $date\"" + +msgid "error188" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a swamp.\"" + +msgid "error188" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht im Sumpf gezaubert werden.\"" + +msgid "error298" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a clone.\"" + +msgid "error298" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Klon.\"" + +msgid "fail_tooheavy" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is too heavy.\"" + +msgid "fail_tooheavy" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist zu schwer.\"" + +msgid "familiar_farcast" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions.\"" + +msgid "familiar_farcast" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten.\"" + +msgid "error184" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not move.\"" + +msgid "error184" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit bewegt sich nicht.\"" + +msgid "income_entertainment" +msgstr "\"$unit($unit) earns $int($amount) in $region($region) with entertainment.\"" + +msgid "income_entertainment" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Unterhaltung.\"" + +msgid "error180" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell fails.\"" + +msgid "error180" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber schlägt fehl.\"" + +msgid "sp_shapeshift_fail" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) cannot take the form of $race($race,1).\"" + +msgid "sp_shapeshift_fail" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) kann nicht $race($race,1) werden.\"" + +msgid "error290" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Einheit kann nur in einem Verband Mitglied sein.\"" + +msgid "cast_rally_effect" +msgstr "\"$unit($mage) quells the uprising in $region($region).\"" + +msgid "cast_rally_effect" +msgstr "\"$unit($mage) besänftigt den Bauernaufstand in $region($region).\"" + +msgid "error246" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already named.\"" + +msgid "error246" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude hat schon einen Namen.\"" + +msgid "stealaura_fail" +msgstr "\"$unit($unit) could not draw aura from $unit($target).\"" + +msgid "stealaura_fail" +msgstr "\"$unit($unit) konnte $unit($target) keine Aura entziehen.\"" + +msgid "nmr_warning" +msgstr "No orders were received for your faction!" + +msgid "nmr_warning" +msgstr "Deine Partei hat letzte Runde keinen Zug abgegeben!" + +msgid "destroy" +msgstr "\"$unit($unit) destroys $building($building).\"" + +msgid "destroy" +msgstr "\"$unit($unit) zerstört $building($building).\"" + +msgid "volcanooutbreaknn" +msgstr "\"The volcano in $region($region) erupts.\"" + +msgid "volcanooutbreaknn" +msgstr "\"Der Vulkan in $region($region) bricht aus.\"" + +msgid "error132" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a dam before building roads through swamps.\"" + +msgid "error132" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Sümpfen Straßen bauen zu können, muß zuerst ein Damm errichtet werden.\"" + +msgid "error251" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot improve this power.\"" + +msgid "error251" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen.\"" + +msgid "error207" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer aura to this unit.\"" + +msgid "error207" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu dieser Einheit kann keine Aura übertragen werden.\"" + +msgid "error317" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object is indestructible.\"" + +msgid "error317" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Objekt ist unzerstörbar.\"" + +msgid "error_different_magic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) does not understand our kind of magic.\"" + +msgid "error_different_magic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) versteht unsere Art von Magie nicht.\"" + +msgid "curseinfo::sparkle_3" +msgstr "\"$unit($unit) is surrounded by a shower of glittering sparkles. ($int36($id))\"" + +msgid "curseinfo::sparkle_3" +msgstr "\"$unit($unit) wird von einem glitzernden Funkenregen umgeben. ($int36($id))\"" + +msgid "error313" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes don't work.\"" + +msgid "error313" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht arbeiten.\"" + +msgid "mail_result" +msgstr "\"A message from $unit($unit): '$message'\"" + +msgid "mail_result" +msgstr "\"Eine Botschaft von $unit($unit): '$message'\"" + +msgid "error203" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No target has been supplied.\"" + +msgid "error203" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Ziel wurde vergessen.\"" + +msgid "cast_storm_effect" +msgstr "\"$unit($mage) casts $spell($spell): Strong stormwinds are blowing and the archers are having a hard time aiming.\"" + +msgid "cast_storm_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): Ein Sturm kommt auf und die Schützen können kaum noch zielen.\"" + +msgid "patzer4" +msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), strong winds suddenly rise. Bizarre ghostlike creatures circle around the magician and seem to be leeching magical energy. However, with a final effort of strength, $unit($unit) manages to complete the spell.\"" + +msgid "patzer4" +msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern erhebt sich plötzlich ein dunkler Wind. Bizarre geisterhafte Gestalten kreisen um den Magier und scheinen sich von den magischen Energien des Zaubers zu ernähren. Mit letzter Kraft gelingt es $unit($unit) dennoch den Spruch zu zaubern.\"" + +msgid "curseinfo::magicrunes_ship" +msgstr "\"The plank of $ship($ship) are inscribed with strange runes. ($int36($id))\"" + +msgid "curseinfo::magicrunes_ship" +msgstr "\"Auf den Planken von $ship($ship) erkennt man seltsame Runen. ($int36($id))\"" + +msgid "santa_f" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." + +msgid "santa_f" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei eine $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." + +msgid "cast_spell_effect" +msgstr "\"$unit($mage) casts $spell($spell).\"" + +msgid "cast_spell_effect" +msgstr "\"$unit($mage) zaubert $spell($spell).\"" + +msgid "curseinfo::disorientationzone" +msgstr "\"A veil of confusion lies over the region. ($int36($id))\"" + +msgid "curseinfo::disorientationzone" +msgstr "\"Ein Schleier der Verwirrung liegt über der Region. ($int36($id))\"" + +msgid "calm_effect" +msgstr "\"$unit($mage) calms $unit($unit).\"" + +msgid "calm_effect" +msgstr "\"$unit($mage) besänftigt $unit($unit).\"" + +msgid "error7" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is no longer possible.\"" + +msgid "error7" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das geht nicht mehr.\"" + +msgid "summonundead_effect_2" +msgstr "\"$unit($mage) communicates with the dead in $region($region).\"" + +msgid "summonundead_effect_2" +msgstr "\"$unit($mage) stört in $region($region) die Ruhe der Toten.\"" + +msgid "generous_effect_0" +msgstr "\"$unit($mage) entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" + +msgid "generous_effect_0" +msgstr "\"Die Darbietungen von $unit($mage) begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" + +msgid "curseinfo::generous" +msgstr "\"Everyone in this region seems to be having a very good time. ($int36($id))\"" + +msgid "curseinfo::generous" +msgstr "\"Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))\"" + +msgid "buildroad" +msgstr "\"$unit($unit) extends the road network in $region($region) by $int($size).\"" + +msgid "buildroad" +msgstr "\"$unit($unit) erweitert in $region($region) das Straßennetz um $int($size).\"" + +msgid "nr_borderlist_postfix" +msgstr "\"$if($transparent,\" there is\",\" sight is blocked by \") ${object}.\"" + +msgid "nr_borderlist_postfix" +msgstr "\"$if($transparent,\" befindet sich\",\" versperrt\") ${object}$if($transparent,\"\",\" die Sicht\").\"" + +msgid "effectstrength" +msgstr "\"$unit($mage) increases the strength of $unit($target) dramatically.\"" + +msgid "effectstrength" +msgstr "\"$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich.\"" + +msgid "wormhole_appear" +msgstr "\"A wormhole appears in $region($region).\"" + +msgid "wormhole_appear" +msgstr "\"In $region($region) erscheint ein Wurmloch.\"" + +msgid "givecommand" +msgstr "\"$unit($unit) gave control to $unit($recipient).\"" + +msgid "givecommand" +msgstr "\"$unit($unit) gibt das Kommando an $unit($recipient).\"" + +msgid "sink_msg" +msgstr "\"$ship($ship) disappears in the depths of $region($region).\"" + +msgid "sink_msg" +msgstr "\"$ship($ship) versinkt in den Fluten von $region($region).\"" + +msgid "force_leave_building" +msgstr "$unit($owner) asks $unit($unit) to leave $building($building)." + +msgid "force_leave_building" +msgstr "$unit($owner) bittet $unit($unit), $building($building) zu verlassen." + +msgid "hero_promotion" +msgstr "\"$unit($unit) uses $int($cost) silber for a promotion.\"" + +msgid "hero_promotion" +msgstr "\"$unit($unit) wird mit $int($cost) Silber zum Helden ernannt.\"" + +msgid "renumber_inuse" +msgstr "\"NUMBER FACTION $int36($id): This number is being used by another faction.\"" + +msgid "renumber_inuse" +msgstr "\"NUMMER PARTEI $int36($id): Diese Nummer wird von einer anderen Partei benutzt.\"" + +msgid "firewall_death" +msgstr "\"$unit($unit) dies trying to cross the wall of fire into $region($region).\"" + +msgid "firewall_death" +msgstr "\"$unit($unit) stirbt beim Versuch, die Feuerwand nach $region($region) zu durchqueren.\"" + +msgid "skillpotion_use" +msgstr "\"$unit($unit) uses a potion of skills and feels his knowledge grow.\"" + +msgid "skillpotion_use" +msgstr "\"$unit($unit) benutzt einen Talenttrunk und fühlt, wie sein Wissen zunimmt.\"" + +msgid "drown_on_ship" +msgstr "\"$unit($unit) drowns when $ship($ship) in $region($region) sinks.\"" + +msgid "drown_on_ship" +msgstr "\"$unit($unit) ertrinkt beim Untergang der $ship($ship) in $region($region).\"" + +msgid "curseinfo::riotzone" +msgstr "\"A fog of negative energy enshrouds the region. ($int36($id))\"" + +msgid "curseinfo::riotzone" +msgstr "\"Eine Wolke negativer Energie liegt über der Region. ($int36($id))\"" + +msgid "send_astral" +msgstr "\"$unit($unit) sends $unit($target) to another world.\"" + +msgid "send_astral" +msgstr "\"$unit($target) wird von $unit($unit) in eine andere Welt geschleudert.\"" + +msgid "earthquake_effect" +msgstr "\"$unit($mage) makes the earth shake in $region($region).\"" + +msgid "earthquake_effect" +msgstr "\"$unit($mage) läßt die Erde in $region($region) erzittern.\"" + +msgid "error56" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot tame that many horses.\"" + +msgid "error56" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann soviele Pferde nicht bändigen.\"" + +msgid "error78" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevented the transfer from happening.\"" + +msgid "error78" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Fluch verhindert die Übergabe.\"" + +msgid "questportal_lock" +msgstr "\"$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" + +msgid "questportal_lock" +msgstr "\"$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" + +msgid "error45" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our own.\"" + +msgid "error45" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist eine der unsrigen.\"" + +msgid "error67" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The horses would drown.\"" + +msgid "error67" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Pferde würden ertrinken.\"" + +msgid "detectforbiddendir" +msgstr "\"$unit($unit) refuses to travel to the $direction($direction).\"" + +msgid "detectforbiddendir" +msgstr "\"$unit($unit) weigert sich, nach $direction($direction) zu reisen.\"" + +msgid "error197" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician has to be in a castle to create a homestone.\"" + +msgid "error197" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um einen Heimstein zu erschaffen, muß der Zauberer in einer Burg sein.\"" + +msgid "sp_flee_effect_1" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were consumed by fear.\"" + +msgid "sp_flee_effect_1" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden von Furcht gepackt.\"" + +msgid "overrun_by_iceberg_des" +msgstr "\"The $ship($ship) has been destroyed by a collision with an iceberg.\"" + +msgid "overrun_by_iceberg_des" +msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg zerstört.\"" + +msgid "curseinfo::region_unknown" +msgstr "\"An unknown spell lies on this region. ($int36($id))\"" + +msgid "curseinfo::region_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf der Region. ($int36($id))\"" + +msgid "nr_market_price" +msgstr "\"$resource($product,0) for $int($price) silver\"" + +msgid "nr_market_price" +msgstr "\"$resource($product,0) $int($price) Silber\"" + +msgid "error259" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That order only applies to units in the same building or ship.\"" + +msgid "error259" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl ist nur auf Einheiten innerhalb des selben Gebäudes oder Schiffes anwendbar.\"" + +msgid "building_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be in a $localize($building) to produce this.\"" + +msgid "building_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit steht nicht im benötigten Gebäude, $localize($building).\"" + +msgid "error149" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Who is supposed to get this message?\"" + +msgid "error149" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wohin soll die Botschaft gehen?\"" + +msgid "curseinfo::building_unknown" +msgstr "\"An unknown spell lies on this building. ($int36($id))\"" + +msgid "curseinfo::building_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf dem Gebäude. ($int36($id))\"" + +msgid "error145" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a castle.\"" + +msgid "error145" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Burg.\"" + +msgid "piratenovictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") could not capture other ships in $region($region).\"" + +msgid "piratenovictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) kann keine Schiffe aufbringen.\"" + +msgid "questportal_unlock" +msgstr "\"$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" + +msgid "questportal_unlock" +msgstr "\"$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" + +msgid "error255" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this.\"" + +msgid "error255" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern.\"" + +msgid "entrance_besieged" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege.\"" + +msgid "entrance_besieged" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert.\"" + +msgid "error260" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted.\"" + +msgid "error260" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden.\"" + +msgid "nr_market_info_s" +msgstr "\"The local market offers $resource($p1,0).\"" + +msgid "nr_market_info_s" +msgstr "\"Auf dem Markt wird $resource($p1,0) feilgeboten.\"" + +msgid "error141" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough crystals left for this many people.\"" + +msgid "error141" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht mehr genug Kristalle für so viele Personen.\"" + +msgid "error106" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - When studying, magicians need to be alone.\"" + +msgid "error106" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier müssen zum studieren allein sein.\"" + +msgid "race_no_attack" +msgstr "\"'$order($command)' - $race($race,0) are peace-loving and will not attack anyone.\"" + +msgid "race_no_attack" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) sind friedliebend und attackieren niemand.\"" + +msgid "error216" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" + +msgid "error216" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Verbindung zur astralen Welt.\"" + +msgid "error771" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this skill.\"" + +msgid "error771" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann die Einheit nicht lernen.\"" + +msgid "error212" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" + +msgid "error212" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" + +msgid "stormwinds_effect" +msgstr "\"$unit($unit) calls up a magical storm that whips the ship over the waters.\"" + +msgid "stormwinds_effect" +msgstr "\"$unit($unit) beschwört einen magischen Wind, der die Schiffe über das Wasser treibt.\"" + +msgid "error102" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade any more goods.\"" + +msgid "error102" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren Güter handeln.\"" + +msgid "sp_drought_effect" +msgstr "\"$unit($mage) puts a curse on the lands of $region($region) and a drought sets in.\"" + +msgid "sp_drought_effect" +msgstr "\"$unit($mage) verflucht das Land in $region($region), und eine Dürreperiode beginnt.\"" + +msgid "error_giveeye" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A higher power prevents $unit($unit) from giving the object away. 'IT IS YOURS MY CHILD. ONLY YOURS.'.\"" + +msgid "error_giveeye" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine höhere Macht hindert $unit($unit) daran, das Objekt zu übergeben. 'ES IST DEINS, MEIN KIND. DEINS GANZ ALLEIN'.\"" + +msgid "curseinfo::buildingunknown" +msgstr "\"A magical shimmer lies on these walls. ($int36($id))\"" + +msgid "curseinfo::buildingunknown" +msgstr "\"Ein magischer Schimmer liegt auf diesen Mauern. ($int36($id))\"" + +msgid "changebanner" +msgstr "\"Banner has been changed to '$value'.\"" + +msgid "changebanner" +msgstr "\"Das Banner wurde auf '$value' geändert.\"" + +msgid "curseinfo::skill_2" +msgstr "\"$unit($unit) has some troubles with $skill($skill). ($int36($id))\"" + +msgid "curseinfo::skill_2" +msgstr "\"$unit($unit) ist ungewöhnlich ungeschickt in $skill($skill). ($int36($id))\"" + +msgid "spellfail::noway" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" + +msgid "spellfail::noway" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" + +msgid "spellbuildingresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be charmed.\"" + +msgid "spellbuildingresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) konnte nicht verzaubert werden.\"" + +msgid "after_battle" +msgstr "\"Units after the battle:\"" + +msgid "after_battle" +msgstr "\"Einheiten nach dem Kampf:\"" + +msgid "nr_claims" +msgstr "\"Units can claim the following items: $resources($items)\"" + +msgid "nr_claims" +msgstr "\"Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)\"" + +msgid "destroy_ship_2" +msgstr "\"$unit($unit) wurde beim Versuch $ship($ship) zu zerstören entdeckt.\"" + +msgid "destroy_ship_2" +msgstr "\"$unit($unit) was detected while trying to destroy $ship($ship).\"" + +msgid "destroy_magic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys $int($succ) spells on ${target}.\"" + +msgid "destroy_magic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört $int($succ) Flüche auf ${target}.\"" + +msgid "battle_row" +msgstr "\"... in combat rank $int($row):\"" + +msgid "battle_row" +msgstr "\"... in der $int($row). Kampflinie:\"" + +msgid "renamed_faction_seen" +msgstr "\"Your faction received a nickname from $unit($unit) in $region($region).\"" + +msgid "renamed_faction_seen" +msgstr "\"Die Partei bekommt von $unit.dative($unit) in $region($region) einen Spitznamen.\"" + +msgid "error_not_on_undead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast upon undead.\"" + +msgid "error_not_on_undead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" + +msgid "iceberg_melt" +msgstr "\"The iceberg $region($region) melts.\"" + +msgid "iceberg_melt" +msgstr "\"Der Eisberg $region($region) schmilzt.\"" + +msgid "cast_berserk_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters went into a mindless rage.\"" + +msgid "cast_berserk_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in einen Blutrausch versetzt.\"" + +msgid "curseinfo::sparkle_1" +msgstr "\"In a dream, a fairy appears to $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_1" +msgstr "\"$unit($unit) ist im Traum eine Fee erschienen. ($int36($id))\"" + +msgid "rust_effect_0" +msgstr "\"$unit($mage) calls forth a terrible torment over the enemy side, but there was nobody who could be affected by it.\"" + +msgid "rust_effect_0" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte.\"" + +msgid "error1222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" + +msgid "error1222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" + +msgid "header_battle" +msgstr "\"There is a battle in $region($region).\"" + +msgid "header_battle" +msgstr "\"In $region($region) findet ein Kampf statt.\"" + +msgid "wormhole_dissolve" +msgstr "\"The wormhole in $region($region) disappears.\"" + +msgid "wormhole_dissolve" +msgstr "\"Das Wurmloch in $region($region) schließt sich.\"" + +msgid "error23" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege.\"" + +msgid "error23" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich.\"" + +msgid "error12" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is not ours.\"" + +msgid "error12" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht.\"" + +msgid "error34" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit has no permission to come on board.\"" + +msgid "error34" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen.\"" + +msgid "income_steal" +msgstr "\"$unit($unit) steals $int($amount) silver in $region($region).\"" + +msgid "income_steal" +msgstr "\"$unit($unit) klaut in $region($region) $int($amount) Silber.\"" + +msgid "itemcrumble" +msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) turn to dust.\"" + +msgid "itemcrumble" +msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) zerfallen zu Staub.\"" + +msgid "error86" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong password.\"" + +msgid "error86" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Falsches Passwort.\"" + +msgid "luxury_notsold" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - These goods are not on sale here.\"" + +msgid "luxury_notsold" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Luxusgut wird hier nicht verkauft.\"" + +msgid "error75" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit does not accept anybody.\"" + +msgid "error75" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit nimmt niemanden an.\"" + +msgid "error97" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insects cannot be recruited in glacier regions.\"" + +msgid "error97" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In Gletschern können keine Insekten rekrutiert werden.\"" + +msgid "regionmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on the region.\"" + +msgid "regionmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es die Region zu verzaubern.\"" + +msgid "error158" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magicians always work alone!\"" + +msgid "error158" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier arbeiten grundsätzlich nur alleine!\"" + +msgid "spyreport_mage" +msgstr "\"$unit($target) is a ${type}-magician\"" + +msgid "spyreport_mage" +msgstr "\"$unit($target) ist ein ${type}-Magier.\"" + +msgid "error268" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer items here.\"" + +msgid "error268" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nichts übergeben.\"" + +msgid "error264" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this good.\"" + +msgid "error264" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut hat die Einheit nicht.\"" + +msgid "battle_army" +msgstr "\"Army $int($index): $name\"" + +msgid "battle_army" +msgstr "\"Heer $int($index): $name\"" + +msgid "error154" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Highly qualified people refuse to work for other parties.\"" + +msgid "error154" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hochqualifizierte Personen weigern sich, für andere Parteien zu arbeiten.\"" + +msgid "error_notstonecircle" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is not a stone circle.\"" + +msgid "error_notstonecircle" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) ist kein Steinkreis.\"" + +msgid "error150" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building.\"" + +msgid "error150" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen.\"" + +msgid "error229" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A familiar is summoned, but it disappears again when it cannot get in contact with its natural element.\"" + +msgid "error229" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Vertrauter wird beschworen, verschwindet jedoch wieder, als er keine Verbindung zu seinem Element herstellen kann.\"" + +msgid "error_migrants_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migrants cannot study this.\"" + +msgid "error_migrants_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migranten können keine kostenpflichtigen Talente lernen.\"" + +msgid "error225" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units do not fight.\"" + +msgid "error225" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Soldaten kämpfen nicht.\"" + +msgid "error115" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is already in use.\"" + +msgid "error115" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist schon belegt.\"" + +msgid "spell_out_of_range" +msgstr "\"$unit($mage) casts $spell($spell), but nobody was in range.\"" + +msgid "spell_out_of_range" +msgstr "\"$unit($mage) zaubert $spell($spell), aber niemand war in Reichweite.\"" + +msgid "error111" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Message has been cut (too long).\"" + +msgid "error111" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nachricht zu lang - gekürzt.\"" + +msgid "error221" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build this here.\"" + +msgid "error221" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man hier nicht bauen.\"" + +msgid "error_race_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot study.\"" + +msgid "error_race_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts lernen.\"" + +msgid "buy" +msgstr "\"$unit($unit) pays $int($money) silver for luxury items.\"" + +msgid "buy" +msgstr "\"$unit($unit) bezahlt $int($money) Silber für den Kauf von Luxusgütern.\"" + +msgid "curseinfo::sparkle_15" +msgstr "\"Rats follow $unit($unit)'s every step. ($int36($id))\"" + +msgid "curseinfo::sparkle_15" +msgstr "\"Ratten folgen $unit($unit) auf Schritt und Tritt. ($int36($id))\"" + +msgid "arena_enter_fail" +msgstr "\"$region($region) reverberates from the voice of the gate keeper: 'Only those who forgo material riches and who are willing to learn my enter the Plane of Challenge. And don't forget about my tip!'. $unit($unit) was not admitted.\"" + +msgid "arena_enter_fail" +msgstr "\"In $region($region) erklingt die Stimme des Torwächters: 'Nur wer ohne materielle Güter und noch lernbegierig ist, der darf die Ebene der Herausforderung betreten. Und vergiß nicht mein Trinkgeld.'. $unit($unit) erhielt keinen Einlaß.\"" + +msgid "aurapotion50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated.\"" + +msgid "aurapotion50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt.\"" + +msgid "curseinfo::deathcloud" +msgstr "\"A poison elemental is spreading pestilence and death. ($int36($id))\"" + +msgid "curseinfo::deathcloud" +msgstr "\"In der Region treibt ein Giftelementar sein Unwesen. ($int36($id))\"" + +msgid "income" +msgstr "\"$unit($unit) earns $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") in $region($region) $if($eq($mode,1),\" by entertainment\",$if($eq($mode,2),\" by taxes\",$if($eq($mode,3),\" by trade\",$if($eq($mode,5),\" by stealing\",$if($eq($mode,6),\" by magic\",$if($eq($mode,7),\" by pillaging\",\"\")))))).\"" + +msgid "income" +msgstr "\"$unit($unit) verdient$if($eq($mode,4),\" am Handel\",\"\") in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber$if($eq($mode,1),\" durch Unterhaltung\",$if($eq($mode,2),\" durch Steuern\",$if($eq($mode,3),\" durch Handel\",$if($eq($mode,5),\" durch Diebstahl\",$if($eq($mode,6),\" durch Zauberei\",$if($eq($mode,7),\" durch Plündern\",\"\")))))).\"" + +msgid "researchherb" +msgstr "\"$unit($unit) discovers that $localize($amount) $resource($herb,0) grow in $region($region).\"" + +msgid "researchherb" +msgstr "\"$unit($unit) in $region($region) stellt fest, dass es hier $localize($amount) $resource($herb,0) gibt.\"" + +msgid "poison_death" +msgstr "\"$unit($unit) dies from poison damage taken in $region($region).\"" + +msgid "poison_death" +msgstr "\"$unit($unit) stirbt am Schaden durch den Giftelementar in $region($region).\"" + +msgid "error_notcomplete" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) has to be complete before it can be blessed.\"" + +msgid "error_notcomplete" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) muss vor der Weihe fertiggestellt sein.\"" + +msgid "regenaura" +msgstr "\"$unit($unit) regenerates $int($amount) aura in $region($region).\"" + +msgid "regenaura" +msgstr "\"$unit($unit) in $region($region) regeneriert $int($amount) Aura.\"" + +msgid "regionmagic_patzer" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) manages to put a spell on the region, but something went wrong nonetheless.\"" + +msgid "regionmagic_patzer" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es zwar die Region zu verzaubern, aber irgendwas ging schief.\"" + +msgid "curseinfo::sparkle_11" +msgstr "\"Bird songs follow $unit($unit) on all his travels. ($int36($id))\"" + +msgid "curseinfo::sparkle_11" +msgstr "\"Vogelzwitschern begleitet $unit($unit) auf all seinen Wegen. ($int36($id))\"" + +msgid "wdw_pyramidspell_notfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away.\"" + +msgid "wdw_pyramidspell_notfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region können keine Pyramiden gebaut werden. Die nächste Pyramidenregion ist zwischen $int($mindist) und $int($maxdist) Regionen entfernt.\"" + +msgid "sailforbidden" +msgstr "\"The crew of the $ship($ship) refuses to travel to $region($region).\"" + +msgid "sailforbidden" +msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen.\"" + +msgid "sp_raisepeasantmob_effect" +msgstr "\"$unit($mage) incites a revolt among the peasants of $region($region).\"" + +msgid "sp_raisepeasantmob_effect" +msgstr "\"$unit($mage) wiegelt in $region($region) die Bauern zum Aufstand auf.\"" + +msgid "error31" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The castle could not be found.\"" + +msgid "error31" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Burg wurde nicht gefunden.\"" + +msgid "error53" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot make potions.\"" + +msgid "error53" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine Tränke herstellen.\"" + +msgid "error20" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship could not be found.\"" + +msgid "error20" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff wurde nicht gefunden.\"" + +msgid "error42" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough coachmen or has too much freights to lad the wagons.\"" + +msgid "error42" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Wagenlenker oder zuviel andere Fracht, um die Wagen aufzuladen.\"" + +msgid "error64" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) is not sufficiently stealthy.\"" + +msgid "error64" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ist nicht ausreichend getarnt.\"" + +msgid "curseinfo::itemcloak" +msgstr "\"$unit($unit)'s equipment is invisible. ($int36($id))\"" + +msgid "curseinfo::itemcloak" +msgstr "\"Die Ausrüstung von $unit($unit) scheint unsichtbar. ($int36($id))\"" + +msgid "error277" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot do this.\"" + +msgid "error277" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann die Einheit nicht.\"" + +msgid "error94" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build a road here.\"" + +msgid "error94" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Straße bauen.\"" + +msgid "error167" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not go to the peasants.\"" + +msgid "error167" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit geht nicht zu den Bauern.\"" + +msgid "use_realworld_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object can only be used in the real world.\"" + +msgid "use_realworld_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand kann nur in der realen Welt benutzt werden.\"" + +msgid "error163" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This potion can only be used by insects.\"" + +msgid "error163" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Nestwärme kann nur von Insektenvölkern benutzt werden.\"" + +msgid "error273" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot teach here.\"" + +msgid "error273" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht unterrichten.\"" + +msgid "error238" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can recruit only orcs here.\"" + +msgid "error238" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier können nur Orks rekrutiert werden.\"" + +msgid "spellfail::nocontact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $region($target) could not be contacted.\"" + +msgid "spellfail::nocontact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu $region($target) kann kein Kontakt hergestellt werden.\"" + +msgid "error119" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no marketplace without at least a tradepost.\"" + +msgid "error119" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne einen Handelsposten gibt es keinen Markt.\"" + +msgid "error124" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot buy that on a market place.\"" + +msgid "error124" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht auf dem Markt kaufen.\"" + +msgid "santa_m" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." + +msgid "santa_m" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei einen $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." + +msgid "error234" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is busy disembarking.\"" + +msgid "error234" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit Ausschiffen beschäftigt..\"" + +msgid "spellfail::nolevel" +msgstr "\"$unit($mage) in $region($region): '$order($command)' - This spell cannot be cast with variable level.\"" + +msgid "spellfail::nolevel" +msgstr "\"$unit($mage) in $region($region): '$order($command)' - Dieser Zauber kann nicht mit Stufenangabe gezaubert werden.\"" + +msgid "nr_score" +msgstr "\"Your faction has a score of ${score}. The average score for similar factions is ${average}.\"" + +msgid "nr_score" +msgstr "\"Deine Partei hat ${score} Punkte. Der Durchschnitt für Parteien ähnlichen Alters ist ${average} Punkte.\"" + +msgid "curseinfo::ship_unknown" +msgstr "\"An unknown spell lies on this ship. ($int36($id))\"" + +msgid "curseinfo::ship_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf dem Schiff. ($int36($id))\"" + +msgid "alliance::kickedout" +msgstr "\"$faction($member) was kicked from $alliance($alliance) by $int($votes) of the alliance's members.\"" + +msgid "alliance::kickedout" +msgstr "\"$faction($member) ist mit $int($votes) Stimmen aus $alliance($alliance) ausgeschlossen worden.\"" + +msgid "error230" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot transport us to this place.\"" + +msgid "error230" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin kann die Einheit uns nicht transportieren.\"" + +msgid "error120" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Characters can be given only to human parties.\"" + +msgid "error120" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Personen können nur an Menschen übergeben werden.\"" + +msgid "error_max_alchemists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more tha $int($amount) alchemists in your faction.\"" + +msgid "error_max_alchemists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Alchemisten pro Partei geben.\"" + +msgid "error305" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Options ZIP and BZIP2 can only be switched, not turned off.\"" + +msgid "error305" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Optionen ZIP und BZIP2 können nur um-, nicht ausgeschaltet werden.\"" + +msgid "error301" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym missing.\"" + +msgid "error301" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Kein Synonym angegeben.\"" + +msgid "iceberg_drift" +msgstr "\"The iceberg $region($region) drifts $direction($dir).\"" + +msgid "iceberg_drift" +msgstr "\"Der Eisberg $region($region) treibt nach $direction($dir).\"" + +msgid "hornofpeace_r_success" +msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing. Peaceful harmony spreads over the region.\"" + +msgid "hornofpeace_r_success" +msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes. In der ganzen Region breitet sich eine friedliche Feststimmmung aus.\"" + +msgid "nr_vicinitystart" +msgstr "\"To the $direction($dir) lies $trailto($region)\"" + +msgid "nr_vicinitystart" +msgstr "\"Im $direction($dir) der Region liegt $trailto($region)\"" + +msgid "giverestriction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction must be at least $int($turns) weeks old to give something to another faction.\"" + +msgid "giverestriction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Deine Partei muss mindestens $int($turns) alt sein, um etwas an andere Parteien übergeben zu können.\"" + +msgid "curseinfo::depression" +msgstr "\"The peasants are upset. ($int36($id))\"" + +msgid "curseinfo::depression" +msgstr "\"Die Bauern sind unzufrieden. ($int36($id))\"" + +msgid "patzer" +msgstr "\"$unit($unit) fumbles while casting $spell($spell) in $region($region).\"" + +msgid "patzer" +msgstr "\"$unit($unit) unterläuft in $region($region) beim Zaubern von $spell($spell) ein Patzer.\"" + +msgid "potionsave" +msgstr "\"A fighter of $unit($unit) was saved by a healing potion.\"" + +msgid "potionsave" +msgstr "\"Eine Person von $unit($unit) konnte durch einen Heiltrank überleben.\"" + +msgid "storm" +msgstr "\"The $ship($ship) in $region($region) gets off course in heavy storm$if($sink,\" and sinks\",\"\").\"" + +msgid "storm" +msgstr "\"Die $ship($ship) wird in $region($region) von Stürmen abgetrieben$if($sink,\" und sinkt\",\"\").\"" + +msgid "nr_insectwinter" +msgstr "It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions." + +msgid "nr_insectwinter" +msgstr "Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren." + +msgid "spellfail_nomonsters" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on monsters.\"" + +msgid "spellfail_nomonsters" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Monster gezaubert werden.\"" + +msgid "bagpipeoffear_region" +msgstr "\"$unit($unit) plays the bagpipe. Stricken with fear the peasants give $int($money) silver.\"" + +msgid "bagpipeoffear_region" +msgstr "\"$unit($unit) spielt einen Dudelsack. Ausser sich vor Furcht geben die Bauern $int($money) Silber.\"" + +msgid "sp_chaosrow_effect_1" +msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub and the battle order is disturbed.\"" + +msgid "sp_chaosrow_effect_1" +msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" + +msgid "use_item" +msgstr "\"$unit($unit) uses $int($amount) $resource($item,$amount).\"" + +msgid "use_item" +msgstr "\"$unit($unit) benutzt $int($amount) $resource($item,$amount).\"" + +msgid "sp_movecastle_effect" +msgstr "\"An tremor shakes $building($building). Many little pseudopods lift up the building and carry it to $direction($direction).\"" + +msgid "sp_movecastle_effect" +msgstr "\"Ein Beben erschüttert $building($building). Viele kleine Pseudopodien erheben das Gebäude und tragen es in Richtung $direction($direction).\"" + +msgid "feedback_no_contact_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, and resists the spell.\"" + +msgid "feedback_no_contact_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen und widersteht dem Zauber.\"" + +msgid "error176" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell on a distant target.\"" + +msgid "error176" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht in die Ferne richten.\"" + +msgid "error286" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not transporting us.\"" + +msgid "error286" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit transportiert uns nicht.\"" + +msgid "error83" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No peasant could be caught.\"" + +msgid "error83" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnte kein Bauer gefangen werden.\"" + +msgid "error50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not experienced enough to do this.\"" + +msgid "error50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht erfahren genug dafür.\"" + +msgid "error282" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot start a jihad against this race.\"" + +msgid "error282" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen diese Rasse kann kein Jihad ausgerufen werden.\"" + +msgid "nmr_warning_final" +msgstr "\"Please send in orders for the next turn if you want to continue playing.\"" + +msgid "nmr_warning_final" +msgstr "\"Bitte sende die Befehle nächste Runde ein, wenn du weiterspielen möchtest.\"" + +msgid "error172" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There was no spell supplied.\"" + +msgid "error172" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Zauber angegeben.\"" + +msgid "entrance_denied" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Entrance to $building($building) was denied.\"" + +msgid "entrance_denied" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Eintritt in $building($building) wurde verwehrt.\"" + +msgid "maelstrom_effect" +msgstr "\"$unit($mage) summons the power of the seas and a giant maelstrom forms.\"" + +msgid "maelstrom_effect" +msgstr "\"$unit($mage) beschwört die Mächte des Wassers und ein gigantischer Strudel bildet sich.\"" + +msgid "displayitem" +msgstr "\"$resource($item,1) (weight: $weight($weight)): $description\"" + +msgid "displayitem" +msgstr "\"$resource($item,1) (Gewicht: $weight($weight)): $description\"" + +msgid "error128" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many strangers.\"" + +msgid "error128" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann die Partei nicht aufnehmen.\"" + +msgid "error247" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction is already named.\"" + +msgid "error247" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat schon einen Namen.\"" + +msgid "spellfail_generous" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mood in this region is so bad that nobody reacts to the spell.\"" + +msgid "spellfail_generous" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Stimmung in der Region ist so schlecht, dass niemand auf den Zauber reagiert.\"" + +msgid "healing_effect_0" +msgstr "\"$unit($mage) sees after the wounded and heals $int($amount).\"" + +msgid "healing_effect_0" +msgstr "\"$unit($mage) kümmert sich um die Verletzten und heilt $int($amount) Verwundete.\"" + +msgid "use_questkey_wrongregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No fitting lock can be found here.\"" + +msgid "use_questkey_wrongregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier ist kein passendes Schloss.\"" + +msgid "error243" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You did not specify a valid race.\"" + +msgid "error243" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine gültige Rasse angegeben.\"" + +msgid "error133" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a caravansary before building roads through deserts.\"" + +msgid "error133" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Wüsten Straßen bauen zu können, muß zuerst eine Karawanserei errichtet werden.\"" + +msgid "changepasswd" +msgstr "\"The password of this faction is '$value'.\"" + +msgid "changepasswd" +msgstr "\"Das Passwort für diese Partei lautet ${value}.\"" + +msgid "cast_combatspell" +msgstr "\"$unit($mage) casts $spell($spell): $int($dead) $if($eq($dead,1),\"enemy was\", \"enemies were\") killed.\"" + +msgid "cast_combatspell" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($dead) $if($eq($dead,1),\"Krieger wurde\", \"Krieger wurden\") getötet.\"" + +msgid "cast_petrify_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were petrified.\"" + +msgid "cast_petrify_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurden versteinert.\"" + +msgid "error309" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit already assumed lycantropic form.\"" + +msgid "error309" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist schon ein Werwesen.\"" + +msgid "nr_stat_salary_new" +msgstr "\"peasant wages: $int($max) silver\"" + +msgid "nr_stat_salary_new" +msgstr "\"Bauerneinnahmen: $int($max) Silber\"" + +msgid "income_magic_reduced" +msgstr "\"$unit($unit) in $region($region) earns $int($amount)$if($eq($wanted,$amount),\"\",\" instead of $int($wanted)\") silver through magic.\"" + +msgid "income_magic_reduced" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Zauberei.\"" + +msgid "destroy_ship_1" +msgstr "\"$unit($unit) konnte $ship($ship) nicht zerstören.\"" + +msgid "destroy_ship_1" +msgstr "\"$unit($unit) could not destroy $ship($ship).\"" + +msgid "error314" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Restart can only be used once.\"" + +msgid "error314" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei kann nur einmal neu starten.\"" + +msgid "error310" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is not in lycantropic form.\"" + +msgid "error310" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist kein Werwesen.\"" + +msgid "error_pflnorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot recruit in this plane.\"" + +msgid "error_pflnorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Ebene der Herausforderung kann niemand rekrutiert werden.\"" + +msgid "sp_mindblast_temp_effect" +msgstr "\"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories.\"" + +msgid "sp_mindblast_temp_effect" +msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren kurzzeitig ihr Gedächtnis.\"" + +msgid "buildbuilding" +msgstr "\"$unit($unit) builds $int($size) more on $building($building).\"" + +msgid "buildbuilding" +msgstr "\"$unit($unit) baut für $int($size) an $building($building) weiter.\"" + +msgid "spellfail_astralblock" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The paths to the spirit world seem to be blocked.\"" + +msgid "spellfail_astralblock" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege zwischen Geisterwelt und Realität scheinen blockiert zu sein.\"" + +msgid "familiar_toofar" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot raise enough energy to channel the spell through $unit($unit).\"" + +msgid "familiar_toofar" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann nicht genug Energie aufbringen, um diesen Spruch durch $unit($unit) zu wirken.\"" + +msgid "wdw_pyramidspell_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pyramids may be build in this region.\"" + +msgid "wdw_pyramidspell_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Regione können Pyramiden gebaut werden.\"" + +msgid "deorcified" +msgstr "\"Little by little, people return to $region($region).\"" + +msgid "deorcified" +msgstr "\"Langsam kehren andere Völker nach $region($region) zurück.\"" + +msgid "sp_movecastle_fail_1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction).\"" + +msgid "sp_movecastle_fail_1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen.\"" + +msgid "curseinfo::strength" +msgstr "\"Testosterone levels are at an all-time high. ($int36($id))\"" + +msgid "curseinfo::strength" +msgstr "\"Die Leute strotzen nur so vor Kraft. ($int36($id))\"" + +msgid "magic_fumble" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is caught in their own spell.\"" + +msgid "magic_fumble" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier verfängt sich im eigenen Zauber.\"" + +msgid "teach_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) is not learning.\"" + +msgid "teach_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) lernt nicht.\"" + +msgid "regionowned" +msgstr "\"$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance.\"" + +msgid "regionowned" +msgstr "\"$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte.\"" + +msgid "income_tradetax" +msgstr "\"$unit($unit) collected $int($amount) silver trade tax in $region($region).\"" + +msgid "income_tradetax" +msgstr "\"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber.\"" + +msgid "error19" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - First you have to leave the ship.\"" + +msgid "error19" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff muß erst verlassen werden.\"" + +msgid "buyamount" +msgstr "\"$unit($unit) buys $int($amount) $resource($resource,$amount).\"" + +msgid "buyamount" +msgstr "\"$unit($unit) kauft $int($amount) $resource($resource,$amount).\"" + +msgid "fumblecurse" +msgstr "\"$unit($unit) in $region($region) was cursed by an unknown magician.\"" + +msgid "fumblecurse" +msgstr "\"$unit($unit) in $region($region) wird von einem Unbekannten verflucht.\"" + +msgid "regionmessage" +msgstr "\"A message by $unit($sender) from $region($region): '$string'\"" + +msgid "regionmessage" +msgstr "\"Eine Botschaft von $unit.dative($sender) aus $region($region): '$string'\"" + +msgid "spellfail_noundead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on undead.\"" + +msgid "spellfail_noundead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" + +msgid "studycost" +msgstr "\"$unit($unit) spends $int($cost) silver in $region($region) to study $skill($skill).\"" + +msgid "studycost" +msgstr "\"$unit($unit) in $region($region) verbraucht $int($cost) Silber für das Studium von $skill($skill).\"" + +msgid "flying_ship_result" +msgstr "\"$unit($mage) summons a wind spirit that lifts the $ship($ship) into the clouds.\"" + +msgid "flying_ship_result" +msgstr "\"$unit($mage) beschwört einen Luftgeist, der die $ship($ship) in die Wolken hebt.\"" + +msgid "forestfire_spread" +msgstr "\"The fire in $region($region) spread to $region($next) and $int($trees) were burned.\"" + +msgid "forestfire_spread" +msgstr "\"Der Waldbrand in $region($region) griff auch auf $region($next) über, und $int($trees) verbrannten.\"" + +msgid "maintenancefail" +msgstr "\"$unit($unit) cannot pay the maintenance for $building($building).\"" + +msgid "maintenancefail" +msgstr "\"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen.\"" + +msgid "bagpipeoffear_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Stricken with fear the peasants give the bard $int($money) silver.\"" + +msgid "bagpipeoffear_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ausser sich vor Furcht geben die Bauern dem Barden $int($money) Silber.\"" + +msgid "unitmessage" +msgstr "\"In $region($region), $unit($unit) received a message by $unit($sender): '$string'\"" + +msgid "unitmessage" +msgstr "\"In $region($region) erhielt $unit($unit) eine Botschaft von $unit.dative($sender): '$string'\"" + +msgid "error189" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot dry out an entire ocean.\"" + +msgid "error189" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst der mächtigste Magier der Welt könnte keinen Ozean austrocknen lassen.\"" + +msgid "teach_student" +msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill).\"" + +msgid "teach_student" +msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill).\"" + +msgid "curseinfo::astralblock" +msgstr "\"Powerful magic disrupts our contact with reality. ($int36($id))\"" + +msgid "curseinfo::astralblock" +msgstr "\"Mächtige Magie verhindert den Kontakt zur Realität. ($int36($id))\"" + +msgid "error299" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid prefix.\"" + +msgid "error299" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Prefix.\"" + +msgid "curseinfo::baddream" +msgstr "\"Nightmares plague the population. ($int36($id))\"" + +msgid "curseinfo::baddream" +msgstr "\"Albträume plagen die Leute. ($int36($id))\"" + +msgid "error295" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only mages may use an astralcrystal.\"" + +msgid "error295" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur ein Magier kann einen Astralkristall benutzen.\"" + +msgid "error185" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell seems exceptionally weak. Something has interfred with the magical energies.\"" + +msgid "error185" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber scheint ungewöhnlich schwach zu sein. Irgendetwas hat die magischen Energien abgeleitet.\"" + +msgid "error181" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - To do this, the magician has to be in a castle or on board a ship.\"" + +msgid "error181" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muß sich der Magier in der Burg oder an Bord des Schiffes befinden.\"" + +msgid "error291" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keinem Verband.\"" + +msgid "curseinfo::calm_0" +msgstr "\"$unit($unit) seems to like $race($race, 0). ($int36($id))\"" + +msgid "curseinfo::calm_0" +msgstr "\"$unit($unit) scheint $race($race, 0) zu mögen. ($int36($id))\"" + +msgid "error256" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot pray for this.\"" + +msgid "error256" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um so etwas kann man nicht beten.\"" + +msgid "desertion" +msgstr "\"$unit($unit) in $region($region) abandons your cause.\"" + +msgid "desertion" +msgstr "\"$unit($unit) in $region($region) desertiert.\"" + +msgid "error91" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no mallorn trees here.\"" + +msgid "error91" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Mallornbäume.\"" + +msgid "error137" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown help mode.\"" + +msgid "error137" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Hilfe-Modus.\"" + +msgid "error80" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "error80" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "error142" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver for recruiting.\"" + +msgid "error142" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat zuwenig Silber, um zu rekrutieren.\"" + +msgid "rust_fail" +msgstr "\"$unit($mage) puts a spell of rust on $unit($target) but it found nothing to consume.\"" + +msgid "rust_fail" +msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target), doch der Rosthauch fand keine Nahrung.\"" + +msgid "error252" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What and how much should be sacrificed?\"" + +msgid "error252" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Was und wieviel soll geopfert werden?\"" + +msgid "dissolve_units_3" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) whithered and died.\"" + +msgid "dissolve_units_3" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verfaulte\", \"verfaulten\").\"" + +msgid "trappedairelemental_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster.\"" + +msgid "trappedairelemental_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die $ship($ship) wird jetzt schneller ihr Ziel erreichen.\"" + +msgid "error208" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong aura values.\"" + +msgid "error208" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft.\"" + +msgid "error318" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building can be expanded only once per turn.\"" + +msgid "error318" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude kann nur einmal pro Runde erweitert werden.\"" + +msgid "teach_asgood" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) needs to be at least 2 levels better than $unit($student).\"" + +msgid "teach_asgood" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) muß mindestens 2 Stufen besser sein als $unit($student).\"" + +msgid "drought_effect_1" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). Ice melts and turns the lands into swamps. Powerful rivers wash away the fertile soil and drown people and animals alike. What buildings have not succumbed to the floods sink into the mire. The torrid sun changes the region forever.\"" + +msgid "drought_effect_1" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Eis schmilzt und verwandelt sich in Morast. Reißende Ströme spülen die mageren Felder weg und ersäufen Mensch und Tier. Was an Bauten nicht den Fluten zum Opfer fiel, verschlingt der Morast. Die sengende Hitze verändert die Region für immer.\"" + +msgid "error204" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a region without trees.\"" + +msgid "error204" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In einer Region ohne Bäume kann man diesen Zauber nicht wirken.\"" + +msgid "patzer5" +msgstr "\"$unit($unit) feels far more exhausted than he should after casting $spell($spell) and assumes that any following spells will cost far more energy than usual.\"" + +msgid "patzer5" +msgstr "\"$unit($unit) fühlt sich nach dem Zaubern von $spell($spell) viel erschöpfter als sonst und hat das Gefühl, dass alle weiteren Zauber deutlich mehr Kraft als normalerweise kosten werden.\"" + +msgid "analyse_region_age" +msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" + +msgid "analyse_region_age" +msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "plague_spell" +msgstr "\"$unit($mage) sends the plague on $region($region).\"" + +msgid "plague_spell" +msgstr "\"$unit($mage) ruft in $region($region) eine Pest hervor.\"" + +msgid "error200" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magician's maximum aura is not high enough for this spell.\"" + +msgid "error200" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die maximale Aura reicht nicht für diesen Zauber.\"" + +msgid "shipnoshore" +msgstr "\"The $ship($ship) discovers that $region($region) is dry land.\"" + +msgid "shipnoshore" +msgstr "\"Die $ship($ship) entdeckt, dass $region($region) Festland ist.\"" + +msgid "sp_sweetdreams_effect" +msgstr "\"$unit($mage) causes $unit($unit) to have a wonderful night in $region($region).\"" + +msgid "sp_sweetdreams_effect" +msgstr "\"$unit($mage) verschafft $unit($unit) ein schönes Nachtleben in $region($region).\"" + +msgid "error3" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Description has been cut (too long).\"" + +msgid "error3" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Beschreibung zu lang - gekürzt.\"" + +msgid "charming_effect" +msgstr "\"$unit($mage) chamrs $unit($unit). $unit($unit) will obey our orders for approximatley $int($duration) more weeks.\"" + +msgid "charming_effect" +msgstr "\"$unit($mage) gelingt es $unit($unit) zu verzaubern. $unit($unit) wird für etwa $int($duration) Wochen unseren Befehlen gehorchen.\"" + +msgid "target_region_invalid" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - invalid target region.\"" + +msgid "target_region_invalid" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültige Zielregion.\"" + +msgid "nr_heroes" +msgstr "\"Your faction has promoted $int($units) heroes out of a possible total of $int($maxunits).\"" + +msgid "nr_heroes" +msgstr "\"Deine Partei hat $int($units) Helden und kann maximal $int($maxunits) Helden ernennen.\"" + +msgid "cast_tired_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had trouble staying awake.\"" + +msgid "cast_tired_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger schleppten sich müde in den Kampf.\"" + +msgid "caldera_handle_1" +msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" + +msgid "caldera_handle_1" +msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" + +msgid "weakmagic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell of $unit($unit) was way to weak and its magic dissolves immediately.\"" + +msgid "weakmagic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber von $unit.dative($unit) war viel zu schwach und löst sich gleich wieder auf.\"" + +msgid "analyse_building_fail" +msgstr "\"It appears to $unit($mage) that $building($building) is charmed, but no details have been revealed.\"" + +msgid "analyse_building_fail" +msgstr "\"$unit($mage) meint, dass auf $building($building) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "spellfail_toomanytargets" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This many people exceed the powers of the magician.\"" + +msgid "spellfail_toomanytargets" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Persoenen übersteigen die Kräfte des Magiers.\"" + +msgid "harvest_effect" +msgstr "\"$if($isnull($mage),\"An unseen magician\",$unit($mage)) blesses the fields in a short ritual.\"" + +msgid "harvest_effect" +msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) segnet in einem kurzen Ritual die Felder.\"" + +msgid "buildship" +msgstr "\"$unit($unit) builds $int($size) more on $ship($ship).\"" + +msgid "buildship" +msgstr "\"$unit($unit) baut für $int($size) an $ship($ship) weiter.\"" + +msgid "spellshipnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ship $int36($id) could not be located.\"" + +msgid "spellshipnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Schiff $int36($id) wurde nicht gefunden.\"" + +msgid "unveileog" +msgstr "\"$unit($unit) discovers laen in $region($region).\"" + +msgid "unveileog" +msgstr "\"$unit($unit) in $region($region) entdeckt eine Laenader.\"" + +msgid "error_roads_finished" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete.\"" + +msgid "error_roads_finished" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen.\"" + +msgid "item_create_spell" +msgstr "\"$unit($mage) creates $int($number) $resource($item,$number).\"" + +msgid "item_create_spell" +msgstr "\"$unit($mage) erschafft $int($number) $resource($item,$number).\"" + +msgid "curseinfo::slavery" +msgstr "This powerful curse appears to rob the unit of its free will. As long as the curse is active, it will only obey the orders of its new lord. ($int36($id))" + +msgid "curseinfo::slavery" +msgstr "Dieser mächtige Bann scheint die Einheit ihres freien Willens zu berauben. Solange der Zauber wirkt, wird sie nur den Befehlen ihres neuen Herrn gehorchen. ($int36($id))" + +msgid "start_battle" +msgstr "\"The battle was initiated by ${factions}.\"" + +msgid "start_battle" +msgstr "\"Der Kampf wurde ausgelöst von ${factions}.\"" + +msgid "stealaura_fail_detect" +msgstr "\"$unit($unit) fühlt strangely weakened.\"" + +msgid "stealaura_fail_detect" +msgstr "\"$unit($unit) fühlt sich einen Moment seltsam geschwächt.\"" + +msgid "battle_msg" +msgstr "\"$string\"" + +msgid "battle_msg" +msgstr "\"$string\"" + +msgid "error16" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already completed.\"" + +msgid "error16" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist schon fertig.\"" + +msgid "error38" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have any herbs.\"" + +msgid "error38" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Kräuter.\"" + +msgid "volcano_dead" +msgstr "\"$int($dead) people in $unit($unit) perish when the volcano in $region($region) erupts.\"" + +msgid "volcano_dead" +msgstr "\"Beim Vulkanausbruch in $region($region) sterben $int($dead) Personen in $unit($unit).\"" + +msgid "curseinfo::warmth_1" +msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") protected from the cold. ($int36($id))\"" + +msgid "curseinfo::warmth_1" +msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"fühlt\", \"fühlen\") sich vor Kälte geschützt. ($int36($id))\"" + +msgid "maintenance_noowner" +msgstr "\"The upkeep for $building($building) was not paid, the building was not operational this week.\"" + +msgid "maintenance_noowner" +msgstr "\"Der Unterhalt von $building($building) konnte nicht gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig.\"" + +msgid "error27" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items for sale is missing.\"" + +msgid "error27" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu verkaufender Produkte fehlt.\"" + +msgid "error49" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not the owner.\"" + +msgid "error49" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Eigentümer.\"" + +msgid "missing_components" +msgstr "\"$unit($unit) has insufficient components to cast $spell($spell) on level $int($level).\"" + +msgid "missing_components" +msgstr "\"$unit($unit) hat nicht genügend Komponenten um $spell($spell) auf Stufe $int($level) zu zaubern.\"" + +msgid "seduce_effect_1" +msgstr "\"$unit($unit) gambles for high stakes and loses almost everything.\"" + +msgid "seduce_effect_1" +msgstr "\"$unit($unit) verfiel dem Glücksspiel und hat fast sein ganzes Hab und gut verspielt.\"" + +msgid "xmastree_effect" +msgstr "\"At night, colourful lights can be seen in this region, bells are a-ringing and the laughter of happy children seems to be everywhere in the forests.\"" + +msgid "xmastree_effect" +msgstr "\"In der Region erstrahlen des Nachts bunte Lichter, Gloeckchen klingeln und frohes Kindergelaechter klingt durch den Wald.\"" + +msgid "cast_sleep_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters have fallen asleep.\"" + +msgid "cast_sleep_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in Schlaf versetzt.\"" + +msgid "nr_alliance" +msgstr "\"Member of '$name ($int36($id))' for $int($age) weeks, led by $faction($leader).\"" + +msgid "nr_alliance" +msgstr "\"Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', angeführt von $faction($leader).\"" + +msgid "deathcloud_effect" +msgstr "\"$unit($mage) summons a poison elemental in $region($region).\"" + +msgid "deathcloud_effect" +msgstr "\"$unit($mage) beschwört einen Giftelementar in $region($region).\"" + +msgid "nr_building_besieged" +msgstr "\", besieged by $int($soldiers) soldiers$if($lt($diff,0),\"\",\" (cut off)\")\"" + +msgid "nr_building_besieged" +msgstr "\", belagert von $int($soldiers) Personen$if($lt($diff,0),\"\",\" (abgeschnitten)\")\"" + +msgid "nr_population" +msgstr "\"Your faction has $int($population) people in $int($units) of $int($limit) possible units.\"" + +msgid "nr_population" +msgstr "\"Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten.\"" + +msgid "curseinfo::shipdisorientation" +msgstr "This ship has lost its path. ($int36($id))" + +msgid "curseinfo::shipdisorientation" +msgstr "Dieses Schiff hat sich verfahren. ($int36($id))" + +msgid "error198" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The flames find no kindling. The fire dies quickly, causing no damage whatsoever.\"" + +msgid "error198" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Flammen finden keine Nahrung. Das Feuer erlischt, ohne Schaden anzurichten.\"" + +msgid "error194" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Target region was supplied incorrectly.\"" + +msgid "error194" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zielregion wurde nicht korrekt angegeben.\"" + +msgid "illusionantimagic" +msgstr "\"$unit($unit) walks into an antimagical zone and dissolves.\"" + +msgid "illusionantimagic" +msgstr "\"$unit($unit) marschiert in eine Antimagiezone und löst sich auf.\"" + +msgid "curseinfo::sparkle_8" +msgstr "\"A group of passing miners makes passes at $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_8" +msgstr "\"Eine Gruppe vorbeiziehender Bergarbeiter rufen $unit($unit) eindeutig Zweideutiges nach. ($int36($id))\"" + +msgid "too_many_units_in_alliance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - An alliance may not consist of more than $int($allowed) units.\"" + +msgid "too_many_units_in_alliance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Allianz darf aus nicht mehr als $int($allowed) Einheiten bestehen.\"" + +msgid "error190" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in the material world.\"" + +msgid "error190" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der materiellen Welt.\"" + +msgid "sp_flee_effect_0" +msgstr "\"$unit($mage) casts $spell($spell), but nobody is affected.\"" + +msgid "sp_flee_effect_0" +msgstr "\"$unit($mage) zaubert $spell($spell), aber es gab niemanden, der beeinflusst werden konnte.\"" + +msgid "error146" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not captain of a ship.\"" + +msgid "error146" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Kapitän des Schiffes.\"" + +msgid "error265" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only works in the normal world.\"" + +msgid "error265" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der normalen Welt.\"" + +msgid "error261" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sort before the owner of a ship or a building.\"" + +msgid "error261" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Vor den Besitzer eines Schiffes oder Gebäudes kann nicht sortiert werden.\"" + +msgid "icastle_dissolve" +msgstr "\"$building($building) suddenly dissolves into small pink clouds.\"" + +msgid "icastle_dissolve" +msgstr "\"Plötzlich löst sich $building($building) in kleine Traumwolken auf.\"" + +msgid "error151" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need stones to build a road.\"" + +msgid "error151" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zum Straßenbau braucht man Steine.\"" + +msgid "slave_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit will not fight.\"" + +msgid "slave_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht.\"" + +msgid "error107" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least two horses to breed more.\"" + +msgid "error107" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man braucht mindestens zwei Pferde, um sie zu züchten.\"" + +msgid "error213" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Incorrect parameter.\"" + +msgid "error213" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Parameter nicht korrekt angegeben.\"" + +msgid "error103" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can build roads.\"" + +msgid "error103" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann Straßen bauen.\"" + +msgid "curseinfo::slave_1" +msgstr "\"$unit($unit) will be under our influence for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" + +msgid "curseinfo::slave_1" +msgstr "\"$unit($unit) wird noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") unter unserem Bann stehen. ($int36($id))\"" + +msgid "alliance::lost" +msgstr "\"$alliance($alliance) has to leave the game after all their temples were lost.\"" + +msgid "alliance::lost" +msgstr "\"$alliance($alliance) scheidet aus dem Spiel aus, nachdem alle Tempel verloren gingen.\"" + +msgid "nr_stat_salary" +msgstr "\"worker salary: $int($max) silver\"" + +msgid "nr_stat_salary" +msgstr "\"Lohn für Arbeit: $int($max) Silber\"" + +msgid "nr_stat_luxuries" +msgstr "\"luxury goods at this price: $int($max)\"" + +msgid "nr_stat_luxuries" +msgstr "\"Luxusgüter zum angegebenen Preis: $int($max)\"" + +msgid "curseinfo::flyingship" +msgstr "\"Powerful storms have lifted this ship high into the air. ($int36($id))\"" + +msgid "curseinfo::flyingship" +msgstr "\"Kräftige Stürme haben dieses Schiff in die Luft gehoben. ($int36($id))\"" + +msgid "curseinfo::blessedharvest" +msgstr "\"The grain in this region is especially healthy. ($int36($id))\"" + +msgid "curseinfo::blessedharvest" +msgstr "\"In dieser Gegend steht das Korn besonders gut im Feld. ($int36($id))\"" + +msgid "killed_battle" +msgstr "\"$unit($unit) killed $int($dead) opponents.\"" + +msgid "killed_battle" +msgstr "\"$unit($unit) tötete $int($dead) Krieger.\"" + +msgid "error6" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building could not be found.\"" + +msgid "error6" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude wurde nicht gefunden.\"" + +msgid "sailnolandingstorm" +msgstr "\"At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region).\"" + +msgid "sailnolandingstorm" +msgstr "\"Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft.\"" + +msgid "teachdumb" +msgstr "\"Due to the effect of duncebuns, $unit($teacher) can only teach $int($amount) students.\"" + +msgid "teachdumb" +msgstr "\"$unit($teacher) kann durch Dumpfbackenbrot nur $int($amount) Schüler lehren.\"" + +msgid "teleport_success" +msgstr "\"$unit($unit) was teleported from $region($source) to $unit($target).\"" + +msgid "teleport_success" +msgstr "\"$unit($unit) wurde von $region($source) nach $unit($target) teleportiert.\"" + +msgid "becomewere" +msgstr "\"$unit($unit) in $region($region) becomes a lycantrope.\"" + +msgid "becomewere" +msgstr "\"$unit($unit) in $region($region) verwandelt sich in ein Werwesen.\"" + +msgid "spellshipresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) resists the spell.\"" + +msgid "spellshipresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) widersteht dem Zauber.\"" + +msgid "nr_potion_effect" +msgstr "\"There $if($eq($left,1),\"is\",\"are\") $int($left) $if($eq($left,1),\"use\",\"uses\") of $resource($potion,1) left.\"" + +msgid "nr_potion_effect" +msgstr "\"Auf der Einheit $if($eq($left,1),\"liegt\",\"liegen\") $int($left) Wirkung$if($eq($left,1),\"\",\"en\") $resource($potion,1).\"" + +msgid "curseinfo::peacezone" +msgstr "\"Everyone in this region seems to be in a peacful mood. ($int36($id))\"" + +msgid "curseinfo::peacezone" +msgstr "\"Die ganze Region ist von einer friedlichen Stimmung erfasst. ($int36($id))\"" + +msgid "rust_effect_1" +msgstr "\"$unit($mage) causes a terrible storm over the enemy, but the magic rain does not do any harm.\"" + +msgid "rust_effect_1" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt.\"" + +msgid "find_manual" +msgstr "\"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous.\"" + +msgid "find_manual" +msgstr "\"$unit($unit) stolpert bei der Erforschung der Region über $localize($location). Nähere Durchsuchung fördert ein zerfleddertes altes Buch mit dem Titel '$localize($book)' zu Tage. Der Wissensschub ist enorm.\"" + +msgid "curseinfo::healingzone" +msgstr "Healing in this region is affected by magic. ($int36($id))" + +msgid "curseinfo::healingzone" +msgstr "Heilung ist in dieser Region magisch beeinflusst. ($int36($id))" + +msgid "income_entertainment_reduced" +msgstr "\"In $region($region), $unit($unit) earns only $int($amount) instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") with entertainment.\"" + +msgid "income_entertainment_reduced" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Unterhaltung.\"" + +msgid "errusingpotion" +msgstr "\"$unit($unit): '$order($command)' - The unit already uses $resource($using,0).\"" + +msgid "errusingpotion" +msgstr "\"$unit($unit): '$order($command)' - Die Einheit benutzt bereits $resource($using,0).\"" + +msgid "missing_components_list" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Casting this spell requires an additional $resources($list).\"" + +msgid "missing_components_list" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für diesen Zauber fehlen noch $resources($list).\"" + +msgid "volcanostopsmoke" +msgstr "\"The volcano of $region($region) stops releasing smoke.\"" + +msgid "volcanostopsmoke" +msgstr "\"Aus dem Vulkankrater von $region($region) steigt kein Rauch mehr.\"" + +msgid "summondragon" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) calls dragons to $region($target).\"" + +msgid "summondragon" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ruft Drachen nach $region($target).\"" + +msgid "use_antimagiccrystal" +msgstr "\"$unit($unit) uses an antimagic crystal.\"" + +msgid "use_antimagiccrystal" +msgstr "\"$unit($unit) benutzt einen Antimagiekristall.\"" + +msgid "cast_stun_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were momentarily stunned.\"" + +msgid "cast_stun_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger sind für einen Moment benommen.\"" + +msgid "error46" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a tavern.\"" + +msgid "error46" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Taverne.\"" + +msgid "error35" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have these herbs.\"" + +msgid "error35" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diese Kräuter nicht.\"" + +msgid "error57" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is too heavily loaded to move.\"" + +msgid "error57" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit trägt zuviel Gewicht, um sich bewegen zu können.\"" + +msgid "feedback_no_contact_no_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, but cannot resist the spell.\"" + +msgid "feedback_no_contact_no_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen, aber widersteht dem Zauber nicht.\"" + +msgid "error79" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A ship or a castle must be supplied.\"" + +msgid "error79" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Schiff oder eine Burg muß angegeben werden.\"" + +msgid "drought_effect_4" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The ice melts and and the region is consumed by a tidal wave.\"" + +msgid "drought_effect_4" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Das Eis zerbricht und eine gewaltige Flutwelle verschlingt die Region.\"" + +msgid "destroy_ship_0" +msgstr "\"$ship($ship) wurde von $unit($unit) zerstört.\"" + +msgid "destroy_ship_0" +msgstr "\"$ship($ship) was destroyed by $unit($unit).\"" + +msgid "curseinfo::sparkle_16" +msgstr "\"The body of $unit($unit) is disfigured by hideous boils. ($int36($id))\"" + +msgid "curseinfo::sparkle_16" +msgstr "\"Pestbeulen befallen den Körper von $unit($unit). ($int36($id))\"" + +msgid "missing_direction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - no direction was specified.\"" + +msgid "missing_direction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - keine Richtung angegeben.\"" + +msgid "error159" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No person could be handed over.\"" + +msgid "error159" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Personen übergeben werden.\"" + +msgid "shock" +msgstr "\"$unit($mage) receives a shock when his familiar dies.\"" + +msgid "shock" +msgstr "\"$unit($mage) erleidet durch den Tod seines Vertrauten einen Schock.\"" + +msgid "error269" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast spells here.\"" + +msgid "error269" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht zaubern.\"" + +msgid "sink_saved_msg" +msgstr "\"$unit($unit) survives unscathed and makes it to $region($region).\"" + +msgid "sink_saved_msg" +msgstr "\"$unit($unit) überlebt unbeschadet und rettet sich nach $region($region).\"" + +msgid "race_noregroup" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be regrouped.\"" + +msgid "race_noregroup" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht neu gruppiert werden.\"" + +msgid "curseinfo::worse" +msgstr "\"$unit($unit) is chased by a nightmare. ($int36($id))\"" + +msgid "curseinfo::worse" +msgstr "\"$unit($unit) wird von einem Alp geritten. ($int36($id))\"" + +msgid "error274" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot teach.\"" + +msgid "error274" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichten.\"" + +msgid "region_guarded" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by $unit($guard), a non-allied unit.\"" + +msgid "region_guarded" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von $unit($guard), einer nichtalliierten Einheit, bewacht.\"" + +msgid "error155" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many magicians in the faction.\"" + +msgid "error155" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Magier in der Partei.\"" + +msgid "curseinfo::speed_1" +msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") accelerated for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" + +msgid "curseinfo::speed_1" +msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"ist\", \"sind\") noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") beschleunigt. ($int36($id))\"" + +msgid "error160" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be bought.\"" + +msgid "error160" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter gekauft werden.\"" + +msgid "error270" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden bestehlen.\"" + +msgid "error226" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units from the backmost rows cannot attack.\"" + +msgid "error226" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten in den hinteren Reihen können nicht angreifen.\"" + +msgid "sailnolanding" +msgstr "\"The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel.\"" + +msgid "sailnolanding" +msgstr "\"Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff.\"" + +msgid "error116" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number can not be assigned.\"" + +msgid "error116" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer kann nicht vergeben werden.\"" + +msgid "error112" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Names may not contain parenthesis.\"" + +msgid "error112" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Namen dürfen keine Klammern enthalten.\"" + +msgid "error222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Show all what?\"" + +msgid "error222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zeige alle was?\"" + +msgid "teach_teacher" +msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level).\"" + +msgid "teach_teacher" +msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level).\"" + +msgid "patzer2" +msgstr "\"$unit($unit) in $region($region) is hit by a massive headache and cannot concentrate on the spell. Some part of this ritual has gone very wrong indeed.\"" + +msgid "patzer2" +msgstr "\"$unit($unit) in $region($region) hat rasende Kopfschmerzen und kann sich nicht mehr richtig konzentrieren. Irgendwas bei diesem Zauber ist fürchterlich schiefgelaufen.\"" + +msgid "curseinfo::magicboost" +msgstr "The magician possesses the gift of Chaos. ($int36($id))" + +msgid "curseinfo::magicboost" +msgstr "Der Magier besitzt die Gabe des Chaos. ($int36($id))" + +msgid "illegal_password" +msgstr "\"Your password was changed because it contained illegal characters. Legal passwords may only contain numbers and letters from A to Z. Your new Password is '${newpass}'.\"" + +msgid "illegal_password" +msgstr "\"Dein Passwort enthält Zeichen, die bei der Nachsendung von Reports Probleme bereiten können. Bitte beachte, dass Passwortenur aus Buchstaben von A bis Z und Zahlen bestehen dürfen. Dein neues Passwort ist '${newpass}'.\"" + +msgid "curseinfo::sparkle_12" +msgstr "\"Brightly coloured flowers pop up all around $unit($unit)'s camp. ($int36($id))\"" + +msgid "curseinfo::sparkle_12" +msgstr "\"Leuchtende Blumen erblühen rund um das Lager von $unit($unit). ($int36($id))\"" + +msgid "familiar_name" +msgstr "\"Familiar of $unit($unit)\"" + +msgid "familiar_name" +msgstr "\"Vertrauter von $unit($unit)\"" + +msgid "error9" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That cannot be sabotaged.\"" + +msgid "error9" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann man nicht sabotieren.\"" + +msgid "curseinfo::sparkle_6" +msgstr "\"$unit($unit) finds a small flute that plays a beautiful melody. ($int36($id))\"" + +msgid "curseinfo::sparkle_6" +msgstr "\"$unit($unit) findet eine kleine Flöte, die eine wundersame Melodie spielt. ($int36($id))\"" + +msgid "renamed_building_seen" +msgstr "\"$building($building) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_building_seen" +msgstr "\"$building($building) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "sp_shadowknights_effect" +msgstr "\"$unit($mage) summons a mirage.\"" + +msgid "sp_shadowknights_effect" +msgstr "\"$unit($mage) beschwört Trugbilder herauf.\"" + +msgid "give" +msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to $unit($target).\"" + +msgid "give" +msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target).\"" + +msgid "sellamount" +msgstr "\"$unit($unit) sells $int($amount) $resource($resource,$amount).\"" + +msgid "sellamount" +msgstr "\"$unit($unit) verkauft $int($amount) $resource($resource,$amount).\"" + +msgid "sp_migranten_fail1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is one of our kind, we should not waste aura on this.\"" + +msgid "sp_migranten_fail1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist von unserer Art, das Ritual wäre verschwendete Aura.\"" + +msgid "victory_murder_complete" +msgstr "\"VICTORY! $if($eq($n,1), \"The faction $winners has\", \"The factions $winners have\") fulfilled the victory condition for the necessary time. The game is over.\"" + +msgid "victory_murder_complete" +msgstr "\"SIEG! $if($eq($n,1), \"Die Partei $winners hat\", \"Die Parteien $winners haben\") die Siegbedingung für die erforderliche Zeit erfüllt. Das Spiel ist damit beendet.\"" + +msgid "shipsink" +msgstr "\"The $ship($ship) has suffered too much damage and sinks.\"" + +msgid "shipsink" +msgstr "\"Die $ship($ship) ist zu stark beschädigt und sinkt.\"" + +msgid "sp_bloodsacrifice_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) receives $int($amount) aura.\"" + +msgid "sp_bloodsacrifice_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gewinnt durch das Ritual $int($amount) Aura.\"" + +msgid "sp_confusion_effect_0" +msgstr "\"$unit($mage) intones a mysterious chant. There is a sudden hubbub, but order is restored quickly.\"" + +msgid "sp_confusion_effect_0" +msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" + +msgid "pest" +msgstr "\"The region is visited by the plague and $int($dead) peasants died.\"" + +msgid "pest" +msgstr "\"Hier wütete die Pest, und $int($dead) Bauern starben.\"" + +msgid "wormhole_exit" +msgstr "\"$unit($unit) travels through a wormhole to $region($region).\"" + +msgid "wormhole_exit" +msgstr "\"$unit($unit) reist durch ein Wurmloch nach $region($region).\"" + +msgid "spellfail_astralonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell will only work in the realm of spirits.\"" + +msgid "spellfail_astralonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der Geisterwelt.\"" + +msgid "analyse_ship_noage" +msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_ship_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "destroy_road" +msgstr "\"$unit($unit) demolishes the road between $region($from) and $region($to).\"" + +msgid "destroy_road" +msgstr "\"$unit($unit) reißt die Straße zwischen $region($from) und $region($to) ein.\"" + +msgid "error13" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has moved already.\"" + +msgid "error13" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat sich bereits bewegt.\"" + +msgid "aborted_battle" +msgstr "\"The battle was aborted because all enemies escaped.\"" + +msgid "aborted_battle" +msgstr "\"Der Kampf wurde abgebrochen, da alle Verteidiger flohen.\"" + +msgid "error24" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege.\"" + +msgid "error24" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich.\"" + +msgid "usecatapult" +msgstr "\"$int($amount) fighters of $unit($unit) launch their catapults.\"" + +msgid "usecatapult" +msgstr "\"$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab.\"" + +msgid "error76" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item cannot be used.\"" + +msgid "error76" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann man nicht benutzen.\"" + +msgid "error98" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In winter, insects can be recruited only in deserts.\"" + +msgid "error98" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insekten können im Winter nur in Wüsten rekrutiert werden.\"" + +msgid "spyreport" +msgstr "\"$unit($spy) managed to gather information about $unit($target): combat status ${status}.\"" + +msgid "spyreport" +msgstr "\"$unit($spy) gelang es, Informationen über $unit($target) herauszubekommen: Kampfstatus ${status}.\"" + +msgid "newbie_password" +msgstr "\"Your password is ${password}.\"" + +msgid "newbie_password" +msgstr "\"Dein Passwort lautet ${password}.\"" + +msgid "error65" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Tuition was too high to be paid.\"" + +msgid "error65" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Lernkosten können nicht bezahlt werden.\"" + +msgid "error87" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dragon blood is required for this elixir.\"" + +msgid "error87" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Elixier benötigt man Drachenblut.\"" + +msgid "spellfail_block" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The connections from to this regions are blocked.\"" + +msgid "spellfail_block" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege aus dieser Region sind blockiert.\"" + +msgid "error278" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot change the name and description of this building.\"" + +msgid "error278" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Name und Beschreibung des Gebäudes können nicht geändert werden.\"" + +msgid "error168" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be sold.\"" + +msgid "error168" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter verkauft werden.\"" + +msgid "stormwinds_reduced" +msgstr "\"$unit($unit) could only enchant $int($ships) of $int($maxships) ships.\"" + +msgid "stormwinds_reduced" +msgstr "\"$unit($unit) konnte nur $int($ships) von $int($maxships) Schiffen verzaubern.\"" + +msgid "error283" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your password may only contain alphanumeric symbols.\"" + +msgid "error283" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Passwort darf nur Buchstaben und Ziffern enthalten.\"" + +msgid "rust_effect" +msgstr "\"$unit($mage) puts a spell of rust on $unit($target). $int($amount) weapons are eaten by rust.\"" + +msgid "rust_effect" +msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target). $int($amount) Waffen wurden vom Rost zerfressen.\"" + +msgid "nr_migrants" +msgstr "\"Your faction has $int($units) migrants out of a possible total of $int($maxunits).\"" + +msgid "nr_migrants" +msgstr "\"Deine Partei hat $int($units) Migranten und kann maximal $int($maxunits) Migranten aufnehmen.\"" + +msgid "error239" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to get a new number?\"" + +msgid "error239" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff eine neue Nummer bekommen?\"" + +msgid "error129" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many people.\"" + +msgid "error129" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Leute kann die Partei nicht aufnehmen.\"" + +msgid "spyreport_skills" +msgstr "\"$unit($target) knows ${skills}.\"" + +msgid "spyreport_skills" +msgstr "\"$unit($target) beherrscht ${skills}.\"" + +msgid "sighting" +msgstr "\"$if($isnull($region),\"\",\"In $region($region), \")$int($number) $race($race,$number) were discovered.\"" + +msgid "sighting" +msgstr "\"$if($isnull($region),\"Es\",\"In $region($region)\") wurde$if($eq($number,1),\"\",\"n\") $int($number) $race($race,$number) gesichtet.\"" + +msgid "nr_stat_recruits" +msgstr "\"recruits: $int($max) peasants\"" + +msgid "nr_stat_recruits" +msgstr "\"Rekruten: max. $int($max) Bauern\"" + +msgid "error235" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Maintenance has not been paid yet.\"" + +msgid "error235" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Gebäude wurde noch kein Unterhalt bezahlt.\"" + +msgid "error231" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit or its animals would not survive there.\"" + +msgid "error231" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit oder ihre Tiere würden dort nicht überleben.\"" + +msgid "error121" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That resource does not exist in this region.\"" + +msgid "error121" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas gibt es hier nicht.\"" + +msgid "error306" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction is not old enough to start over.\"" + +msgid "error306" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 9 Wochen alt sein, um einen Neustart zu versuchen.\"" + +msgid "manacrystal_use" +msgstr "\"$unit($unit) uses an astral crystal and gains $int($aura) aura.\"" + +msgid "manacrystal_use" +msgstr "\"$unit($unit) benutzt einen Astralkristall und gewinnt $int($aura) Aura hinzu.\"" + +msgid "error302" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym already set.\"" + +msgid "error302" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Bereits ein Synonym gesetzt.\"" + +msgid "analyse_region_noage" +msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_region_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "icastle_create" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building.\"" + +msgid "icastle_create" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude.\"" + +msgid "spyfail" +msgstr "\"$unit($spy) could not find out anything about $unit($target).\"" + +msgid "spyfail" +msgstr "\"$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden.\"" + +msgid "firewall_damage" +msgstr "\"$unit($unit) steps through the wall of fire into $region($region) and receives severe burn damage.\"" + +msgid "firewall_damage" +msgstr "\"$unit($unit) erleidet beim Durchqueren der Feuerwand nach $region($region) schwere Verbrennungen.\"" + +msgid "cast_speed_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were magically accelerated.\"" + +msgid "cast_speed_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden magisch beschleunigt.\"" + +msgid "firewall_effect" +msgstr "\"$unit($mage) creates a wall of fire in $region($region).\"" + +msgid "firewall_effect" +msgstr "\"$unit($mage) erschafft in $region($region) eine Wand aus Feuer.\"" + +msgid "phunger" +msgstr "\"$if($eq($dead,1),\"One peasant starves\",\"$int($dead) peasants starve\").\"" + +msgid "phunger" +msgstr "\"$if($eq($dead,1),\"Ein Bauer verhungert\",\"$int($dead) Bauern verhungern\").\"" + +msgid "transport" +msgstr "\"$unit($unit) transported $unit($target) from $region($start) to $region($end).\"" + +msgid "transport" +msgstr "\"$unit($unit) transportiert $unit($target) von $region($start) nach $region($end).\"" + +msgid "sp_holyground_effect" +msgstr "\"$unit($mage) summons natural spirits into the ground of $region($region).\"" + +msgid "sp_holyground_effect" +msgstr "\"$unit($mage) beschwört Naturgeister in den Boden von $region($region).\"" + +msgid "curseinfo::maelstrom" +msgstr "The maelstrom in this area will heavily damage all ships coming into its wake. ($int36($id))" + +msgid "curseinfo::maelstrom" +msgstr "Der Mahlstrom in dieser Region wird alle Schiffe, die in seinen Sog geraten, schwer beschädigen. ($int36($id))" + +msgid "leavefail" +msgstr "\"$unit($unit) could not leave $region($region).\"" + +msgid "leavefail" +msgstr "\"$unit($unit) konnte aus $region($region) nicht ausreisen.\"" + +msgid "reduced_production" +msgstr "The region is ravaged, the ground infertile." + +msgid "reduced_production" +msgstr "Die Region ist verwüstet, der Boden karg." + +msgid "feedback_no_astralregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" + +msgid "feedback_no_astralregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann hier kein Kontakt zur Astralwelt aufgenommen werden.\"" + +msgid "peace_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is so quiet and peaceful, nobody wants to attack anybody right now.\"" + +msgid "peace_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen.\"" + +msgid "peasantluck_success" +msgstr "\"The stork paid an unexpected visit to $if($eq($births,1),\"a peasant\",\"$int($births) peasants\").\"" + +msgid "peasantluck_success" +msgstr "\"$if($eq($births,1),\"Einen Bauern\",\"$int($births) Bauern\") besucht unverhofft der Storch.\"" + +msgid "astralshield_activate" +msgstr "\"$unit($unit) reactivates the astral protection shield in $region($region).\"" + +msgid "astralshield_activate" +msgstr "\"$unit($unit) reaktiviert den astralen Schutzschild in $region($region).\"" + +msgid "destroy_curse_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys the spell ($id) on ${target}.\"" + +msgid "destroy_curse_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört den Fluch ($id) auf ${target}.\"" + +msgid "analyse_region_fail" +msgstr "\"It appears to $unit($mage) that $region($region) is charmed, but no details have been revealed.\"" + +msgid "analyse_region_fail" +msgstr "\"$unit($mage) meint, dass auf $region($region) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "viewreality_effect" +msgstr "\"$unit($unit) manages to catch a glimpse of reality through the fog.\"" + +msgid "viewreality_effect" +msgstr "\"$unit($unit) gelingt es, durch die Nebel auf die Realität zu blicken.\"" + +msgid "use_speedsail" +msgstr "\"$unit($unit) sets a solar sail. The ship's speed is increased by $int($speed).\"" + +msgid "use_speedsail" +msgstr "\"$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht um $int($speed).\"" + +msgid "error21" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no information available for the request.\"" + +msgid "error21" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu gibt es keine Informationen.\"" + +msgid "error43" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this.\"" + +msgid "error43" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat so etwas nicht.\"" + +msgid "unknown_status" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown combat status.\"" + +msgid "unknown_status" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Kampfstatus.\"" + +msgid "error10" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That does not make much sense.\"" + +msgid "error10" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das macht wenig Sinn.\"" + +msgid "error32" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board our ship.\"" + +msgid "error32" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht an Bord unseres Schiffes.\"" + +msgid "error54" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade.\"" + +msgid "error54" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht handeln.\"" + +msgid "manufacture_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0).\"" + +msgid "manufacture_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren.\"" + +msgid "error177" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The familiar cannot cast this spell.\"" + +msgid "error177" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann der Vertraute nicht zaubern.\"" + +msgid "curseinfo::godcurseocean" +msgstr "\"This region was cursed by the gods. The sea is a foul cesspool, noxious gases rise from the deep, undead seamonsters attack all ships. Noone can live here for long. ($int36($id))\"" + +msgid "curseinfo::godcurseocean" +msgstr "\"Diese Region wurde von den Göttern verflucht. Das Meer ist eine ekelige Brühe, braunschwarze, stinkende Gase steigen aus den unergründlichen Tiefen hervor, und untote Seeungeheuer, Schiffe zerfressend und giftige grüne Galle geifernd, sind der Schrecken aller Seeleute, die diese Gewässer durchqueren. Niemand kann hier lange überleben. ($int36($id))\"" + +msgid "curseinfo::sparkle_4" +msgstr "\"A circle of shimmering lights surrounds $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_4" +msgstr "\"Ein schimmernder Lichterkranz umgibt $unit($unit). ($int36($id))\"" + +msgid "error84" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No name was supplied.\"" + +msgid "error84" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Name angegeben.\"" + +msgid "spellfail_noexpensives" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) have unbreakable commitments to their faction.\"" + +msgid "spellfail_noexpensives" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat unaufkündbare Bindungen an seine alte Partei.\"" + +msgid "error287" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We cannot transport this unit there.\"" + +msgid "error287" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin können wir die Einheit nicht transportieren.\"" + +msgid "error292" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot be taught.\"" + +msgid "error292" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichtet werden.\"" + +msgid "error95" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusions cannot guard a region.\"" + +msgid "error95" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusionen können eine Region nicht bewachen.\"" + +msgid "nr_stat_header" +msgstr "\"Statistics for $region($region):\"" + +msgid "nr_stat_header" +msgstr "\"Statistik für $region($region):\"" + +msgid "sp_strongwalls_effect" +msgstr "\"$unit($mage) causes the walls of $building($building) to glow in an eerie magic light.\"" + +msgid "sp_strongwalls_effect" +msgstr "\"$unit($mage) läßt die Mauern von $building($building) in einem unheimlichen magischen Licht erglühen.\"" + +msgid "curseinfo::orcish" +msgstr "\"$unit($unit) goes from one amourous adventure to another. ($int36($id))\"" + +msgid "curseinfo::orcish" +msgstr "\"$unit($unit) stürzt sich von einem amourösen Abenteuer ins nächste. ($int36($id))\"" + +msgid "target_region_not_empty" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are units in the target region.\"" + +msgid "target_region_not_empty" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Zielregion befinden sich noch Einheiten.\"" + +msgid "error173" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even in the Xontormia Library, this spell could not be found.\"" + +msgid "error173" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst in der Bibliothek von Xontormia konnte dieser Spruch nicht gefunden werden.\"" + +msgid "error138" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We do not have anything that could be demolished.\"" + +msgid "error138" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Uns gehört nichts, was man abreißen oder versenken könnte.\"" + +msgid "killsandhits" +msgstr "\"$unit($unit) hit $int($hits) times and killed $int($kills) enemies.\"" + +msgid "killsandhits" +msgstr "\"$unit($unit) erzielte $int($hits) Treffer und tötete $int($kills) Gegner.\"" + +msgid "shapeshift_effect" +msgstr "\"$unit($mage) makes $unit($target) appear as $race($race,$unit.size($target)).\"" + +msgid "shapeshift_effect" +msgstr "\"$unit($mage) läßt $unit($target) als $race($race,$unit.size($target)) erscheinen.\"" + +msgid "error248" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has to be 10 turns old.\"" + +msgid "error248" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 10 Runden alt sein.\"" + +msgid "followfail" +msgstr "\"$unit($follower) could not follow $unit($unit).\"" + +msgid "followfail" +msgstr "\"$unit($follower) konnte $unit($unit) nicht folgen.\"" + +msgid "followdetect" +msgstr "\"$unit($follower) followed $unit($unit).\"" + +msgid "followdetect" +msgstr "\"$unit($follower) ist $unit($unit) gefolgt.\"" + +msgid "unitnotfound_id" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit $id could not be located.\"" + +msgid "unitnotfound_id" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit $id wurde nicht gefunden.\"" + +msgid "error244" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already named.\"" + +msgid "error244" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat schon einen Namen.\"" + +msgid "use_tacticcrystal" +msgstr "\"$unit($unit) uses a dreameye in $region($region).\"" + +msgid "use_tacticcrystal" +msgstr "\"$unit($unit) benutzt in $region($region) ein Traumauge.\"" + +msgid "error134" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown report option.\"" + +msgid "error134" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Meldungs-Option.\"" + +msgid "error319" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has been in combat.\"" + +msgid "error319" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie an einem Kampf teilgenommen hat.\"" + +msgid "analyse_building_noage" +msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_building_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "sink_lost_msg" +msgstr "\"$int($amount) people of $unit($unit) drown.$if($isnull($region),\"\",\" The unit makes it to $region($region).\")\"" + +msgid "sink_lost_msg" +msgstr "\"$int($amount) Personen von $unit($unit) ertrinken.$if($isnull($region),\"\",\" Die Einheit rettet sich nach $region($region).\")\"" + +msgid "error130" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIC SPHERE [1-5].\"" + +msgid "error130" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIEGEBIET [1-5].\"" + +msgid "error240" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to be followed?\"" + +msgid "error240" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff verfolgt werden?\"" + +msgid "travelthru_trail" +msgstr "$trailto($region)" + +msgid "travelthru_trail" +msgstr "$trailto($region)" + +msgid "error315" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not all ingredients present.\"" + +msgid "error315" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht alle Zutaten vorhanden.\"" + +msgid "volcanooutbreak" +msgstr "\"The volcano in $region($regionv) erupts. The lava devastates $region($regionn).\"" + +msgid "volcanooutbreak" +msgstr "\"Der Vulkan in $region($regionv) bricht aus. Die Lavamassen verwüsten $region($regionn).\"" + +msgid "seduce_effect_0" +msgstr "\"$unit($unit) gives $unit($mage) $resources($items).\"" + +msgid "seduce_effect_0" +msgstr "\"$unit($unit) schenkt $unit($mage) $resources($items).\"" + +msgid "error311" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit can not change shape.\"" + +msgid "error311" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht verwandeln.\"" + +msgid "error201" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Race and target unit have not been supplied.\"" + +msgid "error201" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Rasse und Zieleinheit wurden vergessen.\"" + +msgid "newbieimmunity" +msgstr "\"Your faction is immune against assaults for $int($turns) more weeks.\"" + +msgid "newbieimmunity" +msgstr "\"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe.\"" + +msgid "curseinfo::auraboost_0" +msgstr "\"Powerful magical energies are pulsing through $unit($unit). ($int36($id))\"" + +msgid "curseinfo::auraboost_0" +msgstr "\"$unit($unit) fühlt sich von starken magischen Energien durchströmt. ($int36($id))\"" + +msgid "curseinfo::drought" +msgstr "\"This region was hit by a drought. ($int36($id))\"" + +msgid "curseinfo::drought" +msgstr "\"In dieser Gegend herrscht eine Dürre. ($int36($id))\"" + +msgid "race_cantwork" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot work.\"" + +msgid "race_cantwork" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht arbeiten.\"" + +msgid "stealdetect" +msgstr "\"$unit($unit) feels watched.\"" + +msgid "stealdetect" +msgstr "\"$unit($unit) fühlt sich beobachtet.\"" + +msgid "stealaura_detect" +msgstr "\"$unit($unit) feels the powers of magic fade and loses $int($aura) aura.\"" + +msgid "stealaura_detect" +msgstr "\"$unit($unit) fühlt seine magischen Kräfte schwinden und verliert $int($aura) Aura.\"" + +msgid "missing_message" +msgstr "\"Internal Error: Message '$name' is undefined.\"" + +msgid "missing_message" +msgstr "\"Interner Fehler: Meldung '$name' nicht definiert.\"" + +msgid "analyse_ship_fail" +msgstr "\"It appears to $unit($mage) that $ship($ship) is charmed, but no details have been revealed.\"" + +msgid "analyse_ship_fail" +msgstr "\"$unit($mage) meint, dass auf $ship($ship) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "income_magic" +msgstr "\"$unit($unit) earns $int($amount) silver through simple magical services in $region($region).\"" + +msgid "income_magic" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Zauberei.\"" + +msgid "stealaura_success" +msgstr "\"$unit($mage) draws $int($aura) aura from $unit($target).\"" + +msgid "stealaura_success" +msgstr "\"$unit($mage) entzieht $unit($target) $int($aura) Aura.\"" + +msgid "error_flying_ship_too_big" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) is too bulky to fly.\"" + +msgid "error_flying_ship_too_big" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) ist zu groß, um fliegen zu können.\"" + +msgid "familiar_describe" +msgstr "\"$unit($mage) summons a familiar. $race($race, 0) can learn ${skills}.\"" + +msgid "familiar_describe" +msgstr "\"$unit($mage) ruft einen Vertrauten. $race($race, 0) können $skills lernen.\"" + +msgid "wind_effect" +msgstr "\"$unit($mage) asks the gods of wind and water on behalf of the $ship($ship).\"" + +msgid "wind_effect" +msgstr "\"$unit($mage) erfleht den Segen der Götter des Windes und des Wassers für $ship($ship).\"" + +msgid "wormhole_requirements" +msgstr "\"$unit($unit) cannot travel through the wormhole in $region($region) because the unit is either too big or has restricted skills.\"" + +msgid "wormhole_requirements" +msgstr "\"$unit($unit) kann in $region($region) nicht durch das Wurmloch reisen, da die Einheit entweder zu gross ist oder teure Talente besitzt.\"" + +msgid "cast_escape_effect" +msgstr "\"$unit($mage) casts $spell($spell): The noise of the battle dies down and the mage is able to slip away unharmed.\"" + +msgid "cast_escape_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): Das Kampfgetümmel erstirbt und er kann unbehelligt seines Weges ziehen.\"" + +msgid "volcanostartsmoke" +msgstr "\"Columns of smoke are released by the volcano of $region($region).\"" + +msgid "volcanostartsmoke" +msgstr "\"Aus dem Vulkankrater von $region($region) steigt plötzlich Rauch.\"" + +msgid "nr_insectfall" +msgstr "It is the last week before winter in which insects can still recruit." + +msgid "nr_insectfall" +msgstr "Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können." + +msgid "error296" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Trees won't grow here.\"" + +msgid "error296" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier werden niemals Bäume wachsen.\"" + +msgid "error186" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only works on dry land.\"" + +msgid "error186" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur auf Land gelegt werden.\"" + +msgid "error51" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" + +msgid "error51" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" + +msgid "error73" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungry units cannot give anybody away.\"" + +msgid "error73" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine hungernde Einheit kann niemanden weggeben.\"" + +msgid "error40" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit did not contact us.\"" + +msgid "error40" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "error182" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot leave in this direction.\"" + +msgid "error182" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann in diese Richtung nicht ablegen.\"" + +msgid "analyse_ship_nospell" +msgstr "\"It appears to $unit($mage) that $ship($ship) is not charmed.\"" + +msgid "analyse_ship_nospell" +msgstr "\"$unit($mage) meint, dass auf $ship($ship) kein Zauber liegt.\"" + +msgid "birthday_firework" +msgstr "\"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region).\"" + +msgid "birthday_firework" +msgstr "\"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "error257" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid locale.\"" + +msgid "error257" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Locale.\"" + +msgid "error147" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of the largest castle in the region.\"" + +msgid "error147" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht Burgherr der größten Burg in der Region.\"" + +msgid "unknowndirection" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Direction '$dirname' was not recognized.\"" + +msgid "unknowndirection" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung '$dirname' wurde nicht erkannt.\"" + +msgid "error143" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is on board a ship.\"" + +msgid "error143" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf einem Schiff.\"" + +msgid "spellfail_onocean" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast while you are on the ocean.\"" + +msgid "spellfail_onocean" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf hoher See gezaubert werden.\"" + +msgid "error253" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This magician is not strong enough to be sacrificed to the gods.\"" + +msgid "error253" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier ist nicht stark genug, sich den Göttern zu opfern.\"" + +msgid "battle_loot" +msgstr "\"$unit($unit) collects $int($amount) $resource($item,$amount).\"" + +msgid "battle_loot" +msgstr "\"$unit($unit) erbeutet $int($amount) $resource($item,$amount).\"" + +msgid "error209" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" + +msgid "error209" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" + +msgid "summonundead_effect_0" +msgstr "\"$unit($mage) cannot summon any undead in $region($region).\"" + +msgid "summonundead_effect_0" +msgstr "\"$unit($mage) kann in $region($region) keine Untoten rufen.\"" + +msgid "givedumb" +msgstr "\"$unit($unit) administers $int($amount) duncebuns to $unit($recipient).\"" + +msgid "givedumb" +msgstr "\"$unit($unit) gibt $int($amount) Dumpfbackenbrot an $unit($recipient).\"" + +msgid "error205" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in an ocean region.\"" + +msgid "error205" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber gelingt nur in einer Ozeanregion.\"" + +msgid "error210" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is too dangerous to fly the ship in the storm.\"" + +msgid "error210" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen.\"" + +msgid "eatpeasants" +msgstr "\"$unit($unit) ate $int($amount) peasants.\"" + +msgid "eatpeasants" +msgstr "\"$unit($unit) verspeiste $int($amount) Bauern.\"" + +msgid "error320" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot guard the region because it is trying to flee.\"" + +msgid "error320" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht bewachen, da sie versucht zu fliehen.\"" + +msgid "dissolve_units_2" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\"" + +msgid "dissolve_units_2" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"wurde zum Baum\", \"wurden zu Bäumen\").\"" + +msgid "sp_eternizewall_effect" +msgstr "\"$unit($mage) performs a ritual that binds the magical forces of $region($region) into the walls of $building($building).\"" + +msgid "sp_eternizewall_effect" +msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde von $region($region) in die Mauern von $building($building).\"" + diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po new file mode 100644 index 000000000..3a9ee2ed0 --- /dev/null +++ b/res/translations/messages.en.po @@ -0,0 +1,5595 @@ +msgid "homestone_effect" +msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\"" + +msgid "homestone_effect" +msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\"" + +msgid "nogive_reserved" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has this item, but all $int($reservation) $resource($resource,$reservation) are reserved.\"" + +msgid "nogive_reserved" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand zwar, aber sämtliche $int($reservation) $resource($resource,$reservation) sind reserviert.\"" + +msgid "recruit" +msgstr "\"$unit($unit) in $region($region) recruits $int($amount) of $int($want) people.\"" + +msgid "recruit" +msgstr "\"$unit($unit) in $region($region) rekrutiert $int($amount) von $int($want) Personen.\"" + +msgid "sp_dreamreading_effect" +msgstr "\"$unit($mage) is lost in the dreams of $unit($unit) and gets a glimps into $region($region).\"" + +msgid "sp_dreamreading_effect" +msgstr "\"$unit($mage) verliert sich in die Träume von $unit($unit) und erhält einen Eindruck von $region($region).\"" + +msgid "analyse_ship_age" +msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for, about $int($months) more weeks.\"" + +msgid "analyse_ship_age" +msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "curseinfo::sparkle_2" +msgstr "\"$unit($unit) is haunted by terrbile nightmares. ($int36($id))\"" + +msgid "curseinfo::sparkle_2" +msgstr "\"$unit($unit) wird von bösen Alpträumen geplagt. ($int36($id))\"" + +msgid "absorbpeasants" +msgstr "\"$int($amount) peasants become $race($race,0) and join the ranks of $unit($unit).\"" + +msgid "absorbpeasants" +msgstr "\"$int($amount) Bauern werden zu $race($race,0) und schliessen sich $unit($unit) an.\"" + +msgid "unholypower_effect" +msgstr "\"$unit($mage) tranforms $unit($target) to $race($race,0).\"" + +msgid "unholypower_effect" +msgstr "\"$unit($mage) verwandelt $unit($target) in $race($race,0).\"" + +msgid "give_person" +msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to $unit($target).\"" + +msgid "give_person" +msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an $unit($target).\"" + +msgid "rust_effect_2" +msgstr "\"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty.\"" + +msgid "rust_effect_2" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde. Der magischen Regen lässt alles Eisen rosten.\"" + +msgid "heroes_maxed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction already has $int($count) of $int($max) heroes.\"" + +msgid "heroes_maxed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits $int($count) von $int($max) Helden.\"" + +msgid "error_build_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires a skill of at least $int($value) to build.\"" + +msgid "error_build_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um das zu bauen, braucht man ein Talent von mindestens $int($value).\"" + +msgid "analyse_building_age" +msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" + +msgid "analyse_building_age" +msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "curseinfo::auraboost_1" +msgstr "\"$unit($unit) finds it difficult to gather its magical energies. ($int36($id))\"" + +msgid "curseinfo::auraboost_1" +msgstr "\"$unit($unit) hat Schwierigkeiten seine magischen Energien zu sammeln. ($int36($id))\"" + +msgid "harbor_trade" +msgstr "\"$unit($unit) received $resources($items) from the $ship($ship).\"" + +msgid "harbor_trade" +msgstr "\"$unit($unit) erhielt $resources($items) von der $ship($ship).\"" + +msgid "reduce_spell" +msgstr "\"In $region($region), anti-magic from $unit($self) reduces the effect of $unit($mage)'s spell.\"" + +msgid "reduce_spell" +msgstr "\"$unit($self) schwächt in $region($region) einen Zauber von $unit.dative($mage) durch Antimagie ab.\"" + +msgid "raised" +msgstr "\"$unit($unit) breeds $int($amount) horses.\"" + +msgid "raised" +msgstr "\"$unit($unit) züchtet $int($amount) Pferde.\"" + +msgid "speed_time_effect" +msgstr "\"In $region($region), $unit($unit) bends time for $int($amount) men.\"" + +msgid "speed_time_effect" +msgstr "\"In $region($region) dehnt $unit($unit) die Zeit für $int($amount) Personen.\"" + +msgid "error199" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a familiar.\"" + +msgid "error199" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Vertrauten.\"" + +msgid "error195" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" + +msgid "error195" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" + +msgid "healall" +msgstr "\"Life itself touches the world and all beings are healed.\"" + +msgid "healall" +msgstr "\"Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt.\"" + +msgid "build_required" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required).\"" + +msgid "build_required" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required).\"" + +msgid "newbie_immunity_error" +msgstr "\"A faction must be at least $int($turns) weeks old before it can be attacked or stolen from.\"" + +msgid "newbie_immunity_error" +msgstr "\"Eine Partei muß mindestens $int($turns) Wochen alt sein, bevor sie angegriffen oder bestohlen werden kann.\"" + +msgid "error191" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in forests.\"" + +msgid "error191" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in Wäldern.\"" + +msgid "error156" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many alchemists in the faction.\"" + +msgid "error156" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Alchemisten in der Partei.\"" + +msgid "error266" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only functions in the entry hall.\"" + +msgid "error266" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der Eingangshalle.\"" + +msgid "error81" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must first guard the region.\"" + +msgid "error81" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit muß zuerst die Region bewachen.\"" + +msgid "hornofpeace_u_nosuccess" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No region could be pacified.\"" + +msgid "hornofpeace_u_nosuccess" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine Region konnte befriedet werden.\"" + +msgid "error70" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by a non-allied faction.\"" + +msgid "error70" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von Nichtalliierten bewacht.\"" + +msgid "error92" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no normal forest in this region.\"" + +msgid "error92" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keinen normalen Wald.\"" + +msgid "error262" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot have any more wyrms.\"" + +msgid "error262" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei kann keine weiteren Wyrme besitzen.\"" + +msgid "massive_overload" +msgstr "\"The $ship($ship) is massively overloaded and is damaged heavily.\"" + +msgid "massive_overload" +msgstr "\"Die $ship($ship) ist zu stark überladen und wird stark beschädigt.\"" + +msgid "curseinfo::shipspeedup" +msgstr "\"The winds seem to favor this ship. ($int36($id))\"" + +msgid "curseinfo::shipspeedup" +msgstr "\"Die Winde scheinen dieses Schiff besonders zu beguenstigen. ($int36($id))\"" + +msgid "error152" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit jumps over board and drowns.\"" + +msgid "error152" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit springt über Bord und ertrinkt.\"" + +msgid "error108" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No herbs could be found.\"" + +msgid "error108" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es sind keine Kräuter zu finden.\"" + +msgid "spellfail::contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit $unit($target) did not contact us.\"" + +msgid "spellfail::contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "error214" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit is not a magician.\"" + +msgid "error214" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist kein Magier.\"" + +msgid "patzer6" +msgstr "\"A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'\"" + +msgid "patzer6" +msgstr "\"Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'\"" + +msgid "lucky_item" +msgstr "\"$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount).\"" + +msgid "lucky_item" +msgstr "\"$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount).\"" + +msgid "error104" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This metal can be excavated only in a mine.\"" + +msgid "error104" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Metall kann nur in einem Bergwerk abgebaut werden.\"" + +msgid "error100" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here is a skilled ship builder.\"" + +msgid "error100" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier ist gelernter Schiffbauer.\"" + +msgid "curseinfo::gooddream" +msgstr "\"The people in this region have sweet dreams. ($int36($id))\"" + +msgid "curseinfo::gooddream" +msgstr "\"Die Leute haben schöne Träume. ($int36($id))\"" + +msgid "error2" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot guard off shore.\"" + +msgid "error2" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf hoher See kann man nicht bewachen.\"" + +msgid "nr_stat_maxentertainment" +msgstr "\"entertainment: max. $int($max) silver\"" + +msgid "nr_stat_maxentertainment" +msgstr "\"Unterhaltung: max. $int($max) Silber\"" + +msgid "blessedstonecircle_effect" +msgstr "\"$unit($mage) blesses $building($building).\"" + +msgid "blessedstonecircle_effect" +msgstr "\"$unit($mage) weiht $building($building).\"" + +msgid "income_tax_reduced" +msgstr "\"$unit($unit) collects taxes of$if($eq($wanted,$amount),\"\",\" only\") $int($amount) silver$if($eq($wanted,$amount),\"\",\" instead of $int($wanted) silver\") \") in $region($region).\"" + +msgid "income_tax_reduced" +msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber ein.\"" + +msgid "curseinfo::holyground" +msgstr "\"The undead turn away from this region. ($int36($id))\"" + +msgid "curseinfo::holyground" +msgstr "\"Untote schrecken vor dieser Region zurück. ($int36($id))\"" + +msgid "changemail" +msgstr "\"Address has been changed to '$value'.\"" + +msgid "changemail" +msgstr "\"Die Reportadresse wurde auf ${value} geändert.\"" + +msgid "song_of_peace_effect_0" +msgstr "\"The marvelous singing of $unit($mage) enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" + +msgid "song_of_peace_effect_0" +msgstr "\"Die Gesangskunst von $unit($mage) begeistert die Leute. Die friedfertige Stimmung des Lieds überträgt sich auf alle Zuhörer. Einige werfen ihre Waffen weg.\"" + +msgid "emptyeog" +msgstr "\"There is no more laen left in $region($region).\"" + +msgid "emptyeog" +msgstr "\"Die Laenader in $region($region) ist erschöpft.\"" + +msgid "entrise" +msgstr "\"In $region($region), the Lords of the Trees have risen.\"" + +msgid "entrise" +msgstr "\"In $region($region) erschienen die Herren der Bäume.\"" + +msgid "victory_murder_cfulfilled" +msgstr "\"Attention: $faction($faction) has fulfilled the victory condition and will be declared winner in $if($eq($remain,1),\"one week\",\"$int($remain) weeks\").\"" + +msgid "victory_murder_cfulfilled" +msgstr "\"Achtung: $faction($faction) hat die Siegbedingungen erfüllt und wird in $if($eq($remain,1),\"einer Woche\",\"$int($remain) Wochen\") zum Sieger erklärt werden.\"" + +msgid "headache_effect_1" +msgstr "\"$unit($unit) has a splitting headache and can hardly remember last week. Except that it all started in the tavern...\"" + +msgid "headache_effect_1" +msgstr "\"$unit($unit) hat höllische Kopfschmerzen und kann sich an die vergangene Woche nicht mehr erinnern. Nur noch daran, wie alles mit einer fröhlichen Feier in irgendeiner Taverne anfing....\"" + +msgid "feedback_no_contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us.\"" + +msgid "feedback_no_contact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "sailforbiddendir" +msgstr "\"The crew of the $ship($ship) refuses to travel to the $direction($direction).\"" + +msgid "sailforbiddendir" +msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen.\"" + +msgid "receive" +msgstr "\"$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit).\"" + +msgid "receive" +msgstr "\"$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit).\"" + +msgid "missing_feedback" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Internal Error: Message '$name' is undefined.\"" + +msgid "missing_feedback" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Interner Fehler: Meldung '$name' nicht definiert.\"" + +msgid "thiefdiscover" +msgstr "\"$unit($target) caught $unit($unit) in attempted theft.\"" + +msgid "thiefdiscover" +msgstr "\"$unit($target) ertappte $unit($unit) beim versuchten Diebstahl.\"" + +msgid "museumgiveback" +msgstr "\"In $region($region), $unit($unit) received $resources($items) from $unit($sender)\"" + +msgid "museumgiveback" +msgstr "\"In $region($region) erhielt $unit($unit) von $unit.dative($sender) $resources($items)\"" + +msgid "curseinfo::sparkle_17" +msgstr "\"A dark and mysterious fairy appears before $unit($unit). She is of bewitching beauty. ($int36($id))\"" + +msgid "curseinfo::sparkle_17" +msgstr "\"Eine dunkle Fee erscheint $unit($unit) im Schlaf. Sie ist von schauriger Schönheit. ($int36($id))\"" + +msgid "caldera_handle_0" +msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" + +msgid "caldera_handle_0" +msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" + +msgid "researchherb_none" +msgstr "\"$unit($unit) could not find any herbs in $region($region).\"" + +msgid "researchherb_none" +msgstr "\"$unit($unit) in $region($region) kann keine Kräuter finden.\"" + +msgid "moveblockedbyguard" +msgstr "\"$unit($unit) was kept in $region($region) by $unit($guard).\"" + +msgid "moveblockedbyguard" +msgstr "\"$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten.\"" + +msgid "cast_frighten_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were intimidated.\"" + +msgid "cast_frighten_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden eingeschüchtert.\"" + +msgid "curseinfo::Feuerwand" +msgstr "A wall of fire blocks entry and exit. ($int36($id))" + +msgid "curseinfo::Feuerwand" +msgstr "Eine Feuerwand blockiert die Ein- und Ausreise. ($int36($id))" + +msgid "renamed_building_notseen" +msgstr "\"$building($building) in $region($region) received a nickname.\"" + +msgid "renamed_building_notseen" +msgstr "\"$building($building) in $region($region) bekommt einen Spitznamen.\"" + +msgid "heroes_race" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be heroes.\"" + +msgid "heroes_race" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können keine Helden erwählen.\"" + +msgid "summon_effect" +msgstr "\"$unit($mage) summons $int($amount) $race($race,$amount).\"" + +msgid "summon_effect" +msgstr "\"$unit($mage) beschwört $int($amount) $race($race,$amount).\"" + +msgid "error28" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasant morale is low.\"" + +msgid "error28" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern sind schlecht gelaunt.\"" + +msgid "error39" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has not yet learned espionage.\"" + +msgid "error39" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Spionage gelernt.\"" + +msgid "destroy_magic_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician could not destroy any curse.\"" + +msgid "destroy_magic_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier konnte keinen Fluch zerstören.\"" + +msgid "cast_auraleak_effect" +msgstr "\"$unit($mage) in $region($region) caused a tear in the fabric of magic, that sucked all magical energies out of the region.\"" + +msgid "cast_auraleak_effect" +msgstr "\"$unit($mage) rief in $region($region) einen Riss in dem Gefüge der Magie hervor, der alle magische Kraft aus der Region riss.\"" + +msgid "newbie_info_game" +msgstr "Remember to send your orders to $email with the subject ${subject}." + +msgid "newbie_info_game" +msgstr "Bitte denke daran, deine Befehle mit dem Betreff $subject an $email zu senden." + +msgid "mob_warning" +msgstr "\"An angry mob forms and hunts practitioners of the dark arts.\"" + +msgid "mob_warning" +msgstr "\"Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier.\"" + +msgid "dissolve_units_5" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) disappeared in the night.\"" + +msgid "dissolve_units_5" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verschwand\", \"verschwanden\") über Nacht.\"" + +msgid "fleescared" +msgstr "\"$int($amount) peasants fled in fear of $unit($unit).\"" + +msgid "fleescared" +msgstr "\"$int($amount) Bauern flohen aus Furcht vor $unit($unit).\"" + +msgid "drought_effect_3" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds. The drought permanently alters the region.\"" + +msgid "drought_effect_3" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt. Die Dürre verändert die Region für immer.\"" + +msgid "spellfail_pump" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Despite intense questioning, $unit($target) did not have anything to tell about $region($tregion).\"" + +msgid "spellfail_pump" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wusste trotz intensivem Verhör nichts über $region($tregion) zu berichten.\"" + +msgid "maintenance_nowork" +msgstr "\"$building($building) was nonfunctional because upkeep could not be paid at the beginning of the week.\"" + +msgid "maintenance_nowork" +msgstr "\"$building($building) hat diese Woche nicht funktioniert, da zu Beginn der Woche der Unterhalt nicht gezahlt werden konnte.\"" + +msgid "error_spell_on_flying_ship" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is far too dangerous to put this spell on the flying ship $ship($ship).\"" + +msgid "error_spell_on_flying_ship" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, diesen Zauber auf das fliegende Schiff $ship($ship) zu legen.\"" + +msgid "error275" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings cannot be built here.\"" + +msgid "error275" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Gebäude errichten.\"" + +msgid "error165" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit.\"" + +msgid "error165" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht.\"" + +msgid "siege_catapults" +msgstr "\"$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction.\"" + +msgid "siege_catapults" +msgstr "\"$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an.\"" + +msgid "curseinfo::magicstreet" +msgstr "\"The roads are extremely dry and well-kept. ($int36($id))\"" + +msgid "curseinfo::magicstreet" +msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))\"" + +msgid "curseinfo::sparkle_13" +msgstr "\"A group of vultures circles above $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_13" +msgstr "\"Über $unit($unit) zieht eine Gruppe Geier ihre Kreise. ($int36($id))\"" + +msgid "error161" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" + +msgid "error161" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit besitzt den Trank nicht.\"" + +msgid "error271" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot attack here.\"" + +msgid "error271" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden angreifen.\"" + +msgid "renamed_faction_notseen" +msgstr "\"Your faction received a nickname.\"" + +msgid "renamed_faction_notseen" +msgstr "\"Die Partei bekommt einen Spitznamen.\"" + +msgid "error227" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A herbalism skill of 7 or higher is required.\"" + +msgid "error227" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht ein Einheit mindestens Kräuterkunde 7.\"" + +msgid "error117" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot produce that.\"" + +msgid "error117" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann das nicht herstellen.\"" + +msgid "sp_depression_effect" +msgstr "\"$unit($mage) causes great sadness among the peasants of $region($region).\"" + +msgid "sp_depression_effect" +msgstr "\"$unit($mage) sorgt in $region($region) für Trübsal unter den Bauern.\"" + +msgid "sp_mindblast_effect" +msgstr "\"$unit($mage) casts $spell($spell). $int($amount) warriors lose their memories, $int($dead) were killed.\"" + +msgid "sp_mindblast_effect" +msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren Erinnerungen, $int($dead) wurden getötet.\"" + +msgid "error113" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Item to be handed over was not supplied.\"" + +msgid "error113" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nichts angegeben, was wir übergeben sollen.\"" + +msgid "undeadrise" +msgstr "\"The dead rise from their graves in $region($region).\"" + +msgid "undeadrise" +msgstr "\"In $region($region) erhoben sich die Toten aus den Gräbern.\"" + +msgid "reanimate_effect_0" +msgstr "\"$unit($mage) begins a ritual of resurrection. $int($amount) warriors rise from the dead.\"" + +msgid "reanimate_effect_0" +msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung. $int($amount) Krieger stehen von den Toten auf.\"" + +msgid "error223" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot guard.\"" + +msgid "error223" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht bewachen.\"" + +msgid "sp_confusion_effect_1" +msgstr "\"$unit($mage) begins a mysterious chant. Great confusion sweeps through the ranks of the enemy.\"" + +msgid "sp_confusion_effect_1" +msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" + +msgid "itemcloak" +msgstr "\"$unit($mage) shrouds the equipment of $unit($target) in shadows.\"" + +msgid "itemcloak" +msgstr "\"$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($target).\"" + +msgid "error5" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" + +msgid "error5" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" + +msgid "tactics_lost" +msgstr "\"$unit($unit) lured the enemy into an ambush.\"" + +msgid "tactics_lost" +msgstr "\"$unit($unit) konnte dem Gegner eine Falle stellen.\"" + +msgid "error_lowstealth" +msgstr "\"$unit($unit) in $region($region): '$order($command)' -The unit cannot hide that well.\"" + +msgid "error_lowstealth" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht so gut tarnen.\"" + +msgid "chaosgate_effect_1" +msgstr "\"$unit($mage) opens a chaos gate.\"" + +msgid "chaosgate_effect_1" +msgstr "\"$unit($mage) öffnet ein Chaostor.\"" + +msgid "shipsail" +msgstr "\"The $ship($ship) sails from $region($from) to $region($to).\"" + +msgid "shipsail" +msgstr "\"Die $ship($ship) segelt von $region($from) nach $region($to).\"" + +msgid "magicresistance_unit" +msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" + +msgid "magicresistance_unit" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" + +msgid "destroy_partial" +msgstr "\"$unit($unit) tears down parts of $building($building).\"" + +msgid "destroy_partial" +msgstr "\"$unit($unit) reißt einen Teil von $building($building) ein.\"" + +msgid "nr_stat_morale" +msgstr "\"peasant morale: $int($morale)\"" + +msgid "nr_stat_morale" +msgstr "\"Moral der Bauern: $int($morale)\"" + +msgid "changemail_invalid" +msgstr "\"Address not changed, '$value' is an invalid email.\"" + +msgid "changemail_invalid" +msgstr "\"Die Reportadresse wurde nicht geändert, '${value}' ist keine gültige email.\"" + +msgid "block_spell" +msgstr "\"In $region($region), anti-magic from $unit($self) blocks the spell of $unit($mage).\"" + +msgid "block_spell" +msgstr "\"Antimagie von $unit.dative($self) blockiert in $region($region) einen Zauber von $unit.dative($mage).\"" + +msgid "enter_overload" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot go aboard, the ship would be overloaded.\"" + +msgid "enter_overload" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen, da sie das Schiff überladen würde.\"" + +msgid "herbfound" +msgstr "\"$unit($unit) in $region($region) finds $int($amount) $resource($herb,$amount).\"" + +msgid "herbfound" +msgstr "\"$unit($unit) in $region($region) findet $int($amount) $resource($herb,$amount).\"" + +msgid "maintenance" +msgstr "\"$unit($unit) pays the maintenance for $building($building).\"" + +msgid "maintenance" +msgstr "\"$unit($unit) bezahlt den Unterhalt von $building($building).\"" + +msgid "heroes_cost" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has $int($have) of $int($cost) silver required.\"" + +msgid "heroes_cost" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nur $int($have) von $int($cost) benötigtem Silber.\"" + +msgid "error36" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this item.\"" + +msgid "error36" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand nicht.\"" + +msgid "error58" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know how to entertain.\"" + +msgid "error58" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nicht, wie man gaukelt.\"" + +msgid "magiccreate_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) creates $int($amount) ${object}.\"" + +msgid "magiccreate_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) erschafft $int($amount) ${object}.\"" + +msgid "error25" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevents this from happening.\"" + +msgid "error25" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Fluch verhindert das.\"" + +msgid "error47" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our allies.\"" + +msgid "error47" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit uns alliiert.\"" + +msgid "error69" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region is guarded.\"" + +msgid "error69" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird bewacht.\"" + +msgid "overrun_by_iceberg" +msgstr "\"The $ship($ship) has been damaged by a collision with an iceberg.\"" + +msgid "overrun_by_iceberg" +msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg beschädigt.\"" + +msgid "song_of_peace_effect_1" +msgstr "\"A wondrous song fills the air and enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" + +msgid "song_of_peace_effect_1" +msgstr "\"In der Luft liegt ein wunderschönes Lied, dessen friedfertiger Stimmung sich niemand entziehen kann. Einige Leute werfen sogar ihre Waffen weg.\"" + +msgid "error99" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not want to be transported.\"" + +msgid "error99" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit will nicht transportiert werden.\"" + +msgid "disrupt_astral" +msgstr "\"$unit($unit) is sent from the astral plain to $region($region).\"" + +msgid "disrupt_astral" +msgstr "\"$unit($unit) wird aus der astralen Ebene nach $region($region) geschleudert.\"" + +msgid "curseinfo::badmagicresistancezone" +msgstr "\"The magical resistance of some units in this region was weakened. ($int36($id))\"" + +msgid "curseinfo::badmagicresistancezone" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde geschwächt. ($int36($id))\"" + +msgid "error288" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - How much shall we tear down?\"" + +msgid "error288" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wieviel sollen wir einreißen?\"" + +msgid "curseinfo::badlearn" +msgstr "\"People in this region suffer from insomnia. ($int36($id))\"" + +msgid "curseinfo::badlearn" +msgstr "\"Alle Leute in der Region haben Schlafstörungen. ($int36($id))\"" + +msgid "error_nopeasants" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no peasants in this region.\"" + +msgid "error_nopeasants" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Bauern.\"" + +msgid "spellregionresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region could not be charmed.\"" + +msgid "spellregionresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region konnte nicht verzaubert werden.\"" + +msgid "curseinfo::calmmonster" +msgstr "This enchantment appears to make the unit well-disposed towards a particular faction. ($int36($id))" + +msgid "curseinfo::calmmonster" +msgstr "Dieser Beeinflussungszauber scheint die Einheit einem ganz bestimmten Volk wohlgesonnen zu machen. ($int36($id))" + +msgid "error169" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know this spell.\"" + +msgid "error169" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Zauber kennt die Einheit nicht.\"" + +msgid "error174" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only makes sense in combat.\"" + +msgid "error174" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber ist nur im Kampf sinnvoll.\"" + +msgid "error284" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Undead can only be affected once by this spell.\"" + +msgid "error284" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein.\"" + +msgid "growtree_effect" +msgstr "$if($isnull($mage),\"An unknown magician\",$unit($mage)) created a holy forest of $int($amount) young trees." + +msgid "growtree_effect" +msgstr "$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen." + +msgid "error280" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muss erst die Spezialeigenschaft erworben werden.\"" + +msgid "curseinfo::shipnodrift_0" +msgstr "\"A silvery shimmer surrounds the $ship($ship). ($int36($id))\"" + +msgid "curseinfo::shipnodrift_0" +msgstr "\"Ein silberner Schimmer umgibt die $ship($ship). ($int36($id))\"" + +msgid "error170" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasants did not accept this gracious gift.\"" + +msgid "error170" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern nehmen dieses großzügige Geschenk nicht an.\"" + +msgid "dumbeffect" +msgstr "\"$unit($unit) eats a duncebuns and forgets $int($weeks) weeks worth of $skill($skill).\"" + +msgid "dumbeffect" +msgstr "\"$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill).\"" + +msgid "renamed_ship_seen" +msgstr "\"$ship($ship) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_ship_seen" +msgstr "\"Die $ship($ship) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "error126" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sell this.\"" + +msgid "error126" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht verkaufen.\"" + +msgid "error236" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not finished yet.\"" + +msgid "error236" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist noch nicht fertig gebaut.\"" + +msgid "error_unit_size" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units may not have more than $int($maxsize) members.\"" + +msgid "error_unit_size" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten dürfen nicht mehr als $int($maxsize) Personen enthalten.\"" + +msgid "error232" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This type of unit cannot enter a building.\"" + +msgid "error232" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Gebäude betreten.\"" + +msgid "error122" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can only breed horses in a stable.\"" + +msgid "error122" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde kann man nur in einer Pferdezucht züchten.\"" + +msgid "error307" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We snotlings is too stupid fer dat!\"" + +msgid "error307" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Snotlinge sind zu dumm, um auf den Feldern zu arbeiten.\"" + +msgid "godcurse_destroy_ship" +msgstr "\"Her sailors sick from the poisened ocean, planks, rudder und sails corroded by the waters of the cursed ocean, the $ship($ship) finally succumbs to her destiny and sinks.\"" + +msgid "godcurse_destroy_ship" +msgstr "\"Die Mannschaft krank vom vergifteten Wasser, Planken, Ruder und Segel zerfressen von den Wassern des verfluchten Meeres, ergibt sich die $ship($ship) in ihr Schicksal und sinkt.\"" + +msgid "too_many_units_in_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A faction may not consist of more than $int($allowed) units.\"" + +msgid "too_many_units_in_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei darf nicht aus mehr als $int($allowed) Einheiten bestehen.\"" + +msgid "entermaelstrom" +msgstr "\"The $ship($ship) sails into the maelstrom of $region($region) and takes $int($damage) damage$if($sink,\". The ship sinks\",\"\").\"" + +msgid "entermaelstrom" +msgstr "\"Die $ship($ship) fährt in den Mahlstrom von $region($region) und nimmt $int($damage) Schaden$if($sink,\" und sinkt\",\"\").\"" + +msgid "error303" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No trade is possible in this region.\"" + +msgid "error303" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region kann man nichts verkaufen.\"" + +msgid "patzer3" +msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), a sudden disturbance ripples through the magical realm and a terrible force attempts to drag the magician to another dimension. However, with a final effort of strength, $unit($unit) manages to save himself.\"" + +msgid "patzer3" +msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern, scheint plötzlich ein Beben durch die magische Essenz zu laufen und ein furchtbarer Sog versucht $unit($unit) in eine andere Dimension zu ziehen. Mit letzter Kraft gelingt es $unit($unit) sich zu retten.\"" + +msgid "heat_effect" +msgstr "\"$unit($mage) puts protection from cold on $unit($target).\"" + +msgid "heat_effect" +msgstr "\"$unit($mage) belegt $unit($target) mit einem Kälteschutz.\"" + +msgid "gbdream_noteach" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is an active spell in this region that prevents this.\"" + +msgid "gbdream_noteach" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Zauber in dieser Region verhindert das.\"" + +msgid "path_effect" +msgstr "\"$unit($mage) creates dry and well-repaired roads in $region($region).\"" + +msgid "path_effect" +msgstr "\"$unit($mage) sorgt für trockene Straßen in $region($region).\"" + +msgid "summonshadow_effect" +msgstr "\"$unit($mage) summons $int($number) demons from the realm of shadows.\"" + +msgid "summonshadow_effect" +msgstr "\"$unit($mage) beschwört $int($number) Dämonen aus dem Reich der Schatten.\"" + +msgid "error8" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That is useless.\"" + +msgid "error8" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist sinnlos.\"" + +msgid "eathorse" +msgstr "\"$unit($unit) ate $int($amount) horses.\"" + +msgid "eathorse" +msgstr "\"$unit($unit) verspeiste $int($amount) Pferde.\"" + +msgid "confusion_result" +msgstr "\"$unit($mage) summons a fog of confusion.\"" + +msgid "confusion_result" +msgstr "\"$unit($mage) beschwört einen Schleier der Verwirrung.\"" + +msgid "resource_missing" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires $resource($missing,0).\"" + +msgid "resource_missing" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu benötigt man $resource($missing,0).\"" + +msgid "give_person_peasants" +msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to the local peasants.\"" + +msgid "give_person_peasants" +msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an die Bauern.\"" + +msgid "curseinfo::magicwalls" +msgstr "\"These walls appear to have grown straight out of the earth. ($int36($id))\"" + +msgid "curseinfo::magicwalls" +msgstr "\"Diese Mauern wirken, als wären sie direkt aus der Erde gewachsen und nicht erbaut. ($int36($id))\"" + +msgid "sp_clone_effect" +msgstr "\"$unit($mage) creates a clone.\"" + +msgid "sp_clone_effect" +msgstr "\"$unit($mage) erschafft einen Klon.\"" + +msgid "enemy_discovers_spy_msg" +msgstr "\"$unit($unit) was spotted sinking $ship($ship).\"" + +msgid "enemy_discovers_spy_msg" +msgstr "\"$unit($unit) wurde beim versenken von $ship($ship) entdeckt.\"" + +msgid "curseinfo::nocostbuilding" +msgstr "\"Time cannot touch these walls. ($int36($id))\"" + +msgid "curseinfo::nocostbuilding" +msgstr "\"Der Zahn der Zeit kann diesen Mauern nichts anhaben. ($int36($id))\"" + +msgid "income_fishing" +msgstr "\"In $region($region), $unit($unit) catches fish worth $int($amount) silver.\"" + +msgid "income_fishing" +msgstr "\"$unit($unit) fängt in $region($region) Fische im Wert von $int($amount) Silber.\"" + +msgid "analyse_unit_noage" +msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_unit_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "buildingcrash" +msgstr "\"$building($building) in $region($region) collapses.$if($road,\" The collapse ruined half of the road.\",\"\")$if($opfer,\" There are $int($opfer) casualties.\",\"\")\"" + +msgid "buildingcrash" +msgstr "\"In $region($region) stürzte $building($building) ein.$if($road,\" Beim Einsturz wurde die halbe Straße vernichtet.\",\"\")$if($opfer,\" $int($opfer) Opfer $if($eq($opfer,1),\"ist\",\"sind\") zu beklagen.\",\"\")\"" + +msgid "alliance::kickattempt" +msgstr "\"$int($votes) members of $alliance($alliance) tried to kick you out of the alliance.\"" + +msgid "alliance::kickattempt" +msgstr "\"$int($votes) Mitglieder von $alliance($alliance) haben versucht, Deine Partei aus der Allianz auszuschliessen.\"" + +msgid "becomewyrm" +msgstr "\"$unit($mage) turns into a wyrm.\"" + +msgid "becomewyrm" +msgstr "\"$unit($mage) verwandelt sich in einen Wyrm.\"" + +msgid "casualties" +msgstr "\"$unit($unit) lost $int($fallen) people$if($alive,\", $int($alive) survived\",\"\")$if($run,\" and $int($run) fled$if($isnull($runto),\"\",\" to $region($runto)\")\",\"\").\"" + +msgid "casualties" +msgstr "\"$unit($unit) verlor $int($fallen) Personen$if($alive,\", $int($alive) überlebten\",\"\")$if($run,\" und $int($run) flohen$if($isnull($runto),\"\",\" nach $region($runto)\")\",\"\").\"" + +msgid "lineup_battle" +msgstr "\"Units before turn $int($turn):\"" + +msgid "lineup_battle" +msgstr "\"Einheiten vor der $int($turn). Runde:\"" + +msgid "feedback_give_forbidden" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot give anything to this unit.\"" + +msgid "feedback_give_forbidden" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Einheit kann nichts gegeben werden.\"" + +msgid "babbler_effect" +msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told everyone the story of his entire life.\"" + +msgid "babbler_effect" +msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl die ganze Taverne mit seiner Lebensgeschichte unterhalten zu haben.\"" + +msgid "babbler_resist" +msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told $unit($mage) the story of his entire life.\"" + +msgid "babbler_resist" +msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl $unit($mage) seine ganze Lebensgeschichte erzählt zu haben.\"" + +msgid "tidalwave_kill" +msgstr "\"A tidal wave wipes out $region($region) and kills $unit($unit).\"" + +msgid "tidalwave_kill" +msgstr "\"Eine gewaltige Flutwelle verschlingt $unit($unit) in $region($region).\"" + +msgid "error14" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is off shore.\"" + +msgid "error14" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist auf hoher See.\"" + +msgid "renamed_notseen" +msgstr "\"$unit($renamed) in $region($region) received a nickname.\"" + +msgid "renamed_notseen" +msgstr "\"$unit($renamed) in $region($region) bekommt einen Spitznamen.\"" + +msgid "curseinfo::goodmagicresistancezone" +msgstr "\"The magical resistance of some units in this region was boosted. ($int36($id))\"" + +msgid "curseinfo::goodmagicresistancezone" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde gestärkt. ($int36($id))\"" + +msgid "error66" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction could not be found.\"" + +msgid "error66" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei wurde nicht gefunden.\"" + +msgid "error88" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is lacking materials for building the ship.\"" + +msgid "error88" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genügend Materialien für den Schiffbau.\"" + +msgid "error55" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot move.\"" + +msgid "error55" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht fortbewegen.\"" + +msgid "error77" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The skill could not be recognized.\"" + +msgid "error77" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent wurde nicht erkannt.\"" + +msgid "error178" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No magic sphere was supplied.\"" + +msgid "error178" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Magiegebiet angegeben.\"" + +msgid "error297" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings on the ocean may not be entered.\"" + +msgid "error297" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude auf dem Ozean können nicht betreten werden.\"" + +msgid "generous_effect_1" +msgstr "\"A touring minstrel entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" + +msgid "generous_effect_1" +msgstr "\"Die Darbietungen eines fahrenden Gauklers begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" + +msgid "unit_unarmed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "unit_unarmed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "error293" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Verbände können nur zwischen Einheiten derselben Partei gebildet werden.\"" + +msgid "error183" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" + +msgid "error183" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" + +msgid "error_nograves" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no graves in $region($target).\"" + +msgid "error_nograves" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In $region($target) sind keine Gräber.\"" + +msgid "error139" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Different types do not mix.\"" + +msgid "error139" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unterschiedliche Typen können nicht gemischt werden.\"" + +msgid "error249" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot sail into the open seas.\"" + +msgid "error249" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann nicht aufs offene Meer hinaus segeln.\"" + +msgid "killedbygm" +msgstr "\"$unit($unit) in $region($region) was removed by a GM: \\\"$string\\\".\"" + +msgid "killedbygm" +msgstr "\"$unit($unit) wurde in $region($region) von einem GM gelöscht: \\\"$string\\\".\"" + +msgid "spellfail_distance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That region is too far away.\"" + +msgid "spellfail_distance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region ist zu weit entfernt.\"" + +msgid "error245" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already named.\"" + +msgid "error245" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat schon einen Namen.\"" + +msgid "sp_chaosrow_effect_0" +msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub, but order is restored quickly.\"" + +msgid "sp_chaosrow_effect_0" +msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" + +msgid "error135" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown option.\"" + +msgid "error135" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Option.\"" + +msgid "error131" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a tunnel before building roads through glaciers.\"" + +msgid "error131" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden.\"" + +msgid "error241" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction must be at least 81 weeks old to restart with a new race.\"" + +msgid "error241" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 81 Wochen alt sein, um einen Neustart mit einer anderen Rasse zu versuchen.\"" + +msgid "feedback_unit_not_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit could not be found.\"" + +msgid "feedback_unit_not_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wurde nicht gefunden.\"" + +msgid "error206" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is alrady a spell on that building.\"" + +msgid "error206" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Gebäude liegt bereits so ein Zauber.\"" + +msgid "error316" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Without ingredients an alchemist can not produce anything.\"" + +msgid "error316" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne Zutaten kann ein Alchemist nichts herstellen.\"" + +msgid "error312" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes may not be mixed with normal people.\"" + +msgid "error312" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht mit anderen Personen gemischt werden.\"" + +msgid "mallorn_effect" +msgstr "\"The power of $unit($mage) flows into the ground and the trees which survived the spell appear much stronger now.\"" + +msgid "mallorn_effect" +msgstr "\"$unit($mage) läßt einen Teil seiner selbst in die Erde fliessen. Die Bäume, die Transformation überlebt haben, erscheinen nun viel kräftiger.\"" + +msgid "useflamingsword" +msgstr "\"$int($amount) fighters of $unit($unit) are using their flaming sword.\"" + +msgid "useflamingsword" +msgstr "\"$int($amount) Krieger von $unit($unit) benutzen ihre Flammenschwerter.\"" + +msgid "error202" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a valid race.\"" + +msgid "error202" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine gültige Rasse.\"" + +msgid "curseinfo::magicrunes_building" +msgstr "\"The walls of $building($building) are inscribed with strange runes. ($int36($id))\"" + +msgid "curseinfo::magicrunes_building" +msgstr "\"Auf den Mauern von $building($building) erkennt man seltsame Runen. ($int36($id))\"" + +msgid "analyse_unit_fail" +msgstr "\"It appears to $unit($mage) that $unit($unit) is charmed, but no details have been revealed.\"" + +msgid "analyse_unit_fail" +msgstr "\"$unit($mage) meint, dass $unit($unit) verzaubert ist, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "spellunitresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) resists the spell.\"" + +msgid "spellunitresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) widersteht dem Zauber.\"" + +msgid "give_peasants" +msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants.\"" + +msgid "give_peasants" +msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern.\"" + +msgid "leftship" +msgstr "\"$unit($unit) has just landed and cannot continue moving to $region($region).\"" + +msgid "leftship" +msgstr "\"$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen.\"" + +msgid "astral_appear" +msgstr "\"$unit($unit) appears.\"" + +msgid "astral_appear" +msgstr "\"$unit($unit) erscheint plötzlich.\"" + +msgid "magicresistance_effect" +msgstr "\"$unit($unit) is briefly surrounded by a magical light.\"" + +msgid "magicresistance_effect" +msgstr "\"$unit($unit) wird kurz von einem magischen Licht umhüllt.\"" + +msgid "siege" +msgstr "\"$building($building) is under siege by $unit($unit).\"" + +msgid "siege" +msgstr "\"$unit($unit) belagert $building($building).\"" + +msgid "missing_force" +msgstr "\"$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level).\"" + +msgid "missing_force" +msgstr "\"$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern.\"" + +msgid "shipdestroy_partial" +msgstr "\"$unit($unit) in $region($region) damages the $ship($ship).\"" + +msgid "shipdestroy_partial" +msgstr "\"$unit($unit) in $region($region) beschädigt die $ship($ship).\"" + +msgid "forget" +msgstr "\"$unit($unit) forgets $skill($skill).\"" + +msgid "forget" +msgstr "\"$unit($unit) vergisst $skill($skill).\"" + +msgid "spell_astral_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell can only be cast on the astral plane.\"" + +msgid "spell_astral_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur im Astralraum gezaubert werden.\"" + +msgid "sp_movecastle_fail_0" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental is too small to carry the building.\"" + +msgid "sp_movecastle_fail_0" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen.\"" + +msgid "summonundead_effect_1" +msgstr "\"$unit($mage) calls $int($amount) undead from their graves in $region($region).\"" + +msgid "summonundead_effect_1" +msgstr "\"$unit($mage) erweckt in $region($region) $int($amount) Untote aus ihren Gräbern.\"" + +msgid "drown" +msgstr "\"$unit($unit) drowns in $region($region).\"" + +msgid "drown" +msgstr "\"$unit($unit) ertrinkt in $region($region).\"" + +msgid "travel" +msgstr "\"$unit($unit) $if($eq($mode,1),\"rides\", \"walks\") from $region($start) to $region($end)$if($isnull($regions),\"\",\" by way of $trail($regions)\").\"" + +msgid "travel" +msgstr "\"$unit($unit) $if($eq($mode,1),\"reitet\", \"wandert\") von $region($start) nach $region($end).$if($isnull($regions),\"\",\" Dabei wurde $trail($regions) durchquert.\")\"" + +msgid "curseinfo::skill_1" +msgstr "\"$unit($unit) is incredibly skilled at $skill($skill). ($int36($id))\"" + +msgid "curseinfo::skill_1" +msgstr "\"$unit($unit) ist ungewöhnlich geschickt in $skill($skill). ($int36($id))\"" + +msgid "error11" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is still off shore.\"" + +msgid "error11" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff befindet sich auf hoher See.\"" + +msgid "error33" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in our castle.\"" + +msgid "error33" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht in unserer Burg.\"" + +msgid "error22" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown command.\"" + +msgid "error22" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl wurde nicht erkannt.\"" + +msgid "error44" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is off shore.\"" + +msgid "error44" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf hoher See.\"" + +msgid "spydetect" +msgstr "\"$unit($target) feels watched$if($isnull($spy),\"\",\" by $unit($spy)\").\"" + +msgid "spydetect" +msgstr "\"$unit($target) fühlt sich $if($isnull($spy),\"\",\"durch $unit($spy) \")beobachtet.\"" + +msgid "income_trade" +msgstr "\"$unit($unit) earned $int($amount) silver in $region($region) by selling luxury items.\"" + +msgid "income_trade" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch den Verkauf von Luxusgütern.\"" + +msgid "error74" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot give anybody away.\"" + +msgid "error74" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kann niemanden weggeben.\"" + +msgid "error96" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody in this unit can be transferred.\"" + +msgid "error96" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Einheit gibt es niemanden, den man transferieren könnte.\"" + +msgid "error187" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has moved.\"" + +msgid "error187" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie sich bewegt hat.\"" + +msgid "error85" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No email address was supplied.\"" + +msgid "error85" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde keine Emailadresse angegeben.\"" + +msgid "starvation" +msgstr "\"$unit($unit) loses $int($dead) of $int($add($live,$dead)) people due to starvation in $region($region).\"" + +msgid "starvation" +msgstr "\"$unit($unit) verliert in $region($region) $int($dead) von $int($add($live,$dead)) Personen durch Unterernährung.\"" + +msgid "error258" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The target unit is invalid.\"" + +msgid "error258" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zieleinheit ist ungültig.\"" + +msgid "curseinfo::fogtrap" +msgstr "\"Heavy fog makes it impossible to leave the region. ($int36($id))\"" + +msgid "curseinfo::fogtrap" +msgstr "\"Dichte Nebel bedecken diese Woche die Region. Keine Einheit schafft es, diese Nebel zu durchdringen und die Region zu verlassen. ($int36($id))\"" + +msgid "error148" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of a castle.\"" + +msgid "error148" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Burgherr.\"" + +msgid "poison_damage" +msgstr "\"$unit($unit) is taking poison damage in $region($region).\"" + +msgid "poison_damage" +msgstr "\"$unit($unit) nimmt Schaden durch den Giftelementar in $region($region).\"" + +msgid "error144" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board a ship.\"" + +msgid "error144" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf keinem Schiff.\"" + +msgid "magicboost_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The Spheres of Chaos return a part of his power to the magician.\"" + +msgid "magicboost_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Sphären des Chaos geben dem Magier einen Teil ihrer Kraft.\"" + +msgid "error254" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid aura specification or not enough aura.\"" + +msgid "error254" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft oder zuwenig Aura.\"" + +msgid "error250" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not enough karma.\"" + +msgid "error250" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht genug Karma.\"" + +msgid "error140" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is neither in a castle nor on board a ship.\"" + +msgid "error140" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich weder in einer Burg noch auf einem Schiff.\"" + +msgid "error215" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot reach the astral plane from here.\"" + +msgid "error215" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Von hier aus kann man die astrale Ebene nicht erreichen.\"" + +msgid "destroy_ship_4" +msgstr "\"$ship($ship) wurde zerstört.\"" + +msgid "destroy_ship_4" +msgstr "\"$ship($ship) was destroyed.\"" + +msgid "error211" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already under this spell.\"" + +msgid "error211" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff liegt bereits so ein Zauber.\"" + +msgid "forestfire_effect" +msgstr "\"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall victim to the flames.\"" + +msgid "forestfire_effect" +msgstr "\"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer.\"" + +msgid "error101" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can construct a building.\"" + +msgid "error101" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann ein Gebäude errichten.\"" + +msgid "orcgrowth" +msgstr "\"$unit($unit) breeds $int($amount) new $race($race,$amount).\"" + +msgid "orcgrowth" +msgstr "\"$unit($unit) vermehrt sich um $int($amount) $race($race,$amount).\"" + +msgid "sp_wolfhowl_effect" +msgstr "\"$unit($mage) calls for the help of $int($amount) $race($race, $amount).\"" + +msgid "sp_wolfhowl_effect" +msgstr "\"$unit($mage) ruft $int($amount) $race($race, $amount) zu Hilfe.\"" + +msgid "tidalwave" +msgstr "\"A tidal wave wipes out $region($region) and all who lived there.\"" + +msgid "tidalwave" +msgstr "\"Eine gewaltige Flutwelle verschlingt $region($region) und alle Bewohner.\"" + +msgid "cast_hero_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their moral boosted.\"" + +msgid "cast_hero_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden moralisch gestärkt.\"" + +msgid "detectforbidden" +msgstr "\"$unit($unit) refuses to travel to $region($region).\"" + +msgid "detectforbidden" +msgstr "\"$unit($unit) weigert sich, nach $region($region) zu reisen.\"" + +msgid "parse_error" +msgstr "\"$unit($unit): '$command' - Parse error, unknown command.\"" + +msgid "parse_error" +msgstr "\"$unit($unit): '$command' - Dieser Befehl ist unbekannt.\"" + +msgid "fogblock" +msgstr "\"$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense.\"" + +msgid "fogblock" +msgstr "\"$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht.\"" + +msgid "curseinfo::antimagiczone" +msgstr "\"Dieser Zauber scheint magische Energien irgendwie abzuleiten und so alle in der Region gezauberten Sprüche in ihrer Wirkung zu schwächen oder ganz zu verhindern. ($int36($id))\"" + +msgid "curseinfo::antimagiczone" +msgstr "\"A spell is deflecting magical energies and weakening all other spells cast in the region. ($int36($id))\"" + +msgid "nr_market_sale" +msgstr "\"The local market offers $resource($product,0) at a price of $int($price) silver.\"" + +msgid "nr_market_sale" +msgstr "\"Auf dem Markt wird für $resource($product,0) $int($price) Silber verlangt.\"" + +msgid "stealfail" +msgstr "\"$unit($unit) could not sneak close enough to $unit($target).\"" + +msgid "stealfail" +msgstr "\"$unit($unit) gelang es nicht, sich nahe genug an $unit($target) heranzuschleichen.\"" + +msgid "section_battle" +msgstr "\"\"" + +msgid "section_battle" +msgstr "\"\"" + +msgid "sp_disturbingdreams_effect" +msgstr "\"$unit($mage) disturbs everyone's dreams in $region($region).\"" + +msgid "sp_disturbingdreams_effect" +msgstr "\"$unit($mage) sorgt für schlechten Schlaf in $region($region).\"" + +msgid "spy_discovered_msg" +msgstr "\"$unit($unit) caught $unit($saboteur) trying to sink $ship($ship).\"" + +msgid "spy_discovered_msg" +msgstr "\"$unit($unit) entdeckte $unit($saboteur) beim Versenken von $ship($ship).\"" + +msgid "wrongpasswd" +msgstr "\"Your orders had the wrong password (${password}).\"" + +msgid "wrongpasswd" +msgstr "\"Deine Befehle hatten ein falsches Passwort (${password}).\"" + +msgid "curseinfo::sparkle_9" +msgstr "\"A large green snake offers $unit($unit) a fine-looking apple. ($int36($id))\"" + +msgid "curseinfo::sparkle_9" +msgstr "\"$unit($unit) bekommt von einer Schlange einen Apfel angeboten. ($int36($id))\"" + +msgid "birthday_firework_noname" +msgstr "\"A large firework, visible all over the sky, has been started in $region($region).\"" + +msgid "birthday_firework_noname" +msgstr "\"In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "skill_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires the skill $skill($skill).\"" + +msgid "skill_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu braucht man das Talent $skill($skill).\"" + +msgid "renamed_seen" +msgstr "\"$unit($renamed) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_seen" +msgstr "\"$unit($renamed) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "analyse_unit_nospell" +msgstr "\"It appears to $unit($mage) that $unit($target) is not charmed.\"" + +msgid "analyse_unit_nospell" +msgstr "\"$unit($mage) meint, dass auf $unit($target) kein Zauber liegt.\"" + +msgid "army_report" +msgstr "\"Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors.\"" + +msgid "army_report" +msgstr "\"Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende.\"" + +msgid "receive_person" +msgstr "\"$unit($target) receives $int($amount) person$if($eq($amount,1),\"\",\"s\") from $unit($unit).\"" + +msgid "receive_person" +msgstr "\"$unit($target) erhält $int($amount) Person$if($eq($amount,1),\"\",\"en\") von $unit($unit).\"" + +msgid "donation" +msgstr "\"$faction($from) donates $int($amount) silver to $faction($to).\"" + +msgid "donation" +msgstr "\"$faction($from) gibt ein Almosen von $int($amount) Silber an $faction($to).\"" + +msgid "scunicorn" +msgstr "\"$int($amount) $resource($rtype,$amount) $if($eq($amount,1),\"joins\",\"join\") $unit($unit).\"" + +msgid "scunicorn" +msgstr "\"$unit($unit) $if($eq($amount,1),\"schließt\",\"schließen\") sich $int($amount) $resource($rtype,$amount) an.\"" + +msgid "try_astral" +msgstr "\"$unit($unit) tried but failed to send $unit($target) to another world.\"" + +msgid "try_astral" +msgstr "\"$unit($unit) versuchte erfolglos, $unit($target) in eine andere Welt zu schleudern.\"" + +msgid "error196" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a forest region.\"" + +msgid "error196" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine Waldregion.\"" + +msgid "objmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on ${target}.\"" + +msgid "objmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) verzaubert ${target}.\"" + +msgid "puttorest" +msgstr "\"$unit($mage) redeems the tormented souls of the dead.\"" + +msgid "puttorest" +msgstr "\"$unit($mage) erlöst die gequälten Seelen der Toten.\"" + +msgid "error41" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" + +msgid "error41" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" + +msgid "error30" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The message does not contain text.\"" + +msgid "error30" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Botschaft enthält keinen Text.\"" + +msgid "error52" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute more long orders.\"" + +msgid "error52" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren langen Befehle ausführen.\"" + +msgid "recruit_effect" +msgstr "\"$unit($mage) managed to recruit $int($amount) $if($eq($amount,1),\"peasant\",\"peasants\").\"" + +msgid "recruit_effect" +msgstr "\"$unit($mage) konnte $int($amount) $if($eq($amount,1),\"Bauer\",\"Bauern\") anwerben.\"" + +msgid "spell_failed" +msgstr "\"$unit($unit) tries to cast $spell($spell), but the spell fails!\"" + +msgid "spell_failed" +msgstr "\"$unit($unit) versucht $spell($spell) zu zaubern, doch der Zauber schlägt fehl!\"" + +msgid "error157" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has a different magic sphere.\"" + +msgid "error157" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat ein anderes Magiegebiet.\"" + +msgid "auratransfer_success" +msgstr "\"$unit($unit) transfers $int($aura) aura to $unit($target).\"" + +msgid "auratransfer_success" +msgstr "\"$unit($unit) transferiert $int($aura) Aura auf $unit($target).\"" + +msgid "error267" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only a single person can use the ticket.\"" + +msgid "error267" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur eine Einzelperson kann das Ticket benutzen.\"" + +msgid "error263" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This good is not produced here.\"" + +msgid "error263" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut wird hier produziert.\"" + +msgid "error153" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit joins the local peasants.\"" + +msgid "error153" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit schließt sich den Bauern an.\"" + +msgid "error_onlandonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be on land.\"" + +msgid "error_onlandonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit muß sich an Land befinden.\"" + +msgid "error_herorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Heroes cannot recruit.\"" + +msgid "error_herorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Helden können nicht rekrutieren.\"" + +msgid "error109" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if a castle, a ship, a region, or a unit is supposed to be named.\"" + +msgid "error109" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Einheit, eine Region oder eine Partei benannt werden soll.\"" + +msgid "msg_event" +msgstr "\"$string\"" + +msgid "msg_event" +msgstr "\"$string\"" + +msgid "error224" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot cast spells.\"" + +msgid "error224" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht zaubern.\"" + +msgid "piratesawvictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") in $region($region) made $direction($dir) a target.\"" + +msgid "piratesawvictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) entdeckt ein Opfer im $direction($dir).\"" + +msgid "spyreport_items" +msgstr "\"$unit($target) carries $resources($items)\"" + +msgid "spyreport_items" +msgstr "\"Im Gepäck von $unit($target) sind $resources($items).\"" + +msgid "curseinfo::shipnodrift_1" +msgstr "\"The $ship($ship) is blessed with favourable winds$if($lt($duration,3),\", but the spell is starting to wear thin\",\"\"). ($int36($id))\"" + +msgid "curseinfo::shipnodrift_1" +msgstr "\"Die $ship($ship) ist mit gutem Wind gesegnet$if($lt($duration,3),\", doch der Zauber beginnt sich bereits aufzulösen\",\"\"). ($int36($id))\"" + +msgid "error105" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Empty units can not be handed over.\"" + +msgid "error105" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Leere Einheiten können nicht übergeben werden.\"" + +msgid "curseinfo::sparkle_7" +msgstr "\"The women of the nearby village cast furtive looks at $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_7" +msgstr "\"Die Frauen des nahegelegenen Dorfes bewundern $unit($unit) verstohlen. ($int36($id))\"" + +msgid "error110" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if description is for a castle, a ship, a region, or a unit.\"" + +msgid "error110" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Region oder eine Einheit beschrieben werden soll.\"" + +msgid "curseinfo::sparkle_18" +msgstr "\"The stench of decay is poring from all the orifices of $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_18" +msgstr "\"Fäulnisgeruch dringt $unit($unit) aus allen Körperöffnungen. ($int36($id))\"" + +msgid "error_captain_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The captain needs a sailing skill of at least $int($value), to command $ship($ship).\"" + +msgid "error_captain_skill_low" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Kapitän muß ein Segeltalent von mindestens $int($value) haben, um $ship($ship) zu befehligen.\"" + +msgid "error220" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No one could be seen in the astral fog.\"" + +msgid "error220" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Im astralen Nebel konnte niemand entdeckt werden.\"" + +msgid "arena_enter" +msgstr "\"A portal opens in $region($region). A voice calls: 'Welcome to the Plane of Challenge'. $unit($unit) walks through the gate to another world.\"" + +msgid "arena_enter" +msgstr "\"In $region($region) öffnet sich ein Portal. Eine Stimme ertönt, und spricht: 'Willkommen in der Ebene der Herausforderung'. $unit($unit) durchschreitet das Tor zu einer anderen Welt.\"" + +msgid "stealfatal" +msgstr "\"$unit($unit) was caught by $unit($target) in attempted theft.\"" + +msgid "stealfatal" +msgstr "\"$unit($unit) wurde von $unit.dative($target) beim versuchten Diebstahl ertappt.\"" + +msgid "analyse_unit_age" +msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)' that will last for about $int($months) more weeks.\"" + +msgid "analyse_unit_age" +msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "sp_permtransfer_effect" +msgstr "\"$unit($mage) sacrifices $int($amount) aura for $unit($target).\"" + +msgid "sp_permtransfer_effect" +msgstr "\"$unit($mage) opfert $unit($target) $int($amount) Aura.\"" + +msgid "shipfly" +msgstr "\"The $ship($ship) flies from $region($from) to $region($to).\"" + +msgid "shipfly" +msgstr "\"Die $ship($ship) fliegt von $region($from) nach $region($to).\"" + +msgid "curseinfo::unit_unknown" +msgstr "\"An unknown spell lies on this unit. ($int36($id))\"" + +msgid "curseinfo::unit_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf der Einheit. ($int36($id))\"" + +msgid "force_leave_ship" +msgstr "$unit($owner) asks $unit($unit) to leave $ship($ship)." + +msgid "force_leave_ship" +msgstr "$unit($owner) bittet $unit($unit), $ship($ship) zu verlassen." + +msgid "dissolve_units_1" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) returned to the fields.\"" + +msgid "dissolve_units_1" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"kehrte auf seine\", \"kehrten auf ihre\") Felder zurück.\"" + +msgid "hornofpeace_r_nosuccess" +msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing, but nobody here gets into the mood.\"" + +msgid "hornofpeace_r_nosuccess" +msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes, doch niemand hier lässt sich von Stimmung anstecken.\"" + +msgid "malnourish" +msgstr "\"$unit($unit) is weakened due to malnourishment.\"" + +msgid "malnourish" +msgstr "\"$unit($unit) in $region($region) wird durch unzureichende Nahrung geschwächt.\"" + +msgid "iceberg_land" +msgstr "\"The iceberg $region($region) drifts onto a coast.\"" + +msgid "iceberg_land" +msgstr "\"Der Eisberg $region($region) treibt an eine Küste.\"" + +msgid "produce_lowskill" +msgstr "\"$unit($unit) in $region($region) is not proficient enough to produce $resource($resource,0).\"" + +msgid "produce_lowskill" +msgstr "\"$unit($unit) in $region($region) hat ein zu niedriges Talent, um $resource($resource,0) abzubauen.\"" + +msgid "income_steal_reduced" +msgstr "\"$unit($unit) steals only $int($amount) silver instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") in $region($region).\"" + +msgid "income_steal_reduced" +msgstr "\"$unit($unit) klaut in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" + +msgid "error_cannotmake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot produce this.\"" + +msgid "error_cannotmake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht machen.\"" + +msgid "meow" +msgstr "\"Meeoooooow...\"" + +msgid "meow" +msgstr "\"Miiauuuuuu...\"" + +msgid "spelltargetnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell could not find a target.\"" + +msgid "spelltargetnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Ziel gefunden.\"" + +msgid "curseinfo::fumble" +msgstr "\"$unit($unit) can hardly focus on anything. ($int36($id))\"" + +msgid "curseinfo::fumble" +msgstr "\"$unit($unit) kann sich kaum konzentrieren. ($int36($id))\"" + +msgid "curseinfo::sparkle_14" +msgstr "\"The head of $unit($unit) has turned into a madly grinning skull. ($int36($id))\"" + +msgid "curseinfo::sparkle_14" +msgstr "\"Der Kopf von $unit($unit) hat sich in einen grinsenden Totenschädel verwandelt. ($int36($id))\"" + +msgid "reanimate_effect_1" +msgstr "\"$unit($mage) begins a ritual of resurrection augmented by a $resource($item,1). $int($amount) warriors rise from the dead.\"" + +msgid "reanimate_effect_1" +msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Krieger stehen von den Toten auf.\"" + +msgid "analyse_building_nospell" +msgstr "\"It appears to $unit($mage) that $building($building) is not charmed.\"" + +msgid "analyse_building_nospell" +msgstr "\"$unit($mage) meint, dass auf $building($building) kein Zauber liegt.\"" + +msgid "magicresistance_building" +msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" + +msgid "magicresistance_building" +msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" + +msgid "race_notake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) will not accept anything.\"" + +msgid "race_notake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) nehmen nichts an.\"" + +msgid "cast_drainlife_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their life energy drained.\"" + +msgid "cast_drainlife_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurde ihre Lebenskraft entzogen.\"" + +msgid "headache_effect_0" +msgstr "\"$unit($mage) invites $unit($unit) for a few too many drinks and a massive hangover.\"" + +msgid "headache_effect_0" +msgstr "\"$unit($mage) verschafft $unit($unit) einige feuchtfröhliche Stunden mit heftigen Nachwirkungen.\"" + +msgid "unholypower_limitedeffect" +msgstr "\"$unit($mage) transforms $int($amount) from $unit($target) into $race($race,0).\"" + +msgid "unholypower_limitedeffect" +msgstr "\"$unit($mage) verwandelt $int($amount) aus $unit($target) in $race($race,0).\"" + +msgid "income_work_reduced" +msgstr "\"$unit($unit) works in $region($region) for a wage of $int($amount) $if($eq($wanted,$amount),\"\",\" out of $int($wanted)\") silver.\"" + +msgid "income_work_reduced" +msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" + +msgid "maintenancespecialfail" +msgstr "\"$unit($unit) lacks $resource($item,0) to operate $building($building).\"" + +msgid "maintenancespecialfail" +msgstr "\"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building).\"" + +msgid "healing_effect_1" +msgstr "\"$unit($mage) sees after the wounded and heals $int($amount). A $resource($item,1) improves the spell.\"" + +msgid "healing_effect_1" +msgstr "\"$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Verwundete werden geheilt.\"" + +msgid "error276" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here.\"" + +msgid "error276" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen.\"" + +msgid "error166" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle.\"" + +msgid "error166" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern.\"" + +msgid "chaosgate_effect_2" +msgstr "\"A vortex of blinding light appears.\"" + +msgid "chaosgate_effect_2" +msgstr "\"Ein Wirbel aus blendendem Licht erscheint.\"" + +msgid "birthday_firework_local" +msgstr "\"A large firework in honor of ${name} is visible all over the sky.\"" + +msgid "birthday_firework_local" +msgstr "\"Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "hornofpeace_u_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) regions have been pacified.\"" + +msgid "hornofpeace_u_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) Regionen wurden befriedet.\"" + +msgid "error71" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The given direction was not recognized.\"" + +msgid "error71" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung wurde nicht erkannt.\"" + +msgid "error93" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a port in this region.\"" + +msgid "error93" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es schon einen Hafen.\"" + +msgid "no_attack_after_advance" +msgstr "\"'$order($command)' - $unit($unit) marched into $region($region) during the last turn and is too exhausted to attack.\"" + +msgid "no_attack_after_advance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist noch zu erschöpft vom Einmarsch um zu attackieren.\"" + +msgid "error82" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number.\"" + +msgid "error82" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer.\"" + +msgid "error60" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is under siege.\"" + +msgid "error60" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert.\"" + +msgid "error162" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed.\"" + +msgid "error162" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt.\"" + +msgid "error272" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Horses are not allowed inside.\"" + +msgid "error272" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde müssen leider draußen bleiben.\"" + +msgid "warn_dropout" +msgstr "\"Warning: $faction($faction) has not been sending in orders for $int($turns) turns and may be leaving the game soon.\"" + +msgid "warn_dropout" +msgstr "\"Achtung: $faction($faction) hat seit $int($turns) Wochen keine Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel ausscheiden.\"" + +msgid "arena_leave_fail" +msgstr "\"The attempt to use wings of the gryphon failed. $unit($unit) could not leave the Plane of Challenge.\"" + +msgid "arena_leave_fail" +msgstr "\"Der Versuch, die Greifenschwingen zu benutzen, schlug fehl. $unit($unit) konnte die Ebene der Herausforderung nicht verlassen.\"" + +msgid "battle_critical" +msgstr "\"$int36($unit.id($unit))/$int($index) does critical damage.\"" + +msgid "battle_critical" +msgstr "\"$int36($unit.id($unit))/$int($index) erzielt einen kritischen Treffer.\"" + +msgid "error_spell_on_ship_already" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a spell on $ship($ship).\"" + +msgid "error_spell_on_ship_already" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf $ship($ship) liegt beeits ein Zauber.\"" + +msgid "error228" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only normal characters can collect taxes.\"" + +msgid "error228" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur normale Personen können Steuern eintreiben.\"" + +msgid "birthday_firework_noname_local" +msgstr "\"A large firework is visible all over the sky.\"" + +msgid "birthday_firework_noname_local" +msgstr "\"$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "error118" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot produce that.\"" + +msgid "error118" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann die Einheit nicht herstellen.\"" + +msgid "curseinfo::sparkle_10" +msgstr "\"A unicorn touches $unit($unit) with its horn and vanishes into the forest quickly after. ($int36($id))\"" + +msgid "curseinfo::sparkle_10" +msgstr "\"Ein Einhorn berührt $unit($unit) mit seinem Horn und verschwindet kurz darauf im Unterholz. ($int36($id))\"" + +msgid "error114" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is not valid.\"" + +msgid "error114" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist nicht im gültigen Bereich.\"" + +msgid "error233" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Swimmers cannot enter ships.\"" + +msgid "error233" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Schiffe betreten.\"" + +msgid "iceberg_create" +msgstr "\"The glacier in $region($region) breaks up and drifts away.\"" + +msgid "iceberg_create" +msgstr "\"Der Gletscher von $region($region) bricht und treibt davon.\"" + +msgid "chaos_disease" +msgstr "\"$unit($unit) is stricken by a strange disease.\"" + +msgid "chaos_disease" +msgstr "\"$unit($unit) scheint von einer seltsamen Krankheit befallen.\"" + +msgid "error1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are not enough experienced sailors on board the ship.\"" + +msgid "error1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.\"" + +msgid "sp_icastle_effect" +msgstr "\"Flabbergasted, the peasants of $region($region) behold a new building.\"" + +msgid "sp_icastle_effect" +msgstr "\"Verwundert blicken die Bauern von $region($region) auf ein neues Gebäude.\"" + +msgid "curseinfo::godcurse" +msgstr "\"This region was cursed by the gods. Stinking vapors billow over the dead ground and hideous creatures move about the country. The wells are poisened and the edible plants are covered by a pink fungus. Noone can live here for long. ($int36($id))\"" + +msgid "curseinfo::godcurse" +msgstr "\"Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen über die tote Erde und furchtbare Kreaturen ziehen über das Land. Die Brunnen sind vergiftet, und die wenigen essbaren Früchte sind von einem rosa Pilz überzogen. Niemand kann hier lange überleben. ($int36($id))\"" + +msgid "recruit_archetype" +msgstr "\"$unit($unit) recruits $int($amount) $localize($archetype).\"" + +msgid "recruit_archetype" +msgstr "\"$unit($unit) rekrutiert $int($amount) $localize($archetype).\"" + +msgid "tactics_won" +msgstr "\"$unit($unit) surprises the enemies.\"" + +msgid "tactics_won" +msgstr "\"$unit($unit) überrascht den Gegner.\"" + +msgid "raindance_effect" +msgstr "\"$if($isnull($mage),\"an unseen magician\",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields.\"" + +msgid "raindance_effect" +msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen.\"" + +msgid "mistake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" + +msgid "mistake" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" + +msgid "income_tax" +msgstr "\"$unit($unit) collects taxes of $int($amount) silver in $region($region).\"" + +msgid "income_tax" +msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount) Silber ein.\"" + +msgid "give_person_ocean" +msgstr "\"$unit($unit) drowns $int($amount).\"" + +msgid "give_person_ocean" +msgstr "\"$unit($unit) ertränkt $int($amount) Person$if($eq($amount,1),\"\",\"en\").\"" + +msgid "error_no_tax_skill" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not now how to tax.\"" + +msgid "error_no_tax_skill" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht geschult im Eintreiben von Steuern.\"" + +msgid "sparkle_effect" +msgstr "\"$unit($mage) puts a spell on $unit($target).\"" + +msgid "sparkle_effect" +msgstr "\"$unit($mage) belegt $unit($target) mit einem Zauber.\"" + +msgid "error18" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is too heavily loaded to sail.\"" + +msgid "error18" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist zu schwer beladen, um in See zu stechen.\"" + +msgid "sp_raisepeasants_effect" +msgstr "\"$unit($mage) incites a revolt among $int($amount) peasants of $region($region).\"" + +msgid "sp_raisepeasants_effect" +msgstr "\"$unit($mage) wiegelt in $region($region) $int($amount) Bauern zum Aufstand auf.\"" + +msgid "pump_effect" +msgstr "\"$unit($mage) questions $unit($unit) about $region($tregion).\"" + +msgid "pump_effect" +msgstr "\"$unit($mage) horcht $unit($unit) über $region($tregion) aus.\"" + +msgid "curseinfo::sparkle_5" +msgstr "\"A haunting melody fills the air, and $unit($unit) dances until late into the night. ($int36($id))\"" + +msgid "curseinfo::sparkle_5" +msgstr "\"Eine Melodie erklingt, und $unit($unit) tanzt bis spät in die Nacht hinein. ($int36($id))\"" + +msgid "dragon_growl" +msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"I smell\", \"We smell\") something in $region($target)\\\".\"" + +msgid "dragon_growl" +msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"Ich rieche\", \"Wir riechen\") etwas in $region($target)\\\".\"" + +msgid "produce" +msgstr "\"$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") $resource($resource,$amount).\"" + +msgid "produce" +msgstr "\"$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),\"\",\" von $int($wanted)\") $resource($resource,$wanted).\"" + +msgid "income_work" +msgstr "\"In $region($region), $unit($unit) works for a wage of $int($amount) silver.\"" + +msgid "income_work" +msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount) Silber.\"" + +msgid "nr_stat_people" +msgstr "\"people: $int($max)\"" + +msgid "nr_stat_people" +msgstr "\"Personen: $int($max)\"" + +msgid "destroy_curse_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell is not strong enough to destroy the curse ($id) on ${target}.\"" + +msgid "destroy_curse_noeffect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber ist nicht stark genug, um den Fluch ($id) auf ${target} zu zerstören.\"" + +msgid "detectocean" +msgstr "\"$unit($unit) discovered that $region($region) is $localize($terrain).\"" + +msgid "detectocean" +msgstr "\"$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist.\"" + +msgid "spell_resist" +msgstr "\"$unit($unit) manages to cast $spell($spell), but the spell seems to have no effect.\"" + +msgid "spell_resist" +msgstr "\"$unit($unit) gelingt es $spell($spell) zu zaubern, doch der Spruch zeigt keine Wirkung.\"" + +msgid "shipdestroy" +msgstr "\"$unit($unit) sunk $ship($ship) in $region($region).\"" + +msgid "shipdestroy" +msgstr "\"$unit($unit) in $region($region) versenkt die $ship($ship).\"" + +msgid "destroy_ship_3" +msgstr "\"Es wurde versucht, $ship($ship) zu zerstören.\"" + +msgid "destroy_ship_3" +msgstr "\"Somebody attempted to destroy $ship($ship).\"" + +msgid "error289" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What should we disguise as?\"" + +msgid "error289" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wie sollen wir uns tarnen?\"" + +msgid "spellbuildingnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be located.\"" + +msgid "spellbuildingnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) wurde nicht gefunden.\"" + +msgid "error179" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this magic sphere.\"" + +msgid "error179" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Magiegebiet kann die Einheit nicht lernen.\"" + +msgid "sp_migranten" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) has become one of our kind.\"" + +msgid "sp_migranten" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wird von uns aufgenommen.\"" + +msgid "error175" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell while standing on a moving ship.\"" + +msgid "error175" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht auf einem sich bewegenden Schiff stehend zaubern.\"" + +msgid "error285" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit knows no recipes for potions.\"" + +msgid "error285" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kennt keine Trankrezepte.\"" + +msgid "dissolve_units_4" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned to dust.\"" + +msgid "dissolve_units_4" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"zerfiel\", \"zerfielen\") zu Staub.\"" + +msgid "error281" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What race did you want the jihad to be against?\"" + +msgid "error281" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen welche Rasse soll der Jihad ausgerufen werden?\"" + +msgid "error171" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This combat spell does not exist.\"" + +msgid "error171" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Kampfzauber gibt es nicht.\"" + +msgid "astral_disappear" +msgstr "\"$unit($unit) disappears.\"" + +msgid "astral_disappear" +msgstr "\"$unit($unit) wird durchscheinend und verschwindet.\"" + +msgid "error127" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction cannot hire so many strangers.\"" + +msgid "error127" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann Deine Partei nicht aufnehmen.\"" + +msgid "drought_effect_2" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds.\"" + +msgid "drought_effect_2" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt.\"" + +msgid "usepotion" +msgstr "\"$unit($unit) uses $resource($potion,1).\"" + +msgid "usepotion" +msgstr "\"$unit($unit) benutzt $resource($potion,1).\"" + +msgid "error237" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are riots in this region.\"" + +msgid "error237" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region befindet sich in Aufruhr.\"" + +msgid "error90" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have travel with us.\"" + +msgid "error90" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit fährt nicht mit uns.\"" + +msgid "orcified" +msgstr "\"People in $region($region) flee because of too many orcs.\"" + +msgid "orcified" +msgstr "\"Vor den vielen Orks in $region($region) fliehen die anderen Einwohner.\"" + +msgid "plant_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - At least $skill($skill) $int($minskill) is needed for planting $resource($product,0).\"" + +msgid "plant_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu pflanzen.\"" + +msgid "renamed_ship_notseen" +msgstr "\"$ship($ship) in $region($region) received a nickname.\"" + +msgid "renamed_ship_notseen" +msgstr "\"Die $ship($ship) in $region($region) bekommt einen Spitznamen.\"" + +msgid "error123" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have such a thing.\"" + +msgid "error123" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas hat die Einheit nicht.\"" + +msgid "error308" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This skill cannot be raised any higher.\"" + +msgid "error308" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann nicht höher gelernt werden.\"" + +msgid "spyreport_faction" +msgstr "\"$unit($target) belongs to $faction($faction).\"" + +msgid "spyreport_faction" +msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\"" + +msgid "ship_drift" +msgstr "\"The ship $ship($ship) drifts to the $direction($dir).\"" + +msgid "ship_drift" +msgstr "\"Die $ship($ship) treibt nach $direction($dir).\"" + +msgid "error_max_magicians" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more than $int($amount) magicians in your faction.\"" + +msgid "error_max_magicians" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Magier pro Partei geben.\"" + +msgid "error304" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units of a faction that can't be attacked may not guard.\"" + +msgid "error304" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen.\"" + +msgid "error300" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid synonym.\"" + +msgid "error300" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Synonym.\"" + +msgid "error4" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already completed.\"" + +msgid "error4" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist bereits fertig.\"" + +msgid "curseinfo::magicstreetwarn" +msgstr "\"The roads are extremely dry and well-kept, but some areas show the first signs of potholes reappearing. ($int36($id))\"" + +msgid "curseinfo::magicstreetwarn" +msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar, doch an manchen Stellen bilden sich wieder die erste Schlammlöcher. ($int36($id))\"" + +msgid "moveblocked" +msgstr "\"$unit($unit) discovers that there is no route going $direction($direction).\"" + +msgid "moveblocked" +msgstr "\"$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt.\"" + +msgid "nr_market_info_p" +msgstr "\"The local market offers $resource($p1,0) and $resource($p2,0).\"" + +msgid "nr_market_info_p" +msgstr "\"Auf dem Markt werden $resource($p1,0) und $resource($p2,0) feilgeboten.\"" + +msgid "stealeffect" +msgstr "\"In $region($region), thieves stole $int($amount) silver from $unit($unit).\"" + +msgid "stealeffect" +msgstr "\"$unit($unit) wurden in $region($region) $int($amount) Silberstücke geklaut.\"" + +msgid "curseinfo::calm_1" +msgstr "\"$unit($unit) likes $faction($faction). ($int36($id))\"" + +msgid "curseinfo::calm_1" +msgstr "\"$unit($unit) scheint $faction($faction) zu mögen. ($int36($id))\"" + +msgid "plant" +msgstr "\"$unit($unit) plants $int($amount) $resource($herb,$amount) in $region($region).\"" + +msgid "plant" +msgstr "\"$unit($unit) pflanzt in $region($region) $int($amount) $resource($herb,$amount).\"" + +msgid "nr_region_owner" +msgstr "\"The region is owned by $faction($faction).\"" + +msgid "nr_region_owner" +msgstr "\"Die Region ist im Besitz von $faction($faction).\"" + +msgid "analyse_region_nospell" +msgstr "\"It appears to $unit($mage) that $region($region) is not charmed.\"" + +msgid "analyse_region_nospell" +msgstr "\"$unit($mage) meint, dass auf $region($region) kein Zauber liegt.\"" + +msgid "one_circle_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has already chosen a magical school.\"" + +msgid "one_circle_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits ein Magiegebiet.\"" + +msgid "race_nosteal" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot steal anything.\"" + +msgid "race_nosteal" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts stehelen.\"" + +msgid "error26" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items to buy is missing.\"" + +msgid "error26" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu kaufender Produkte fehlt.\"" + +msgid "error48" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "error48" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "sailfail" +msgstr "\"The $ship($ship) could not leave $region($region).\"" + +msgid "sailfail" +msgstr "\"Die $ship($ship) konnte $region($region) nicht verlassen.\"" + +msgid "error15" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has not yet been completed.\"" + +msgid "error15" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist noch nicht fertig gebaut.\"" + +msgid "error37" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" + +msgid "error37" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Trank nicht.\"" + +msgid "error59" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know anything about herbalism.\"" + +msgid "error59" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nichts über Botanik.\"" + +msgid "ent_effect" +msgstr "\"$unit($mage) animates $int($amount) trees.\"" + +msgid "ent_effect" +msgstr "\"$unit($mage) belebt $int($amount) Bäume.\"" + +msgid "error89" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Money offer is missing.\"" + +msgid "error89" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Geldgebot fehlt.\"" + +msgid "nr_header_date" +msgstr "\"Report for $game, $date\"" + +msgid "nr_header_date" +msgstr "\"Report für $game, $date\"" + +msgid "error188" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a swamp.\"" + +msgid "error188" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht im Sumpf gezaubert werden.\"" + +msgid "error298" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a clone.\"" + +msgid "error298" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Klon.\"" + +msgid "fail_tooheavy" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is too heavy.\"" + +msgid "fail_tooheavy" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist zu schwer.\"" + +msgid "familiar_farcast" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions.\"" + +msgid "familiar_farcast" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten.\"" + +msgid "error184" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not move.\"" + +msgid "error184" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit bewegt sich nicht.\"" + +msgid "income_entertainment" +msgstr "\"$unit($unit) earns $int($amount) in $region($region) with entertainment.\"" + +msgid "income_entertainment" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Unterhaltung.\"" + +msgid "error180" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell fails.\"" + +msgid "error180" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber schlägt fehl.\"" + +msgid "sp_shapeshift_fail" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) cannot take the form of $race($race,1).\"" + +msgid "sp_shapeshift_fail" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) kann nicht $race($race,1) werden.\"" + +msgid "error290" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Einheit kann nur in einem Verband Mitglied sein.\"" + +msgid "cast_rally_effect" +msgstr "\"$unit($mage) quells the uprising in $region($region).\"" + +msgid "cast_rally_effect" +msgstr "\"$unit($mage) besänftigt den Bauernaufstand in $region($region).\"" + +msgid "error246" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already named.\"" + +msgid "error246" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude hat schon einen Namen.\"" + +msgid "stealaura_fail" +msgstr "\"$unit($unit) could not draw aura from $unit($target).\"" + +msgid "stealaura_fail" +msgstr "\"$unit($unit) konnte $unit($target) keine Aura entziehen.\"" + +msgid "nmr_warning" +msgstr "No orders were received for your faction!" + +msgid "nmr_warning" +msgstr "Deine Partei hat letzte Runde keinen Zug abgegeben!" + +msgid "destroy" +msgstr "\"$unit($unit) destroys $building($building).\"" + +msgid "destroy" +msgstr "\"$unit($unit) zerstört $building($building).\"" + +msgid "volcanooutbreaknn" +msgstr "\"The volcano in $region($region) erupts.\"" + +msgid "volcanooutbreaknn" +msgstr "\"Der Vulkan in $region($region) bricht aus.\"" + +msgid "error132" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a dam before building roads through swamps.\"" + +msgid "error132" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Sümpfen Straßen bauen zu können, muß zuerst ein Damm errichtet werden.\"" + +msgid "error251" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot improve this power.\"" + +msgid "error251" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen.\"" + +msgid "error207" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer aura to this unit.\"" + +msgid "error207" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu dieser Einheit kann keine Aura übertragen werden.\"" + +msgid "error317" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object is indestructible.\"" + +msgid "error317" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Objekt ist unzerstörbar.\"" + +msgid "error_different_magic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) does not understand our kind of magic.\"" + +msgid "error_different_magic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) versteht unsere Art von Magie nicht.\"" + +msgid "curseinfo::sparkle_3" +msgstr "\"$unit($unit) is surrounded by a shower of glittering sparkles. ($int36($id))\"" + +msgid "curseinfo::sparkle_3" +msgstr "\"$unit($unit) wird von einem glitzernden Funkenregen umgeben. ($int36($id))\"" + +msgid "error313" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes don't work.\"" + +msgid "error313" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht arbeiten.\"" + +msgid "mail_result" +msgstr "\"A message from $unit($unit): '$message'\"" + +msgid "mail_result" +msgstr "\"Eine Botschaft von $unit($unit): '$message'\"" + +msgid "error203" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No target has been supplied.\"" + +msgid "error203" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Ziel wurde vergessen.\"" + +msgid "cast_storm_effect" +msgstr "\"$unit($mage) casts $spell($spell): Strong stormwinds are blowing and the archers are having a hard time aiming.\"" + +msgid "cast_storm_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): Ein Sturm kommt auf und die Schützen können kaum noch zielen.\"" + +msgid "patzer4" +msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), strong winds suddenly rise. Bizarre ghostlike creatures circle around the magician and seem to be leeching magical energy. However, with a final effort of strength, $unit($unit) manages to complete the spell.\"" + +msgid "patzer4" +msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern erhebt sich plötzlich ein dunkler Wind. Bizarre geisterhafte Gestalten kreisen um den Magier und scheinen sich von den magischen Energien des Zaubers zu ernähren. Mit letzter Kraft gelingt es $unit($unit) dennoch den Spruch zu zaubern.\"" + +msgid "curseinfo::magicrunes_ship" +msgstr "\"The plank of $ship($ship) are inscribed with strange runes. ($int36($id))\"" + +msgid "curseinfo::magicrunes_ship" +msgstr "\"Auf den Planken von $ship($ship) erkennt man seltsame Runen. ($int36($id))\"" + +msgid "santa_f" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." + +msgid "santa_f" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei eine $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." + +msgid "cast_spell_effect" +msgstr "\"$unit($mage) casts $spell($spell).\"" + +msgid "cast_spell_effect" +msgstr "\"$unit($mage) zaubert $spell($spell).\"" + +msgid "curseinfo::disorientationzone" +msgstr "\"A veil of confusion lies over the region. ($int36($id))\"" + +msgid "curseinfo::disorientationzone" +msgstr "\"Ein Schleier der Verwirrung liegt über der Region. ($int36($id))\"" + +msgid "calm_effect" +msgstr "\"$unit($mage) calms $unit($unit).\"" + +msgid "calm_effect" +msgstr "\"$unit($mage) besänftigt $unit($unit).\"" + +msgid "error7" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is no longer possible.\"" + +msgid "error7" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das geht nicht mehr.\"" + +msgid "summonundead_effect_2" +msgstr "\"$unit($mage) communicates with the dead in $region($region).\"" + +msgid "summonundead_effect_2" +msgstr "\"$unit($mage) stört in $region($region) die Ruhe der Toten.\"" + +msgid "generous_effect_0" +msgstr "\"$unit($mage) entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" + +msgid "generous_effect_0" +msgstr "\"Die Darbietungen von $unit($mage) begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" + +msgid "curseinfo::generous" +msgstr "\"Everyone in this region seems to be having a very good time. ($int36($id))\"" + +msgid "curseinfo::generous" +msgstr "\"Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))\"" + +msgid "buildroad" +msgstr "\"$unit($unit) extends the road network in $region($region) by $int($size).\"" + +msgid "buildroad" +msgstr "\"$unit($unit) erweitert in $region($region) das Straßennetz um $int($size).\"" + +msgid "nr_borderlist_postfix" +msgstr "\"$if($transparent,\" there is\",\" sight is blocked by \") ${object}.\"" + +msgid "nr_borderlist_postfix" +msgstr "\"$if($transparent,\" befindet sich\",\" versperrt\") ${object}$if($transparent,\"\",\" die Sicht\").\"" + +msgid "effectstrength" +msgstr "\"$unit($mage) increases the strength of $unit($target) dramatically.\"" + +msgid "effectstrength" +msgstr "\"$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich.\"" + +msgid "wormhole_appear" +msgstr "\"A wormhole appears in $region($region).\"" + +msgid "wormhole_appear" +msgstr "\"In $region($region) erscheint ein Wurmloch.\"" + +msgid "givecommand" +msgstr "\"$unit($unit) gave control to $unit($recipient).\"" + +msgid "givecommand" +msgstr "\"$unit($unit) gibt das Kommando an $unit($recipient).\"" + +msgid "sink_msg" +msgstr "\"$ship($ship) disappears in the depths of $region($region).\"" + +msgid "sink_msg" +msgstr "\"$ship($ship) versinkt in den Fluten von $region($region).\"" + +msgid "force_leave_building" +msgstr "$unit($owner) asks $unit($unit) to leave $building($building)." + +msgid "force_leave_building" +msgstr "$unit($owner) bittet $unit($unit), $building($building) zu verlassen." + +msgid "hero_promotion" +msgstr "\"$unit($unit) uses $int($cost) silber for a promotion.\"" + +msgid "hero_promotion" +msgstr "\"$unit($unit) wird mit $int($cost) Silber zum Helden ernannt.\"" + +msgid "renumber_inuse" +msgstr "\"NUMBER FACTION $int36($id): This number is being used by another faction.\"" + +msgid "renumber_inuse" +msgstr "\"NUMMER PARTEI $int36($id): Diese Nummer wird von einer anderen Partei benutzt.\"" + +msgid "firewall_death" +msgstr "\"$unit($unit) dies trying to cross the wall of fire into $region($region).\"" + +msgid "firewall_death" +msgstr "\"$unit($unit) stirbt beim Versuch, die Feuerwand nach $region($region) zu durchqueren.\"" + +msgid "skillpotion_use" +msgstr "\"$unit($unit) uses a potion of skills and feels his knowledge grow.\"" + +msgid "skillpotion_use" +msgstr "\"$unit($unit) benutzt einen Talenttrunk und fühlt, wie sein Wissen zunimmt.\"" + +msgid "drown_on_ship" +msgstr "\"$unit($unit) drowns when $ship($ship) in $region($region) sinks.\"" + +msgid "drown_on_ship" +msgstr "\"$unit($unit) ertrinkt beim Untergang der $ship($ship) in $region($region).\"" + +msgid "curseinfo::riotzone" +msgstr "\"A fog of negative energy enshrouds the region. ($int36($id))\"" + +msgid "curseinfo::riotzone" +msgstr "\"Eine Wolke negativer Energie liegt über der Region. ($int36($id))\"" + +msgid "send_astral" +msgstr "\"$unit($unit) sends $unit($target) to another world.\"" + +msgid "send_astral" +msgstr "\"$unit($target) wird von $unit($unit) in eine andere Welt geschleudert.\"" + +msgid "earthquake_effect" +msgstr "\"$unit($mage) makes the earth shake in $region($region).\"" + +msgid "earthquake_effect" +msgstr "\"$unit($mage) läßt die Erde in $region($region) erzittern.\"" + +msgid "error56" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot tame that many horses.\"" + +msgid "error56" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann soviele Pferde nicht bändigen.\"" + +msgid "error78" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevented the transfer from happening.\"" + +msgid "error78" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Fluch verhindert die Übergabe.\"" + +msgid "questportal_lock" +msgstr "\"$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" + +msgid "questportal_lock" +msgstr "\"$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" + +msgid "error45" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our own.\"" + +msgid "error45" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist eine der unsrigen.\"" + +msgid "error67" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The horses would drown.\"" + +msgid "error67" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Pferde würden ertrinken.\"" + +msgid "detectforbiddendir" +msgstr "\"$unit($unit) refuses to travel to the $direction($direction).\"" + +msgid "detectforbiddendir" +msgstr "\"$unit($unit) weigert sich, nach $direction($direction) zu reisen.\"" + +msgid "error197" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician has to be in a castle to create a homestone.\"" + +msgid "error197" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um einen Heimstein zu erschaffen, muß der Zauberer in einer Burg sein.\"" + +msgid "sp_flee_effect_1" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were consumed by fear.\"" + +msgid "sp_flee_effect_1" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden von Furcht gepackt.\"" + +msgid "overrun_by_iceberg_des" +msgstr "\"The $ship($ship) has been destroyed by a collision with an iceberg.\"" + +msgid "overrun_by_iceberg_des" +msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg zerstört.\"" + +msgid "curseinfo::region_unknown" +msgstr "\"An unknown spell lies on this region. ($int36($id))\"" + +msgid "curseinfo::region_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf der Region. ($int36($id))\"" + +msgid "nr_market_price" +msgstr "\"$resource($product,0) for $int($price) silver\"" + +msgid "nr_market_price" +msgstr "\"$resource($product,0) $int($price) Silber\"" + +msgid "error259" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That order only applies to units in the same building or ship.\"" + +msgid "error259" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl ist nur auf Einheiten innerhalb des selben Gebäudes oder Schiffes anwendbar.\"" + +msgid "building_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be in a $localize($building) to produce this.\"" + +msgid "building_needed" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit steht nicht im benötigten Gebäude, $localize($building).\"" + +msgid "error149" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Who is supposed to get this message?\"" + +msgid "error149" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wohin soll die Botschaft gehen?\"" + +msgid "curseinfo::building_unknown" +msgstr "\"An unknown spell lies on this building. ($int36($id))\"" + +msgid "curseinfo::building_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf dem Gebäude. ($int36($id))\"" + +msgid "error145" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a castle.\"" + +msgid "error145" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Burg.\"" + +msgid "piratenovictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") could not capture other ships in $region($region).\"" + +msgid "piratenovictim" +msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) kann keine Schiffe aufbringen.\"" + +msgid "questportal_unlock" +msgstr "\"$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" + +msgid "questportal_unlock" +msgstr "\"$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" + +msgid "error255" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this.\"" + +msgid "error255" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern.\"" + +msgid "entrance_besieged" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege.\"" + +msgid "entrance_besieged" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert.\"" + +msgid "error260" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted.\"" + +msgid "error260" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden.\"" + +msgid "nr_market_info_s" +msgstr "\"The local market offers $resource($p1,0).\"" + +msgid "nr_market_info_s" +msgstr "\"Auf dem Markt wird $resource($p1,0) feilgeboten.\"" + +msgid "error141" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough crystals left for this many people.\"" + +msgid "error141" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht mehr genug Kristalle für so viele Personen.\"" + +msgid "error106" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - When studying, magicians need to be alone.\"" + +msgid "error106" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier müssen zum studieren allein sein.\"" + +msgid "race_no_attack" +msgstr "\"'$order($command)' - $race($race,0) are peace-loving and will not attack anyone.\"" + +msgid "race_no_attack" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) sind friedliebend und attackieren niemand.\"" + +msgid "error216" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" + +msgid "error216" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Verbindung zur astralen Welt.\"" + +msgid "error771" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this skill.\"" + +msgid "error771" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann die Einheit nicht lernen.\"" + +msgid "error212" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" + +msgid "error212" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" + +msgid "stormwinds_effect" +msgstr "\"$unit($unit) calls up a magical storm that whips the ship over the waters.\"" + +msgid "stormwinds_effect" +msgstr "\"$unit($unit) beschwört einen magischen Wind, der die Schiffe über das Wasser treibt.\"" + +msgid "error102" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade any more goods.\"" + +msgid "error102" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren Güter handeln.\"" + +msgid "sp_drought_effect" +msgstr "\"$unit($mage) puts a curse on the lands of $region($region) and a drought sets in.\"" + +msgid "sp_drought_effect" +msgstr "\"$unit($mage) verflucht das Land in $region($region), und eine Dürreperiode beginnt.\"" + +msgid "error_giveeye" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A higher power prevents $unit($unit) from giving the object away. 'IT IS YOURS MY CHILD. ONLY YOURS.'.\"" + +msgid "error_giveeye" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine höhere Macht hindert $unit($unit) daran, das Objekt zu übergeben. 'ES IST DEINS, MEIN KIND. DEINS GANZ ALLEIN'.\"" + +msgid "curseinfo::buildingunknown" +msgstr "\"A magical shimmer lies on these walls. ($int36($id))\"" + +msgid "curseinfo::buildingunknown" +msgstr "\"Ein magischer Schimmer liegt auf diesen Mauern. ($int36($id))\"" + +msgid "changebanner" +msgstr "\"Banner has been changed to '$value'.\"" + +msgid "changebanner" +msgstr "\"Das Banner wurde auf '$value' geändert.\"" + +msgid "curseinfo::skill_2" +msgstr "\"$unit($unit) has some troubles with $skill($skill). ($int36($id))\"" + +msgid "curseinfo::skill_2" +msgstr "\"$unit($unit) ist ungewöhnlich ungeschickt in $skill($skill). ($int36($id))\"" + +msgid "spellfail::noway" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" + +msgid "spellfail::noway" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" + +msgid "spellbuildingresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be charmed.\"" + +msgid "spellbuildingresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) konnte nicht verzaubert werden.\"" + +msgid "after_battle" +msgstr "\"Units after the battle:\"" + +msgid "after_battle" +msgstr "\"Einheiten nach dem Kampf:\"" + +msgid "nr_claims" +msgstr "\"Units can claim the following items: $resources($items)\"" + +msgid "nr_claims" +msgstr "\"Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)\"" + +msgid "destroy_ship_2" +msgstr "\"$unit($unit) wurde beim Versuch $ship($ship) zu zerstören entdeckt.\"" + +msgid "destroy_ship_2" +msgstr "\"$unit($unit) was detected while trying to destroy $ship($ship).\"" + +msgid "destroy_magic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys $int($succ) spells on ${target}.\"" + +msgid "destroy_magic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört $int($succ) Flüche auf ${target}.\"" + +msgid "battle_row" +msgstr "\"... in combat rank $int($row):\"" + +msgid "battle_row" +msgstr "\"... in der $int($row). Kampflinie:\"" + +msgid "renamed_faction_seen" +msgstr "\"Your faction received a nickname from $unit($unit) in $region($region).\"" + +msgid "renamed_faction_seen" +msgstr "\"Die Partei bekommt von $unit.dative($unit) in $region($region) einen Spitznamen.\"" + +msgid "error_not_on_undead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast upon undead.\"" + +msgid "error_not_on_undead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" + +msgid "iceberg_melt" +msgstr "\"The iceberg $region($region) melts.\"" + +msgid "iceberg_melt" +msgstr "\"Der Eisberg $region($region) schmilzt.\"" + +msgid "cast_berserk_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters went into a mindless rage.\"" + +msgid "cast_berserk_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in einen Blutrausch versetzt.\"" + +msgid "curseinfo::sparkle_1" +msgstr "\"In a dream, a fairy appears to $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_1" +msgstr "\"$unit($unit) ist im Traum eine Fee erschienen. ($int36($id))\"" + +msgid "rust_effect_0" +msgstr "\"$unit($mage) calls forth a terrible torment over the enemy side, but there was nobody who could be affected by it.\"" + +msgid "rust_effect_0" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte.\"" + +msgid "error1222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" + +msgid "error1222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" + +msgid "header_battle" +msgstr "\"There is a battle in $region($region).\"" + +msgid "header_battle" +msgstr "\"In $region($region) findet ein Kampf statt.\"" + +msgid "wormhole_dissolve" +msgstr "\"The wormhole in $region($region) disappears.\"" + +msgid "wormhole_dissolve" +msgstr "\"Das Wurmloch in $region($region) schließt sich.\"" + +msgid "error23" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege.\"" + +msgid "error23" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich.\"" + +msgid "error12" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is not ours.\"" + +msgid "error12" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht.\"" + +msgid "error34" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit has no permission to come on board.\"" + +msgid "error34" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen.\"" + +msgid "income_steal" +msgstr "\"$unit($unit) steals $int($amount) silver in $region($region).\"" + +msgid "income_steal" +msgstr "\"$unit($unit) klaut in $region($region) $int($amount) Silber.\"" + +msgid "itemcrumble" +msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) turn to dust.\"" + +msgid "itemcrumble" +msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) zerfallen zu Staub.\"" + +msgid "error86" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong password.\"" + +msgid "error86" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Falsches Passwort.\"" + +msgid "luxury_notsold" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - These goods are not on sale here.\"" + +msgid "luxury_notsold" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Luxusgut wird hier nicht verkauft.\"" + +msgid "error75" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit does not accept anybody.\"" + +msgid "error75" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit nimmt niemanden an.\"" + +msgid "error97" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insects cannot be recruited in glacier regions.\"" + +msgid "error97" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In Gletschern können keine Insekten rekrutiert werden.\"" + +msgid "regionmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on the region.\"" + +msgid "regionmagic_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es die Region zu verzaubern.\"" + +msgid "error158" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magicians always work alone!\"" + +msgid "error158" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier arbeiten grundsätzlich nur alleine!\"" + +msgid "spyreport_mage" +msgstr "\"$unit($target) is a ${type}-magician\"" + +msgid "spyreport_mage" +msgstr "\"$unit($target) ist ein ${type}-Magier.\"" + +msgid "error268" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer items here.\"" + +msgid "error268" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nichts übergeben.\"" + +msgid "error264" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this good.\"" + +msgid "error264" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut hat die Einheit nicht.\"" + +msgid "battle_army" +msgstr "\"Army $int($index): $name\"" + +msgid "battle_army" +msgstr "\"Heer $int($index): $name\"" + +msgid "error154" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Highly qualified people refuse to work for other parties.\"" + +msgid "error154" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hochqualifizierte Personen weigern sich, für andere Parteien zu arbeiten.\"" + +msgid "error_notstonecircle" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is not a stone circle.\"" + +msgid "error_notstonecircle" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) ist kein Steinkreis.\"" + +msgid "error150" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building.\"" + +msgid "error150" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen.\"" + +msgid "error229" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A familiar is summoned, but it disappears again when it cannot get in contact with its natural element.\"" + +msgid "error229" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Vertrauter wird beschworen, verschwindet jedoch wieder, als er keine Verbindung zu seinem Element herstellen kann.\"" + +msgid "error_migrants_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migrants cannot study this.\"" + +msgid "error_migrants_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migranten können keine kostenpflichtigen Talente lernen.\"" + +msgid "error225" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units do not fight.\"" + +msgid "error225" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Soldaten kämpfen nicht.\"" + +msgid "error115" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is already in use.\"" + +msgid "error115" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist schon belegt.\"" + +msgid "spell_out_of_range" +msgstr "\"$unit($mage) casts $spell($spell), but nobody was in range.\"" + +msgid "spell_out_of_range" +msgstr "\"$unit($mage) zaubert $spell($spell), aber niemand war in Reichweite.\"" + +msgid "error111" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Message has been cut (too long).\"" + +msgid "error111" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nachricht zu lang - gekürzt.\"" + +msgid "error221" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build this here.\"" + +msgid "error221" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man hier nicht bauen.\"" + +msgid "error_race_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot study.\"" + +msgid "error_race_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts lernen.\"" + +msgid "buy" +msgstr "\"$unit($unit) pays $int($money) silver for luxury items.\"" + +msgid "buy" +msgstr "\"$unit($unit) bezahlt $int($money) Silber für den Kauf von Luxusgütern.\"" + +msgid "curseinfo::sparkle_15" +msgstr "\"Rats follow $unit($unit)'s every step. ($int36($id))\"" + +msgid "curseinfo::sparkle_15" +msgstr "\"Ratten folgen $unit($unit) auf Schritt und Tritt. ($int36($id))\"" + +msgid "arena_enter_fail" +msgstr "\"$region($region) reverberates from the voice of the gate keeper: 'Only those who forgo material riches and who are willing to learn my enter the Plane of Challenge. And don't forget about my tip!'. $unit($unit) was not admitted.\"" + +msgid "arena_enter_fail" +msgstr "\"In $region($region) erklingt die Stimme des Torwächters: 'Nur wer ohne materielle Güter und noch lernbegierig ist, der darf die Ebene der Herausforderung betreten. Und vergiß nicht mein Trinkgeld.'. $unit($unit) erhielt keinen Einlaß.\"" + +msgid "aurapotion50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated.\"" + +msgid "aurapotion50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt.\"" + +msgid "curseinfo::deathcloud" +msgstr "\"A poison elemental is spreading pestilence and death. ($int36($id))\"" + +msgid "curseinfo::deathcloud" +msgstr "\"In der Region treibt ein Giftelementar sein Unwesen. ($int36($id))\"" + +msgid "income" +msgstr "\"$unit($unit) earns $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") in $region($region) $if($eq($mode,1),\" by entertainment\",$if($eq($mode,2),\" by taxes\",$if($eq($mode,3),\" by trade\",$if($eq($mode,5),\" by stealing\",$if($eq($mode,6),\" by magic\",$if($eq($mode,7),\" by pillaging\",\"\")))))).\"" + +msgid "income" +msgstr "\"$unit($unit) verdient$if($eq($mode,4),\" am Handel\",\"\") in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber$if($eq($mode,1),\" durch Unterhaltung\",$if($eq($mode,2),\" durch Steuern\",$if($eq($mode,3),\" durch Handel\",$if($eq($mode,5),\" durch Diebstahl\",$if($eq($mode,6),\" durch Zauberei\",$if($eq($mode,7),\" durch Plündern\",\"\")))))).\"" + +msgid "researchherb" +msgstr "\"$unit($unit) discovers that $localize($amount) $resource($herb,0) grow in $region($region).\"" + +msgid "researchherb" +msgstr "\"$unit($unit) in $region($region) stellt fest, dass es hier $localize($amount) $resource($herb,0) gibt.\"" + +msgid "poison_death" +msgstr "\"$unit($unit) dies from poison damage taken in $region($region).\"" + +msgid "poison_death" +msgstr "\"$unit($unit) stirbt am Schaden durch den Giftelementar in $region($region).\"" + +msgid "error_notcomplete" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) has to be complete before it can be blessed.\"" + +msgid "error_notcomplete" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) muss vor der Weihe fertiggestellt sein.\"" + +msgid "regenaura" +msgstr "\"$unit($unit) regenerates $int($amount) aura in $region($region).\"" + +msgid "regenaura" +msgstr "\"$unit($unit) in $region($region) regeneriert $int($amount) Aura.\"" + +msgid "regionmagic_patzer" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) manages to put a spell on the region, but something went wrong nonetheless.\"" + +msgid "regionmagic_patzer" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es zwar die Region zu verzaubern, aber irgendwas ging schief.\"" + +msgid "curseinfo::sparkle_11" +msgstr "\"Bird songs follow $unit($unit) on all his travels. ($int36($id))\"" + +msgid "curseinfo::sparkle_11" +msgstr "\"Vogelzwitschern begleitet $unit($unit) auf all seinen Wegen. ($int36($id))\"" + +msgid "wdw_pyramidspell_notfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away.\"" + +msgid "wdw_pyramidspell_notfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region können keine Pyramiden gebaut werden. Die nächste Pyramidenregion ist zwischen $int($mindist) und $int($maxdist) Regionen entfernt.\"" + +msgid "sailforbidden" +msgstr "\"The crew of the $ship($ship) refuses to travel to $region($region).\"" + +msgid "sailforbidden" +msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen.\"" + +msgid "sp_raisepeasantmob_effect" +msgstr "\"$unit($mage) incites a revolt among the peasants of $region($region).\"" + +msgid "sp_raisepeasantmob_effect" +msgstr "\"$unit($mage) wiegelt in $region($region) die Bauern zum Aufstand auf.\"" + +msgid "error31" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The castle could not be found.\"" + +msgid "error31" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Burg wurde nicht gefunden.\"" + +msgid "error53" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot make potions.\"" + +msgid "error53" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine Tränke herstellen.\"" + +msgid "error20" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship could not be found.\"" + +msgid "error20" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff wurde nicht gefunden.\"" + +msgid "error42" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough coachmen or has too much freights to lad the wagons.\"" + +msgid "error42" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Wagenlenker oder zuviel andere Fracht, um die Wagen aufzuladen.\"" + +msgid "error64" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) is not sufficiently stealthy.\"" + +msgid "error64" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ist nicht ausreichend getarnt.\"" + +msgid "curseinfo::itemcloak" +msgstr "\"$unit($unit)'s equipment is invisible. ($int36($id))\"" + +msgid "curseinfo::itemcloak" +msgstr "\"Die Ausrüstung von $unit($unit) scheint unsichtbar. ($int36($id))\"" + +msgid "error277" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot do this.\"" + +msgid "error277" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann die Einheit nicht.\"" + +msgid "error94" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build a road here.\"" + +msgid "error94" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Straße bauen.\"" + +msgid "error167" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not go to the peasants.\"" + +msgid "error167" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit geht nicht zu den Bauern.\"" + +msgid "use_realworld_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object can only be used in the real world.\"" + +msgid "use_realworld_only" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand kann nur in der realen Welt benutzt werden.\"" + +msgid "error163" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This potion can only be used by insects.\"" + +msgid "error163" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Nestwärme kann nur von Insektenvölkern benutzt werden.\"" + +msgid "error273" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot teach here.\"" + +msgid "error273" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht unterrichten.\"" + +msgid "error238" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can recruit only orcs here.\"" + +msgid "error238" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier können nur Orks rekrutiert werden.\"" + +msgid "spellfail::nocontact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $region($target) could not be contacted.\"" + +msgid "spellfail::nocontact" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu $region($target) kann kein Kontakt hergestellt werden.\"" + +msgid "error119" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no marketplace without at least a tradepost.\"" + +msgid "error119" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne einen Handelsposten gibt es keinen Markt.\"" + +msgid "error124" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot buy that on a market place.\"" + +msgid "error124" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht auf dem Markt kaufen.\"" + +msgid "santa_m" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." + +msgid "santa_m" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei einen $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." + +msgid "error234" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is busy disembarking.\"" + +msgid "error234" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit Ausschiffen beschäftigt..\"" + +msgid "spellfail::nolevel" +msgstr "\"$unit($mage) in $region($region): '$order($command)' - This spell cannot be cast with variable level.\"" + +msgid "spellfail::nolevel" +msgstr "\"$unit($mage) in $region($region): '$order($command)' - Dieser Zauber kann nicht mit Stufenangabe gezaubert werden.\"" + +msgid "nr_score" +msgstr "\"Your faction has a score of ${score}. The average score for similar factions is ${average}.\"" + +msgid "nr_score" +msgstr "\"Deine Partei hat ${score} Punkte. Der Durchschnitt für Parteien ähnlichen Alters ist ${average} Punkte.\"" + +msgid "curseinfo::ship_unknown" +msgstr "\"An unknown spell lies on this ship. ($int36($id))\"" + +msgid "curseinfo::ship_unknown" +msgstr "\"Ein unbekannter Zauber liegt auf dem Schiff. ($int36($id))\"" + +msgid "alliance::kickedout" +msgstr "\"$faction($member) was kicked from $alliance($alliance) by $int($votes) of the alliance's members.\"" + +msgid "alliance::kickedout" +msgstr "\"$faction($member) ist mit $int($votes) Stimmen aus $alliance($alliance) ausgeschlossen worden.\"" + +msgid "error230" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot transport us to this place.\"" + +msgid "error230" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin kann die Einheit uns nicht transportieren.\"" + +msgid "error120" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Characters can be given only to human parties.\"" + +msgid "error120" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Personen können nur an Menschen übergeben werden.\"" + +msgid "error_max_alchemists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more tha $int($amount) alchemists in your faction.\"" + +msgid "error_max_alchemists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Alchemisten pro Partei geben.\"" + +msgid "error305" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Options ZIP and BZIP2 can only be switched, not turned off.\"" + +msgid "error305" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Optionen ZIP und BZIP2 können nur um-, nicht ausgeschaltet werden.\"" + +msgid "error301" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym missing.\"" + +msgid "error301" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Kein Synonym angegeben.\"" + +msgid "iceberg_drift" +msgstr "\"The iceberg $region($region) drifts $direction($dir).\"" + +msgid "iceberg_drift" +msgstr "\"Der Eisberg $region($region) treibt nach $direction($dir).\"" + +msgid "hornofpeace_r_success" +msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing. Peaceful harmony spreads over the region.\"" + +msgid "hornofpeace_r_success" +msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes. In der ganzen Region breitet sich eine friedliche Feststimmmung aus.\"" + +msgid "nr_vicinitystart" +msgstr "\"To the $direction($dir) lies $trailto($region)\"" + +msgid "nr_vicinitystart" +msgstr "\"Im $direction($dir) der Region liegt $trailto($region)\"" + +msgid "giverestriction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction must be at least $int($turns) weeks old to give something to another faction.\"" + +msgid "giverestriction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Deine Partei muss mindestens $int($turns) alt sein, um etwas an andere Parteien übergeben zu können.\"" + +msgid "curseinfo::depression" +msgstr "\"The peasants are upset. ($int36($id))\"" + +msgid "curseinfo::depression" +msgstr "\"Die Bauern sind unzufrieden. ($int36($id))\"" + +msgid "patzer" +msgstr "\"$unit($unit) fumbles while casting $spell($spell) in $region($region).\"" + +msgid "patzer" +msgstr "\"$unit($unit) unterläuft in $region($region) beim Zaubern von $spell($spell) ein Patzer.\"" + +msgid "potionsave" +msgstr "\"A fighter of $unit($unit) was saved by a healing potion.\"" + +msgid "potionsave" +msgstr "\"Eine Person von $unit($unit) konnte durch einen Heiltrank überleben.\"" + +msgid "storm" +msgstr "\"The $ship($ship) in $region($region) gets off course in heavy storm$if($sink,\" and sinks\",\"\").\"" + +msgid "storm" +msgstr "\"Die $ship($ship) wird in $region($region) von Stürmen abgetrieben$if($sink,\" und sinkt\",\"\").\"" + +msgid "nr_insectwinter" +msgstr "It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions." + +msgid "nr_insectwinter" +msgstr "Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren." + +msgid "spellfail_nomonsters" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on monsters.\"" + +msgid "spellfail_nomonsters" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Monster gezaubert werden.\"" + +msgid "bagpipeoffear_region" +msgstr "\"$unit($unit) plays the bagpipe. Stricken with fear the peasants give $int($money) silver.\"" + +msgid "bagpipeoffear_region" +msgstr "\"$unit($unit) spielt einen Dudelsack. Ausser sich vor Furcht geben die Bauern $int($money) Silber.\"" + +msgid "sp_chaosrow_effect_1" +msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub and the battle order is disturbed.\"" + +msgid "sp_chaosrow_effect_1" +msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" + +msgid "use_item" +msgstr "\"$unit($unit) uses $int($amount) $resource($item,$amount).\"" + +msgid "use_item" +msgstr "\"$unit($unit) benutzt $int($amount) $resource($item,$amount).\"" + +msgid "sp_movecastle_effect" +msgstr "\"An tremor shakes $building($building). Many little pseudopods lift up the building and carry it to $direction($direction).\"" + +msgid "sp_movecastle_effect" +msgstr "\"Ein Beben erschüttert $building($building). Viele kleine Pseudopodien erheben das Gebäude und tragen es in Richtung $direction($direction).\"" + +msgid "feedback_no_contact_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, and resists the spell.\"" + +msgid "feedback_no_contact_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen und widersteht dem Zauber.\"" + +msgid "error176" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell on a distant target.\"" + +msgid "error176" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht in die Ferne richten.\"" + +msgid "error286" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not transporting us.\"" + +msgid "error286" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit transportiert uns nicht.\"" + +msgid "error83" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No peasant could be caught.\"" + +msgid "error83" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnte kein Bauer gefangen werden.\"" + +msgid "error50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not experienced enough to do this.\"" + +msgid "error50" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht erfahren genug dafür.\"" + +msgid "error282" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot start a jihad against this race.\"" + +msgid "error282" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen diese Rasse kann kein Jihad ausgerufen werden.\"" + +msgid "nmr_warning_final" +msgstr "\"Please send in orders for the next turn if you want to continue playing.\"" + +msgid "nmr_warning_final" +msgstr "\"Bitte sende die Befehle nächste Runde ein, wenn du weiterspielen möchtest.\"" + +msgid "error172" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There was no spell supplied.\"" + +msgid "error172" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Zauber angegeben.\"" + +msgid "entrance_denied" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Entrance to $building($building) was denied.\"" + +msgid "entrance_denied" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Eintritt in $building($building) wurde verwehrt.\"" + +msgid "maelstrom_effect" +msgstr "\"$unit($mage) summons the power of the seas and a giant maelstrom forms.\"" + +msgid "maelstrom_effect" +msgstr "\"$unit($mage) beschwört die Mächte des Wassers und ein gigantischer Strudel bildet sich.\"" + +msgid "displayitem" +msgstr "\"$resource($item,1) (weight: $weight($weight)): $description\"" + +msgid "displayitem" +msgstr "\"$resource($item,1) (Gewicht: $weight($weight)): $description\"" + +msgid "error128" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many strangers.\"" + +msgid "error128" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann die Partei nicht aufnehmen.\"" + +msgid "error247" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction is already named.\"" + +msgid "error247" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat schon einen Namen.\"" + +msgid "spellfail_generous" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mood in this region is so bad that nobody reacts to the spell.\"" + +msgid "spellfail_generous" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Stimmung in der Region ist so schlecht, dass niemand auf den Zauber reagiert.\"" + +msgid "healing_effect_0" +msgstr "\"$unit($mage) sees after the wounded and heals $int($amount).\"" + +msgid "healing_effect_0" +msgstr "\"$unit($mage) kümmert sich um die Verletzten und heilt $int($amount) Verwundete.\"" + +msgid "use_questkey_wrongregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No fitting lock can be found here.\"" + +msgid "use_questkey_wrongregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier ist kein passendes Schloss.\"" + +msgid "error243" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You did not specify a valid race.\"" + +msgid "error243" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine gültige Rasse angegeben.\"" + +msgid "error133" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a caravansary before building roads through deserts.\"" + +msgid "error133" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Wüsten Straßen bauen zu können, muß zuerst eine Karawanserei errichtet werden.\"" + +msgid "changepasswd" +msgstr "\"The password of this faction is '$value'.\"" + +msgid "changepasswd" +msgstr "\"Das Passwort für diese Partei lautet ${value}.\"" + +msgid "cast_combatspell" +msgstr "\"$unit($mage) casts $spell($spell): $int($dead) $if($eq($dead,1),\"enemy was\", \"enemies were\") killed.\"" + +msgid "cast_combatspell" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($dead) $if($eq($dead,1),\"Krieger wurde\", \"Krieger wurden\") getötet.\"" + +msgid "cast_petrify_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were petrified.\"" + +msgid "cast_petrify_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurden versteinert.\"" + +msgid "error309" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit already assumed lycantropic form.\"" + +msgid "error309" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist schon ein Werwesen.\"" + +msgid "nr_stat_salary_new" +msgstr "\"peasant wages: $int($max) silver\"" + +msgid "nr_stat_salary_new" +msgstr "\"Bauerneinnahmen: $int($max) Silber\"" + +msgid "income_magic_reduced" +msgstr "\"$unit($unit) in $region($region) earns $int($amount)$if($eq($wanted,$amount),\"\",\" instead of $int($wanted)\") silver through magic.\"" + +msgid "income_magic_reduced" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Zauberei.\"" + +msgid "destroy_ship_1" +msgstr "\"$unit($unit) konnte $ship($ship) nicht zerstören.\"" + +msgid "destroy_ship_1" +msgstr "\"$unit($unit) could not destroy $ship($ship).\"" + +msgid "error314" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Restart can only be used once.\"" + +msgid "error314" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei kann nur einmal neu starten.\"" + +msgid "error310" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is not in lycantropic form.\"" + +msgid "error310" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist kein Werwesen.\"" + +msgid "error_pflnorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot recruit in this plane.\"" + +msgid "error_pflnorecruit" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Ebene der Herausforderung kann niemand rekrutiert werden.\"" + +msgid "sp_mindblast_temp_effect" +msgstr "\"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories.\"" + +msgid "sp_mindblast_temp_effect" +msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren kurzzeitig ihr Gedächtnis.\"" + +msgid "buildbuilding" +msgstr "\"$unit($unit) builds $int($size) more on $building($building).\"" + +msgid "buildbuilding" +msgstr "\"$unit($unit) baut für $int($size) an $building($building) weiter.\"" + +msgid "spellfail_astralblock" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The paths to the spirit world seem to be blocked.\"" + +msgid "spellfail_astralblock" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege zwischen Geisterwelt und Realität scheinen blockiert zu sein.\"" + +msgid "familiar_toofar" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot raise enough energy to channel the spell through $unit($unit).\"" + +msgid "familiar_toofar" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann nicht genug Energie aufbringen, um diesen Spruch durch $unit($unit) zu wirken.\"" + +msgid "wdw_pyramidspell_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pyramids may be build in this region.\"" + +msgid "wdw_pyramidspell_found" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Regione können Pyramiden gebaut werden.\"" + +msgid "deorcified" +msgstr "\"Little by little, people return to $region($region).\"" + +msgid "deorcified" +msgstr "\"Langsam kehren andere Völker nach $region($region) zurück.\"" + +msgid "sp_movecastle_fail_1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction).\"" + +msgid "sp_movecastle_fail_1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen.\"" + +msgid "curseinfo::strength" +msgstr "\"Testosterone levels are at an all-time high. ($int36($id))\"" + +msgid "curseinfo::strength" +msgstr "\"Die Leute strotzen nur so vor Kraft. ($int36($id))\"" + +msgid "magic_fumble" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is caught in their own spell.\"" + +msgid "magic_fumble" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier verfängt sich im eigenen Zauber.\"" + +msgid "teach_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) is not learning.\"" + +msgid "teach_nolearn" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) lernt nicht.\"" + +msgid "regionowned" +msgstr "\"$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance.\"" + +msgid "regionowned" +msgstr "\"$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte.\"" + +msgid "income_tradetax" +msgstr "\"$unit($unit) collected $int($amount) silver trade tax in $region($region).\"" + +msgid "income_tradetax" +msgstr "\"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber.\"" + +msgid "error19" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - First you have to leave the ship.\"" + +msgid "error19" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff muß erst verlassen werden.\"" + +msgid "buyamount" +msgstr "\"$unit($unit) buys $int($amount) $resource($resource,$amount).\"" + +msgid "buyamount" +msgstr "\"$unit($unit) kauft $int($amount) $resource($resource,$amount).\"" + +msgid "fumblecurse" +msgstr "\"$unit($unit) in $region($region) was cursed by an unknown magician.\"" + +msgid "fumblecurse" +msgstr "\"$unit($unit) in $region($region) wird von einem Unbekannten verflucht.\"" + +msgid "regionmessage" +msgstr "\"A message by $unit($sender) from $region($region): '$string'\"" + +msgid "regionmessage" +msgstr "\"Eine Botschaft von $unit.dative($sender) aus $region($region): '$string'\"" + +msgid "spellfail_noundead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on undead.\"" + +msgid "spellfail_noundead" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" + +msgid "studycost" +msgstr "\"$unit($unit) spends $int($cost) silver in $region($region) to study $skill($skill).\"" + +msgid "studycost" +msgstr "\"$unit($unit) in $region($region) verbraucht $int($cost) Silber für das Studium von $skill($skill).\"" + +msgid "flying_ship_result" +msgstr "\"$unit($mage) summons a wind spirit that lifts the $ship($ship) into the clouds.\"" + +msgid "flying_ship_result" +msgstr "\"$unit($mage) beschwört einen Luftgeist, der die $ship($ship) in die Wolken hebt.\"" + +msgid "forestfire_spread" +msgstr "\"The fire in $region($region) spread to $region($next) and $int($trees) were burned.\"" + +msgid "forestfire_spread" +msgstr "\"Der Waldbrand in $region($region) griff auch auf $region($next) über, und $int($trees) verbrannten.\"" + +msgid "maintenancefail" +msgstr "\"$unit($unit) cannot pay the maintenance for $building($building).\"" + +msgid "maintenancefail" +msgstr "\"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen.\"" + +msgid "bagpipeoffear_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Stricken with fear the peasants give the bard $int($money) silver.\"" + +msgid "bagpipeoffear_faction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ausser sich vor Furcht geben die Bauern dem Barden $int($money) Silber.\"" + +msgid "unitmessage" +msgstr "\"In $region($region), $unit($unit) received a message by $unit($sender): '$string'\"" + +msgid "unitmessage" +msgstr "\"In $region($region) erhielt $unit($unit) eine Botschaft von $unit.dative($sender): '$string'\"" + +msgid "error189" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot dry out an entire ocean.\"" + +msgid "error189" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst der mächtigste Magier der Welt könnte keinen Ozean austrocknen lassen.\"" + +msgid "teach_student" +msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill).\"" + +msgid "teach_student" +msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill).\"" + +msgid "curseinfo::astralblock" +msgstr "\"Powerful magic disrupts our contact with reality. ($int36($id))\"" + +msgid "curseinfo::astralblock" +msgstr "\"Mächtige Magie verhindert den Kontakt zur Realität. ($int36($id))\"" + +msgid "error299" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid prefix.\"" + +msgid "error299" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Prefix.\"" + +msgid "curseinfo::baddream" +msgstr "\"Nightmares plague the population. ($int36($id))\"" + +msgid "curseinfo::baddream" +msgstr "\"Albträume plagen die Leute. ($int36($id))\"" + +msgid "error295" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only mages may use an astralcrystal.\"" + +msgid "error295" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur ein Magier kann einen Astralkristall benutzen.\"" + +msgid "error185" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell seems exceptionally weak. Something has interfred with the magical energies.\"" + +msgid "error185" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber scheint ungewöhnlich schwach zu sein. Irgendetwas hat die magischen Energien abgeleitet.\"" + +msgid "error181" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - To do this, the magician has to be in a castle or on board a ship.\"" + +msgid "error181" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muß sich der Magier in der Burg oder an Bord des Schiffes befinden.\"" + +msgid "error291" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keinem Verband.\"" + +msgid "curseinfo::calm_0" +msgstr "\"$unit($unit) seems to like $race($race, 0). ($int36($id))\"" + +msgid "curseinfo::calm_0" +msgstr "\"$unit($unit) scheint $race($race, 0) zu mögen. ($int36($id))\"" + +msgid "error256" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot pray for this.\"" + +msgid "error256" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um so etwas kann man nicht beten.\"" + +msgid "desertion" +msgstr "\"$unit($unit) in $region($region) abandons your cause.\"" + +msgid "desertion" +msgstr "\"$unit($unit) in $region($region) desertiert.\"" + +msgid "error91" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no mallorn trees here.\"" + +msgid "error91" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Mallornbäume.\"" + +msgid "error137" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown help mode.\"" + +msgid "error137" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Hilfe-Modus.\"" + +msgid "error80" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" + +msgid "error80" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist nicht bewaffnet und kampffähig.\"" + +msgid "error142" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver for recruiting.\"" + +msgid "error142" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat zuwenig Silber, um zu rekrutieren.\"" + +msgid "rust_fail" +msgstr "\"$unit($mage) puts a spell of rust on $unit($target) but it found nothing to consume.\"" + +msgid "rust_fail" +msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target), doch der Rosthauch fand keine Nahrung.\"" + +msgid "error252" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - What and how much should be sacrificed?\"" + +msgid "error252" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Was und wieviel soll geopfert werden?\"" + +msgid "dissolve_units_3" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) whithered and died.\"" + +msgid "dissolve_units_3" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verfaulte\", \"verfaulten\").\"" + +msgid "trappedairelemental_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster.\"" + +msgid "trappedairelemental_success" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die $ship($ship) wird jetzt schneller ihr Ziel erreichen.\"" + +msgid "error208" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong aura values.\"" + +msgid "error208" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft.\"" + +msgid "error318" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building can be expanded only once per turn.\"" + +msgid "error318" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude kann nur einmal pro Runde erweitert werden.\"" + +msgid "teach_asgood" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) needs to be at least 2 levels better than $unit($student).\"" + +msgid "teach_asgood" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) muß mindestens 2 Stufen besser sein als $unit($student).\"" + +msgid "drought_effect_1" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). Ice melts and turns the lands into swamps. Powerful rivers wash away the fertile soil and drown people and animals alike. What buildings have not succumbed to the floods sink into the mire. The torrid sun changes the region forever.\"" + +msgid "drought_effect_1" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Eis schmilzt und verwandelt sich in Morast. Reißende Ströme spülen die mageren Felder weg und ersäufen Mensch und Tier. Was an Bauten nicht den Fluten zum Opfer fiel, verschlingt der Morast. Die sengende Hitze verändert die Region für immer.\"" + +msgid "error204" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a region without trees.\"" + +msgid "error204" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In einer Region ohne Bäume kann man diesen Zauber nicht wirken.\"" + +msgid "patzer5" +msgstr "\"$unit($unit) feels far more exhausted than he should after casting $spell($spell) and assumes that any following spells will cost far more energy than usual.\"" + +msgid "patzer5" +msgstr "\"$unit($unit) fühlt sich nach dem Zaubern von $spell($spell) viel erschöpfter als sonst und hat das Gefühl, dass alle weiteren Zauber deutlich mehr Kraft als normalerweise kosten werden.\"" + +msgid "analyse_region_age" +msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" + +msgid "analyse_region_age" +msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" + +msgid "plague_spell" +msgstr "\"$unit($mage) sends the plague on $region($region).\"" + +msgid "plague_spell" +msgstr "\"$unit($mage) ruft in $region($region) eine Pest hervor.\"" + +msgid "error200" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magician's maximum aura is not high enough for this spell.\"" + +msgid "error200" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die maximale Aura reicht nicht für diesen Zauber.\"" + +msgid "shipnoshore" +msgstr "\"The $ship($ship) discovers that $region($region) is dry land.\"" + +msgid "shipnoshore" +msgstr "\"Die $ship($ship) entdeckt, dass $region($region) Festland ist.\"" + +msgid "sp_sweetdreams_effect" +msgstr "\"$unit($mage) causes $unit($unit) to have a wonderful night in $region($region).\"" + +msgid "sp_sweetdreams_effect" +msgstr "\"$unit($mage) verschafft $unit($unit) ein schönes Nachtleben in $region($region).\"" + +msgid "error3" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Description has been cut (too long).\"" + +msgid "error3" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Beschreibung zu lang - gekürzt.\"" + +msgid "charming_effect" +msgstr "\"$unit($mage) chamrs $unit($unit). $unit($unit) will obey our orders for approximatley $int($duration) more weeks.\"" + +msgid "charming_effect" +msgstr "\"$unit($mage) gelingt es $unit($unit) zu verzaubern. $unit($unit) wird für etwa $int($duration) Wochen unseren Befehlen gehorchen.\"" + +msgid "target_region_invalid" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - invalid target region.\"" + +msgid "target_region_invalid" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültige Zielregion.\"" + +msgid "nr_heroes" +msgstr "\"Your faction has promoted $int($units) heroes out of a possible total of $int($maxunits).\"" + +msgid "nr_heroes" +msgstr "\"Deine Partei hat $int($units) Helden und kann maximal $int($maxunits) Helden ernennen.\"" + +msgid "cast_tired_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had trouble staying awake.\"" + +msgid "cast_tired_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger schleppten sich müde in den Kampf.\"" + +msgid "caldera_handle_1" +msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" + +msgid "caldera_handle_1" +msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" + +msgid "weakmagic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell of $unit($unit) was way to weak and its magic dissolves immediately.\"" + +msgid "weakmagic" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber von $unit.dative($unit) war viel zu schwach und löst sich gleich wieder auf.\"" + +msgid "analyse_building_fail" +msgstr "\"It appears to $unit($mage) that $building($building) is charmed, but no details have been revealed.\"" + +msgid "analyse_building_fail" +msgstr "\"$unit($mage) meint, dass auf $building($building) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "spellfail_toomanytargets" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This many people exceed the powers of the magician.\"" + +msgid "spellfail_toomanytargets" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Persoenen übersteigen die Kräfte des Magiers.\"" + +msgid "harvest_effect" +msgstr "\"$if($isnull($mage),\"An unseen magician\",$unit($mage)) blesses the fields in a short ritual.\"" + +msgid "harvest_effect" +msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) segnet in einem kurzen Ritual die Felder.\"" + +msgid "buildship" +msgstr "\"$unit($unit) builds $int($size) more on $ship($ship).\"" + +msgid "buildship" +msgstr "\"$unit($unit) baut für $int($size) an $ship($ship) weiter.\"" + +msgid "spellshipnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ship $int36($id) could not be located.\"" + +msgid "spellshipnotfound" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Schiff $int36($id) wurde nicht gefunden.\"" + +msgid "unveileog" +msgstr "\"$unit($unit) discovers laen in $region($region).\"" + +msgid "unveileog" +msgstr "\"$unit($unit) in $region($region) entdeckt eine Laenader.\"" + +msgid "error_roads_finished" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete.\"" + +msgid "error_roads_finished" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen.\"" + +msgid "item_create_spell" +msgstr "\"$unit($mage) creates $int($number) $resource($item,$number).\"" + +msgid "item_create_spell" +msgstr "\"$unit($mage) erschafft $int($number) $resource($item,$number).\"" + +msgid "curseinfo::slavery" +msgstr "This powerful curse appears to rob the unit of its free will. As long as the curse is active, it will only obey the orders of its new lord. ($int36($id))" + +msgid "curseinfo::slavery" +msgstr "Dieser mächtige Bann scheint die Einheit ihres freien Willens zu berauben. Solange der Zauber wirkt, wird sie nur den Befehlen ihres neuen Herrn gehorchen. ($int36($id))" + +msgid "start_battle" +msgstr "\"The battle was initiated by ${factions}.\"" + +msgid "start_battle" +msgstr "\"Der Kampf wurde ausgelöst von ${factions}.\"" + +msgid "stealaura_fail_detect" +msgstr "\"$unit($unit) fühlt strangely weakened.\"" + +msgid "stealaura_fail_detect" +msgstr "\"$unit($unit) fühlt sich einen Moment seltsam geschwächt.\"" + +msgid "battle_msg" +msgstr "\"$string\"" + +msgid "battle_msg" +msgstr "\"$string\"" + +msgid "error16" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already completed.\"" + +msgid "error16" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist schon fertig.\"" + +msgid "error38" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have any herbs.\"" + +msgid "error38" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Kräuter.\"" + +msgid "volcano_dead" +msgstr "\"$int($dead) people in $unit($unit) perish when the volcano in $region($region) erupts.\"" + +msgid "volcano_dead" +msgstr "\"Beim Vulkanausbruch in $region($region) sterben $int($dead) Personen in $unit($unit).\"" + +msgid "curseinfo::warmth_1" +msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") protected from the cold. ($int36($id))\"" + +msgid "curseinfo::warmth_1" +msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"fühlt\", \"fühlen\") sich vor Kälte geschützt. ($int36($id))\"" + +msgid "maintenance_noowner" +msgstr "\"The upkeep for $building($building) was not paid, the building was not operational this week.\"" + +msgid "maintenance_noowner" +msgstr "\"Der Unterhalt von $building($building) konnte nicht gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig.\"" + +msgid "error27" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items for sale is missing.\"" + +msgid "error27" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu verkaufender Produkte fehlt.\"" + +msgid "error49" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not the owner.\"" + +msgid "error49" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Eigentümer.\"" + +msgid "missing_components" +msgstr "\"$unit($unit) has insufficient components to cast $spell($spell) on level $int($level).\"" + +msgid "missing_components" +msgstr "\"$unit($unit) hat nicht genügend Komponenten um $spell($spell) auf Stufe $int($level) zu zaubern.\"" + +msgid "seduce_effect_1" +msgstr "\"$unit($unit) gambles for high stakes and loses almost everything.\"" + +msgid "seduce_effect_1" +msgstr "\"$unit($unit) verfiel dem Glücksspiel und hat fast sein ganzes Hab und gut verspielt.\"" + +msgid "xmastree_effect" +msgstr "\"At night, colourful lights can be seen in this region, bells are a-ringing and the laughter of happy children seems to be everywhere in the forests.\"" + +msgid "xmastree_effect" +msgstr "\"In der Region erstrahlen des Nachts bunte Lichter, Gloeckchen klingeln und frohes Kindergelaechter klingt durch den Wald.\"" + +msgid "cast_sleep_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters have fallen asleep.\"" + +msgid "cast_sleep_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in Schlaf versetzt.\"" + +msgid "nr_alliance" +msgstr "\"Member of '$name ($int36($id))' for $int($age) weeks, led by $faction($leader).\"" + +msgid "nr_alliance" +msgstr "\"Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', angeführt von $faction($leader).\"" + +msgid "deathcloud_effect" +msgstr "\"$unit($mage) summons a poison elemental in $region($region).\"" + +msgid "deathcloud_effect" +msgstr "\"$unit($mage) beschwört einen Giftelementar in $region($region).\"" + +msgid "nr_building_besieged" +msgstr "\", besieged by $int($soldiers) soldiers$if($lt($diff,0),\"\",\" (cut off)\")\"" + +msgid "nr_building_besieged" +msgstr "\", belagert von $int($soldiers) Personen$if($lt($diff,0),\"\",\" (abgeschnitten)\")\"" + +msgid "nr_population" +msgstr "\"Your faction has $int($population) people in $int($units) of $int($limit) possible units.\"" + +msgid "nr_population" +msgstr "\"Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten.\"" + +msgid "curseinfo::shipdisorientation" +msgstr "This ship has lost its path. ($int36($id))" + +msgid "curseinfo::shipdisorientation" +msgstr "Dieses Schiff hat sich verfahren. ($int36($id))" + +msgid "error198" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The flames find no kindling. The fire dies quickly, causing no damage whatsoever.\"" + +msgid "error198" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Flammen finden keine Nahrung. Das Feuer erlischt, ohne Schaden anzurichten.\"" + +msgid "error194" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Target region was supplied incorrectly.\"" + +msgid "error194" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zielregion wurde nicht korrekt angegeben.\"" + +msgid "illusionantimagic" +msgstr "\"$unit($unit) walks into an antimagical zone and dissolves.\"" + +msgid "illusionantimagic" +msgstr "\"$unit($unit) marschiert in eine Antimagiezone und löst sich auf.\"" + +msgid "curseinfo::sparkle_8" +msgstr "\"A group of passing miners makes passes at $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_8" +msgstr "\"Eine Gruppe vorbeiziehender Bergarbeiter rufen $unit($unit) eindeutig Zweideutiges nach. ($int36($id))\"" + +msgid "too_many_units_in_alliance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - An alliance may not consist of more than $int($allowed) units.\"" + +msgid "too_many_units_in_alliance" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Allianz darf aus nicht mehr als $int($allowed) Einheiten bestehen.\"" + +msgid "error190" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in the material world.\"" + +msgid "error190" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der materiellen Welt.\"" + +msgid "sp_flee_effect_0" +msgstr "\"$unit($mage) casts $spell($spell), but nobody is affected.\"" + +msgid "sp_flee_effect_0" +msgstr "\"$unit($mage) zaubert $spell($spell), aber es gab niemanden, der beeinflusst werden konnte.\"" + +msgid "error146" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not captain of a ship.\"" + +msgid "error146" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Kapitän des Schiffes.\"" + +msgid "error265" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only works in the normal world.\"" + +msgid "error265" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der normalen Welt.\"" + +msgid "error261" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sort before the owner of a ship or a building.\"" + +msgid "error261" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Vor den Besitzer eines Schiffes oder Gebäudes kann nicht sortiert werden.\"" + +msgid "icastle_dissolve" +msgstr "\"$building($building) suddenly dissolves into small pink clouds.\"" + +msgid "icastle_dissolve" +msgstr "\"Plötzlich löst sich $building($building) in kleine Traumwolken auf.\"" + +msgid "error151" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need stones to build a road.\"" + +msgid "error151" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zum Straßenbau braucht man Steine.\"" + +msgid "slave_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit will not fight.\"" + +msgid "slave_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht.\"" + +msgid "error107" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least two horses to breed more.\"" + +msgid "error107" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man braucht mindestens zwei Pferde, um sie zu züchten.\"" + +msgid "error213" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Incorrect parameter.\"" + +msgid "error213" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Parameter nicht korrekt angegeben.\"" + +msgid "error103" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can build roads.\"" + +msgid "error103" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann Straßen bauen.\"" + +msgid "curseinfo::slave_1" +msgstr "\"$unit($unit) will be under our influence for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" + +msgid "curseinfo::slave_1" +msgstr "\"$unit($unit) wird noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") unter unserem Bann stehen. ($int36($id))\"" + +msgid "alliance::lost" +msgstr "\"$alliance($alliance) has to leave the game after all their temples were lost.\"" + +msgid "alliance::lost" +msgstr "\"$alliance($alliance) scheidet aus dem Spiel aus, nachdem alle Tempel verloren gingen.\"" + +msgid "nr_stat_salary" +msgstr "\"worker salary: $int($max) silver\"" + +msgid "nr_stat_salary" +msgstr "\"Lohn für Arbeit: $int($max) Silber\"" + +msgid "nr_stat_luxuries" +msgstr "\"luxury goods at this price: $int($max)\"" + +msgid "nr_stat_luxuries" +msgstr "\"Luxusgüter zum angegebenen Preis: $int($max)\"" + +msgid "curseinfo::flyingship" +msgstr "\"Powerful storms have lifted this ship high into the air. ($int36($id))\"" + +msgid "curseinfo::flyingship" +msgstr "\"Kräftige Stürme haben dieses Schiff in die Luft gehoben. ($int36($id))\"" + +msgid "curseinfo::blessedharvest" +msgstr "\"The grain in this region is especially healthy. ($int36($id))\"" + +msgid "curseinfo::blessedharvest" +msgstr "\"In dieser Gegend steht das Korn besonders gut im Feld. ($int36($id))\"" + +msgid "killed_battle" +msgstr "\"$unit($unit) killed $int($dead) opponents.\"" + +msgid "killed_battle" +msgstr "\"$unit($unit) tötete $int($dead) Krieger.\"" + +msgid "error6" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building could not be found.\"" + +msgid "error6" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude wurde nicht gefunden.\"" + +msgid "sailnolandingstorm" +msgstr "\"At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region).\"" + +msgid "sailnolandingstorm" +msgstr "\"Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft.\"" + +msgid "teachdumb" +msgstr "\"Due to the effect of duncebuns, $unit($teacher) can only teach $int($amount) students.\"" + +msgid "teachdumb" +msgstr "\"$unit($teacher) kann durch Dumpfbackenbrot nur $int($amount) Schüler lehren.\"" + +msgid "teleport_success" +msgstr "\"$unit($unit) was teleported from $region($source) to $unit($target).\"" + +msgid "teleport_success" +msgstr "\"$unit($unit) wurde von $region($source) nach $unit($target) teleportiert.\"" + +msgid "becomewere" +msgstr "\"$unit($unit) in $region($region) becomes a lycantrope.\"" + +msgid "becomewere" +msgstr "\"$unit($unit) in $region($region) verwandelt sich in ein Werwesen.\"" + +msgid "spellshipresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) resists the spell.\"" + +msgid "spellshipresists" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) widersteht dem Zauber.\"" + +msgid "nr_potion_effect" +msgstr "\"There $if($eq($left,1),\"is\",\"are\") $int($left) $if($eq($left,1),\"use\",\"uses\") of $resource($potion,1) left.\"" + +msgid "nr_potion_effect" +msgstr "\"Auf der Einheit $if($eq($left,1),\"liegt\",\"liegen\") $int($left) Wirkung$if($eq($left,1),\"\",\"en\") $resource($potion,1).\"" + +msgid "curseinfo::peacezone" +msgstr "\"Everyone in this region seems to be in a peacful mood. ($int36($id))\"" + +msgid "curseinfo::peacezone" +msgstr "\"Die ganze Region ist von einer friedlichen Stimmung erfasst. ($int36($id))\"" + +msgid "rust_effect_1" +msgstr "\"$unit($mage) causes a terrible storm over the enemy, but the magic rain does not do any harm.\"" + +msgid "rust_effect_1" +msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt.\"" + +msgid "find_manual" +msgstr "\"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous.\"" + +msgid "find_manual" +msgstr "\"$unit($unit) stolpert bei der Erforschung der Region über $localize($location). Nähere Durchsuchung fördert ein zerfleddertes altes Buch mit dem Titel '$localize($book)' zu Tage. Der Wissensschub ist enorm.\"" + +msgid "curseinfo::healingzone" +msgstr "Healing in this region is affected by magic. ($int36($id))" + +msgid "curseinfo::healingzone" +msgstr "Heilung ist in dieser Region magisch beeinflusst. ($int36($id))" + +msgid "income_entertainment_reduced" +msgstr "\"In $region($region), $unit($unit) earns only $int($amount) instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") with entertainment.\"" + +msgid "income_entertainment_reduced" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Unterhaltung.\"" + +msgid "errusingpotion" +msgstr "\"$unit($unit): '$order($command)' - The unit already uses $resource($using,0).\"" + +msgid "errusingpotion" +msgstr "\"$unit($unit): '$order($command)' - Die Einheit benutzt bereits $resource($using,0).\"" + +msgid "missing_components_list" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Casting this spell requires an additional $resources($list).\"" + +msgid "missing_components_list" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für diesen Zauber fehlen noch $resources($list).\"" + +msgid "volcanostopsmoke" +msgstr "\"The volcano of $region($region) stops releasing smoke.\"" + +msgid "volcanostopsmoke" +msgstr "\"Aus dem Vulkankrater von $region($region) steigt kein Rauch mehr.\"" + +msgid "summondragon" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) calls dragons to $region($target).\"" + +msgid "summondragon" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ruft Drachen nach $region($target).\"" + +msgid "use_antimagiccrystal" +msgstr "\"$unit($unit) uses an antimagic crystal.\"" + +msgid "use_antimagiccrystal" +msgstr "\"$unit($unit) benutzt einen Antimagiekristall.\"" + +msgid "cast_stun_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were momentarily stunned.\"" + +msgid "cast_stun_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger sind für einen Moment benommen.\"" + +msgid "error46" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a tavern.\"" + +msgid "error46" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Taverne.\"" + +msgid "error35" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have these herbs.\"" + +msgid "error35" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diese Kräuter nicht.\"" + +msgid "error57" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is too heavily loaded to move.\"" + +msgid "error57" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit trägt zuviel Gewicht, um sich bewegen zu können.\"" + +msgid "feedback_no_contact_no_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, but cannot resist the spell.\"" + +msgid "feedback_no_contact_no_resist" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen, aber widersteht dem Zauber nicht.\"" + +msgid "error79" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - A ship or a castle must be supplied.\"" + +msgid "error79" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Schiff oder eine Burg muß angegeben werden.\"" + +msgid "drought_effect_4" +msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The ice melts and and the region is consumed by a tidal wave.\"" + +msgid "drought_effect_4" +msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Das Eis zerbricht und eine gewaltige Flutwelle verschlingt die Region.\"" + +msgid "destroy_ship_0" +msgstr "\"$ship($ship) wurde von $unit($unit) zerstört.\"" + +msgid "destroy_ship_0" +msgstr "\"$ship($ship) was destroyed by $unit($unit).\"" + +msgid "curseinfo::sparkle_16" +msgstr "\"The body of $unit($unit) is disfigured by hideous boils. ($int36($id))\"" + +msgid "curseinfo::sparkle_16" +msgstr "\"Pestbeulen befallen den Körper von $unit($unit). ($int36($id))\"" + +msgid "missing_direction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - no direction was specified.\"" + +msgid "missing_direction" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - keine Richtung angegeben.\"" + +msgid "error159" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No person could be handed over.\"" + +msgid "error159" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Personen übergeben werden.\"" + +msgid "shock" +msgstr "\"$unit($mage) receives a shock when his familiar dies.\"" + +msgid "shock" +msgstr "\"$unit($mage) erleidet durch den Tod seines Vertrauten einen Schock.\"" + +msgid "error269" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast spells here.\"" + +msgid "error269" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht zaubern.\"" + +msgid "sink_saved_msg" +msgstr "\"$unit($unit) survives unscathed and makes it to $region($region).\"" + +msgid "sink_saved_msg" +msgstr "\"$unit($unit) überlebt unbeschadet und rettet sich nach $region($region).\"" + +msgid "race_noregroup" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be regrouped.\"" + +msgid "race_noregroup" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht neu gruppiert werden.\"" + +msgid "curseinfo::worse" +msgstr "\"$unit($unit) is chased by a nightmare. ($int36($id))\"" + +msgid "curseinfo::worse" +msgstr "\"$unit($unit) wird von einem Alp geritten. ($int36($id))\"" + +msgid "error274" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot teach.\"" + +msgid "error274" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichten.\"" + +msgid "region_guarded" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by $unit($guard), a non-allied unit.\"" + +msgid "region_guarded" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von $unit($guard), einer nichtalliierten Einheit, bewacht.\"" + +msgid "error155" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many magicians in the faction.\"" + +msgid "error155" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Magier in der Partei.\"" + +msgid "curseinfo::speed_1" +msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") accelerated for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" + +msgid "curseinfo::speed_1" +msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"ist\", \"sind\") noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") beschleunigt. ($int36($id))\"" + +msgid "error160" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be bought.\"" + +msgid "error160" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter gekauft werden.\"" + +msgid "error270" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden bestehlen.\"" + +msgid "error226" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units from the backmost rows cannot attack.\"" + +msgid "error226" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten in den hinteren Reihen können nicht angreifen.\"" + +msgid "sailnolanding" +msgstr "\"The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel.\"" + +msgid "sailnolanding" +msgstr "\"Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff.\"" + +msgid "error116" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number can not be assigned.\"" + +msgid "error116" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer kann nicht vergeben werden.\"" + +msgid "error112" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Names may not contain parenthesis.\"" + +msgid "error112" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Namen dürfen keine Klammern enthalten.\"" + +msgid "error222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Show all what?\"" + +msgid "error222" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zeige alle was?\"" + +msgid "teach_teacher" +msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level).\"" + +msgid "teach_teacher" +msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level).\"" + +msgid "patzer2" +msgstr "\"$unit($unit) in $region($region) is hit by a massive headache and cannot concentrate on the spell. Some part of this ritual has gone very wrong indeed.\"" + +msgid "patzer2" +msgstr "\"$unit($unit) in $region($region) hat rasende Kopfschmerzen und kann sich nicht mehr richtig konzentrieren. Irgendwas bei diesem Zauber ist fürchterlich schiefgelaufen.\"" + +msgid "curseinfo::magicboost" +msgstr "The magician possesses the gift of Chaos. ($int36($id))" + +msgid "curseinfo::magicboost" +msgstr "Der Magier besitzt die Gabe des Chaos. ($int36($id))" + +msgid "illegal_password" +msgstr "\"Your password was changed because it contained illegal characters. Legal passwords may only contain numbers and letters from A to Z. Your new Password is '${newpass}'.\"" + +msgid "illegal_password" +msgstr "\"Dein Passwort enthält Zeichen, die bei der Nachsendung von Reports Probleme bereiten können. Bitte beachte, dass Passwortenur aus Buchstaben von A bis Z und Zahlen bestehen dürfen. Dein neues Passwort ist '${newpass}'.\"" + +msgid "curseinfo::sparkle_12" +msgstr "\"Brightly coloured flowers pop up all around $unit($unit)'s camp. ($int36($id))\"" + +msgid "curseinfo::sparkle_12" +msgstr "\"Leuchtende Blumen erblühen rund um das Lager von $unit($unit). ($int36($id))\"" + +msgid "familiar_name" +msgstr "\"Familiar of $unit($unit)\"" + +msgid "familiar_name" +msgstr "\"Vertrauter von $unit($unit)\"" + +msgid "error9" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That cannot be sabotaged.\"" + +msgid "error9" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann man nicht sabotieren.\"" + +msgid "curseinfo::sparkle_6" +msgstr "\"$unit($unit) finds a small flute that plays a beautiful melody. ($int36($id))\"" + +msgid "curseinfo::sparkle_6" +msgstr "\"$unit($unit) findet eine kleine Flöte, die eine wundersame Melodie spielt. ($int36($id))\"" + +msgid "renamed_building_seen" +msgstr "\"$building($building) in $region($region) received a nickname from $unit($renamer).\"" + +msgid "renamed_building_seen" +msgstr "\"$building($building) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" + +msgid "sp_shadowknights_effect" +msgstr "\"$unit($mage) summons a mirage.\"" + +msgid "sp_shadowknights_effect" +msgstr "\"$unit($mage) beschwört Trugbilder herauf.\"" + +msgid "give" +msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to $unit($target).\"" + +msgid "give" +msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target).\"" + +msgid "sellamount" +msgstr "\"$unit($unit) sells $int($amount) $resource($resource,$amount).\"" + +msgid "sellamount" +msgstr "\"$unit($unit) verkauft $int($amount) $resource($resource,$amount).\"" + +msgid "sp_migranten_fail1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is one of our kind, we should not waste aura on this.\"" + +msgid "sp_migranten_fail1" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist von unserer Art, das Ritual wäre verschwendete Aura.\"" + +msgid "victory_murder_complete" +msgstr "\"VICTORY! $if($eq($n,1), \"The faction $winners has\", \"The factions $winners have\") fulfilled the victory condition for the necessary time. The game is over.\"" + +msgid "victory_murder_complete" +msgstr "\"SIEG! $if($eq($n,1), \"Die Partei $winners hat\", \"Die Parteien $winners haben\") die Siegbedingung für die erforderliche Zeit erfüllt. Das Spiel ist damit beendet.\"" + +msgid "shipsink" +msgstr "\"The $ship($ship) has suffered too much damage and sinks.\"" + +msgid "shipsink" +msgstr "\"Die $ship($ship) ist zu stark beschädigt und sinkt.\"" + +msgid "sp_bloodsacrifice_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) receives $int($amount) aura.\"" + +msgid "sp_bloodsacrifice_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gewinnt durch das Ritual $int($amount) Aura.\"" + +msgid "sp_confusion_effect_0" +msgstr "\"$unit($mage) intones a mysterious chant. There is a sudden hubbub, but order is restored quickly.\"" + +msgid "sp_confusion_effect_0" +msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" + +msgid "pest" +msgstr "\"The region is visited by the plague and $int($dead) peasants died.\"" + +msgid "pest" +msgstr "\"Hier wütete die Pest, und $int($dead) Bauern starben.\"" + +msgid "wormhole_exit" +msgstr "\"$unit($unit) travels through a wormhole to $region($region).\"" + +msgid "wormhole_exit" +msgstr "\"$unit($unit) reist durch ein Wurmloch nach $region($region).\"" + +msgid "spellfail_astralonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell will only work in the realm of spirits.\"" + +msgid "spellfail_astralonly" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der Geisterwelt.\"" + +msgid "analyse_ship_noage" +msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_ship_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "destroy_road" +msgstr "\"$unit($unit) demolishes the road between $region($from) and $region($to).\"" + +msgid "destroy_road" +msgstr "\"$unit($unit) reißt die Straße zwischen $region($from) und $region($to) ein.\"" + +msgid "error13" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has moved already.\"" + +msgid "error13" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat sich bereits bewegt.\"" + +msgid "aborted_battle" +msgstr "\"The battle was aborted because all enemies escaped.\"" + +msgid "aborted_battle" +msgstr "\"Der Kampf wurde abgebrochen, da alle Verteidiger flohen.\"" + +msgid "error24" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege.\"" + +msgid "error24" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich.\"" + +msgid "usecatapult" +msgstr "\"$int($amount) fighters of $unit($unit) launch their catapults.\"" + +msgid "usecatapult" +msgstr "\"$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab.\"" + +msgid "error76" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item cannot be used.\"" + +msgid "error76" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann man nicht benutzen.\"" + +msgid "error98" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In winter, insects can be recruited only in deserts.\"" + +msgid "error98" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insekten können im Winter nur in Wüsten rekrutiert werden.\"" + +msgid "spyreport" +msgstr "\"$unit($spy) managed to gather information about $unit($target): combat status ${status}.\"" + +msgid "spyreport" +msgstr "\"$unit($spy) gelang es, Informationen über $unit($target) herauszubekommen: Kampfstatus ${status}.\"" + +msgid "newbie_password" +msgstr "\"Your password is ${password}.\"" + +msgid "newbie_password" +msgstr "\"Dein Passwort lautet ${password}.\"" + +msgid "error65" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Tuition was too high to be paid.\"" + +msgid "error65" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Lernkosten können nicht bezahlt werden.\"" + +msgid "error87" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dragon blood is required for this elixir.\"" + +msgid "error87" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Elixier benötigt man Drachenblut.\"" + +msgid "spellfail_block" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The connections from to this regions are blocked.\"" + +msgid "spellfail_block" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege aus dieser Region sind blockiert.\"" + +msgid "error278" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot change the name and description of this building.\"" + +msgid "error278" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Name und Beschreibung des Gebäudes können nicht geändert werden.\"" + +msgid "error168" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be sold.\"" + +msgid "error168" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter verkauft werden.\"" + +msgid "stormwinds_reduced" +msgstr "\"$unit($unit) could only enchant $int($ships) of $int($maxships) ships.\"" + +msgid "stormwinds_reduced" +msgstr "\"$unit($unit) konnte nur $int($ships) von $int($maxships) Schiffen verzaubern.\"" + +msgid "error283" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your password may only contain alphanumeric symbols.\"" + +msgid "error283" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Passwort darf nur Buchstaben und Ziffern enthalten.\"" + +msgid "rust_effect" +msgstr "\"$unit($mage) puts a spell of rust on $unit($target). $int($amount) weapons are eaten by rust.\"" + +msgid "rust_effect" +msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target). $int($amount) Waffen wurden vom Rost zerfressen.\"" + +msgid "nr_migrants" +msgstr "\"Your faction has $int($units) migrants out of a possible total of $int($maxunits).\"" + +msgid "nr_migrants" +msgstr "\"Deine Partei hat $int($units) Migranten und kann maximal $int($maxunits) Migranten aufnehmen.\"" + +msgid "error239" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to get a new number?\"" + +msgid "error239" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff eine neue Nummer bekommen?\"" + +msgid "error129" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many people.\"" + +msgid "error129" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Leute kann die Partei nicht aufnehmen.\"" + +msgid "spyreport_skills" +msgstr "\"$unit($target) knows ${skills}.\"" + +msgid "spyreport_skills" +msgstr "\"$unit($target) beherrscht ${skills}.\"" + +msgid "sighting" +msgstr "\"$if($isnull($region),\"\",\"In $region($region), \")$int($number) $race($race,$number) were discovered.\"" + +msgid "sighting" +msgstr "\"$if($isnull($region),\"Es\",\"In $region($region)\") wurde$if($eq($number,1),\"\",\"n\") $int($number) $race($race,$number) gesichtet.\"" + +msgid "nr_stat_recruits" +msgstr "\"recruits: $int($max) peasants\"" + +msgid "nr_stat_recruits" +msgstr "\"Rekruten: max. $int($max) Bauern\"" + +msgid "error235" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Maintenance has not been paid yet.\"" + +msgid "error235" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Gebäude wurde noch kein Unterhalt bezahlt.\"" + +msgid "error231" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit or its animals would not survive there.\"" + +msgid "error231" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit oder ihre Tiere würden dort nicht überleben.\"" + +msgid "error121" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That resource does not exist in this region.\"" + +msgid "error121" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas gibt es hier nicht.\"" + +msgid "error306" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction is not old enough to start over.\"" + +msgid "error306" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 9 Wochen alt sein, um einen Neustart zu versuchen.\"" + +msgid "manacrystal_use" +msgstr "\"$unit($unit) uses an astral crystal and gains $int($aura) aura.\"" + +msgid "manacrystal_use" +msgstr "\"$unit($unit) benutzt einen Astralkristall und gewinnt $int($aura) Aura hinzu.\"" + +msgid "error302" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym already set.\"" + +msgid "error302" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Bereits ein Synonym gesetzt.\"" + +msgid "analyse_region_noage" +msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_region_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "icastle_create" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building.\"" + +msgid "icastle_create" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude.\"" + +msgid "spyfail" +msgstr "\"$unit($spy) could not find out anything about $unit($target).\"" + +msgid "spyfail" +msgstr "\"$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden.\"" + +msgid "firewall_damage" +msgstr "\"$unit($unit) steps through the wall of fire into $region($region) and receives severe burn damage.\"" + +msgid "firewall_damage" +msgstr "\"$unit($unit) erleidet beim Durchqueren der Feuerwand nach $region($region) schwere Verbrennungen.\"" + +msgid "cast_speed_effect" +msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were magically accelerated.\"" + +msgid "cast_speed_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden magisch beschleunigt.\"" + +msgid "firewall_effect" +msgstr "\"$unit($mage) creates a wall of fire in $region($region).\"" + +msgid "firewall_effect" +msgstr "\"$unit($mage) erschafft in $region($region) eine Wand aus Feuer.\"" + +msgid "phunger" +msgstr "\"$if($eq($dead,1),\"One peasant starves\",\"$int($dead) peasants starve\").\"" + +msgid "phunger" +msgstr "\"$if($eq($dead,1),\"Ein Bauer verhungert\",\"$int($dead) Bauern verhungern\").\"" + +msgid "transport" +msgstr "\"$unit($unit) transported $unit($target) from $region($start) to $region($end).\"" + +msgid "transport" +msgstr "\"$unit($unit) transportiert $unit($target) von $region($start) nach $region($end).\"" + +msgid "sp_holyground_effect" +msgstr "\"$unit($mage) summons natural spirits into the ground of $region($region).\"" + +msgid "sp_holyground_effect" +msgstr "\"$unit($mage) beschwört Naturgeister in den Boden von $region($region).\"" + +msgid "curseinfo::maelstrom" +msgstr "The maelstrom in this area will heavily damage all ships coming into its wake. ($int36($id))" + +msgid "curseinfo::maelstrom" +msgstr "Der Mahlstrom in dieser Region wird alle Schiffe, die in seinen Sog geraten, schwer beschädigen. ($int36($id))" + +msgid "leavefail" +msgstr "\"$unit($unit) could not leave $region($region).\"" + +msgid "leavefail" +msgstr "\"$unit($unit) konnte aus $region($region) nicht ausreisen.\"" + +msgid "reduced_production" +msgstr "The region is ravaged, the ground infertile." + +msgid "reduced_production" +msgstr "Die Region ist verwüstet, der Boden karg." + +msgid "feedback_no_astralregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" + +msgid "feedback_no_astralregion" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann hier kein Kontakt zur Astralwelt aufgenommen werden.\"" + +msgid "peace_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is so quiet and peaceful, nobody wants to attack anybody right now.\"" + +msgid "peace_active" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen.\"" + +msgid "peasantluck_success" +msgstr "\"The stork paid an unexpected visit to $if($eq($births,1),\"a peasant\",\"$int($births) peasants\").\"" + +msgid "peasantluck_success" +msgstr "\"$if($eq($births,1),\"Einen Bauern\",\"$int($births) Bauern\") besucht unverhofft der Storch.\"" + +msgid "astralshield_activate" +msgstr "\"$unit($unit) reactivates the astral protection shield in $region($region).\"" + +msgid "astralshield_activate" +msgstr "\"$unit($unit) reaktiviert den astralen Schutzschild in $region($region).\"" + +msgid "destroy_curse_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys the spell ($id) on ${target}.\"" + +msgid "destroy_curse_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört den Fluch ($id) auf ${target}.\"" + +msgid "analyse_region_fail" +msgstr "\"It appears to $unit($mage) that $region($region) is charmed, but no details have been revealed.\"" + +msgid "analyse_region_fail" +msgstr "\"$unit($mage) meint, dass auf $region($region) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "viewreality_effect" +msgstr "\"$unit($unit) manages to catch a glimpse of reality through the fog.\"" + +msgid "viewreality_effect" +msgstr "\"$unit($unit) gelingt es, durch die Nebel auf die Realität zu blicken.\"" + +msgid "use_speedsail" +msgstr "\"$unit($unit) sets a solar sail. The ship's speed is increased by $int($speed).\"" + +msgid "use_speedsail" +msgstr "\"$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht um $int($speed).\"" + +msgid "error21" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no information available for the request.\"" + +msgid "error21" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu gibt es keine Informationen.\"" + +msgid "error43" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this.\"" + +msgid "error43" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat so etwas nicht.\"" + +msgid "unknown_status" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown combat status.\"" + +msgid "unknown_status" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Kampfstatus.\"" + +msgid "error10" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - That does not make much sense.\"" + +msgid "error10" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das macht wenig Sinn.\"" + +msgid "error32" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board our ship.\"" + +msgid "error32" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht an Bord unseres Schiffes.\"" + +msgid "error54" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade.\"" + +msgid "error54" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht handeln.\"" + +msgid "manufacture_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0).\"" + +msgid "manufacture_skills" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren.\"" + +msgid "error177" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The familiar cannot cast this spell.\"" + +msgid "error177" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann der Vertraute nicht zaubern.\"" + +msgid "curseinfo::godcurseocean" +msgstr "\"This region was cursed by the gods. The sea is a foul cesspool, noxious gases rise from the deep, undead seamonsters attack all ships. Noone can live here for long. ($int36($id))\"" + +msgid "curseinfo::godcurseocean" +msgstr "\"Diese Region wurde von den Göttern verflucht. Das Meer ist eine ekelige Brühe, braunschwarze, stinkende Gase steigen aus den unergründlichen Tiefen hervor, und untote Seeungeheuer, Schiffe zerfressend und giftige grüne Galle geifernd, sind der Schrecken aller Seeleute, die diese Gewässer durchqueren. Niemand kann hier lange überleben. ($int36($id))\"" + +msgid "curseinfo::sparkle_4" +msgstr "\"A circle of shimmering lights surrounds $unit($unit). ($int36($id))\"" + +msgid "curseinfo::sparkle_4" +msgstr "\"Ein schimmernder Lichterkranz umgibt $unit($unit). ($int36($id))\"" + +msgid "error84" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - No name was supplied.\"" + +msgid "error84" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Name angegeben.\"" + +msgid "spellfail_noexpensives" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) have unbreakable commitments to their faction.\"" + +msgid "spellfail_noexpensives" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat unaufkündbare Bindungen an seine alte Partei.\"" + +msgid "error287" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We cannot transport this unit there.\"" + +msgid "error287" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin können wir die Einheit nicht transportieren.\"" + +msgid "error292" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot be taught.\"" + +msgid "error292" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichtet werden.\"" + +msgid "error95" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusions cannot guard a region.\"" + +msgid "error95" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusionen können eine Region nicht bewachen.\"" + +msgid "nr_stat_header" +msgstr "\"Statistics for $region($region):\"" + +msgid "nr_stat_header" +msgstr "\"Statistik für $region($region):\"" + +msgid "sp_strongwalls_effect" +msgstr "\"$unit($mage) causes the walls of $building($building) to glow in an eerie magic light.\"" + +msgid "sp_strongwalls_effect" +msgstr "\"$unit($mage) läßt die Mauern von $building($building) in einem unheimlichen magischen Licht erglühen.\"" + +msgid "curseinfo::orcish" +msgstr "\"$unit($unit) goes from one amourous adventure to another. ($int36($id))\"" + +msgid "curseinfo::orcish" +msgstr "\"$unit($unit) stürzt sich von einem amourösen Abenteuer ins nächste. ($int36($id))\"" + +msgid "target_region_not_empty" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are units in the target region.\"" + +msgid "target_region_not_empty" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Zielregion befinden sich noch Einheiten.\"" + +msgid "error173" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even in the Xontormia Library, this spell could not be found.\"" + +msgid "error173" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst in der Bibliothek von Xontormia konnte dieser Spruch nicht gefunden werden.\"" + +msgid "error138" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - We do not have anything that could be demolished.\"" + +msgid "error138" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Uns gehört nichts, was man abreißen oder versenken könnte.\"" + +msgid "killsandhits" +msgstr "\"$unit($unit) hit $int($hits) times and killed $int($kills) enemies.\"" + +msgid "killsandhits" +msgstr "\"$unit($unit) erzielte $int($hits) Treffer und tötete $int($kills) Gegner.\"" + +msgid "shapeshift_effect" +msgstr "\"$unit($mage) makes $unit($target) appear as $race($race,$unit.size($target)).\"" + +msgid "shapeshift_effect" +msgstr "\"$unit($mage) läßt $unit($target) als $race($race,$unit.size($target)) erscheinen.\"" + +msgid "error248" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has to be 10 turns old.\"" + +msgid "error248" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 10 Runden alt sein.\"" + +msgid "followfail" +msgstr "\"$unit($follower) could not follow $unit($unit).\"" + +msgid "followfail" +msgstr "\"$unit($follower) konnte $unit($unit) nicht folgen.\"" + +msgid "followdetect" +msgstr "\"$unit($follower) followed $unit($unit).\"" + +msgid "followdetect" +msgstr "\"$unit($follower) ist $unit($unit) gefolgt.\"" + +msgid "unitnotfound_id" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit $id could not be located.\"" + +msgid "unitnotfound_id" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit $id wurde nicht gefunden.\"" + +msgid "error244" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already named.\"" + +msgid "error244" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat schon einen Namen.\"" + +msgid "use_tacticcrystal" +msgstr "\"$unit($unit) uses a dreameye in $region($region).\"" + +msgid "use_tacticcrystal" +msgstr "\"$unit($unit) benutzt in $region($region) ein Traumauge.\"" + +msgid "error134" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown report option.\"" + +msgid "error134" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Meldungs-Option.\"" + +msgid "error319" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has been in combat.\"" + +msgid "error319" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie an einem Kampf teilgenommen hat.\"" + +msgid "analyse_building_noage" +msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for centuries.\"" + +msgid "analyse_building_noage" +msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" + +msgid "sink_lost_msg" +msgstr "\"$int($amount) people of $unit($unit) drown.$if($isnull($region),\"\",\" The unit makes it to $region($region).\")\"" + +msgid "sink_lost_msg" +msgstr "\"$int($amount) Personen von $unit($unit) ertrinken.$if($isnull($region),\"\",\" Die Einheit rettet sich nach $region($region).\")\"" + +msgid "error130" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIC SPHERE [1-5].\"" + +msgid "error130" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIEGEBIET [1-5].\"" + +msgid "error240" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to be followed?\"" + +msgid "error240" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff verfolgt werden?\"" + +msgid "travelthru_trail" +msgstr "$trailto($region)" + +msgid "travelthru_trail" +msgstr "$trailto($region)" + +msgid "error315" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not all ingredients present.\"" + +msgid "error315" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht alle Zutaten vorhanden.\"" + +msgid "volcanooutbreak" +msgstr "\"The volcano in $region($regionv) erupts. The lava devastates $region($regionn).\"" + +msgid "volcanooutbreak" +msgstr "\"Der Vulkan in $region($regionv) bricht aus. Die Lavamassen verwüsten $region($regionn).\"" + +msgid "seduce_effect_0" +msgstr "\"$unit($unit) gives $unit($mage) $resources($items).\"" + +msgid "seduce_effect_0" +msgstr "\"$unit($unit) schenkt $unit($mage) $resources($items).\"" + +msgid "error311" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit can not change shape.\"" + +msgid "error311" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht verwandeln.\"" + +msgid "error201" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Race and target unit have not been supplied.\"" + +msgid "error201" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Rasse und Zieleinheit wurden vergessen.\"" + +msgid "newbieimmunity" +msgstr "\"Your faction is immune against assaults for $int($turns) more weeks.\"" + +msgid "newbieimmunity" +msgstr "\"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe.\"" + +msgid "curseinfo::auraboost_0" +msgstr "\"Powerful magical energies are pulsing through $unit($unit). ($int36($id))\"" + +msgid "curseinfo::auraboost_0" +msgstr "\"$unit($unit) fühlt sich von starken magischen Energien durchströmt. ($int36($id))\"" + +msgid "curseinfo::drought" +msgstr "\"This region was hit by a drought. ($int36($id))\"" + +msgid "curseinfo::drought" +msgstr "\"In dieser Gegend herrscht eine Dürre. ($int36($id))\"" + +msgid "race_cantwork" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot work.\"" + +msgid "race_cantwork" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht arbeiten.\"" + +msgid "stealdetect" +msgstr "\"$unit($unit) feels watched.\"" + +msgid "stealdetect" +msgstr "\"$unit($unit) fühlt sich beobachtet.\"" + +msgid "stealaura_detect" +msgstr "\"$unit($unit) feels the powers of magic fade and loses $int($aura) aura.\"" + +msgid "stealaura_detect" +msgstr "\"$unit($unit) fühlt seine magischen Kräfte schwinden und verliert $int($aura) Aura.\"" + +msgid "missing_message" +msgstr "\"Internal Error: Message '$name' is undefined.\"" + +msgid "missing_message" +msgstr "\"Interner Fehler: Meldung '$name' nicht definiert.\"" + +msgid "analyse_ship_fail" +msgstr "\"It appears to $unit($mage) that $ship($ship) is charmed, but no details have been revealed.\"" + +msgid "analyse_ship_fail" +msgstr "\"$unit($mage) meint, dass auf $ship($ship) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" + +msgid "income_magic" +msgstr "\"$unit($unit) earns $int($amount) silver through simple magical services in $region($region).\"" + +msgid "income_magic" +msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Zauberei.\"" + +msgid "stealaura_success" +msgstr "\"$unit($mage) draws $int($aura) aura from $unit($target).\"" + +msgid "stealaura_success" +msgstr "\"$unit($mage) entzieht $unit($target) $int($aura) Aura.\"" + +msgid "error_flying_ship_too_big" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) is too bulky to fly.\"" + +msgid "error_flying_ship_too_big" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) ist zu groß, um fliegen zu können.\"" + +msgid "familiar_describe" +msgstr "\"$unit($mage) summons a familiar. $race($race, 0) can learn ${skills}.\"" + +msgid "familiar_describe" +msgstr "\"$unit($mage) ruft einen Vertrauten. $race($race, 0) können $skills lernen.\"" + +msgid "wind_effect" +msgstr "\"$unit($mage) asks the gods of wind and water on behalf of the $ship($ship).\"" + +msgid "wind_effect" +msgstr "\"$unit($mage) erfleht den Segen der Götter des Windes und des Wassers für $ship($ship).\"" + +msgid "wormhole_requirements" +msgstr "\"$unit($unit) cannot travel through the wormhole in $region($region) because the unit is either too big or has restricted skills.\"" + +msgid "wormhole_requirements" +msgstr "\"$unit($unit) kann in $region($region) nicht durch das Wurmloch reisen, da die Einheit entweder zu gross ist oder teure Talente besitzt.\"" + +msgid "cast_escape_effect" +msgstr "\"$unit($mage) casts $spell($spell): The noise of the battle dies down and the mage is able to slip away unharmed.\"" + +msgid "cast_escape_effect" +msgstr "\"$unit($mage) zaubert $spell($spell): Das Kampfgetümmel erstirbt und er kann unbehelligt seines Weges ziehen.\"" + +msgid "volcanostartsmoke" +msgstr "\"Columns of smoke are released by the volcano of $region($region).\"" + +msgid "volcanostartsmoke" +msgstr "\"Aus dem Vulkankrater von $region($region) steigt plötzlich Rauch.\"" + +msgid "nr_insectfall" +msgstr "It is the last week before winter in which insects can still recruit." + +msgid "nr_insectfall" +msgstr "Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können." + +msgid "error296" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Trees won't grow here.\"" + +msgid "error296" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier werden niemals Bäume wachsen.\"" + +msgid "error186" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only works on dry land.\"" + +msgid "error186" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur auf Land gelegt werden.\"" + +msgid "error51" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" + +msgid "error51" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" + +msgid "error73" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungry units cannot give anybody away.\"" + +msgid "error73" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine hungernde Einheit kann niemanden weggeben.\"" + +msgid "error40" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit did not contact us.\"" + +msgid "error40" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keinen Kontakt mit uns aufgenommen.\"" + +msgid "error182" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot leave in this direction.\"" + +msgid "error182" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann in diese Richtung nicht ablegen.\"" + +msgid "analyse_ship_nospell" +msgstr "\"It appears to $unit($mage) that $ship($ship) is not charmed.\"" + +msgid "analyse_ship_nospell" +msgstr "\"$unit($mage) meint, dass auf $ship($ship) kein Zauber liegt.\"" + +msgid "birthday_firework" +msgstr "\"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region).\"" + +msgid "birthday_firework" +msgstr "\"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" + +msgid "error257" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid locale.\"" + +msgid "error257" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Locale.\"" + +msgid "error147" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of the largest castle in the region.\"" + +msgid "error147" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht Burgherr der größten Burg in der Region.\"" + +msgid "unknowndirection" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Direction '$dirname' was not recognized.\"" + +msgid "unknowndirection" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung '$dirname' wurde nicht erkannt.\"" + +msgid "error143" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is on board a ship.\"" + +msgid "error143" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf einem Schiff.\"" + +msgid "spellfail_onocean" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast while you are on the ocean.\"" + +msgid "spellfail_onocean" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf hoher See gezaubert werden.\"" + +msgid "error253" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This magician is not strong enough to be sacrificed to the gods.\"" + +msgid "error253" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier ist nicht stark genug, sich den Göttern zu opfern.\"" + +msgid "battle_loot" +msgstr "\"$unit($unit) collects $int($amount) $resource($item,$amount).\"" + +msgid "battle_loot" +msgstr "\"$unit($unit) erbeutet $int($amount) $resource($item,$amount).\"" + +msgid "error209" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" + +msgid "error209" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" + +msgid "summonundead_effect_0" +msgstr "\"$unit($mage) cannot summon any undead in $region($region).\"" + +msgid "summonundead_effect_0" +msgstr "\"$unit($mage) kann in $region($region) keine Untoten rufen.\"" + +msgid "givedumb" +msgstr "\"$unit($unit) administers $int($amount) duncebuns to $unit($recipient).\"" + +msgid "givedumb" +msgstr "\"$unit($unit) gibt $int($amount) Dumpfbackenbrot an $unit($recipient).\"" + +msgid "error205" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in an ocean region.\"" + +msgid "error205" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber gelingt nur in einer Ozeanregion.\"" + +msgid "error210" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is too dangerous to fly the ship in the storm.\"" + +msgid "error210" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen.\"" + +msgid "eatpeasants" +msgstr "\"$unit($unit) ate $int($amount) peasants.\"" + +msgid "eatpeasants" +msgstr "\"$unit($unit) verspeiste $int($amount) Bauern.\"" + +msgid "error320" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot guard the region because it is trying to flee.\"" + +msgid "error320" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht bewachen, da sie versucht zu fliehen.\"" + +msgid "dissolve_units_2" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\"" + +msgid "dissolve_units_2" +msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"wurde zum Baum\", \"wurden zu Bäumen\").\"" + +msgid "sp_eternizewall_effect" +msgstr "\"$unit($mage) performs a ritual that binds the magical forces of $region($region) into the walls of $building($building).\"" + +msgid "sp_eternizewall_effect" +msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde von $region($region) in die Mauern von $building($building).\"" + diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po new file mode 100644 index 000000000..faf8a7982 --- /dev/null +++ b/res/translations/strings.de.po @@ -0,0 +1,6312 @@ +msgid "rustychainmail" +msgstr "Rostiges Kettenhemd" + +msgctxt "spellinfo" +msgid "destroy_magic" +msgstr "Dieser Zauber ermöglicht dem Magier, Verzauberungen einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen." + +msgctxt "spell" +msgid "shadowknights" +msgstr "Schattenritter" + +msgctxt "race" +msgid "snowman" +msgstr "Schneemann" + +msgid "par_unit" +msgstr "Einheit-Nr" + +msgctxt "race" +msgid "shadowdemon_d" +msgstr "Schattendämonen" + +msgctxt "race" +msgid "sphinx_x" +msgstr "Spinx" + +msgctxt "coast" +msgid "sw" +msgstr "Südwestküste" + +msgid "pegasus" +msgstr "Pegasus" + +msgid "truthpotion_p" +msgstr "Tränke der Wahrheit" + +msgid "aurafocus" +msgstr "Aurafocus" + +msgid "firewall" +msgstr "Feuerwand" + +msgctxt "spell" +msgid "gwyrrddestroymagic" +msgstr "Geister bannen" + +msgid "nut_p" +msgstr "Nüsse" + +msgctxt "spell" +msgid "transferauratraum" +msgstr "Traum der Magie" + +msgctxt "race" +msgid "shadowdemon_p" +msgstr "Schattendämonen" + +msgid "AGGRESSIV" +msgstr "AGGRESSIV" + +msgid "stat_tribe_p" +msgstr "völker" + +msgid "h10_p" +msgstr "Kakteenschwitze" + +msgctxt "spell" +msgid "speed" +msgstr "Zeitdehnung" + +msgctxt "race" +msgid "shadowdemon_x" +msgstr "Schattendämon" + +msgid "jadee_dress" +msgstr "Hochzeitskleid" + +msgctxt "spell" +msgid "fumblecurse" +msgstr "Chaosfluch" + +msgid "halberd_p" +msgstr "Hellebarden" + +msgid "h13_p" +msgstr "Fjordwuchse" + +msgid "laensword" +msgstr "Laenschwert" + +msgctxt "keyword" +msgid "entertain" +msgstr "UNTERHALTE" + +msgid "spinx00" +msgstr "Das Schiff des Elfen hat ein rotes Segel" + +msgid "greatbow_p" +msgstr "Elfenbögen" + +msgid "spinx01" +msgstr "Der Zwerg hat eine Nuss dabei" + +msgid "person" +msgstr "Person" + +msgid "spinx02" +msgstr "Die Katze führt eine Hellebarde" + +msgctxt "spell" +msgid "eternal_walls" +msgstr "Mauern der Ewigkeit" + +msgid "spinx03" +msgstr "Das Schiff mit dem grünen Segel liegt links neben dem mit einem weissen Segel" + +msgid "JEDEM" +msgstr "JEDEM" + +msgctxt "skill" +msgid "sailing" +msgstr "Segeln" + +msgid "spinx04" +msgstr "Auf dem Schiff mit grünen Segeln kam der Speerkämpfer" + +msgid "h16_p" +msgstr "Spaltwachse" + +msgid "spinx05" +msgstr "Der Krieger mit dem Kreis im Wappen hat einen Keks" + +msgid "spinx06" +msgstr "Der Krieger des mittleren Schiffs hat ein Schwert" + +msgid "fortress_generic" +msgstr "Burg" + +msgid "spinx07" +msgstr "Auf dem gelben Segel prankt ein Kreuz als Wappen" + +msgctxt "race" +msgid "undeadpharaoh_d" +msgstr "Untoten Pharao" + +msgid "spinx08" +msgstr "Der Mensch kam mit dem ersten Schiff" + +msgid "TRAENKE" +msgstr "TRÄNKE" + +msgid "northwest" +msgstr "Nordwesten" + +msgid "spinx09" +msgstr "Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat" + +msgctxt "iteminfo" +msgid "cookie" +msgstr "Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e" + +msgctxt "spell" +msgid "protective_runes" +msgstr "Runen des Schutzes" + +msgid "h19_p" +msgstr "Weiße Wüteriche" + +msgid "birthdaycake_p" +msgstr "Geburtstagstorten" + +msgid "volcano" +msgstr "Vulkan" + +msgctxt "keyword" +msgid "default" +msgstr "DEFAULT" + +msgctxt "spellinfo" +msgid "create_roqf" +msgstr "Die berühmte Bardin Miriam bhean'Meddaf war bekannt für ihr außergewöhnliches Geschick mit der Harfe. Ihre Finger sollen sich so schnell über die Saiten bewegt haben, das sie nicht mehr erkennbar waren. Dieser Zauber, der recht einfach in einen Silberring zu bannen ist, bewirkt eine um das zehnfache verbesserte Geschicklichkeit und Gewandheit der Finger. (Das soll sie auch an anderer Stelle ausgenutzt haben, ihr Ruf als Falschspielerin war berüchtigt). Handwerker können somit das zehnfache produzieren, und bei einigen anderen Tätigkeiten könnte dies ebenfalls von Nutzen sein." + +msgid "magicbag" +msgstr "Zauberbeutel" + +msgid "rustysword_p" +msgstr "Schartige Schwerter" + +msgctxt "iteminfo" +msgid "wente_dress" +msgstr "Hach! Sieht der Mann beeindruckend aus in diesem Frack! Und so ordentlich! Und so ernst! Und so beeindruckend! Es fällt ein wenig schwer, sich auf den Bräutigam zu konzentrieren, weil das Brautkleid noch daneben strahlt, aber der Anzug des Bräutigams ist auf jeden Fall so, wie er sein soll und sieht toll aus und sehr geschmackvoll." + +msgctxt "race" +msgid "apophis_d" +msgstr "Apophis" + +msgctxt "race" +msgid "undeadpharaoh_p" +msgstr "Untoter Pharaonen" + +msgctxt "iteminfo" +msgid "magicbag" +msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." + +msgid "lighthouse" +msgstr "Leuchtturm" + +msgid "iceberg_sleep_trail" +msgstr "der Gletscher von %s" + +msgctxt "keyword" +msgid "reserve" +msgstr "RESERVIERE" + +msgctxt "calendar" +msgid "age_1" +msgstr "neuer Zeitrechnung" + +msgctxt "prefix" +msgid "Frost" +msgstr "Frost" + +msgctxt "calendar" +msgid "age_2" +msgstr "des zweiten Zeitalters" + +msgctxt "calendar" +msgid "age_3" +msgstr "des dritten Zeitalters" + +msgctxt "race" +msgid "undeadpharaoh_x" +msgstr "Untote Pharaonen" + +msgctxt "race" +msgid "youngdragon_d" +msgstr "Jungdrachen" + +msgctxt "iteminfo" +msgid "no_info" +msgstr "Keine Informationen." + +msgid "insectspoil_p" +msgstr "Insektenfühler" + +msgctxt "spell" +msgid "barkskin" +msgstr "Rindenhaut" + +msgctxt "spellinfo" +msgid "auraleak" +msgstr "Der Schwarzmagier kann mit diesem dunklen Ritual einen Riss in das Gefüge der Magie bewirken, der alle magische Kraft aus der Region reißen wird. Alle magisch begabten in der Region werden einen Großteil ihrer Aura verlieren." + +msgctxt "race" +msgid "apophis_p" +msgstr "Apophis" + +msgctxt "spell" +msgid "calm_monster" +msgstr "Monster friedlich stimmen" + +msgid "spinx10" +msgstr "Das Schiff des Kriegers, der ein Apfel hat, liegt neben dem, der ein Kreuz als Wappen hat" + +msgctxt "spellinfo" +msgid "sound_out" +msgstr " Erliegt die Einheit dem Zauber, so wird sie dem Magier alles erzählen, was sie über die gefragte Region weiß. Ist in der Region niemand ihrer Partei, so weiß sie nichts zu berichten. Auch kann sie nur das erzählen, was sie selber sehen könnte. " + +msgctxt "spell" +msgid "readmind" +msgstr "Traumdeuten" + +msgid "spinx11" +msgstr "Der Krieger mit dem Turm im Wappen trägt eine Axt" + +msgid "spinx12" +msgstr "Das Schiff des Menschen liegt neben dem blauen Schiff" + +msgctxt "race" +msgid "apophis_x" +msgstr "Apophis" + +msgid "spinx13" +msgstr "Das Insekt trägt einen Baum als Wappen" + +msgctxt "race" +msgid "youngdragon_p" +msgstr "Jungdrachen" + +msgid "spinx14" +msgstr "Das Schiff mit dem Stern im Wappen liegt neben dem des Kriegers, der einen Zweihänder führt" + +msgid "nr_options" +msgstr "Optionen" + +msgid "GRUPPE" +msgstr "GRUPPE" + +msgctxt "spellinfo" +msgid "cerddorfumbleshield" +msgstr "Dieser schrille Gesang hallt über das ganze Schlachtfeld. Die besonderen Dissonanzen in den Melodien machen es Magiern fast unmöglich, sich auf ihre Zauber zu konzentrieren." + +msgctxt "prefix" +msgid "Sonnen" +msgstr "Sonnen" + +msgctxt "race" +msgid "youngdragon_x" +msgstr "Jungdrachen" + +msgctxt "spellinfo" +msgid "calm_monster" +msgstr " Dieser einschmeichelnde Gesang kann fast jedes intelligente Monster zähmen. Es wird von Angriffen auf den Magier absehen und auch seine Begleiter nicht anrühren. Doch sollte man sich nicht täuschen, es wird dennoch ein unberechenbares Wesen bleiben. " + +msgctxt "spell" +msgid "clone" +msgstr "Seelenkopie" + +msgctxt "spellinfo" +msgid "concealing_aura" +msgstr "Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Zeit vor den Blicken anderer verschleiern." + +msgctxt "shipinfo" +msgid "balloon" +msgstr "Der Sumpfgasballon besteht aus einem großen Weidenkorb, welcher Platz für maximal 5 Personen oder 500 Gewichtseinheiten bietet, und einer großen, mit Sumpfgas gefüllten Wyrmblase. Bei guten Winden kann sich der Ballon zwei Regionen pro Woche fortbewegen. Das Führen eines Ballons ist nicht einfach, und der Kapitän muss mindestens ein Segeltalent von 6 besitzen. Diese neue Entwicklung auf Eressea wird ausschließlich für den Xontormia-Expreß hergestellt und die Baupläne sind streng geheim. So ist es auch bisher noch niemandem gelungen, ein Exemplar nachzubauen." + +msgctxt "iteminfo" +msgid "toad" +msgstr "Die Kröte ist eine der seltensten Rassen Eresseas. Man munkelt, sie würde nur auf magische Weise entstehen. In einer uralten Abhandlung über Magie aus der Bibliothek der Akademie von Xontormia wird die Theorie aufgestellt, das die Kröte die ins morphische Feld des Magiers übertragene Manifestation eines implodierten Zauberfeldes sein könnte. Vieleicht deswegen ist die Kröte auch gegen Zauber weitaus widerstandsfähiger als die normalen Rassen Eresseas, leider aber auch weitaus unmagischer als diese. Die Kröte kann schon aufgrund ihrer Größe und der fehlenden Hände nur unter Schwierigkeiten normale Tätigkeiten ausüben. Der einzige Vorteil ihrer geringen Größe ist, dass sie sich leichter verstecken kann." + +msgctxt "spell" +msgid "bloodsacrifice" +msgstr "Kleines Blutopfer" + +msgid "undead_name_0" +msgstr "Geister" + +msgid "undead_name_1" +msgstr "Phantome" + +msgid "undead_name_2" +msgstr "Vampire" + +msgctxt "spellinfo" +msgid "migration" +msgstr " Dieses Ritual ermöglicht es, eine Einheit, egal welcher Art, in die eigene Partei aufzunehmen. Der um Aufnahme Bittende muss dazu willig und bereit sein, seiner alten Partei abzuschwören. Dies bezeugt er durch KONTAKTIEREn des Magiers. Auch wird er die Woche über ausschliesslich mit Vorbereitungen auf das Ritual beschäftigt sein. Das Ritual wird fehlschlagen, wenn er zu stark an seine alte Partei gebunden ist, dieser etwa Dienst für seine teuere Ausbildung schuldet. Der das Ritual leitende Magier muss für die permanente Bindung des Aufnahmewilligen an seine Partei naturgemäß auch permanente Aura aufwenden. Pro Stufe und pro 1 permanente Aura kann er eine Person aufnehmen. " + +msgctxt "race" +msgid "illusion" +msgstr "Illusion" + +msgid "EINHEIT" +msgstr "EINHEIT" + +msgid "magictower" +msgstr "Magierturm" + +msgid "undead_name_3" +msgstr "Zombies" + +msgid "stonecircle" +msgstr "Steinkreis" + +msgid "undead_name_4" +msgstr "Gespenster" + +msgid "p0" +msgstr "Siebenmeilentee" + +msgid "undead_name_5" +msgstr "Kreaturen" + +msgid "undead_name_6" +msgstr "Gestalten" + +msgid "undead_name_7" +msgstr "Schemen" + +msgid "p3" +msgstr "Schaffenstrunk" + +msgid "balloon_a" +msgstr "ein Ballon" + +msgid "undead_name_8" +msgstr "Monster" + +msgid "jadee_ring" +msgstr "Jadees Hochzeitsring" + +msgid "undead_name_9" +msgstr "Krieger" + +msgid "mallorntree" +msgstr "Mallorn" + +msgid "p6" +msgstr "Gehirnschmalz" + +msgid "p7" +msgstr "Dumpfbackenbrot" + +msgctxt "iteminfo" +msgid "firesword" +msgstr "Ein Flammenschwert gibt dem Träger, der kein Magier sein muß, zusätzlich zu seinem normalen Angriff (3d6+10) einen kleinen Feuerballangriff, der bei 1-10 Opfern 2d6 magischen Schaden verursacht. Um ein Flammenschwert führen zu können, muss man mindestens Hiebwaffen 7 haben, dann verleiht es einem auch einen zusätzlichen Kampfbonus von +1. Ein Flammenschwert erhöht die Magieresistenz seines Trägers wie ein Laenschwert." + +msgid "stat_hitpoints" +msgstr "Trefferpunkte" + +msgid "p9" +msgstr "Pferdeglück" + +msgctxt "damage" +msgid "strong" +msgstr "stark" + +msgctxt "race" +msgid "dragon_d" +msgstr "Drachen" + +msgid "stat_defense" +msgstr "Verteidigung" + +msgid "demonspoil_p" +msgstr "Dämonenblut" + +msgid "dwarfspoil_p" +msgstr "Zwergenbärte" + +msgctxt "iteminfo" +msgid "jadee_ring" +msgstr "Zwerge schufen diesen wunderschönen Ring aus Weissgold und Platin. Die Oberfläche ist so glatt, dass man nur bei genauem Hinsehen entdeckt, dass hier eigentlich zwei Metalle ineinander verarbeitet worden sind. In der Innenseite des Rings ist eine Gravur zu lesen: \"Wildente, 3. Woche Eiswind Jahr 8\"." + +msgctxt "race" +msgid "cat" +msgstr "Katze" + +msgid "sword" +msgstr "Schwert" + +msgctxt "race" +msgid "mummy" +msgstr "Mumie" + +msgctxt "race" +msgid "braineater" +msgstr "Hirntöter" + +msgid "nr_size" +msgstr "Größe" + +msgid "axe" +msgstr "Kriegsaxt" + +msgctxt "race" +msgid "dragon_p" +msgstr "Drachen" + +msgid "blessedstonecircle" +msgstr "Gesegneter Steinkreis" + +msgid "dragon_postfix_0" +msgstr "der Weise" + +msgid "aots_p" +msgstr "Amulette des wahren Sehens" + +msgid "dragon_postfix_1" +msgstr "der Allwissende" + +msgid "dragon_postfix_2" +msgstr "der Mächtige" + +msgid "dragon_postfix_3" +msgstr "die Ehrwürdige" + +msgctxt "race" +msgid "dragon_x" +msgstr "Drachen" + +msgid "dragon_postfix_4" +msgstr "die Listige" + +msgid "dragon_postfix_5" +msgstr "der Grüne" + +msgctxt "spellinfo" +msgid "gwyrrdfumbleshield" +msgstr "Dieses Ritual beschwört einige Elementargeister der Magie und schickt sie in die Reihen der feindlichen Magier. Diesen wird das Zaubern für die Dauer des Kampfes deutlich schwerer fallen." + +msgid "dragon_postfix_6" +msgstr "die Strafende" + +msgctxt "race" +msgid "shadowdemon" +msgstr "Schattendämon" + +msgid "antimagic_p" +msgstr "Antimagiekristalle" + +msgid "dragon_postfix_7" +msgstr "der Sehende" + +msgid "dragon_postfix_8" +msgstr "der Reisende" + +msgid "weight_per" +msgstr "GE je" + +msgid "dragon_postfix_9" +msgstr "die Wissende" + +msgid "nestwarmth_p" +msgstr "Nestwärme" + +msgctxt "race" +msgid "irongolem_d" +msgstr "Eisengolems" + +msgid "sphereofinv_p" +msgstr "Sphären der Unsichtbarkeit" + +msgid "nr_trade_end" +msgstr "." + +msgctxt "spellinfo" +msgid "firewall" +msgstr "Der Zauberer erschafft eine Wand aus Feuer in der angegebenen Richtung. Sie verletzt jeden, der sie durchschreitet." + +msgctxt "border" +msgid "gate_open" +msgstr "gewaltiges offenes Tor" + +msgctxt "spellinfo" +msgid "magicboost" +msgstr "Der Magier öffnet seinen Geist den Sphären des Chaos und wird so für einige Zeit über mehr magische Kraft verfügen. Doch die Hilfe der Herren der Sphären hat seinen Preis, und so wird die Phase der Macht abgelöst von einer Phase der Schwäche." + +msgctxt "race" +msgid "irongolem_p" +msgstr "Eisengolems" + +msgid "snowman_p" +msgstr "Schneemänner" + +msgid "Sommer" +msgstr "Sommer" + +msgid "laenshield_p" +msgstr "Laenschilde" + +msgctxt "spellinfo" +msgid "break_curse" +msgstr "Dieser Zauber ermöglicht dem Magier, gezielt eine bestimmte Verzauberung einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen." + +msgctxt "race" +msgid "irongolem_x" +msgstr "Eisengolem" + +msgctxt "spellinfo" +msgid "draigfumbleshield" +msgstr "Dieses Ritual, ausgeführt vor einem Kampf, verwirbelt die astralen Energien auf dem Schlachtfeld und macht es so feindlichen Magier schwieriger, ihre Zauber zu wirken." + +msgid "balloon" +msgstr "Ballon" + +msgid "nr_schemes_postfix" +msgstr " sind erkennbar." + +msgid "SILBER" +msgstr "SILBER" + +msgid "h0_p" +msgstr "Flachwurz" + +msgid "humanspoil_p" +msgstr "Menschenskalpe" + +msgctxt "keyword" +msgid "forget" +msgstr "VERGISS" + +msgid "nestwarmth" +msgstr "Nestwärme" + +msgctxt "skill" +msgid "tactics" +msgstr "Taktik" + +msgid "laenmail" +msgstr "Laenkettenhemd" + +msgid "orcspoil" +msgstr "Orkhauer" + +msgctxt "spell" +msgid "sleep" +msgstr "Schlaf" + +msgctxt "race" +msgid "rat" +msgstr "Ratte" + +msgid "faction_help" +msgstr "Wir helfen" + +msgid "lifepotion" +msgstr "Wasser des Lebens" + +msgid "rustyhalberd" +msgstr "Rostige Hellebarde" + +msgid "h3_p" +msgstr "Grüne Spinneriche" + +msgctxt "spell" +msgid "summonshadow" +msgstr "Beschwöre Schattendämonen" + +msgctxt "skill" +msgid "building" +msgstr "Burgenbau" + +msgid "unknown_faction_dative" +msgstr "einer unbekannten Partei" + +msgid "SHOWSKCHANGE" +msgstr "TALENTVERSCHIEBUNGEN" + +msgid "h6_p" +msgstr "Gurgelkräuter" + +msgid "firesword_p" +msgstr "Flammenschwerter" + +msgctxt "spellinfo" +msgid "raise_mob" +msgstr " Mit Hilfe dieses magischen Gesangs überzeugt der Magier die Bauern der Region, sich ihm anzuschließen. Die Bauern werden ihre Heimat jedoch nicht verlassen, und keine ihrer Besitztümer fortgeben. Jede Woche werden zudem einige der Bauern den Bann abwerfen und auf ihre Felder zurückkehren. Wie viele Bauern sich dem Magier anschließen hängt von der Kraft seines Gesangs ab. " + +msgctxt "keyword" +msgid "origin" +msgstr "URSPRUNG" + +msgid "zombie_prefix_0" +msgstr "Faulende" + +msgid "wand" +msgstr "Zauberstab" + +msgid "zombie_prefix_1" +msgstr "Zerschlagene" + +msgid "zombie_prefix_2" +msgstr "Gefolterte" + +msgid "zombie_prefix_3" +msgstr "Angsteinflößende" + +msgctxt "spellinfo" +msgid "summonshadow" +msgstr "Mit Hilfe dunkler Rituale beschwört der Zauberer Dämonen aus der Sphäre der Schatten. Diese gefürchteten Wesen können sich fast unsichtbar unter den Lebenden bewegen, ihre finstere Aura ist jedoch für jeden spürbar. Im Kampf sind Schattendämonen gefürchtete Gegner. Sie sind schwer zu treffen und entziehen ihrem Gegner Kraft." + +msgid "zombie_prefix_4" +msgstr "Leise Schlurfende" + +msgid "zombie_prefix_5" +msgstr "Kinderfressende" + +msgid "aurapotion50" +msgstr "Auratrank" + +msgid "zombie_prefix_6" +msgstr "Schwarze" + +msgid "h9_p" +msgstr "Wasserfinder" + +msgid "tree" +msgstr "Baum" + +msgid "zombie_prefix_7" +msgstr "Dunkle" + +msgid "zombie_prefix_8" +msgstr "Fürchterliche" + +msgctxt "race" +msgid "redscarab" +msgstr "roter Scarabäus" + +msgctxt "race" +msgid "wolf_d" +msgstr "Wölfen" + +msgid "zombie_prefix_9" +msgstr "Grauenhafte" + +msgctxt "race" +msgid "museumghost_d" +msgstr "Museumsgeistern" + +msgid "sehr viele" +msgstr "sehr viele" + +msgid "section_economy" +msgstr "Wirtschaft und Handel" + +msgid "mallornlance_p" +msgstr "Mallornlanzen" + +msgctxt "spell" +msgid "sparkle" +msgstr "Unbekannter Effekt" + +msgctxt "race" +msgid "wolf_p" +msgstr "Wölfe" + +msgctxt "spellinfo" +msgid "living_rock" +msgstr " Dieses kräftezehrende Ritual beschwört mit Hilfe einer Kugel aus konzentriertem Laen einen gewaltigen Erdelementar und bannt ihn in ein Gebäude. Dem Elementar kann dann befohlen werden, das Gebäude mitsamt aller Bewohner in eine Nachbarregion zu tragen. Die Stärke des beschworenen Elementars hängt vom Talent des Magiers ab: Der Elementar kann maximal [Stufe-12]*250 Größeneinheiten große Gebäude versetzen. Das Gebäude wird diese Prozedur nicht unbeschädigt überstehen. " + +msgctxt "race" +msgid "museumghost_p" +msgstr "Museumsgeister" + +msgctxt "race" +msgid "catdragon" +msgstr "Katzendrache" + +msgctxt "spell" +msgid "summonundead" +msgstr "Mächte des Todes" + +msgctxt "race" +msgid "gnome_d" +msgstr "Gnomen" + +msgid "zombie_postfix_0" +msgstr "der Nacht" + +msgid "zombie_postfix_1" +msgstr "der Schatten" + +msgctxt "race" +msgid "wolf_x" +msgstr "Wolfs" + +msgid "zombie_postfix_2" +msgstr "der Finsternis" + +msgctxt "race" +msgid "hellcat_d" +msgstr "Höllenkatzen" + +msgctxt "race" +msgid "museumghost_x" +msgstr "Museumsgeister" + +msgid "zombie_postfix_3" +msgstr "des Bösen" + +msgid "stat_armor" +msgstr "Rüstung" + +msgid "zombie_postfix_4" +msgstr "der Erschlagenen" + +msgctxt "race" +msgid "snowman_p" +msgstr "Schneemänner" + +msgid "zombie_postfix_5" +msgstr "der Verfluchten" + +msgctxt "spellinfo" +msgid "hail" +msgstr "Im Kampf ruft der Magier die Elementargeister der Kälte an und bindet sie an sich. Sodann kann er ihnen befehlen, den Gegner mit Hagelkörnern und Eisbrocken zuzusetzen." + +msgid "zombie_postfix_6" +msgstr "der Ruhelosen" + +msgid "zombie_postfix_7" +msgstr "aus dem Nebel" + +msgid "zombie_postfix_8" +msgstr "aus dem Dunkel" + +msgid "zombie_postfix_9" +msgstr "der Tiefe" + +msgid "skeleton_prefix_10" +msgstr "Fürchterliche" + +msgid "skeleton_prefix_11" +msgstr "Grauenhafte" + +msgctxt "keyword" +msgid "pay" +msgstr "BEZAHLE" + +msgid "skeleton_prefix_12" +msgstr "Furchtbare" + +msgctxt "race" +msgid "gnome_p" +msgstr "Gnome" + +msgid "skeleton_prefix_13" +msgstr "Entsetzliche" + +msgid "mine" +msgstr "Bergwerk" + +msgid "skeleton_prefix_14" +msgstr "Schauderhafte" + +msgctxt "calendar" +msgid "secondweek" +msgstr "die zweite Woche" + +msgid "skeleton_prefix_15" +msgstr "Schreckliche" + +msgctxt "race" +msgid "hellcat_p" +msgstr "Höllenkatzen" + +msgid "skeleton_prefix_16" +msgstr "Düstere" + +msgctxt "spellinfo" +msgid "summonundead" +msgstr "Nächtelang muss der Schwarzmagier durch die Friedhöfe und Gräberfelder der Region ziehen um dann die ausgegrabenen Leichen beleben zu können. Die Untoten werden ihm zu Diensten sein, doch sei der Unkundige gewarnt, dass die Beschwörung der Mächte des Todes ein zweischneidiges Schwert sein kann." + +msgid "skeleton_prefix_17" +msgstr "Schaurige" + +msgctxt "keyword" +msgid "buy" +msgstr "KAUFE" + +msgid "skeleton_prefix_18" +msgstr "Erbarmungslose" + +msgctxt "spell" +msgid "gbdream" +msgstr "Schöne Träume oder Schlechte Träume" + +msgid "southwest" +msgstr "Südwesten" + +msgid "forest_trail" +msgstr "der Wald von %s" + +msgctxt "race" +msgid "gnome_x" +msgstr "Gnomen" + +msgctxt "race" +msgid "dracoid" +msgstr "Dracoid" + +msgctxt "race" +msgid "hellcat_x" +msgstr "Höllenkatzen" + +msgid "TEMP" +msgstr "TEMP" + +msgctxt "race" +msgid "shadowmaster_d" +msgstr "Schattenmeistern" + +msgctxt "race" +msgid "redscarab_d" +msgstr "roten Scarabäen" + +msgid "aurapotion50_p" +msgstr "Auratränke" + +msgctxt "spell" +msgid "sound_out" +msgstr "Aushorchen" + +msgctxt "race" +msgid "seaserpent_d" +msgstr "Seeschlangen" + +msgctxt "spellinfo" +msgid "antimagiczone" +msgstr "Mit diesem Zauber kann der Magier eine Zone der astralen Schwächung erzeugen, ein lokales Ungleichgewicht im Astralen Feld. Dieses Zone wird bestrebt sein, wieder in den Gleichgewichtszustand zu gelangen. Dazu wird sie jedem in dieser Region gesprochenen Zauber einen Teil seiner Stärke entziehen, die schwächeren gar ganz absorbieren." + +msgid "villagers" +msgstr "Dorfbewohner" + +msgctxt "spellinfo" +msgid "disturbingdreams" +msgstr "Dieser Zauber führt in der betroffenen Region für einige Wochen zu Schlaflosigkeit und Unruhe. Den Betroffenen fällt das Lernen deutlich schwerer." + +msgctxt "spellinfo" +msgid "raindance" +msgstr "Dieses uralte Tanzritual ruft die Kräfte des Lebens und der Fruchtbarkeit. Die Erträge der Bauern werden für einige Wochen deutlich besser ausfallen." + +msgid "wdw_pyramid" +msgstr "Pyramide" + +msgctxt "race" +msgid "shadowmaster_p" +msgstr "Schattenmeister" + +msgid "unarmed" +msgstr "unbewaffnet" + +msgid "plain" +msgstr "Ebene" + +msgctxt "race" +msgid "redscarab_p" +msgstr "rote Scarabäen" + +msgctxt "race" +msgid "seaserpent_p" +msgstr "Seeschlangen" + +msgctxt "spell" +msgid "cerddor_destroymagic" +msgstr "Lebenslied festigen" + +msgctxt "spellinfo" +msgid "homestone" +msgstr "Mit dieser Formel bindet der Magier auf ewig die Kräfte der Erde in die Mauern der Burg, in der er sich gerade befindet. Weder magisch noch mit schwerem Geschütz können derartig gestärkte Mauern zerstört werden, und auch das Alter setzt ihnen weniger zu. Das Gebäude bietet sodann auch einen besseren Schutz gegen Angriffe mit dem Schwert wie mit Magie." + +msgid "birthday_firework_p" +msgstr "Feuerwerke" + +msgctxt "spell" +msgid "fogtrap" +msgstr "ein unbekannter Zauber" + +msgctxt "race" +msgid "shadowmaster_x" +msgstr "Schattenmeister" + +msgid "dreameye" +msgstr "Traumauge" + +msgid "adamantium" +msgstr "Adamantium" + +msgid "seashell" +msgstr "Muschel" + +msgctxt "race" +msgid "redscarab_x" +msgstr "rote Scarabäen" + +msgid "adamantiumplate" +msgstr "Adamantiumrüstung" + +msgctxt "spell" +msgid "transferauradruide" +msgstr "Meditation" + +msgctxt "iteminfo" +msgid "dreameye" +msgstr "Dieses verzauberte Drachenauge muß vor dem Abend einer Schlacht vom Heerführer verzehrt werden. Während der Nacht wird er dann Einblick in die Träume der feindlichen Heerführer erhalten und so möglicherweise einen entscheidenden Vorteil im kommenden Gefecht erlangen." + +msgid "nr_mallorntree_p" +msgstr "Mallornbäume" + +msgctxt "iteminfo" +msgid "seashell" +msgstr "Dieses Abzeichen identifiziert die Partei seines Trägers offiziell als einen Besucher der Botschafterregion 'Muschelplateau'." + +msgctxt "border" +msgid "a_road" +msgstr "eine Straße" + +msgctxt "race" +msgid "seaserpent_x" +msgstr "Seeschlangen" + +msgctxt "spell" +msgid "astralblock" +msgstr "Störe Astrale Integrität" + +msgctxt "spell" +msgid "migration" +msgstr "Ritual der Aufnahme" + +msgid "SCHIFF" +msgstr "SCHIFF" + +msgctxt "race" +msgid "littlescarab" +msgstr "kleiner Scarabäus" + +msgctxt "iteminfo" +msgid "nut" +msgstr "Nuß, im umgangssprachlichen Sinne alle trockenen, hartschaligen Früchte oder Samen, die eine Schale besitzen, die sich leicht vom inneren, eßbaren Kern entfernen läßt. In der botanischen Terminologie beschränkt sich die Bezeichnung Nuß auf eine einsamige Frucht, die aus einem Fruchtknoten (Ovarium) entstanden ist, dessen äußere Wände sich verholzt haben und der sich nicht öffnet, um seinen Samen zu entlassen. Solche echten Nüsse können eßbar, aber auch ungenießbar sein. Bekannte Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse. Beispiele für Früchte oder Samen, die vom Volksmund fälschlich als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im botanischen Sinne sind dies Steinfrüchte, denen die fleischige äußere Schale entfernt wurde. Andere Beispiele für unechte Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie Roßkastanien und Paranüsse, bei denen es sich um von Kapseln umhüllte Samen handelt." + +msgctxt "spell" +msgid "sacrifice_strength" +msgstr "Opfere Kraft" + +msgid "spice_p" +msgstr "Gewürze" + +msgid "nr_building_inprogress" +msgstr " (im Bau)" + +msgid "ring_of_levitation_p" +msgstr "Ringe der Levitation" + +msgctxt "spell" +msgid "song_resist_magic" +msgstr "Gesang des wachen Geistes" + +msgid "attack_standard" +msgstr "ein Angriff mit der Waffe oder unbewaffnet" + +msgid "b_armor" +msgstr "Rüstung" + +msgctxt "skill" +msgid "riding" +msgstr "Reiten" + +msgctxt "calendar" +msgid "thirdweek" +msgstr "die letzte Woche" + +msgid "furious_mob" +msgstr "Aufgebrachte Bauern" + +msgctxt "skill" +msgid "catapult" +msgstr "Katapultbedienung" + +msgid "pyramid" +msgstr "Pyramide" + +msgctxt "spellinfo" +msgid "big_recruit" +msgstr " Aus 'Wanderungen' von Firudin dem Weisen: 'In Weilersweide, nahe dem Wytharhafen, liegt ein kleiner Gasthof, der nur wenig besucht ist. Niemanden bekannt ist, das dieser Hof bis vor einigen Jahren die Bleibe des verbannten Wanderpredigers Grauwolf war. Nachdem er bei einer seiner berüchtigten flammenden Reden fast die gesammte Bauernschaft angeworben hatte, wurde er wegen Aufruhr verurteilt und verbannt. Nur zögerlich war er bereit mir das Geheimnis seiner Überzeugungskraft zu lehren.' " + +msgid "catapultammo" +msgstr "Katapultmunition" + +msgctxt "skill" +msgid "quarrying" +msgstr "Steinbau" + +msgid "HELFE" +msgstr "HELFE" + +msgctxt "describe" +msgid "healing" +msgstr "Für einen Heiltrank nehme man die Schale eines Windbeutels und etwas Gurgelkraut, rühre eine kleingehacktes Elfenlieb dazu und bestreue alles mit den Blüten einer Eisblume. Dies muß vier Tage lang gären, wobei man am zweiten Tag einen Spaltwachs dazutun muß. Dann ziehe man vorsichtig den oben schwimmenden Saft ab. Ein solcher Trank gibt vier Männern (oder einem Mann vier mal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt." + +msgctxt "race" +msgid "orc_d" +msgstr "Orks" + +msgid "stat_pierce" +msgstr "Ist durch Stichwaffen, Bögen und Armbrüste schwer zu verwunden." + +msgid "snowglobe" +msgstr "Schneekugel" + +msgid "rustygreatsword_p" +msgstr "Rostige Zweihänder" + +msgctxt "keyword" +msgid "email" +msgstr "EMAIL" + +msgctxt "spellinfo" +msgid "analysesong_unit" +msgstr "Alle lebenden Wesen haben ein eigenes individuelles Lebenslied. Nicht zwei Lieder gleichen sich, auch wenn sich alle Lieder einer Art ähneln. Jeder Zauber verändert dieses Lied auf die eine oder andere Art und gibt sich damit zu erkennen. Dieser Gesang hilft, jene Veränderungen im Lebenslied einer Person zu erlauschen, welche magischer Natur sind. Alle Verzauberungen, die nicht stärker maskiert sind als Eure Fähigkeit, werdet Ihr so entschlüsseln und demaskieren können." + +msgctxt "spell" +msgid "fiery_dragonbreath" +msgstr "Feuriger Drachenodem" + +msgid "oil" +msgstr "Öl" + +msgctxt "iteminfo" +msgid "birthdaycake" +msgstr "Eine Geburtstagstorte mit 10 Kerzen. Herzlichen Glückwunsch, Eressea!" + +msgid "jewel_p" +msgstr "Juwelen" + +msgctxt "race" +msgid "orc_p" +msgstr "Orks" + +msgid "boat_a" +msgstr "ein Boot" + +msgctxt "race" +msgid "nymph" +msgstr "Nymphe" + +msgctxt "spellinfo" +msgid "immolation" +msgstr "Verletzt alle Gegner." + +msgctxt "race" +msgid "sphinx" +msgstr "Spinx" + +msgctxt "coast" +msgid "e" +msgstr "Ostküste" + +msgid "harbour" +msgstr "Hafen" + +msgctxt "spell" +msgid "analyze_magic" +msgstr "Magie analysieren" + +msgid "truthpotion" +msgstr "Trank der Wahrheit" + +msgid "northeast" +msgstr "Nordosten" + +msgid "sehr wenige" +msgstr "sehr wenige" + +msgctxt "race" +msgid "orc_x" +msgstr "Ork" + +msgctxt "race" +msgid "tunnelworm" +msgstr "Tunnelwurm" + +msgid "stardust_p" +msgstr "Sternenstaub" + +msgctxt "race" +msgid "peasant" +msgstr "Bauer" + +msgid "mallorncrossbow_p" +msgstr "Mallornarmbrüste" + +msgctxt "spellinfo" +msgid "summonent" +msgstr "Mit Hilfe dieses Zaubers weckt der Druide die in den Wälder der Region schlummernden Ents aus ihrem äonenlangen Schlaf. Die wilden Baumwesen werden sich ihm anschließen und ihm beistehen, jedoch nach einiger Zeit wieder in Schlummer verfallen." + +msgid "LOCALE" +msgstr "LOCALE" + +msgctxt "coast" +msgid "w" +msgstr "Westküste" + +msgctxt "keyword" +msgid "message" +msgstr "BOTSCHAFT" + +msgctxt "spellinfo" +msgid "barkskin" +msgstr "Dieses vor dem Kampf zu zaubernde Ritual gibt den eigenen Truppen einen zusätzlichen Bonus auf ihre Rüstung. Jeder Treffer reduziert die Kraft des Zaubers, so dass der Schild sich irgendwann im Kampf auflösen wird." + +msgid "coal_p" +msgstr "Kohlenstücke" + +msgid "goliathwater" +msgstr "Goliathwasser" + +msgid "person_p" +msgstr "Personen" + +msgctxt "spellinfo" +msgid "readmind" +msgstr "Mit diesem Zauber dringt der Traumweber in die Gedanken und Traumwelt seines Opfers ein und kann so seine intimsten Geheimnisse ausspähen. Seine Fähigkeiten, seinen Besitz und seine Parteizugehörigkeit wird nicht länger ungewiss sein." + +msgctxt "spell" +msgid "acidrain" +msgstr "Säurenebel" + +msgid "battle_attack" +msgstr "Attacke gegen:" + +msgid "almond" +msgstr "Mandelkern" + +msgid "lance" +msgstr "Lanze" + +msgctxt "race" +msgid "insect_d" +msgstr "Insekten" + +msgctxt "spellinfo" +msgid "bad_dreams" +msgstr " Dieser Zauber ermöglicht es dem Träumer, den Schlaf aller nichtaliierten Einheiten (HELFE BEWACHE) in der Region so stark zu stören, das sie vorübergehend einen Teil ihrer Erinnerungen verlieren. " + +msgctxt "spellinfo" +msgid "bloodthirst" +msgstr " Wie viele magischen Gesänge, so entstammt auch dieser den altem Wissen der Katzen, die schon immer um die machtvolle Wirkung der Stimme wussten. Mit diesem Lied wird die Stimmung der Krieger aufgepeitscht, sie gar in wilde Raserrei und Blutrausch versetzt. Ungeachtet eigener Schmerzen werden sie kämpfen bis zum Tode und niemals fliehen. Während ihre Attacke verstärkt ist achten sie kaum auf sich selbst. " + +msgctxt "spell" +msgid "nodrift" +msgstr "Wasserelementar" + +msgctxt "spell" +msgid "combat_speed" +msgstr "Beschleunigung" + +msgctxt "spell" +msgid "Feuerwand" +msgstr "Feuerwand" + +msgctxt "race" +msgid "irongolem" +msgstr "Eisengolem" + +msgid "snowman" +msgstr "Schneemann" + +msgid "PRIVAT" +msgstr "PRIVAT" + +msgid "PUNKTE" +msgstr "PUNKTE" + +msgctxt "race" +msgid "insect_p" +msgstr "Insekten" + +msgctxt "spellinfo" +msgid "goodwinds" +msgstr "Der Magier zwingt mit diesem Ritual die Elementargeister des Wassers in seinen Dienst und bringt sie dazu, das angegebene Schiff schneller durch das Wasser zu tragen. Zudem wird das Schiff nicht durch ungünstige Winde oder Strömungen beeinträchtigt." + +msgctxt "spellinfo" +msgid "astral_disruption" +msgstr " Dieser Zauber bewirkt eine schwere Störung des Astralraums. Innerhalb eines astralen Radius von Stufe/5 Regionen werden alle Astralwesen, die dem Zauber nicht wiederstehen können, aus der astralen Ebene geschleudert. Der astrale Kontakt mit allen betroffenen Regionen ist für Stufe/3 Wochen gestört. " + +msgctxt "spell" +msgid "earthquake" +msgstr "Beschwöre einen Erdelementar" + +msgctxt "spell" +msgid "raise_mob" +msgstr "Mob aufwiegeln" + +msgid "stat_bash" +msgstr "Ist durch Schlagwaffen und Katapulte schwer zu verwunden." + +msgctxt "spellinfo" +msgid "combat_speed" +msgstr " Dieser Zauber beschleunigt einige Kämpfer auf der eigenen Seite so, dass sie während des gesamten Kampfes in einer Kampfrunde zweimal angreifen können. " + +msgctxt "keyword" +msgid "claim" +msgstr "BEANSPRUCHE" + +msgctxt "race" +msgid "insect_x" +msgstr "Insekten" + +msgid "corridor1" +msgstr "Gang" + +msgctxt "spellinfo" +msgid "windshield" +msgstr "Die Anrufung der Elementargeister des Windes beschwört plötzliche Windböen, kleine Windhosen und Luftlöcher herauf, die die gegnerischen Schützen behindern werden." + +msgid "papyrus_p" +msgstr "Papyri" + +msgid "trireme" +msgstr "Trireme" + +msgctxt "keyword" +msgid "alliance" +msgstr "ALLIANZ" + +msgctxt "spell" +msgid "song_of_healing" +msgstr "Lied der Heilung" + +msgid "sapling" +msgstr "Schößling" + +msgid "vial_p" +msgstr "Phiolen" + +msgid "rustyshield" +msgstr "Rostiger Schild" + +msgid "quarry" +msgstr "Steinbruch" + +msgctxt "spellinfo" +msgid "firestorm" +msgstr "Tötet die Feinde mit Feuer." + +msgid "scale_p" +msgstr "Schuppenpanzer" + +msgctxt "spellinfo" +msgid "strongwall" +msgstr "Mit dieser Formel bindet der Magier zu Beginn eines Kampfes einige Elementargeister des Fels in die Mauern des Gebäudes, in dem er sich gerade befindet. Das Gebäude bietet sodann einen besseren Schutz gegen Angriffe mit dem Schwert wie mit Magie." + +msgctxt "race" +msgid "seaserpent" +msgstr "Seeschlange" + +msgctxt "spellinfo" +msgid "fish_shield" +msgstr " Dieser Zauber vermag dem Gegner ein geringfügig versetztes Bild der eigenen Truppen vorzuspiegeln, so wie der Fisch im Wasser auch nicht dort ist wo er zu sein scheint. Von jedem Treffer kann so die Hälfte des Schadens unschädlich abgeleitet werden. Doch hält der Schild nur einige Hundert Schwerthiebe aus, danach wird er sich auflösen. Je stärker der Magier, desto mehr Schaden hält der Schild aus. " + +msgid "section_newpotions" +msgstr "Neue Tränke" + +msgctxt "border" +msgid "an_illusionwall" +msgstr "eine Illusionswand" + +msgctxt "race" +msgid "apepsnake" +msgstr "Apepschlange" + +msgctxt "race" +msgid "dracoid_d" +msgstr "Dracoiden" + +msgctxt "spell" +msgid "create_chastitybelt" +msgstr "Erschaffe ein Amulett der Keuschheit" + +msgid "roqf_p" +msgstr "Ringe der flinken Finger" + +msgctxt "school" +msgid "common" +msgstr "Gemein" + +msgid "fairyboot_p" +msgstr "Feenstiefel" + +msgid "FREMDES" +msgstr "FREMDES" + +msgid "ghoul_prefix_10" +msgstr "Grauenhafte" + +msgctxt "race" +msgid "dracoid_p" +msgstr "Dracoide" + +msgid "nr_trade_final" +msgstr "und für" + +msgid "ghoul_prefix_11" +msgstr "Furchtbare" + +msgid "Winter" +msgstr "Winter" + +msgid "ghoul_prefix_12" +msgstr "Entsetzliche" + +msgid "mistletoe" +msgstr "Mistelzweig" + +msgid "ghoul_prefix_13" +msgstr "Schauderhafte" + +msgid "mallorncrossbow" +msgstr "Mallornarmbrust" + +msgid "ghoul_prefix_14" +msgstr "Schreckliche" + +msgctxt "spell" +msgid "illaundestroymagic" +msgstr "Traumbilder entwirren" + +msgid "ghoul_prefix_15" +msgstr "Düstere" + +msgctxt "race" +msgid "goblin_d" +msgstr "Goblins" + +msgid "ghoul_prefix_16" +msgstr "Schaurige" + +msgid "eyeofdragon_p" +msgstr "Augen des Drachen" + +msgctxt "spellinfo" +msgid "shockwave" +msgstr "Dieser Zauber läßt eine Welle aus purer Kraft über die gegnerischen Reihen hinwegfegen. Viele Kämpfer wird der Schock so benommen machen, dass sie für einen kurzen Moment nicht angreifen können." + +msgctxt "race" +msgid "dracoid_x" +msgstr "Dracoiden" + +msgctxt "race" +msgid "special" +msgstr "Spezial" + +msgid "lebkuchenherz" +msgstr "Lebkuchenherz mit der Aufschrift 'Erz und Stein, das ist fein'" + +msgctxt "iteminfo" +msgid "snowglobe" +msgstr " Eine Kugel aus Kristallglas von circa drei Zoll Durchmesser, welche auf einem Sockel aus Granit ruht. Im Inneren tanzen unzählige winzige Schneeflocken munter umher. Auf der Unterseite des Sockels ist eine goldene Windrose mit den sechs Himmelsrichtungen abgebildet. Eigentlich ein sehr schöner Anblick, doch strahlt sie eine namenlose Kälte aus. Unter Magiern und anderen der arkanen Künste kundigen ist die Funktion und Wirkungsweise des Artefaktes heftig umstritten. Einig scheint man sich darüber zu sein, dass in dieser kleinen Kugel so viel Kälte gefangen ist, dass es dauerhafte Folgen für eine weiträumige Umgebung hätte wenn man sie zerstört. Größte Brände ließen sich damit wohl löschen, Vulkane besänftigen und Unmengen von Wasser zum gefrieren bringen. Doch auch in weniger extremen Umgebungen würden sich bestimmt dauerhafte Veränderungen ereignen. Es wäre sicherlich nicht zu empfehlen das Kleinod einfach fallen zu lassen. Man sollte es anstelle dessen so weit wie möglich von sich schleudern und dafür sorge tragen, dass sich am Einschlagsort kein Lebewesen aufhält. So man denn eine Benutzung tatsächlich riskieren will. (BENUTZE Schneekugel ) " + +msgid "desert" +msgstr "Wüste" + +msgctxt "race" +msgid "dolphin" +msgstr "Delphin" + +msgid "bow_p" +msgstr "Bögen" + +msgctxt "race" +msgid "goblin_p" +msgstr "Goblins" + +msgctxt "spellinfo" +msgid "song_of_slavery" +msgstr " Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft sie den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig fühlen. " + +msgctxt "spell" +msgid "healingzone" +msgstr "Zone der Heilung" + +msgctxt "keyword" +msgid "follow" +msgstr "FOLGE" + +msgctxt "race" +msgid "goblin_x" +msgstr "Goblin" + +msgctxt "spellinfo" +msgid "earn_silver#gwyrrd" +msgstr "Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 50 Silber verdienen." + +msgctxt "spell" +msgid "raindance" +msgstr "Regentanz" + +msgid "goblinspoil_p" +msgstr "Goblinköpfe" + +msgctxt "describe" +msgid "nestwarmth" +msgstr "Nestwärme erlaubt es einem Insekt, im Winter außerhalb von Wüsten neue Rekruten anzuwerben. Zur Zubereitung nimmt der geübte Alchemist einen Kakteenschwitz, vermischt ihn mit einer Portion Spaltwachs, die in einer sternklaren Nacht gesammelt wurde, gibt zur Vertreibung des Winters einige Blütenblätter der Eisblume in den Sud, und rührt alles mit einem grünen Spinnerich bis es eine violette Farbe annimmt. Ein Trank reicht eine Woche lang für eine ganze Region." + +msgid "attack_natural" +msgstr "ein unbewaffneter Angriff" + +msgctxt "keyword" +msgid "study" +msgstr "LERNE" + +msgctxt "iteminfo" +msgid "jadee_dress" +msgstr "Dieses Brautkleid ist mit Abstand das schönste, was je jemand irgendwie irgendwo gesehen hat. Auch wenn nur Wildente und Jadee das finden müssten, wird jeder Bewohner Eresseas dies neidlos bestätigen. Das sehr stilvolle Kleid lässt die zarten Schultern seiner Trägerin frei und liegt am Oberkörper eng an. Dies betont atemberaubend die zarten Kurven der Braut. Der Rock fällt leicht ausgestellt den ganzen langen Weg an den Beinen herunter Richtung Boden, wo er sich in einer sehr stilvollen Schleppe ergiesst." + +msgid "ZAUBER" +msgstr "ZAUBER" + +msgid "mallorn" +msgstr "Mallorn" + +msgid "mallorn_p" +msgstr "Mallorn" + +msgctxt "describe" +msgid "lifepotion" +msgstr "Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme." + +msgctxt "spell" +msgid "homestone" +msgstr "Heimstein" + +msgid "thickfog_trail" +msgstr "%s" + +msgctxt "race" +msgid "skeletonlord" +msgstr "Skelettherr" + +msgid "permaura" +msgstr "permanente Aura" + +msgid "nr_inventory" +msgstr "hat" + +msgid "section_events" +msgstr "Ereignisse" + +msgid "battle_helpers" +msgstr "Hilft:" + +msgid "incense_p" +msgstr "Weihrauch" + +msgid "iron" +msgstr "Eisen" + +msgctxt "spellinfo" +msgid "gooddreams" +msgstr "Dieser Zauber ermöglicht es dem Traumweber, den Schlaf aller aliierten Einheiten in der Region so zu beeinflussen, dass sie für einige Zeit einen Bonus in allen Talenten bekommen." + +msgctxt "spell" +msgid "earn_silver#illaun" +msgstr "Wahrsagen" + +msgid "hero_p" +msgstr "Helden" + +msgid "mallornspear" +msgstr "Mallornspeer" + +msgctxt "prefix" +msgid "Schnee" +msgstr "Schnee" + +msgid "ao_healing" +msgstr "Amulett der Heilung" + +msgid "inn" +msgstr "Taverne" + +msgctxt "border" +msgid "firewall" +msgstr "Feuerwand" + +msgctxt "spellinfo" +msgid "create_invisibility_sphere" +msgstr "Mit diesem Spruch kann der Zauberer eine Sphäre der Unsichtbarkeit erschaffen. Die Späre macht ihren Träger sowie neunundneunzig weitere Personen in derselben Einheit unsichtbar." + +msgctxt "iteminfo" +msgid "ao_healing" +msgstr "Diese Amulett ist ein hervorragender Fokus für alle Heilzauber. Ein mit diesem Fokus gewirkter Heilzauber wird mit größerer Warscheinlichkeit Erfolgreich sein und doppelt so viele Leute heilen können." + +msgid "smod_nofamiliar" +msgstr "Magier exklusiv" + +msgid "unit" +msgstr "Einheit" + +msgctxt "spellinfo" +msgid "transferaurachaos" +msgstr "Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes übertragen." + +msgid "seed_p" +msgstr "Samen" + +msgid "trollspoil" +msgstr "Trollhorn" + +msgctxt "spellinfo" +msgid "great_drought" +msgstr " Dieses mächtige Ritual öffnet ein Tor in die Elementarebene der Hitze. Eine grosse Dürre kommt über das Land. Bauern, Tiere und Pflanzen der Region kämpfen um das nackte Überleben, aber eine solche Dürre überlebt wohl nur die Hälfte aller Lebewesen. Der Landstrich kann über Jahre hinaus von den Folgen einer solchen Dürre betroffen sein. " + +msgid "fog" +msgstr "Nebel" + +msgid "catspoil_p" +msgstr "Katzenschwänze" + +msgctxt "prefix" +msgid "See" +msgstr "See" + +msgctxt "spell" +msgid "disturbingdreams" +msgstr "Schlechter Schlaf" + +msgid "iron_p" +msgstr "Eisen" + +msgid "elfspoil" +msgstr "Elfenohr" + +msgctxt "iteminfo" +msgid "trollspoil" +msgstr "Das Horn eines Trolles. Kein Troll würde sich lebend davon trennen." + +msgctxt "spellinfo" +msgid "icastle" +msgstr "Mit Hilfe dieses Zaubers kann der Traumweber die Illusion eines beliebigen Gebäudes erzeugen. Die Illusion kann betreten werden, ist aber ansonsten funktionslos und benötigt auch keinen Unterhalt. Sie wird einige Wochen bestehen bleiben." + +msgid "dreameye_p" +msgstr "Traumaugen" + +msgctxt "race" +msgid "human" +msgstr "Mensch" + +msgid "peasantblood" +msgstr "Bauernblut" + +msgid "caravan" +msgstr "Karawanserei" + +msgid "museumexitticket_p" +msgstr "Rückkehrtickets des Großen Museum" + +msgctxt "spell" +msgid "summonent" +msgstr "Erwecke Ents" + +msgctxt "spellinfo" +msgid "reelingarrows" +msgstr "Diese Beschwörung öffnet ein Tor in die Ebene der Elementargeister des Windes. Sofort erheben sich in der Umgebung des Tors starke Winde oder gar Stürme und behindern alle Schützen einer Schlacht." + +msgid "southeast" +msgstr "Südosten" + +msgid "adamantiumplate_p" +msgstr "Adamantiumrüstungen" + +msgid "log" +msgstr "Holz" + +msgctxt "race" +msgid "bluescarab" +msgstr "blauer Scarabäus" + +msgctxt "school" +msgid "draig" +msgstr "Draig" + +msgid "presspass_p" +msgstr "Akkreditionen des Xontormia-Expreß" + +msgctxt "spellinfo" +msgid "create_runesword" +msgstr "Mit diesem Spruch erzeugt man ein Runenschwert. Die Klinge des schwarzen Schwertes ist mit alten, magischen Runen verziert, und ein seltsames Eigenleben erfüllt die warme Klinge. Um es zu benutzen, muss man ein Schwertkämpfer von beachtlichem Talent (7) sein. Der Träger des Runenschwertes erhält einen Talentbonus von +4 im Kampf und wird so gut wie immun gegen alle Formen von Magie." + +msgctxt "spell" +msgid "magicboost" +msgstr "Gabe des Chaos" + +msgctxt "iteminfo" +msgid "mistletoe" +msgstr "Im Mistelzweig ruht eine magische Kraft der besonderer Art. Der Anwender wird von seinen Feinden in Frieden gelassen, eine Woche lang läßt jeder Kämpfer ihn unbeschadet seines Weges ziehen." + +msgctxt "race" +msgid "undeadpharaoh" +msgstr "Untoter Pharao" + +msgctxt "skill" +msgid "taxation" +msgstr "Steuereintreiben" + +msgctxt "spell" +msgid "heroic_song" +msgstr "Heldengesang" + +msgctxt "spell" +msgid "mallorntreegrow" +msgstr "Segne Mallornstecken" + +msgctxt "race" +msgid "littlescarab_d" +msgstr "kleinen Scarabäen" + +msgctxt "keyword" +msgid "hide" +msgstr "TARNE" + +msgctxt "keyword" +msgid "move" +msgstr "NACH" + +msgctxt "spellinfo" +msgid "create_dreameye" +msgstr "Ein mit diesem Zauber belegtes Drachenauge, welches zum Abendmahle verzehrt wird, erlaubt es dem Benutzer, in die Träume einer anderen Person einzudringen und diese zu lesen. Lange Zeit wurde eine solche Fähigkeit für nutzlos erachtet, bis die ehemalige waldelfische Magistra für Kampfmagie, Liarana Sonnentau von der Akademie Thall, eine besondere Anwendung vorstellte: Feldherren träumen vor großen Kämpfen oft unruhig und verraten im Traum ihre Pläne. Dies kann dem Anwender einen großen Vorteil im kommenden Kampf geben. Aber Vorsicht: Die Interpretation von Träumen ist eine schwierige Angelegenheit." + +msgid "demonspoil" +msgstr "Dämonenblut" + +msgctxt "damage" +msgid "plusstrong" +msgstr "sehr stark" + +msgctxt "race" +msgid "littlescarab_p" +msgstr "kleine Scarabäen" + +msgid "an_unknown_ship" +msgstr "ein unbekanntes Schiff" + +msgctxt "iteminfo" +msgid "almond" +msgstr "(Prunus dulcis) [...] Die Nüsse existieren in zwei Varianten, süß und bitter. Süße Mandeln sind der bekannte eßbare Typ, der in Form von Nüssen gegessen, beim Kochen verwandt oder zu Mandelöl und Mandelmehl verarbeitet wird." + +msgid "roi" +msgstr "Ring der Unsichtbarkeit" + +msgid "caravel_a" +msgstr "eine Karavelle" + +msgctxt "keyword" +msgid "describe" +msgstr "BESCHREIBE" + +msgid "mallornspear_p" +msgstr "Mallornspeere" + +msgid "DEBUG" +msgstr "DEBUG" + +msgctxt "spell" +msgid "goodwinds" +msgstr "Beschwörung eines Wasserelementares" + +msgid "GEBAEUDE" +msgstr "GEBÄUDE" + +msgctxt "spellinfo" +msgid "blessedharvest" +msgstr "Dieses Ernteritual verbessert die Erträge der arbeitenden Bauern in der Region um ein Silberstück. Je mehr Kraft der Druide investiert, desto länger wirkt der Zauber." + +msgid "KRAEUTER" +msgstr "KRÄUTER" + +msgctxt "spellinfo" +msgid "rustweapon" +msgstr "Mit diesem Ritual wird eine dunkle Gewitterfront beschworen, die sich unheilverkündend über der Region auftürmt. Der magische Regen wird alles Erz rosten lassen. Eisenwaffen und Rüstungen werden schartig und rostig. Die Zerstörungskraft des Regens ist von der investierten Kraft des Magiers abhängig. Für jede Stufe können bis zu 10 Eisenwaffen betroffen werden. Ein Ring der Macht verstärkt die Wirkung wie eine zusätzliche Stufe." + +msgctxt "race" +msgid "littlescarab_x" +msgstr "kleine Scarabäen" + +msgid "rop" +msgstr "Ring der Macht" + +msgid "wall1" +msgstr "Wand" + +msgctxt "spell" +msgid "analysesong_unit" +msgstr "Gesang des Lebens analysieren" + +msgid "ror" +msgstr "Ring der Regeneration" + +msgctxt "race" +msgid "ghost" +msgstr "Geist" + +msgid "runesword_p" +msgstr "Runenschwerter" + +msgctxt "spell" +msgid "farvision" +msgstr "ein unbekannter Zauber" + +msgctxt "spell" +msgid "icastle" +msgstr "Traumschlößchen" + +msgid "newbie_info_cr" +msgstr "Mit der ersten Auswertung bekommst du einen Computerreport, den du mit vielen Tools wie z.B. Magellan benutzen kannst. Wenn du ihn weiterhin bekommen willst, gib einer deiner Einheiten den Befehl OPTION COMPUTER." + +msgctxt "spellinfo" +msgid "puttorest" +msgstr "Dieses magische Ritual beruhigt die gequälten Seelen der gewaltsam zu Tode gekommenen und ermöglicht es ihnen so, ihre letzte Reise in die Anderlande zu beginnen. Je Stufe des Zaubers werden ungefähr 50 Seelen ihre Ruhe finden. Der Zauber vermag nicht, bereits wieder auferstandene lebende Tote zu erlösen, da deren Bindung an diese Welt zu stark ist." + +msgid "key_p" +msgstr "Schlüssel" + +msgid "aura_p" +msgstr "Aura" + +msgctxt "spell" +msgid "song_of_peace" +msgstr "Gesang der Friedfertigkeit" + +msgctxt "spell" +msgid "firestorm" +msgstr "Feuersturm" + +msgctxt "school" +msgid "cerddor" +msgstr "Cerddor" + +msgctxt "spell" +msgid "create_aots" +msgstr "Erschaffe ein Amulett des wahren Sehens" + +msgctxt "prefix" +msgid "black" +msgstr "Schwarz" + +msgctxt "spellinfo" +msgid "magic_roots" +msgstr " Mit Hilfe dieses aufwändigen Rituals läßt der Druide einen Teil seiner Kraft dauerhaft in den Boden und die Wälder der Region fliessen. Dadurch wird das Gleichgewicht der Natur in der Region für immer verändert, und in Zukunft werden nur noch die anspruchsvollen, aber kräftigen Mallorngewächse in der Region gedeihen. " + +msgctxt "race" +msgid "undead_d" +msgstr "Untoten" + +msgctxt "calendar" +msgid "thirdweek_d" +msgstr "der letzten Woche" + +msgctxt "spellinfo" +msgid "leaveastral" +msgstr "Der Magier konzentriert sich auf die Struktur der Realität und kann so die astrale Ebene verlassen. Er kann insgesamt (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 11 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen." + +msgid "zombie_name_0" +msgstr "Zombies" + +msgid "zombie_name_1" +msgstr "Kreaturen" + +msgid "VORNE" +msgstr "VORNE" + +msgid "zombie_name_2" +msgstr "Verlorene" + +msgid "zombie_name_3" +msgstr "Erschlagene" + +msgid "zombie_name_4" +msgstr "Verdammte" + +msgctxt "spellinfo" +msgid "tybiedfumbleshield" +msgstr "Dieser Zauber legt ein antimagisches Feld um die Magier der Feinde und behindert ihre Zauber erheblich. Nur wenige werden die Kraft besitzen, das Feld zu durchdringen und ihren Truppen in der Schlacht zu helfen." + +msgid "adamantiumaxe" +msgstr "Adamantiumaxt" + +msgid "skillpotion_p" +msgstr "Talenttrünke" + +msgctxt "race" +msgid "undead_p" +msgstr "Untote" + +msgctxt "race" +msgid "imp" +msgstr "Teufelchen" + +msgid "ZUGVORLAGE" +msgstr "ZUGVORLAGE" + +msgctxt "race" +msgid "shadowbat_d" +msgstr "Todesflattern" + +msgctxt "race" +msgid "nightmare_d" +msgstr "Alpträumen" + +msgid "sptype_precombat" +msgstr "Präkampfzauber" + +msgid "nr_spell_level" +msgstr "Stufe:" + +msgctxt "spell" +msgid "create_magicherbbag" +msgstr "Erschaffe einen magischen Kräuterbeutel" + +msgctxt "spell" +msgid "shockwave" +msgstr "Schockwelle" + +msgctxt "race" +msgid "undead_x" +msgstr "Untoten" + +msgid "flyingcarpet_a" +msgstr "ein fliegender Teppich" + +msgid "mallorntree_p" +msgstr "Mallorn" + +msgid "castle" +msgstr "Burg" + +msgid "nr_borderlist_infix" +msgstr ", im " + +msgctxt "race" +msgid "shadowbat_p" +msgstr "Todesflattern" + +msgctxt "iteminfo" +msgid "apple" +msgstr "Frucht aus der Gattung Malus (ca. 25 Arten), gehört zur Familie der Rosengewächse. Die am häufigsten kultivierte Baumfrucht. Der Apfel gehört zu den fleischigen Früchten, in dem der gereifte Fruchtknoten und das umgebende Gewebe fleischig und eßbar werden. Die Apfelblüte der meisten Varianten erfordert Kreuzbestäubung zur Befruchtung. Form und Größe des Apfels bei der Ernte variieren abhängig von kulturellen und umweltbedingten Einflüssen in Größe, Form, Farbe und Geschmack, sind jedoch nichtsdestotrotz üblicherweise rund, zwischen 50 und 100mm im Durchmesser und weisen röt- oder gelbliche Farbtöne auf." + +msgctxt "race" +msgid "nightmare_p" +msgstr "Alpträume" + +msgctxt "spellinfo" +msgid "shadowknights" +msgstr "Dieser Zauber vermag dem Gegner ein geringfügig versetztes Bild der eigenen Truppen vorzuspiegeln. Die Schattenritter haben keinen effektiven Angriff und Verwundungen im Kampf zerstören sie sofort." + +msgctxt "prefix" +msgid "Nacht" +msgstr "Nacht" + +msgctxt "spell" +msgid "fetch_astral" +msgstr "Ruf der Realität" + +msgctxt "keyword" +msgid "password" +msgstr "PASSWORT" + +msgid "nr_mourning" +msgstr " (trauernd)" + +msgctxt "spellinfo" +msgid "create_chastitybelt" +msgstr "Dieses Amulett in Gestalt einer orkischen Matrone unterdrückt den Fortpflanzungstrieb eines einzelnen Orks sehr zuverlässig. Ein Ork mit Amulett der Keuschheit wird sich nicht mehr vermehren." + +msgctxt "spellinfo" +msgid "analyse_object" +msgstr " Wie Lebewesen, so haben auch Schiffe und Gebäude und sogar Regionen ihr eigenes Lied, wenn auch viel schwächer und schwerer zu hören. Und so, wie aus dem Lebenslied einer Person erkannt werden kann, ob diese unter einem Zauber steht, so ist dies auch bei Burgen, Schiffen oder Regionen möglich. " + +msgctxt "race" +msgid "shadowbat_x" +msgstr "Todesflatter" + +msgctxt "race" +msgid "nightmare_x" +msgstr "Alptraum" + +msgid "stat_attacks" +msgstr "Angriffe" + +msgctxt "spell" +msgid "transfer_aura_song" +msgstr "Gesang des Auratransfers" + +msgctxt "race" +msgid "ghoul" +msgstr "Ghoul" + +msgid "eyeofdragon" +msgstr "Auge des Drachen" + +msgctxt "spellinfo" +msgid "fetch_astral" +msgstr "Ein Magier, welcher sich in der materiellen Welt befindet, kann er mit Hilfe dieses Zaubers Einheiten aus der angrenzenden Astralwelt herbeiholen. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen in die materielle Welt zwingen." + +msgid "chainmail_p" +msgstr "Kettenhemden" + +msgctxt "race" +msgid "goblin" +msgstr "Goblin" + +msgctxt "skill" +msgid "training" +msgstr "Pferdedressur" + +msgid "undead_postfix_10" +msgstr "der Tiefe" + +msgid "undead_postfix_11" +msgstr "in Ketten" + +msgctxt "race" +msgid "demon" +msgstr "Dämon" + +msgid "undead_postfix_12" +msgstr "aus dem Totenreich" + +msgctxt "calendar" +msgid "summer" +msgstr "Sommer" + +msgctxt "spellinfo" +msgid "acidrain" +msgstr "Tötet die Feinde mit Säure." + +msgid "undead_postfix_13" +msgstr "aus der Unterwelt" + +msgctxt "prefix" +msgid "Wald" +msgstr "Wald" + +msgid "trollspoil_p" +msgstr "Trollhörner" + +msgctxt "spellinfo" +msgid "steal_aura" +msgstr "Mit Hilfe dieses Zaubers kann der Magier einem anderen Magier seine Aura gegen dessen Willen entziehen und sich selber zuführen." + +msgctxt "race" +msgid "mummy_d" +msgstr "Mumien" + +msgctxt "race" +msgid "braineater_d" +msgstr "Hirntöter" + +msgctxt "describe" +msgid "goliathwater" +msgstr "Zuerst brate man das Gurgelkraut leicht an und würze das Zeug mit ein wenig Fjordwuchs. Man lasse alles so lange kochen, bis fast alle Flüssigkeit verdampft ist. Diesen Brei stelle man über Nacht raus. Am nächsten Morgen presse man den Brei aus. Die so gewonnene Flüssigkeit, Goliathwasser genannt, verleiht bis zu zehn Männern die Tragkraft eines Pferdes." + +msgctxt "spellinfo" +msgid "eternal_walls" +msgstr "Mit dieser Formel bindet der Magier auf ewig die Kräfte der Erde in die Mauern des Gebäudes. Ein solchermaßen verzaubertes Gebäude ist gegen den Zahn der Zeit geschützt und benötigt keinen Unterhalt mehr." + +msgid "snowglobe_p" +msgstr "Schneekugeln" + +msgctxt "skill" +msgid "weaponsmithing" +msgstr "Waffenbau" + +msgid "an_unknown_building" +msgstr "ein unbekanntes Gebäude" + +msgid "museumexitticket" +msgstr "Rückkehrticket des Großen Museum" + +msgctxt "race" +msgid "mummy_p" +msgstr "Mumien" + +msgctxt "race" +msgid "braineater_p" +msgstr "Hirntöter" + +msgctxt "keyword" +msgid "attack" +msgstr "ATTACKIERE" + +msgctxt "spell" +msgid "concealing_aura" +msgstr "Schleieraura" + +msgctxt "race" +msgid "mummy_x" +msgstr "Mumien" + +msgctxt "race" +msgid "braineater_x" +msgstr "Hirntöter" + +msgctxt "spell" +msgid "unholypower" +msgstr "Unheilige Kraft" + +msgctxt "school" +msgid "illaun" +msgstr "Illaun" + +msgid "nr_calendar" +msgstr "Wir schreiben %s des Monats %s im Jahre %d %s." + +msgid "caravel" +msgstr "Karavelle" + +msgid "dragon_postfix_10" +msgstr "der Goldene" + +msgid "dragon_postfix_11" +msgstr "der Graue" + +msgid "stone_p" +msgstr "Steine" + +msgid "dragon_postfix_12" +msgstr "der Steinerne" + +msgctxt "spellinfo" +msgid "song_suscept_magic" +msgstr " Dieses Lied, das in die magische Essenz der Region gewoben wird, schwächt die natürliche Widerstandskraft gegen eine Verzauberung einmalig um 15%. Nur die Verbündeten des Barden (HELFE BEWACHE) sind gegen die Wirkung des Gesangs gefeit. " + +msgid "dragon_postfix_13" +msgstr "die Alte" + +msgid "plate" +msgstr "Plattenpanzer" + +msgid "herbbag_p" +msgstr "Kräuterbeutel" + +msgid "dragon_postfix_14" +msgstr "die Mächtige" + +msgid "dragon_postfix_15" +msgstr "die Goldene" + +msgid "skillpotion" +msgstr "Talenttrunk" + +msgid "dragon_postfix_16" +msgstr "der Grausame" + +msgid "speedsail_p" +msgstr "Sonnensegel" + +msgid "dragon_postfix_17" +msgstr "der Sanddrache" + +msgid "dragon_postfix_18" +msgstr "der Durstige" + +msgid "dragon_postfix_19" +msgstr "die Verzehrende" + +msgctxt "skill" +msgid "cartmaking" +msgstr "Wagenbau" + +msgctxt "race" +msgid "nightmare" +msgstr "Alptraum" + +msgid "nr_alliances" +msgstr "Aktueller Status" + +msgid "cart_p" +msgstr "Wagen" + +msgid "section_study" +msgstr "Lehren und Lernen" + +msgctxt "skill" +msgid "stealth" +msgstr "Tarnung" + +msgctxt "spell" +msgid "magicwalls" +msgstr "Heimstein" + +msgctxt "race" +msgid "smurf" +msgstr "Schlumpf" + +msgctxt "spell" +msgid "badmagicresistancezone" +msgstr "Gesang des schwachen Geistes" + +msgid "peasant" +msgstr "Bauer" + +msgctxt "iteminfo" +msgid "ring_of_levitation" +msgstr "Benutzt der Kapitän des Schiffes diesen Talisman, so wird allen an Bord befindlichen Mallornsamen ihre magisch Energie entzogen, und das Schiff kann mit dieser Energie bis zu zwei Wochen lang fliegen." + +msgctxt "spell" +msgid "tiredsoldiers" +msgstr "Schwere Glieder" + +msgctxt "spell" +msgid "immolation" +msgstr "Feuerwalze" + +msgctxt "race" +msgid "aquarian" +msgstr "Meermensch" + +msgctxt "prefix" +msgid "star" +msgstr "Sternen" + +msgid "xmastree_p" +msgstr "Weihnachtsbäume" + +msgctxt "race" +msgid "tunnelworm_d" +msgstr "Tunnelwürmern" + +msgid "dragon_postfix_20" +msgstr "die Grüne" + +msgid "dragon_postfix_21" +msgstr "die Rote" + +msgid "dragon_postfix_22" +msgstr "der Furchtlose" + +msgid "dragon_postfix_23" +msgstr "der Allmächtige" + +msgid "dragon_postfix_24" +msgstr "der Weitblickende" + +msgctxt "border" +msgid "a_wisps" +msgstr "eine Gruppe von Irrlichtern" + +msgid "dragon_postfix_25" +msgstr "der Weiße" + +msgid "NAECHSTER" +msgstr "NÄCHSTER" + +msgid "dragon_postfix_26" +msgstr "die Glänzende" + +msgctxt "spell" +msgid "wdwpyramid_cerddor" +msgstr "Gesang der Götter" + +msgctxt "keyword" +msgid "leave" +msgstr "VERLASSE" + +msgid "dragon_postfix_27" +msgstr "der Wissende" + +msgid "dragon_postfix_28" +msgstr "die Unbarmherzige" + +msgid "dragon_postfix_29" +msgstr "die Schöne" + +msgctxt "race" +msgid "tunnelworm_p" +msgstr "Tunnelwürmer" + +msgid "nr_skills" +msgstr "Talente" + +msgid "section_movement" +msgstr "Reisen und Bewegung" + +msgctxt "race" +msgid "tunnelworm_x" +msgstr "Tunnelwurm" + +msgid "weight_per_p" +msgstr "GE je" + +msgid "h12_p" +msgstr "Windbeutel" + +msgctxt "spell" +msgid "fumble" +msgstr "Chaosfluch" + +msgctxt "spell" +msgid "wdwpyramid_illaun" +msgstr "Traum von den Göttern" + +msgctxt "race" +msgid "bluescarab_d" +msgstr "blauen Scarabäen" + +msgctxt "race" +msgid "snotling" +msgstr "Snotling" + +msgctxt "spellinfo" +msgid "berserk" +msgstr "In diesem blutigen Ritual opfert der Magier vor der Schlacht ein Neugeborenes vor den Augen seiner Armee. Die so gerufenen Blutgeister werden von den Soldaten Besitz ergreifen und sie in einen Blutrausch versetzen." + +msgctxt "race" +msgid "wyrm_d" +msgstr "Wyrmen" + +msgid "h15_p" +msgstr "Steinbeißer" + +msgctxt "spell" +msgid "bad_dreams" +msgstr "Schlechte Träume" + +msgctxt "spell" +msgid "goodmagicresistancezone" +msgstr "Gesang des wachen Geistes" + +msgctxt "skill" +msgid "shipcraft" +msgstr "Schiffbau" + +msgctxt "prefix" +msgid "Klein" +msgstr "Klein" + +msgctxt "race" +msgid "bluescarab_p" +msgstr "blaue Scarabäen" + +msgid "citadel" +msgstr "Zitadelle" + +msgctxt "spell" +msgid "puttorest" +msgstr "Seelenfrieden" + +msgid "list_and" +msgstr " und " + +msgctxt "spell" +msgid "godcursezone" +msgstr "Fluch der Götter" + +msgid "sptype_postcombat" +msgstr "Postkampfzauber" + +msgid "h18_p" +msgstr "Eisblumen" + +msgctxt "race" +msgid "wyrm_p" +msgstr "Wyrme" + +msgid "viele" +msgstr "viele" + +msgctxt "race" +msgid "bluescarab_x" +msgstr "blaue Scarabäen" + +msgctxt "spell" +msgid "wdwpyramid_draig" +msgstr "Göttliche Macht" + +msgid "nr_nospells" +msgstr "keiner" + +msgctxt "prefix" +msgid "Sumpf" +msgstr "Sumpf" + +msgctxt "race" +msgid "wyrm_x" +msgstr "Wyrm" + +msgctxt "spell" +msgid "windshield" +msgstr "Windschild" + +msgctxt "race" +msgid "museumghost" +msgstr "Museumsgeist" + +msgctxt "spellinfo" +msgid "fumblecurse" +msgstr "Dieser heimtückische Fluch beeinträchtigt die magischen Fähigkeiten des Opfers erheblich. Eine chaosmagische Zone um das Opfer vermindert seine Konzentrationsfähigkeit und macht es ihm sehr schwer Zauber zu wirken." + +msgctxt "keyword" +msgid "option" +msgstr "OPTION" + +msgctxt "border" +msgid "roads" +msgstr "Straßen" + +msgid "battle_army" +msgstr "Heer" + +msgctxt "race" +msgid "giantturtle_d" +msgstr "Riesenschildkröten" + +msgctxt "spell" +msgid "create_runesword" +msgstr "Erschaffe ein Runenschwert" + +msgctxt "spell" +msgid "strongwall" +msgstr "Starkes Tor und feste Mauer" + +msgctxt "spell" +msgid "double_time" +msgstr "Zeitdehnung" + +msgctxt "raceinfo" +msgid "unicorn" +msgstr "Dieses mystische Wesen lebt bevorzugt in den tiefsten Wäldern und vermag sich hervorragend vor den Augen anderer zu verbergen. Nur selten schließt sich ein Einhorn einem Magier an, jedoch wenn das geschieht ist es ein mächtiger Verbündeter, der auch über eigene Magie verfügt." + +msgid "wente_ring" +msgstr "Wildentes Hochzeitsring" + +msgctxt "spell" +msgid "earn_silver#tybied" +msgstr "Wunderdoktor" + +msgid "snowball" +msgstr "Schneeball" + +msgid "apple" +msgstr "Apfel" + +msgctxt "prefix" +msgid "Mond" +msgstr "Mond" + +msgctxt "iteminfo" +msgid "snowball" +msgstr "Ein Schneeball. Es scheinen kleine Eissplitter darin zu sein. In den richtigen Händen können sie sicher weh tun." + +msgid "nr_spell_syntax" +msgstr "Syntax:" + +msgctxt "raceinfo" +msgid "no_info" +msgstr "Keine Informationen über diese Rasse verfügbar." + +msgid "seaserpenthead_p" +msgstr "Seeschlangenköpfe" + +msgid "forest" +msgstr "Wald" + +msgctxt "race" +msgid "giantturtle_p" +msgstr "Riesenschildkröten" + +msgid "ring_of_levitation" +msgstr "Ring der Levitation" + +msgctxt "spell" +msgid "berserk" +msgstr "Blutrausch" + +msgctxt "skill" +msgid "herbalism" +msgstr "Kräuterkunde" + +msgid "nr_spell_rank" +msgstr "Rang:" + +msgctxt "iteminfo" +msgid "wente_ring" +msgstr "Dieser Ring ist ein wahres Meisterwerk. Obwohl er sehr gross ist (weil auch sein Träger sehr gross ist), wirkt er filigran. Weissgold und Platin verschmelzen in diesem Ring zu einer Einheit, die die Schönheit der einzelnen Elemente nur noch unterstreich. In der Innenseite des Rings ist eine Gravur zu lesen: 'Jadee, 3. Woche Eiswind Jahr 8'." + +msgctxt "spellinfo" +msgid "stonegolem" +msgstr "Man befeuchte einen kluftfreien Block aus feinkristallinen Gestein mit einer Phiole des Lebenswassers bis dieses vollständig vom Gestein aufgesogen wurde. Sodann richte man seine Kraft auf die sich bildende feine Aura des Lebens und forme der ungebundenen Kraft ein Gehäuse. Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden, bevor die Aura sich verflüchtigt. Jeder Golem hat jede Runde eine Chance von 10 Prozent zu Staub zu zerfallen. Gibt man den Golems die Befehle MACHE BURG oder MACHE STRASSE, so werden pro Golem 4 Steine verbaut und der Golem löst sich auf. " + +msgid "dolphin" +msgstr "Delphin" + +msgctxt "race" +msgid "snotling_d" +msgstr "Snotlingen" + +msgctxt "race" +msgid "giantturtle_x" +msgstr "Riesenschildkröten" + +msgid "lmsreward" +msgstr "Gürtel der Heldentaten" + +msgid "crossbow" +msgstr "Armbrust" + +msgctxt "race" +msgid "orc" +msgstr "Ork" + +msgctxt "spellinfo" +msgid "create_antimagic" +msgstr "Mit Hilfe dieses Zauber entzieht der Magier einem Quarzkristall all seine magischen Energien. Der Kristall wird dann, wenn er zu feinem Staub zermahlen und verteilt wird, die beim Zaubern freigesetzten magischen Energien aufsaugen und die Kraft aller Zauber reduzieren, welche in der betreffenden Woche in der Region gezaubert werden." + +msgid "goliathwater_p" +msgstr "Goliathwasser" + +msgid "stardust" +msgstr "Sternenstaub" + +msgid "illusioncastle" +msgstr "Traumschlößchen" + +msgctxt "iteminfo" +msgid "stardust" +msgstr "Dieser magische Staub ist aus einem im Winter vom Himmel gefallenen Stern gewonnen worden, und ihm werden aphrodisiakische Eigenschaften nachgesagt." + +msgctxt "race" +msgid "snotling_p" +msgstr "Snotlinge" + +msgctxt "calendar" +msgid "fall" +msgstr "Herbst" + +msgid "halflingspoil_p" +msgstr "Halblingfüße" + +msgid "glacier" +msgstr "Gletscher" + +msgid "aod_p" +msgstr "Amulette der Dunkelheit" + +msgctxt "race" +msgid "snotling_x" +msgstr "Snotling" + +msgctxt "spellinfo" +msgid "create_magicherbbag" +msgstr "Der Druide nehme etwas präpariertes Leder, welches er in einem großen Ritual der Reinigung von allen unreinen Geistern befreie, und binde dann einige kleine Geister der Luft und des Wassers in das Material. Aus dem so vorbereiteten Leder fertige er nun ein kleines Beutelchen, welches in ihm aufbewahrte Kräuter besser zu konservieren vermag." + +msgctxt "border" +msgid "road" +msgstr "Straße" + +msgid "status_defensive" +msgstr "defensiv" + +msgctxt "describe" +msgid "peasantblood" +msgstr "Zu den gefährlichsten und geheimsten Wissen der Alchemisten zählt die Kenntnis um diesen Trank. Den finstersten Höllen entrissen, ermöglicht die Kenntnis dieser Formel die Herstellung eines Elixiers, welches Dämonen als Nahrung dient. Von normalen Lebewesen eingenommen, führt es zu schnellem Tod und ewigen Nichtleben. Die Herstellung benötigt nebst Fjordwuchs, etwas Höhlenglimm und einem Blauen Baumringel auch einen Bauern aus der Region, welcher in einem tagelangen blutigen Ritual getötet wird. Ein Fläschchen des Tranks kann den Hunger von 100 Dämonen für eine Woche stillen." + +msgctxt "keyword" +msgid "spy" +msgstr "SPIONIERE" + +msgctxt "spell" +msgid "powerful_dragonbreath" +msgstr "Großer Drachenodem" + +msgid "DURCHREISE" +msgstr "DURCHREISE" + +msgid "aog_p" +msgstr "Amulette des Treffens" + +msgid "dragonblood_p" +msgstr "Drachenblut" + +msgctxt "describe" +msgid "p10" +msgstr "Will man seine Krieger zu Höchstleistungen antreiben, sei das Berserkerblut empfohlen. Um es herzustellen, braucht man einen Weißen Wüterich, etwas Flachwurz, Sandfäule und eine Alraune. Alle Zutaten müssen möglichst klein geschnitten und anschließend zwei Stunden lang gekocht werden. Den abgekühlten Brei gebe man in ein Tuch und presse ihn aus. Der so gewonnene Saft reicht aus, um zehn Kämpfer besser angreifen zu lassen." + +msgctxt "describe" +msgid "p11" +msgstr "Das Bauernlieb betört Mann und Frau gleichwohl und läßt in ihnen den Wunsch nach Kindern anwachsen. Für eine große Portion höhle man eine Alraune aus, gebe kleingehackten Blasenmorchel, Elfenlieb und Schneekristall dazu, streue ein wenig geriebenen Steinbeißer darüber und lasse dieses zwanzig Stunden lang auf kleiner Flamme kochen. Bis zu 1000 Bauern vermag der Trank das Glück von Zwillinge zu bescheren." + +msgctxt "describe" +msgid "p13" +msgstr "Eines der seltensten und wertvollsten alchemistischen Elixiere, verleiht dieser Trank dem Anwender für einige Wochen die Kraft eines Drachen. Der Trank erhöht die Lebensenergie von maximal zehn Personen auf das fünffache. Die Wirkung ist direkt nach der Einnahme am stärksten und klingt danach langsam ab. Zur Herstellung benötigt der Alchemist ein Elfenlieb, einen Windbeutel, ein Stück Wasserfinder und einen Grünen Spinnerich. Über dieses Mischung streue er schließlich einen zerriebenen Blasenmorchel und rühre dieses Pulver unter etwas Drachenblut." + +msgid "an_unknown_curse" +msgstr "ein unbekannter Zauber" + +msgctxt "spell" +msgid "gooddreams" +msgstr "Schöne Träume" + +msgctxt "race" +msgid "zombie" +msgstr "Zombie" + +msgid "sptype_normal" +msgstr "Normaler Zauber" + +msgid "PERSONEN" +msgstr "PERSONEN" + +msgctxt "race" +msgid "ent_d" +msgstr "Ents" + +msgid "unit_hungers" +msgstr "hungert" + +msgid "amulet_p" +msgstr "Amulette" + +msgctxt "race" +msgid "rat_d" +msgstr "Ratten" + +msgid "laenmail_p" +msgstr "Laenkettenhemden" + +msgid "orcspoil_p" +msgstr "Orkhauer" + +msgctxt "keyword" +msgid "loot" +msgstr "PLÜNDERE" + +msgctxt "calendar" +msgid "month_1" +msgstr "Feldsegen" + +msgid "status_front" +msgstr "vorne" + +msgctxt "keyword" +msgid "guard" +msgstr "BEWACHE" + +msgctxt "calendar" +msgid "month_2" +msgstr "Nebeltage" + +msgid "activevolcano_trail" +msgstr "der Vulkan von %s" + +msgctxt "calendar" +msgid "month_3" +msgstr "Sturmmond" + +msgctxt "spellinfo" +msgid "stormwinds" +msgstr "Die Beschwörung von Elementargeistern der Stürme ist ein uraltes Ritual. Der Druide bannt die Elementare in die Segel der Schiffe, wo sie helfen, das Schiff mit hoher Geschwindigkeit über die Wellen zu tragen. Je mehr Kraft der Druide in den Zauber investiert, desto größer ist die Zahl der Elementargeister, die sich bannen lassen. Für jedes Schiff wird ein Elementargeist benötigt." + +msgid "PAUSE" +msgstr "PAUSE" + +msgctxt "calendar" +msgid "month_4" +msgstr "Herdfeuer" + +msgctxt "spellinfo" +msgid "summon_familiar" +msgstr "Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird." + +msgctxt "spell" +msgid "courting" +msgstr "Gesang des Werbens" + +msgctxt "race" +msgid "ghost_d" +msgstr "Geistern" + +msgid "trollbelt_p" +msgstr "Gürtel der Trollstärke" + +msgctxt "calendar" +msgid "month_5" +msgstr "Eiswind" + +msgctxt "spellinfo" +msgid "healing" +msgstr "Nicht nur der Feldscher kann den Verwundeten einer Schlacht helfen. Druiden vermögen mittels einer Beschwörung der Elementargeister des Lebens Wunden zu schließen, gebrochene Knochen zu richten und selbst abgetrennte Glieder wieder zu regenerieren." + +msgctxt "race" +msgid "vampunicorn_d" +msgstr "Nachteinhörnern" + +msgid "rop_p" +msgstr "Ringe der Macht" + +msgctxt "calendar" +msgid "month_6" +msgstr "Schneebann" + +msgctxt "race" +msgid "ent_p" +msgstr "Ents" + +msgctxt "calendar" +msgid "month_7" +msgstr "Blütenregen" + +msgctxt "calendar" +msgid "month_8" +msgstr "Mond der milden Winde" + +msgctxt "calendar" +msgid "month_9" +msgstr "Sonnenfeuer" + +msgctxt "race" +msgid "rat_p" +msgstr "Ratten" + +msgid "key" +msgstr "Schlüssel" + +msgid "aura" +msgstr "Aura" + +msgctxt "spell" +msgid "badlearn" +msgstr "Schlechter Schlaf" + +msgctxt "race" +msgid "ent_x" +msgstr "Ent" + +msgctxt "race" +msgid "ghost_p" +msgstr "Geister" + +msgctxt "race" +msgid "vampunicorn_p" +msgstr "Nachteinhörner" + +msgid "ao_chastity" +msgstr "Amulett der Keuschheit" + +msgctxt "race" +msgid "rat_x" +msgstr "Ratten" + +msgid "new" +msgstr "NEU" + +msgctxt "spell" +msgid "draigfumbleshield" +msgstr "Astrales Chaos" + +msgid "lifepotion_p" +msgstr "Wasser des Lebens" + +msgid "rustyhalberd_p" +msgstr "Rostige Hellebarden" + +msgid "section_magic" +msgstr "Magie und Artefakte" + +msgctxt "race" +msgid "ghost_x" +msgstr "Geister" + +msgctxt "race" +msgid "vampunicorn_x" +msgstr "Nachteinhorn" + +msgid "h2_p" +msgstr "Eulenaugen" + +msgctxt "race" +msgid "halfling" +msgstr "Halbling" + +msgctxt "race" +msgid "eagle" +msgstr "Adler" + +msgid "shield" +msgstr "Schild" + +msgctxt "spellinfo" +msgid "calm_riot" +msgstr " Mit Hilfe dieses magischen Gesangs kann der Magier eine Region in Aufruhr wieder beruhigen. Die Bauernhorden werden sich verlaufen und wieder auf ihre Felder zurückkehren. " + +msgctxt "race" +msgid "stonegolem" +msgstr "Steingolem" + +msgid "ointment" +msgstr "Wundsalbe" + +msgid "h5_p" +msgstr "Elfenlieb" + +msgid "describe_braineater" +msgstr "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." + +msgid "maelstrom" +msgstr "Mahlstrom" + +msgctxt "race" +msgid "skeleton_d" +msgstr "Skeletten" + +msgid "xmastree" +msgstr "Weihnachtsbaum" + +msgid "h8_p" +msgstr "Blasenmorcheln" + +msgctxt "iteminfo" +msgid "xmastree" +msgstr "Dieser wunderschoen geschmueckte Baum entfaltet in den Wintermonaten eine magische Wirkung auf den ganzen Wald." + +msgid "h10" +msgstr "Kakteenschwitz" + +msgctxt "keyword" +msgid "besiege" +msgstr "BELAGERE" + +msgid "h11" +msgstr "Sandfäule" + +msgid "h12" +msgstr "Windbeutel" + +msgctxt "spell" +msgid "healing" +msgstr "Heilung" + +msgid "h13" +msgstr "Fjordwuchs" + +msgid "trireme_a" +msgstr "eine Trireme" + +msgctxt "prefix" +msgid "Dunkel" +msgstr "Dunkel" + +msgid "h14" +msgstr "Alraune" + +msgid "tower" +msgstr "Turm" + +msgid "smod_ship" +msgstr "Schiffszauber" + +msgid "h15" +msgstr "Steinbeißer" + +msgctxt "race" +msgid "skeleton_p" +msgstr "Skelette" + +msgid "h16" +msgstr "Spaltwachs" + +msgid "h17" +msgstr "Höhlenglimm" + +msgid "h18" +msgstr "Eisblume" + +msgid "MATERIALPOOL" +msgstr "MATERIALPOOL" + +msgid "h19" +msgstr "Weißer Wüterich" + +msgctxt "race" +msgid "skeleton_x" +msgstr "Skelett" + +msgctxt "prefix" +msgid "Blut" +msgstr "Blut" + +msgid "nr_guarding_prefix" +msgstr "Die Region wird von " + +msgctxt "race" +msgid "giantturtle" +msgstr "Riesenschildkröte" + +msgid "magicherbbag" +msgstr "Magischer Kräuterbeutel" + +msgid "undead_postfix_0" +msgstr "der Nacht" + +msgctxt "spellpar" +msgid "direction" +msgstr "Richtung" + +msgid "rustychainmail_p" +msgstr "Rostige Kettenhemden" + +msgid "halflingspoil" +msgstr "Halblingfuß" + +msgid "undead_postfix_1" +msgstr "der Schatten" + +msgid "ALLES" +msgstr "ALLES" + +msgid "undead_postfix_2" +msgstr "der Finsternis" + +msgid "undead_postfix_3" +msgstr "des Bösen" + +msgid "undead_postfix_4" +msgstr "der Erschlagenen" + +msgctxt "race" +msgid "songdragon_d" +msgstr "Singdrachen" + +msgid "undead_postfix_5" +msgstr "der Verfluchten" + +msgctxt "describe" +msgid "p0" +msgstr "Für den Siebenmeilentee koche man einen Blauen Baumringel auf und gieße dieses Gebräu in einen Windbeutel. Das heraustropfende Wasser fange man auf, filtere es und verabreiche es alsdann. Durch diesen Tee können bis zu zehn Menschen schnell wie ein Pferd laufen." + +msgid "undead_postfix_6" +msgstr "der Gefolterten" + +msgid "nr_damaged" +msgstr "beschädigt" + +msgid "undead_postfix_7" +msgstr "der Ruhelosen" + +msgid "aots" +msgstr "Amulett des wahren Sehens" + +msgid "undead_postfix_8" +msgstr "aus dem Nebel" + +msgctxt "spellinfo" +msgid "analyze_magic" +msgstr "Mit diesem Spruch kann der Magier versuchen, die Verzauberungen eines einzelnen angegebenen Objekts zu erkennen. Von allen Sprüchen, die seine eigenen Fähigkeiten nicht überschreiten, wird er einen Eindruck ihres Wirkens erhalten können. Bei stärkeren Sprüchen benötigt er ein wenig Glück für eine gelungene Analyse." + +msgctxt "spell" +msgid "rustweapon" +msgstr "Rostregen" + +msgctxt "describe" +msgid "p3" +msgstr "Man lasse einen Würzigen Wagemut drei Stunden lang in einem Liter Wasser köcheln. Dann gebe man eine geriebene Alraune dazu und bestreue das ganze mit bei Vollmond geerntetem Spaltwachs. Nun lasse man den Sud drei Tage an einem dunklen und warmen Ort ziehen und seie dann die Flüssigkeit ab. Dieser Schaffenstrunk erhöht die Kraft und Ausdauer von zehn Männern, so dass sie doppelt soviel schaffen können wie sonst." + +msgid "undead_postfix_9" +msgstr "aus dem Dunkel" + +msgctxt "spell" +msgid "drought" +msgstr "Beschwörung eines Hitzeelementar" + +msgctxt "describe" +msgid "p6" +msgstr "Für das Gehirnschmalz verrühre man den Saft eines Wasserfinders mit recht viel geriebenem Windbeutel und ein wenig Gurgelkraut. Dies lasse man kurz aufwallen. Wenn die Flüssigkeit nur noch handwarm ist, gebe man etwas Steinbeißer dazu. Das ganze muß genau siebenmal rechtsherum und siebenmal linksherum mit einem großen Löffel gerührt werden. Wenn keine Bewegung mehr zu erkennen ist, fülle man den Saft ab. Der Saft gibt mit einer Chance von 1/3 bis zu zehn Personen einen zusätzlichen Lernversuch." + +msgid "pegasus_p" +msgstr "Pegasi" + +msgctxt "describe" +msgid "p7" +msgstr "Das Dumpfbackenbrot ist eine sehr gemeine Sache, macht es doch jeden Lernerfolg zunichte oder läßt einen gar Dinge vergessen! Für zehn Portionen verknete man einen geriebenen Fjordwuchs, einen zerstoßenes Eulenauge und einen kleingeschnittenen Grünen Spinnerich zu einem geschmeidigen Teig. Diesen backe man eine Stunde lang bei guter Hitze und bestreiche das Ergebnis mit etwas Höhlenglimm. Wer dieses Brot gegessen hat, kann eine Woche lang nichts lernen, und so er nichts zu lernen versucht, wird er gar eine Woche seiner besten Fähigkeit vergessen." + +msgctxt "spell" +msgid "resist_magic" +msgstr "Schutzzauber" + +msgctxt "describe" +msgid "p9" +msgstr "Für das Pferdeglück zerhacke man einen Kakteenschwitz, einen blauen Baumringel und etwas knotigen Saugwurz und koche das ganze mit einem Eimer Wasser auf. Dann füge man etwas Sandfäule dazu und lasse diesen Sud drei Tage lang ziehen. Letztlich gebe man es den Pferden zu trinken, auf dass sie sich doppelt so schnell vermehren." + +msgid "h20" +msgstr "Schneekristall" + +msgctxt "race" +msgid "songdragon_p" +msgstr "Singdrachen" + +msgid "REGION" +msgstr "REGION" + +msgid "sapling_p" +msgstr "Schößlinge" + +msgid "STUFE" +msgstr "STUFE" + +msgid "kick" +msgstr "AUSSTOSSEN" + +msgctxt "spell" +msgid "frighten" +msgstr "Gesang der Angst" + +msgctxt "keyword" +msgid "recruit" +msgstr "REKRUTIERE" + +msgctxt "race" +msgid "songdragon_x" +msgstr "Singdrachen" + +msgctxt "border" +msgid "illusionwall" +msgstr "Illusionswand" + +msgctxt "spellinfo" +msgid "summonshadowlords" +msgstr "Mit Hilfe dunkler Rituale beschwört der Zauberer Dämonen aus der Sphäre der Schatten. Diese gefürchteten Wesen können sich fast unsichtbar unter den Lebenden bewegen, ihre finstere Aura ist jedoch für jeden spürbar. Im Kampf sind Schattenmeister gefürchtete Gegner. Sie sind schwer zu treffen und entziehen ihrem Gegner Kraft und Leben." + +msgid "nr_herbsrequired" +msgstr "Benötigte Kräuter" + +msgid "mallornlance" +msgstr "Mallornlanze" + +msgctxt "race" +msgid "juju" +msgstr "Juju-Zombie" + +msgctxt "spellinfo" +msgid "resist_magic" +msgstr "Dieser Zauber verstärkt die natürliche Widerstandskraft gegen Magie. Eine so geschützte Einheit ist auch gegen Kampfmagie weniger empfindlich. Pro Stufe reicht die Kraft des Magiers aus, um 5 Personen zu schützen." + +msgctxt "keyword" +msgid "steal" +msgstr "BEKLAUE" + +msgid "ADRESSEN" +msgstr "ADRESSEN" + +msgctxt "race" +msgid "apepsnake_d" +msgstr "Apepschlangen" + +msgid "section_production" +msgstr "Rohstoffe und Produktion" + +msgid "adamantiumaxe_p" +msgstr "Adamantiumäxte" + +msgid "COMPUTER" +msgstr "COMPUTER" + +msgctxt "spell" +msgid "chaossuction" +msgstr "Chaossog" + +msgctxt "race" +msgid "apepsnake_p" +msgstr "Apepschlangen" + +msgid "skeleton_name_0" +msgstr "Skelette" + +msgctxt "race" +msgid "imp_d" +msgstr "Teufelchen" + +msgid "PARTEITARNUNG" +msgstr "PARTEITARNUNG" + +msgid "skeleton_name_1" +msgstr "Kreaturen" + +msgctxt "school" +msgid "tybied" +msgstr "Tybied" + +msgid "skeleton_name_2" +msgstr "Krieger" + +msgid "skeleton_name_3" +msgstr "Kämpfer" + +msgid "skeleton_name_4" +msgstr "Rächer" + +msgctxt "race" +msgid "apepsnake_x" +msgstr "Apepschlange" + +msgctxt "iteminfo" +msgid "aots" +msgstr "Das Amulett erlaubt es dem Träger, alle Einheiten, die durch einen Ring der Unsichtbarkeit geschützt sind, zu sehen. Einheiten allerdings, die sich mit ihrem Tarnungs-Talent verstecken, bleiben weiterhin unentdeckt. Die Herstellung des Amulettes kostet 3000 Silber." + +msgctxt "keyword" +msgid "name" +msgstr "BENENNE" + +msgid "KOMMANDO" +msgstr "KOMMANDO" + +msgid "glacier_trail" +msgstr "der Gletscher von %s" + +msgctxt "spellinfo" +msgid "chaossuction" +msgstr "Durch das Opfern von 200 Bauern kann der Chaosmagier ein Tor zur astralen Welt öffnen. Das Tor kann in der Folgewoche verwendet werden, es löst sich am Ende der Folgewoche auf." + +msgctxt "spell" +msgid "create_focus" +msgstr "Erschaffe einen Aurafocus" + +msgctxt "race" +msgid "imp_p" +msgstr "Teufelchen" + +msgid "nr_combatspells" +msgstr "Kampfzauber" + +msgctxt "race" +msgid "owl" +msgstr "Eule" + +msgctxt "spellinfo" +msgid "holyground" +msgstr "Dieses Ritual beschwört verschiedene Naturgeister in den Boden der Region, welche diese fortan bewachen. In einer so gesegneten Region werden niemals wieder die Toten ihre Gräber verlassen, und anderswo entstandene Untote werden sie wann immer möglich meiden." + +msgid "zombie_prefix_10" +msgstr "Furchtbare" + +msgid "zombie_prefix_11" +msgstr "Entsetzliche" + +msgctxt "race" +msgid "imp_x" +msgstr "Teufelchen-" + +msgid "zombie_prefix_12" +msgstr "Schauderhafte" + +msgid "zombie_prefix_13" +msgstr "Schreckliche" + +msgid "zombie_prefix_14" +msgstr "Düstere" + +msgid "manacrystal" +msgstr "Astralkristall" + +msgid "silk" +msgstr "Seide" + +msgid "zombie_prefix_15" +msgstr "Schaurige" + +msgid "vial" +msgstr "Phiole" + +msgctxt "race" +msgid "unicorn" +msgstr "Einhorn" + +msgid "magicstorm" +msgstr "Magischer Sturm" + +msgctxt "spellinfo" +msgid "create_focus" +msgstr "Erzeugt einen Aurafokus." + +msgctxt "spellinfo" +msgid "earn_silver#draig" +msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll, niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 50 Silber pro Stufe ein." + +msgctxt "spell" +msgid "song_of_slavery" +msgstr "Gesang der Versklavung" + +msgctxt "spellinfo" +msgid "song_of_confusion" +msgstr "Aus den uralten Gesängen der Katzen entstammt dieses magisches Lied, welches vor einem Kampfe eingesetzt, einem entscheidende strategische Vorteile bringen kann. Wer unter den Einfluss dieses Gesangs gelangt, der wird seiner Umgebung nicht achtend der Melodie folgen, sein Geist wird verwirrt und sprunghaft plötzlichen Eingebungen nachgeben. So sollen schon einst wohlgeordnete Heere plötzlich ihre Schützen weit vorne und ihre Kavallerie bei den Lagerwachen kartenspielend wiedergefunden haben (oder ihren Anführer schlafend im lange verlassenen Lager, wie es in den Großen Kriegen der Alten Welt wirklich geschehen sein soll)." + +msgctxt "border" +msgid "gate_locked" +msgstr "gewaltiges verschlossenes Tor" + +msgid "rustyaxe_p" +msgstr "Rostige Kriegsäxte" + +msgctxt "border" +msgid "an_incomplete_road" +msgstr "eine unvollständige Straße" + +msgctxt "spellinfo" +msgid "plague" +msgstr "In einem aufwendigen Ritual opfert der Schwarzmagier einige Bauern und verteilt dann die Leichen auf magische Weise in den Brunnen der Region." + +msgid "jadee_dress_p" +msgstr "Hochzeitskleider" + +msgctxt "spell" +msgid "magicstreet" +msgstr "Magischer Pfad" + +msgid "crossbow_p" +msgstr "Armbrüste" + +msgctxt "spell" +msgid "steal_aura" +msgstr "Stehle Aura" + +msgid "horse_p" +msgstr "Pferde" + +msgid "mallornbow_p" +msgstr "Mallornbögen" + +msgid "aquarianspoil" +msgstr "Meermenschschuppe" + +msgid "mistletoe_p" +msgstr "Mistelzweige" + +msgctxt "spell" +msgid "wyrm_transformation" +msgstr "Wyrmtransformation" + +msgid "sptype_combat" +msgstr "Kampfzauber" + +msgid "laensword_p" +msgstr "Laenschwerter" + +msgctxt "spell" +msgid "gwyrrdfumbleshield" +msgstr "Astralschutzgeister" + +msgctxt "spell" +msgid "wdwpyramid_tybied" +msgstr "Göttliches Netz" + +msgctxt "spell" +msgid "create_antimagic" +msgstr "Erschaffe Antimagiekristall" + +msgid "presspass" +msgstr "Akkredition des Xontormia-Expreß" + +msgctxt "race" +msgid "special_d" +msgstr "Spezial" + +msgctxt "iteminfo" +msgid "catapultammo" +msgstr "Munition für Katapulte." + +msgctxt "prefix" +msgid "Nebel" +msgstr "Nebel" + +msgctxt "race" +msgid "tiger_d" +msgstr "Tigern" + +msgid "dragonhoard" +msgstr "Drachenhort" + +msgctxt "iteminfo" +msgid "eyeofdragon" +msgstr "So wisse denn, dass das Auge des Drachen den Weg zur Herausforderung aufzeigt. Doch die Überlieferung sagt, das nur der Unschuldige und Ungewappnete es benutzen kann. Sie sagt auch, daß er einen Beutel mit einem Betrag von bis zu zweitausend Silber mit sich führen soll, jedoch nicht mehr als einem Fünftel der Stärke seines Volkes entsprechend - dem Torwächter zum Geschenke als Beweis seiner asketischen Gesinnung. Die 5 scheidet ganz aus." + +msgid "b_defense" +msgstr "Verteidigung" + +msgid "fortress" +msgstr "Festung" + +msgid "runesword" +msgstr "Runenschwert" + +msgid "hall1" +msgstr "Halle" + +msgid "PARTEI" +msgstr "PARTEI" + +msgctxt "race" +msgid "special_p" +msgstr "Spezial" + +msgid "par_building" +msgstr "Gebäude-Nr" + +msgid "skeleton_postfix_10" +msgstr "der Tiefe" + +msgctxt "race" +msgid "tiger_p" +msgstr "Tiger" + +msgid "skeleton_postfix_11" +msgstr "in Ketten" + +msgid "skeleton_postfix_12" +msgstr "aus dem Totenreich" + +msgid "skeleton_postfix_13" +msgstr "aus der Unterwelt" + +msgid "nr_addresses" +msgstr "Liste aller Adressen" + +msgctxt "spellpar" +msgid "race" +msgstr "Rasse" + +msgctxt "spell" +msgid "calm_riot" +msgstr "Aufruhr beschwichtigen" + +msgctxt "race" +msgid "special_x" +msgstr "Spezial" + +msgctxt "keyword" +msgid "//" +msgstr "//" + +msgid "flyingcarpet" +msgstr "fliegender Teppich" + +msgctxt "race" +msgid "tiger_x" +msgstr "Tiger" + +msgctxt "prefix" +msgid "Hoch" +msgstr "Hoch" + +msgid "hell_trail" +msgstr "eine %s" + +msgctxt "calendar" +msgid "secondweek_d" +msgstr "der zweiten Woche" + +msgid "fortification" +msgstr "Befestigung" + +msgctxt "keyword" +msgid "enter" +msgstr "BETRETE" + +msgctxt "spellinfo" +msgid "airship" +msgstr "Diese magischen Runen bringen ein Boot bis zu einer Kapazität von 50 Gewichtseinheiten für eine Woche zum Fliegen. Dies ermöglicht dem Boot die Überquerung von Land. Für die Farbe der Runen muss eine spezielle Tinte aus einem Windbeutel und einem Schneekristall angerührt werden." + +msgid "ERESSEA" +msgstr "ERESSEA" + +msgid "bagpipeoffear_p" +msgstr "Dudelsäcke der Furcht" + +msgctxt "spell" +msgid "astral_disruption" +msgstr "Störe Astrale Integrität" + +msgid "herbbag" +msgstr "Kräuterbeutel" + +msgid "cart" +msgstr "Wagen" + +msgid "iceberg_trail" +msgstr "der Eisberg von %s" + +msgctxt "keyword" +msgid "work" +msgstr "ARBEITE" + +msgid "manacrystal_p" +msgstr "Astralkristalle" + +msgid "silk_p" +msgstr "Seide" + +msgid "fog_trail" +msgstr "ein %s" + +msgctxt "spell" +msgid "show_astral" +msgstr "Astraler Blick" + +msgctxt "iteminfo" +msgid "skillpotion" +msgstr " Die Herstellung dieses Trunkes ist ein wohlgehütetes Geheimnis. Manche behaupten gar, von Sterblichen könne er gar nicht gebraut werden. Tatsache ist, dass er dem Trinkenden tiefere Einsicht in seine erlernten Talente gewährt, was ihn in der Meisterung dieser Talente voranbringt. " + +msgctxt "keyword" +msgid "cast" +msgstr "ZAUBERE" + +msgctxt "damage" +msgid "wounded" +msgstr "verwundet" + +msgid "par_ship" +msgstr "Schiff-Nr" + +msgctxt "race" +msgid "dwarf" +msgstr "Zwerg" + +msgctxt "spellinfo" +msgid "irongolem" +msgstr "Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden. Jeder Golem hat jede Runde eine Chance von 15 Prozent zu Staub zu zerfallen. Gibt man den Golems den Befehl MACHE SCHWERT/BIHÄNDER oder MACHE SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 4 Eisenbarren verbaut und der Golem löst sich auf. " + +msgctxt "race" +msgid "ghoul_d" +msgstr "Ghoulen" + +msgid "santa2004" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei ein Sonnensegel. (Um das Segel einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 Sonnensegel')." + +msgid "cookie_p" +msgstr "Kekse" + +msgid "santa2005" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei eine Phiole mit Sternenstaub. (Informationen dazu gibt es mit BEANSPRUCHE und ZEIGE)." + +msgid "santa2006" +msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei einen wundervoll geschmueckten Weihnachtsbaum. (Informationen dazu gibt es mit BEANSPRUCHE und ZEIGE)." + +msgctxt "race" +msgid "ghoul_p" +msgstr "Ghoule" + +msgid "volcano_trail" +msgstr "der Vulkan von %s" + +msgid "smod_none" +msgstr "Keine" + +msgid "moneybag" +msgstr "Silberbeutel" + +msgctxt "spell" +msgid "create_dreameye" +msgstr "Erschaffe ein Traumauge" + +msgctxt "keyword" +msgid "destroy" +msgstr "ZERSTÖRE" + +msgid "nr_trade_intro" +msgstr "Geboten wird für" + +msgid "unknown_unit_dative" +msgstr "einer unbekannten Einheit" + +msgctxt "prefix" +msgid "Schatten" +msgstr "Schatten" + +msgctxt "skill" +msgid "stamina" +msgstr "Ausdauer" + +msgctxt "prefix" +msgid "Hoehlen" +msgstr "Höhlen" + +msgctxt "race" +msgid "ghoul_x" +msgstr "Ghoul" + +msgctxt "spell" +msgid "airship" +msgstr "Luftschiff" + +msgid "sphereofinv" +msgstr "Sphäre der Unsichtbarkeit" + +msgctxt "spell" +msgid "plague" +msgstr "Fluch der Pestilenz" + +msgid "section_battle" +msgstr "Kämpfe" + +msgctxt "skill" +msgid "entertainment" +msgstr "Unterhaltung" + +msgctxt "border" +msgid "a_road_connection" +msgstr "ein Straßenanschluß" + +msgctxt "spellinfo" +msgid "courting" +msgstr "Aus 'Die Gesänge der Alten' von Firudin dem Weisen: 'Diese verführerische kleine Melodie und einige einschmeichelnde Worte überwinden das Misstrauen der Bauern im Nu. Begeistert werden sie sich Euch anschliessen und selbst Haus und Hof in Stich lassen.'" + +msgid "healing_p" +msgstr "Heiltränke" + +msgctxt "spell" +msgid "fireball" +msgstr "Feuerball" + +msgid "nr_trade_next" +msgstr ", für" + +msgctxt "race" +msgid "gnome" +msgstr "Gnom" + +msgctxt "iteminfo" +msgid "snowman" +msgstr "Rübennase, schwarzer Hut, kaltes Herz. Ein Schneemann. Er gibt einen prima Wachmann ab, wenn er in einem Gletscher belebt wird (BENUTZE 1 Schneemann)." + +msgctxt "iteminfo" +msgid "runesword" +msgstr "Die rötlich glühende Klinge dieser furchterregenden magischen Waffe ist mit dunklen Runen bedeckt. Nur die erfahrendsten Schwertkämpfer vermögen ihre Kraft zu zähmen, doch in ihrer Hand vermag dem Runenschwert nichts zu widerstehen - selbst magische Rüstungen durchdringt es ohne Schwierigkeiten - und den Geist des Kämpfers füllt es mit unterschütterlicher Zuversicht." + +msgctxt "spell" +msgid "stonegolem" +msgstr "Erschaffe Steingolems" + +msgctxt "race" +msgid "skeletonlord_d" +msgstr "Skelettherren" + +msgid "rustyaxe" +msgstr "Rostige Kriegsaxt" + +msgid "mallornsapling" +msgstr "Mallornschößling" + +msgctxt "spellinfo" +msgid "song_of_peace" +msgstr " Dieser mächtige Bann verhindert jegliche Attacken. Niemand in der ganzen Region ist fähig seine Waffe gegen irgendjemanden zu erheben. Die Wirkung kann etliche Wochen andauern. " + +msgctxt "spell" +msgid "nocostbuilding" +msgstr "Mauern der Ewigkeit" + +msgctxt "race" +msgid "skeletonlord_p" +msgstr "Skelettherren" + +msgid "permaura_p" +msgstr "permanente Aura" + +msgctxt "spellpar" +msgid "buildingtype" +msgstr "Gebäudetyp" + +msgid "coal" +msgstr "Kohlenstück" + +msgctxt "spellinfo" +msgid "create_roi" +msgstr "Mit diesem Spruch kann der Zauberer einen Ring der Unsichtbarkeit erschaffen. Der Träger des Ringes wird für alle Einheiten anderer Parteien unsichtbar, egal wie gut ihre Wahrnehmung auch sein mag. In einer unsichtbaren Einheit muss jede Person einen Ring tragen." + +msgctxt "spell" +msgid "sparkledream" +msgstr "Traumsenden" + +msgctxt "race" +msgid "skeletonlord_x" +msgstr "Skelettherren" + +msgctxt "race" +msgid "insect" +msgstr "Insekt" + +msgid "bagpipeoffear" +msgstr "Dudelsack der Furcht" + +msgctxt "spellinfo" +msgid "create_rop" +msgstr "Dieses mächtige Ritual erschafft einen Ring der Macht. Ein Ring der Macht erhöht die Stärke jedes Zaubers, den sein Träger zaubert, als wäre der Magier eine Stufe besser." + +msgid "papyrus" +msgstr "Papyrus" + +msgctxt "spellinfo" +msgid "create_ror" +msgstr "Erzeugt einen Ring der Regeneration." + +msgctxt "spell" +msgid "blessedharvest" +msgstr "Segen der Erde" + +msgid "stat_equipment" +msgstr "Kann Waffen benutzen." + +msgctxt "border" +msgid "a_firewall" +msgstr "eine Feuerwand" + +msgid "Herbst" +msgstr "Herbst" + +msgctxt "spell" +msgid "enterastral" +msgstr "Astraler Weg" + +msgctxt "spellinfo" +msgid "sparkledream" +msgstr "Der Zauberer sendet dem Ziel des Spruches einen Traum." + +msgctxt "border" +msgid "a_gate_open" +msgstr "ein gewaltiges offenes Tor" + +msgctxt "spell" +msgid "transferaurachaos" +msgstr "Machtübertragung" + +msgid "bow" +msgstr "Bogen" + +msgid "UM" +msgstr "UM" + +msgctxt "prefix" +msgid "Huegel" +msgstr "Hügel" + +msgctxt "spellinfo" +msgid "blessstonecircle" +msgstr "Dieses Ritual segnet einen Steinkreis, der zuvor aus Steinen und etwas Holz gebaut werden muss. Die Segnung des Druiden macht aus dem Kreis eine mächtige Stätte magischen Wirkens, die Schutz vor Magie und erhöhte Aura- Regeneration bewirkt. Man sagt, Jungfrauen seien in der Umgebung von Steinkreisen seltsame Wesen begegnet." + +msgctxt "race" +msgid "elf_d" +msgstr "Elfen" + +msgid "incense" +msgstr "Weihrauch" + +msgctxt "spellinfo" +msgid "gwyrrddestroymagic" +msgstr "Wie die alten Lehren der Druiden berichten, besteht das, was die normalen Wesen Magie nennen, aus Elementargeistern. Der Magier beschwört und bannt diese in eine Form, um den gewünschten Effekt zu erzielen. Dieses Ritual nun vermag es, in diese Welt gerufene Elementargeister zu vertreiben, um so ein Objekt von Magie zu befreien." + +msgctxt "spell" +msgid "shipspeedup" +msgstr "Beschleunigung" + +msgctxt "spellinfo" +msgid "clone" +msgstr " Dieser mächtige Zauber kann einen Magier vor dem sicheren Tod bewahren. Der Magier erschafft anhand einer kleinen Blutprobe einen Klon von sich, und legt diesen in ein Bad aus Drachenblut und verdünntem Wasser des Lebens. Anschließend transferiert er in einem aufwändigen Ritual einen Teil seiner Seele in den Klon. Stirbt der Magier, reist seine Seele in den Klon und der erschaffene Körper dient nun dem Magier als neues Gefäß. Es besteht allerdings eine geringe Wahrscheinlichkeit, dass die Seele nach dem Tod zu schwach ist, das neue Gefäß zu erreichen. " + +msgctxt "race" +msgid "elf_p" +msgstr "Elfen" + +msgid "elvenhorse_p" +msgstr "Elfenpferde" + +msgctxt "spellinfo" +msgid "frighten" +msgstr " Dieser Kriegsgesang sät Panik in der Front der Gegner und schwächt so ihre Kampfkraft erheblich. Angst wird ihren Schwertarm schwächen und Furcht ihren Schildarm lähmen. " + +msgctxt "keyword" +msgid "ride" +msgstr "FAHRE" + +msgctxt "spell" +msgid "stormwinds" +msgstr "Beschwöre einen Sturmelementar" + +msgctxt "race" +msgid "elf" +msgstr "Elf" + +msgid "museumticket_p" +msgstr "Eintrittskarten des Großen Museum" + +msgctxt "race" +msgid "elf_x" +msgstr "Elfen" + +msgctxt "keyword" +msgid "sort" +msgstr "SORTIERE" + +msgctxt "spellinfo" +msgid "draigdestroymagic" +msgstr "Genau um Mitternacht, wenn die Kräfte der Finsternis am größten sind, kann auch ein Schwarzmagier seine Kräfte nutzen um Verzauberungen aufzuheben. Dazu zeichnet er ein Pentagramm in das verzauberte Objekt und beginnt mit einer Anrufung der Herren der Finsternis. Die Herren werden ihm beistehen, doch ob es ihm gelingt, den Zauber zu lösen, hängt allein von seiner eigenen Kraft ab." + +msgctxt "race" +msgid "shadowknight" +msgstr "Schattenritter" + +msgid "unknown_faction" +msgstr "Unbekannte Partei" + +msgctxt "spellinfo" +msgid "wyrm_transformation" +msgstr " Mit Hilfe dieses Zaubers kann sich der Magier permanent in einen mächtigen Wyrm verwandeln. Der Magier behält seine Talente und Möglichkeiten, bekommt jedoch die Kampf- und Bewegungseigenschaften eines Wyrms. Der Odem des Wyrms wird sich mit steigendem Magie-Talent verbessern. Der Zauber ist sehr kraftraubend und der Wyrm wird einige Zeit brauchen, um sich zu erholen. " + +msgid "questkey2_p" +msgstr "Saphirne Schlüssel" + +msgid "money" +msgstr "Silber" + +msgctxt "spell" +msgid "chaosrow" +msgstr "Wahnsinn des Krieges" + +msgctxt "race" +msgid "kraken" +msgstr "Krake" + +msgctxt "race" +msgid "shadowbat" +msgstr "Todesflatter" + +msgid "group_help" +msgstr "hilft" + +msgctxt "spell" +msgid "analyse_object" +msgstr "Lied des Ortes analysieren" + +msgid "nr_borderlist_lastfix" +msgstr " und im " + +msgctxt "race" +msgid "shadowknight_d" +msgstr "Schattenrittern" + +msgid "chainmail" +msgstr "Kettenhemd" + +msgctxt "race" +msgid "illusion_d" +msgstr "Illusions" + +msgid "angry_mob" +msgstr "Bauernmob" + +msgctxt "race" +msgid "toad" +msgstr "Kröte" + +msgid "command" +msgstr "KOMMANDO" + +msgid "xmas_exit" +msgstr "Pforte" + +msgctxt "spellinfo" +msgid "heroic_song" +msgstr "Dieser alte Schlachtengesang hebt die Moral der eigenen Truppen und und hilft ihnen auch der angsteinflößenden Aura dämonischer und untoter Wesen zu widerstehen. Ein derartig gefestigter Krieger wird auch in schwierigen Situationen nicht die Flucht ergreifen und sein überlegtes Verhalten wird ihm manch Vorteil in der Verteidigung geben." + +msgctxt "race" +msgid "shadowknight_p" +msgstr "Schattenritter" + +msgid "firewall_trail" +msgstr "eine %s" + +msgid "iceberg_sleep" +msgstr "Gletscher" + +msgid "speedsail" +msgstr "Sonnensegel" + +msgctxt "spellinfo" +msgid "forestfire" +msgstr "Diese Elementarbeschwörung ruft einen Feuerteufel herbei, ein Wesen aus den tiefsten Niederungen der Flammenhöllen. Der Feuerteufel wird sich begierig auf die Wälder der Region stürzen und sie in Flammen setzen." + +msgctxt "race" +msgid "illusion_p" +msgstr "Illusionen" + +msgctxt "spell" +msgid "versteinern" +msgstr "Blick des Basilisken" + +msgctxt "race" +msgid "shadowknight_x" +msgstr "Schattenritter" + +msgid "magicstorm_trail" +msgstr "ein %s" + +msgid "portal" +msgstr "Portal" + +msgctxt "spell" +msgid "magicrunes" +msgstr "Runen des Schutzes" + +msgctxt "spell" +msgid "stormwind" +msgstr "Sturmelementar" + +msgctxt "spell" +msgid "irongolem" +msgstr "Erschaffe Eisengolems" + +msgctxt "race" +msgid "illusion_x" +msgstr "Illusions" + +msgctxt "keyword" +msgid "number" +msgstr "NUMMER" + +msgid "DEFENSIV" +msgstr "DEFENSIV" + +msgid "swamp" +msgstr "Sumpf" + +msgid "firedragon" +msgstr "Feuerdrache" + +msgctxt "race" +msgid "kraken_d" +msgstr "Kraken" + +msgid "money_p" +msgstr "Silber" + +msgid "jadee_ring_p" +msgstr "Jadees Hochzeitsringe" + +msgctxt "race" +msgid "apophis" +msgstr "Apophis" + +msgctxt "shipinfo" +msgid "no_info" +msgstr "Keine Informationen über diesen Schiffstyp verfügbar." + +msgid "p11_p" +msgstr "Bauernlieb" + +msgid "site" +msgstr "Grundmauern" + +msgid "missing_key" +msgstr "Fehler: Unbekannter Schlüssel" + +msgctxt "spell" +msgid "generous" +msgstr "Hohes Lied der Gaukelei" + +msgctxt "race" +msgid "kraken_p" +msgstr "Kraken" + +msgctxt "spellinfo" +msgid "sleep" +msgstr "Dieser Zauber läßt einige feindliche Kämpfer einschlafen. Schlafende Kämpfer greifen nicht an und verteidigen sich schlechter, sie wachen jedoch auf, sobald sie im Kampf getroffen werden. " + +msgctxt "spellinfo" +msgid "tiredsoldiers" +msgstr "Dieser Kampfzauber führt dazu, dass einige Gegner im Kampf unter schwerer Müdigkeit leiden. Die Soldaten verschlafen manchmal ihren Angriff und verteidigen sich schlechter." + +msgctxt "spell" +msgid "incite_riot" +msgstr "Aufruhr verursachen" + +msgid "p7_p" +msgstr "Dumpfbackenbrote" + +msgctxt "spell" +msgid "appeasement" +msgstr "Friedenslied" + +msgid "dwarfspoil" +msgstr "Zwergenbart" + +msgctxt "race" +msgid "dragon" +msgstr "Drache" + +msgctxt "race" +msgid "kraken_x" +msgstr "Kraken" + +msgctxt "keyword" +msgid "group" +msgstr "GRUPPE" + +msgid "artacademy" +msgstr "Akademie der Künste" + +msgid "antimagic" +msgstr "Antimagiekristall" + +msgctxt "spellinfo" +msgid "create_aots" +msgstr "Der Spruch ermöglicht es einem Magier, ein Amulett des Wahren Sehens zu erschaffen. Das Amulett erlaubt es dem Träger, alle Einheiten, die durch einen Ring der Unsichtbarkeit geschützt sind, zu sehen. Einheiten allerdings, die sich mit ihrem Tarnungs-Talent verstecken, bleiben weiterhin unentdeckt." + +msgid "mallornseed" +msgstr "Mallornsame" + +msgctxt "race" +msgid "ent" +msgstr "Ent" + +msgctxt "iteminfo" +msgid "dwarfspoil" +msgstr "Beim Barte des Proheten! Ach nein, Zwergen. Irgendetwas riecht hier ranzig." + +msgctxt "race" +msgid "clone" +msgstr "Klon" + +msgctxt "race" +msgid "vampunicorn" +msgstr "Nachteinhorn" + +msgid "wormhole" +msgstr "Wurmloch" + +msgctxt "spell" +msgid "pull_astral" +msgstr "Astraler Ruf" + +msgctxt "skill" +msgid "polearm" +msgstr "Stangenwaffen" + +msgid "unit_p" +msgstr "Einheiten" + +msgid "ALLIANZ" +msgstr "ALLIANZ" + +msgctxt "race" +msgid "eagle_d" +msgstr "Adlern" + +msgctxt "race" +msgid "toad_d" +msgstr "Kröten" + +msgid "XEBALLOON" +msgstr "XEBALLON" + +msgctxt "spell" +msgid "treewalkenter" +msgstr "Weg der Bäume" + +msgctxt "race" +msgid "cat_d" +msgstr "Katzen" + +msgid "toadslime" +msgstr "Tiegel mit Krötenschleim" + +msgctxt "race" +msgid "stonegolem_d" +msgstr "Steingolems" + +msgctxt "spellinfo" +msgid "melancholy" +msgstr " Mit diesem Gesang verbreitet der Barde eine melancholische, traurige Stimmung unter den Bauern. Einige Wochen lang werden sie sich in ihre Hütten zurückziehen und kein Silber in den Theatern und Tavernen lassen. " + +msgctxt "spell" +msgid "earn_silver#gwyrrd" +msgstr "Viehheilung" + +msgctxt "race" +msgid "eagle_p" +msgstr "Adler" + +msgctxt "race" +msgid "hellcat" +msgstr "Höllenkatze" + +msgid "shield_p" +msgstr "Schilde" + +msgctxt "border" +msgid "a_wall" +msgstr "eine Wand" + +msgctxt "race" +msgid "toad_p" +msgstr "Kröten" + +msgid "section_mail" +msgstr "Botschaften" + +msgctxt "race" +msgid "eagle_x" +msgstr "Adler" + +msgctxt "spell" +msgid "meteor_rain" +msgstr "Meteorregen" + +msgctxt "spell" +msgid "peacezone" +msgstr "Gesang der Friedfertigkeit" + +msgctxt "race" +msgid "cat_p" +msgstr "Katzen" + +msgid "sword_p" +msgstr "Schwerter" + +msgctxt "race" +msgid "stonegolem_p" +msgstr "Steingolems" + +msgid "spice" +msgstr "Gewürz" + +msgid "dragonhead" +msgstr "Drachenkopf" + +msgctxt "race" +msgid "toad_x" +msgstr "Kröten" + +msgid "ghoul_postfix_10" +msgstr "in Ketten" + +msgid "ghoul_postfix_11" +msgstr "aus dem Totenreich" + +msgid "ghoul_postfix_12" +msgstr "aus der Unterwelt" + +msgctxt "race" +msgid "cat_x" +msgstr "Katzen" + +msgctxt "race" +msgid "stonegolem_x" +msgstr "Steingolem" + +msgid "peasant_p" +msgstr "Bauern" + +msgid "b_damage" +msgstr "Schaden" + +msgctxt "raceinfo" +msgid "songdragon" +msgstr "Singdrachen sind von der Größe eines ausgewachsenden Tigers. Ihre Färbung reicht von schillerndem Rot, über dunkles Grün bis hin zu tiefem Schwarz. Alle bekannten Drachen dieser Art weisen eine hohe Intelligenz und ein hohes Maß an magischen Fähigkeiten auf. Wie Ihre großen Verwandten verfügen sie über einen Feuerodem. Sie lieben den Gesang und das üppige Mahl. Von Zeit zu Zeit gehen sie eine engen magisches Bund zu einem Magier ein. Wenn dies geschieht, so steht dem Magier ein äußerst loyaler und lohnender Vertrauter zur Seite. " + +msgid "axe_p" +msgstr "Kriegsäxte" + +msgid "ocean_trail" +msgstr "%s" + +msgid "status_avoid" +msgstr "kämpft nicht" + +msgctxt "keyword" +msgid "carry" +msgstr "TRANSPORTIERE" + +msgid "see_neighbour" +msgstr "benachbart" + +msgctxt "iteminfo" +msgid "dragonhead" +msgstr "Der Kopf eines toten Drachens oder Wyrms. Man sagt, es ruhen magische Kräfte darin." + +msgctxt "prefix" +msgid "Wild" +msgstr "Wild" + +msgid "dam" +msgstr "Damm" + +msgctxt "spellinfo" +msgid "create_trollbelt" +msgstr "Dieses magische Artefakt verleiht dem Träger die Stärke eines ausgewachsenen Höhlentrolls. Seine Tragkraft erhöht sich auf das 50fache und auch im Kampf werden sich die erhöhte Kraft und die trollisch zähe Haut positiv auswirken." + +msgctxt "spell" +msgid "holyground" +msgstr "Heiliger Boden" + +msgctxt "border" +msgid "a_gate_locked" +msgstr "ein gewaltiges verschlossenes Tor" + +msgctxt "race" +msgid "nymph_d" +msgstr "Nymphen" + +msgctxt "spell" +msgid "orcish" +msgstr "Unbekannter Effekt" + +msgid "section_newspells" +msgstr "Neue Zauber" + +msgid "nr_borderlist_prefix" +msgstr "Im " + +msgctxt "race" +msgid "greenscarab_d" +msgstr "grünen Scarabäen" + +msgctxt "iteminfo" +msgid "speedsail" +msgstr "Setzt eine Einheit dieses Segel auf einem Schiff, so erhöht sich dessen Reichweite permanent um 1 Region." + +msgctxt "race" +msgid "nymph_p" +msgstr "Nymphen" + +msgctxt "spell" +msgid "flee" +msgstr "Grauen der Schlacht" + +msgctxt "race" +msgid "greenscarab_p" +msgstr "grüne Scarabäen" + +msgid "studypotion_p" +msgstr "Lerntränke" + +msgctxt "race" +msgid "nymph_x" +msgstr "Nymphen" + +msgid "goblinspoil" +msgstr "Goblinkopf" + +msgid "stables" +msgstr "Pferdezucht" + +msgctxt "race" +msgid "lynx" +msgstr "Luchs" + +msgid "longboat_a" +msgstr "ein Langboot" + +msgctxt "race" +msgid "human_d" +msgstr "Menschen" + +msgctxt "race" +msgid "greenscarab_x" +msgstr "grünen Scarabäen" + +msgctxt "spellinfo" +msgid "unholypower" +msgstr "Nur geflüstert wird dieses Ritual an den dunklen Akademien an die Adepten weitergegeben, gehört es doch zu den finstersten, die je niedergeschrieben wurden. Durch die Anrufung unheiliger Dämonen wird die Kraft der lebenden Toten verstärkt und sie verwandeln sich in untote Monster großer Kraft." + +msgid "balm" +msgstr "Balsam" + +msgctxt "spellinfo" +msgid "transferauratraum" +msgstr "Mit Hilfe dieses Zaubers kann der Traumweber eigene Aura im Verhältnis 2:1 auf einen anderen Traumweber übertragen." + +msgctxt "school" +msgid "gray" +msgstr "Kein Magiegebiet" + +msgctxt "spell" +msgid "summonfireelemental" +msgstr "Beschwörung eines Hitzeelementar" + +msgid "seed" +msgstr "Same" + +msgid "nr_nb_next" +msgstr ", im " + +msgctxt "spellinfo" +msgid "undeadhero" +msgstr "Dieses Ritual bindet die bereits entfliehenden Seelen einiger Kampfopfer an ihren toten Körper, wodurch sie zu untoten Leben wiedererweckt werden. Ob sie ehemals auf der Seite des Feindes oder der eigenen kämpften, ist für das Ritual ohne belang." + +msgctxt "spell" +msgid "create_roqf" +msgstr "Miriams flinke Finger" + +msgctxt "race" +msgid "human_p" +msgstr "Menschen" + +msgctxt "raceinfo" +msgid "direwolf" +msgstr "Diese großen Wölfe sind nicht alle so wild und böse wie in den Legenden berichtet, und einige von ihnen schließen sich auch guten Magiern bereitwillig an und sind ihnen dann treue Gefährten." + +msgid "peasantblood_p" +msgstr "Bauernblut" + +msgid "highland_trail" +msgstr "das Hochland von %s" + +msgid "caldera" +msgstr "Krater" + +msgid "h11_p" +msgstr "Sandfäulen" + +msgctxt "prefix" +msgid "Duester" +msgstr "Düster" + +msgctxt "race" +msgid "peasant_d" +msgstr "Bauern" + +msgid "ZEITUNG" +msgstr "ZEITUNG" + +msgctxt "race" +msgid "human_x" +msgstr "Menschen" + +msgctxt "race" +msgid "template" +msgstr "Schablone" + +msgctxt "spell" +msgid "earn_silver#cerddor" +msgstr "Gaukeleien" + +msgctxt "spellinfo" +msgid "fireball" +msgstr "Der Zauberer schleudert fokussiertes Chaos in die Reihen der Gegner. Das ballförmige Chaos wird jeden verwunden, den es trifft." + +msgctxt "spell" +msgid "summon_familiar" +msgstr "Vertrauten rufen" + +msgctxt "spellinfo" +msgid "combatrust" +msgstr "Mit diesem Ritual wird eine dunkle Gewitterfront beschworen, die sich unheilverkündend über der Region auftürmt. Der magische Regen wird alles Erz rosten lassen und so viele Waffen des Gegners zerstören." + +msgctxt "iteminfo" +msgid "antimagic" +msgstr "Für den ungeübten Betrachter mag der Antimagiekristall wie ein gewöhnlicher Quarzkristall ausschauen, doch ein Magier spürt, das ihm ganz besondere Kräfte innewohnen. Durch spezielle Rituale antimagisch aufgeladen wird der Kristall, wenn er zu feinem Staub zermahlen und verteilt wird, die beim Zaubern freigesetzten magischen Energien aufsaugen und die Kraft aller Zauber reduzieren, welche in der betreffenden Woche in der Region gezaubert werden." + +msgid "HINTEN" +msgstr "HINTEN" + +msgid "h14_p" +msgstr "Alraunen" + +msgctxt "spellinfo" +msgid "seduction" +msgstr " Mit diesem Lied kann eine Einheit derartig betört werden, so dass sie dem Barden den größten Teil ihres Bargelds und ihres Besitzes schenkt. Sie behält jedoch immer soviel, wie sie zum Überleben braucht. " + +msgctxt "race" +msgid "dwarf_d" +msgstr "Zwergen" + +msgctxt "race" +msgid "peasant_p" +msgstr "Bauern" + +msgid "HINTER" +msgstr "HINTER" + +msgctxt "spellpar" +msgid "aura" +msgstr "Aura" + +msgctxt "prefix" +msgid "Finster" +msgstr "Finster" + +msgctxt "spellinfo" +msgid "deathcloud" +msgstr "Mit einem düsteren Ritual und unter Opferung seines eigenen Blutes beschwört der Schwarzmagier einen großen Geist von der Elementarebene der Gifte. Der Geist manifestiert sich als giftgrüner Schwaden über der Region und wird allen, die mit ihm in Kontakt kommen, Schaden zufügen." + +msgid "anonymous" +msgstr "anonym" + +msgid "FLIEHE" +msgstr "FLIEHE" + +msgid "log_p" +msgstr "Holz" + +msgid "iceberg" +msgstr "Eisberg" + +msgctxt "race" +msgid "peasant_x" +msgstr "Bauern" + +msgid "h17_p" +msgstr "Höhlenglimme" + +msgid "nr_calendar_season" +msgstr "Wir schreiben %s des Monats %s im Jahre %d %s. Es ist %s." + +msgctxt "race" +msgid "dwarf_p" +msgstr "Zwerge" + +msgctxt "spell" +msgid "worse" +msgstr "Alp" + +msgid "nr_spell_modifiers" +msgstr "Modifikationen:" + +msgid "status_noaid" +msgstr "bekommt keine Hilfe" + +msgctxt "iteminfo" +msgid "toadslime" +msgstr "Dieser Tiegel enthält die seltenste alchemistische Substanz Eresseas, den Krötenschleim. Angeblich soll der Krötenschleim eine aussergewöhnlich hohe magische Absorbtionskraft besitzen und deswegen in obskuren magischen Ritualen Verwendung finden." + +msgctxt "race" +msgid "dwarf_x" +msgstr "Zwergen" + +msgctxt "spell" +msgid "blabbermouth" +msgstr "Plappermaul" + +msgctxt "spell" +msgid "blessstonecircle" +msgstr "Segne Steinkreis" + +msgctxt "iteminfo" +msgid "roi" +msgstr "Dieses magische Artefakt wurde seit Urzeiten von den Elfen benutzt, auf der Jagd oder um sich vor Feinden zu verbergen. Doch auch andere Rassen haben nach der Begegnung mit den Elfenvölkern den Wert des Rings schnell schätzen gelernt - schließlich macht er den Träger für jedes noch so scharfe Auge unsichtbar - nur mit magischen Mitteln ist der Verborgene noch zu entdecken." + +msgctxt "prefix" +msgid "Berg" +msgstr "Berg" + +msgid "highland" +msgstr "Hochland" + +msgctxt "iteminfo" +msgid "rop" +msgstr "Ein Ring der Macht verstärkt die Kraft des Magiers. Jeder Zauber wird, ohne das sich die Kosten erhöhen, so gezaubert als hätte der Magier eine Stufe mehr." + +msgid "enterpasswd" +msgstr "hier_passwort_eintragen" + +msgctxt "skill" +msgid "mining" +msgstr "Bergbau" + +msgid "studypotion" +msgstr "Lerntrank" + +msgctxt "keyword" +msgid "make" +msgstr "MACHE" + +msgctxt "border" +msgid "a_road_percent" +msgstr "eine zu $percent% vollendete Straße" + +msgctxt "spell" +msgid "sparklechaos" +msgstr "Verwünschung" + +msgid "KAEMPFE" +msgstr "KÄMPFE" + +msgctxt "spellinfo" +msgid "transferauradruide" +msgstr "Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes übertragen." + +msgctxt "spellinfo" +msgid "blabbermouth" +msgstr "Die verzauberte Einheit beginnt hemmungslos zu plappern und erzählt welche Talente sie kann, was für Gegenstände sie mit sich führt und sollte sie magisch begabt sein, sogar welche Zauber sie beherrscht. Leider beeinflußt dieser Zauber nicht das Gedächtnis, und so wird sie sich im nachhinein wohl bewußt werden, dass sie zuviel erzählt hat." + +msgid "nut" +msgstr "Nuß" + +msgid "halberd" +msgstr "Hellebarde" + +msgid "undead_name_10" +msgstr "Ghule" + +msgid "undead_name_11" +msgstr "Kopflose" + +msgid "undead_name_12" +msgstr "Irrlichter" + +msgid "temple" +msgstr "Tempel" + +msgctxt "spellinfo" +msgid "sacrifice_strength" +msgstr "Mit Hilfe dieses Zaubers kann der Magier einen Teil seiner magischen Kraft permanent auf einen anderen Magier übertragen. Auf einen Magier des selben Magiegebietes kann er die Hälfte der eingesetzten Kraft übertragen, auf andere Magier ein Drittel." + +msgctxt "spellinfo" +msgid "cold_protection" +msgstr "Dieser Zauber ermöglicht es dem Magier Insekten auf magische Weise vor der lähmenden Kälte der Gletscher zu bewahren. Sie können Gletscher betreten und dort normal agieren. Der Spruch wirkt auf Stufe*10 Insekten. Ein Ring der Macht erhöht die Menge der verzauberbaren Insekten zusätzlich um 10." + +msgid "nr_undercons" +msgstr "im Bau" + +msgctxt "spellinfo" +msgid "sparklechaos" +msgstr "Das Ziel des Zauberers wird von einer harmlosen Verwünschung heimgesucht." + +msgid "BURG" +msgstr "BURG" + +msgctxt "keyword" +msgid "route" +msgstr "ROUTE" + +msgctxt "spell" +msgid "tybiedfumbleshield" +msgstr "Schutz vor Magie" + +msgid "XELAEN" +msgstr "XELAEN" + +msgid "sawmill" +msgstr "Sägewerk" + +msgid "magicherbbag_p" +msgstr "Magische Kräuterbeutel" + +msgid "seaserpenthead" +msgstr "Seeschlangenkopf" + +msgctxt "spellinfo" +msgid "shapeshift" +msgstr "Mit Hilfe dieses arkanen Rituals vermag der Traumweber die wahre Gestalt einer Gruppe zu verschleiern. Unbedarften Beobachtern erscheint sie dann als einer anderen Rasse zugehörig." + +msgctxt "skill" +msgid "crossbow" +msgstr "Armbrustschießen" + +msgctxt "spell" +msgid "destroy_magic" +msgstr "Magiefresser" + +msgctxt "skill" +msgid "magic" +msgstr "Magie" + +msgid "see_lighthouse" +msgstr "vom Turm erblickt" + +msgid "nr_schemes_prefix" +msgstr "Schemen der Regionen " + +msgid "aoc_p" +msgstr "Katzenamulette" + +msgctxt "spell" +msgid "orkdream" +msgstr "Süße Träume" + +msgctxt "border" +msgid "a_fogwall" +msgstr "eine Nebelwand" + +msgctxt "calendar" +msgid "winter" +msgstr "Winter" + +msgid "wall1_trail" +msgstr "eine mächtige Mauer" + +msgctxt "spellinfo" +msgid "double_time" +msgstr "Diese praktische Anwendung des theoretischen Wissens um Raum und Zeit ermöglicht es, den Zeitfluß für einige Personen zu verändern. Auf diese Weise veränderte Personen bekommen für einige Wochen doppelt soviele Bewegungspunkte und doppelt soviele Angriffe pro Runde." + +msgctxt "race" +msgid "direwolf" +msgstr "Warg" + +msgctxt "race" +msgid "dreamcat_d" +msgstr "Traumkatzen" + +msgid "Frühling" +msgstr "Frühling" + +msgctxt "spell" +msgid "slavery" +msgstr "Gesang der Versklavung" + +msgctxt "spell" +msgid "break_curse" +msgstr "Fluch brechen" + +msgctxt "spell" +msgid "treewalkexit" +msgstr "Sog des Lebens" + +msgid "catapult_p" +msgstr "Katapulte" + +msgid "almond_p" +msgstr "Mandelkerne" + +msgid "lance_p" +msgstr "Lanzen" + +msgctxt "race" +msgid "spell" +msgstr "Zauber" + +msgid "roi_p" +msgstr "Ringe der Unsichtbarkeit" + +msgctxt "spellinfo" +msgid "chaosrow" +msgstr "Vor den Augen der feindlichen Soldaten opfert der Schwarzmagier die zehn Bauern in einem blutigen, grausamen Ritual und beschwört auf diese Weise Geister des Wahnsinns über die feindlichen Truppen. Diese werden im Kampf verwirrt reagieren und nicht in der Lage sein, den Anweisungen ihrer Offiziere zu folgen." + +msgctxt "race" +msgid "dreamcat_p" +msgstr "Traumkatzen" + +msgctxt "keyword" +msgid "ready" +msgstr "KAMPFZAUBER" + +msgid "wenige" +msgstr "wenige" + +msgid "b_attacke" +msgstr "Angriff" + +msgctxt "keyword" +msgid "help" +msgstr "HELFE" + +msgctxt "race" +msgid "dreamcat_x" +msgstr "Traumkatzen" + +msgctxt "spellinfo" +msgid "treewalkexit" +msgstr "Ein Druide, den es in die Welt der Geister verschlagen hat, kann mit Hilfe dieses Zaubers Stufe*5 Gewichtseinheiten in einen Wald auf der materiellen Welt zurückschicken." + +msgctxt "race" +msgid "shadowmaster" +msgstr "Schattenmeister" + +msgctxt "race" +msgid "fairy_d" +msgstr "Feen" + +msgid "mallornseed_p" +msgstr "Mallornsamen" + +msgid "ghoul_prefix_0" +msgstr "Faulende" + +msgid "ghoul_prefix_1" +msgstr "Angsteinflößende" + +msgid "nr_mallorntree" +msgstr "Mallornbaum" + +msgid "ghoul_prefix_2" +msgstr "Leise" + +msgid "ghoul_prefix_3" +msgstr "Kinderfressende" + +msgid "ghoul_prefix_4" +msgstr "Menschenfressende" + +msgctxt "school" +msgid "gwyrrd" +msgstr "Gwyrrd" + +msgid "smod_sea" +msgstr "Seezauber" + +msgid "ghoul_prefix_5" +msgstr "Wahnsinnige" + +msgid "ghoul_prefix_6" +msgstr "Brutale" + +msgid "ghoul_prefix_7" +msgstr "Schwarze" + +msgctxt "damage" +msgid "exhausted" +msgstr "erschöpft" + +msgid "ghoul_prefix_8" +msgstr "Dunkle" + +msgctxt "race" +msgid "clone_d" +msgstr "Klonen" + +msgid "ghoul_prefix_9" +msgstr "Fürchterliche" + +msgctxt "spell" +msgid "song_of_fear" +msgstr "Gesang der Furcht" + +msgctxt "skill" +msgid "perception" +msgstr "Wahrnehmung" + +msgctxt "spellinfo" +msgid "bloodsacrifice" +msgstr "Mit diesem Ritual kann der Magier einen Teil seiner Lebensenergie opfern, um dafür an magischer Kraft zu gewinnen. Erfahrene Ritualmagier berichten, das sich das Ritual, einmal initiiert, nur schlecht steuern ließe und die Menge der so gewonnenen Kraft stark schwankt. So steht im 'Buch des Blutes' geschrieben: 'So richte Er aus das Zeichen der vier Elemente im Kreis des Werdens und Vergehens und Weihe ein jedes mit einem Tropfen Blut. Sodann begebe Er in der Mitten der Ewigen Vierer sich und lasse Leben verrinnen, auf das Kraft geboren werde.'" + +msgctxt "race" +msgid "fairy_p" +msgstr "Feen" + +msgid "rustygreatsword" +msgstr "Rostiger Zweihänder" + +msgid "an_unknown_unit" +msgstr "eine unbekannte Einheit" + +msgctxt "race" +msgid "direwolf_d" +msgstr "Wargen" + +msgctxt "spellinfo" +msgid "ironkeeper" +msgstr "Erschafft einen Wächtergeist, der in Gletschern und Bergen Eisen- und Laenabbau durch nichtalliierte Parteien (HELFE BEWACHE) verhindert, solange er die Region bewacht. Der Bergwächter ist an den Ort der Beschwörung gebunden." + +msgid "h20_p" +msgstr "Schneekristalle" + +msgid "hell" +msgstr "Ebene aus Feuer und Dunkelheit" + +msgid "mailcmd" +msgstr "BEFEHLE" + +msgid "skeleton_postfix_0" +msgstr "der Nacht" + +msgctxt "spellpar" +msgid "spellid" +msgstr "Zauber-ID" + +msgid "skeleton_postfix_1" +msgstr "der Schatten" + +msgctxt "spell" +msgid "create_roi" +msgstr "Erschaffe einen Ring der Unsichtbarkeit" + +msgctxt "race" +msgid "fairy_x" +msgstr "Feen" + +msgid "skeleton_postfix_2" +msgstr "der Finsternis" + +msgid "ror_p" +msgstr "Ringe der Regeneration" + +msgid "skeleton_postfix_3" +msgstr "des Bösen" + +msgctxt "race" +msgid "troll_d" +msgstr "Trollen" + +msgctxt "race" +msgid "clone_p" +msgstr "Klone" + +msgid "skeleton_postfix_4" +msgstr "der Erschlagenen" + +msgid "skeleton_postfix_5" +msgstr "der Verfluchten" + +msgid "skeleton_postfix_6" +msgstr "der Gefolterten" + +msgctxt "race" +msgid "direwolf_p" +msgstr "Warge" + +msgid "skeleton_postfix_7" +msgstr "der Ruhelosen" + +msgid "skeleton_postfix_8" +msgstr "aus dem Nebel" + +msgctxt "spellinfo" +msgid "song_of_fear" +msgstr "Ein gar machtvoller Gesang aus den Überlieferungen der Katzen, der tief in die Herzen der Feinde dringt und ihnen Mut und Hoffnung raubt. Furcht wird sie zittern lassen und Panik ihre Gedanken beherrschen. Voller Angst werden sie versuchen, den gräßlichen Gesängen zu entrinnen und fliehen." + +msgctxt "spell" +msgid "create_rop" +msgstr "Erschaffe einen Ring der Macht" + +msgctxt "keyword" +msgid "grow" +msgstr "ZÜCHTE" + +msgid "skeleton_postfix_9" +msgstr "aus dem Dunkel" + +msgctxt "spell" +msgid "create_ror" +msgstr "Erschaffe einen Ring der Regeneration" + +msgctxt "spell" +msgid "keeploot" +msgstr "Beute Bewahren" + +msgctxt "race" +msgid "clone_x" +msgstr "Klonen" + +msgid "plain_trail" +msgstr "die Ebene von %s" + +msgctxt "spellinfo" +msgid "create_firesword" +msgstr "'Und so reibe das Blut eines wilden Kämpfers in den Stahl der Klinge und beginne die Anrufung der Sphären des Chaos. Und hast du alles zu ihrem Wohlgefallen getan, so werden sie einen niederen der ihren senden, das Schwert mit seiner Macht zu beseelen...'" + +msgid "h1_p" +msgstr "Würzige Wagemut" + +msgid "healingpotion_p" +msgstr "Heiltränke" + +msgctxt "spell" +msgid "song_suscept_magic" +msgstr "Gesang des schwachen Geistes" + +msgctxt "race" +msgid "direwolf_x" +msgstr "Warg" + +msgctxt "race" +msgid "troll_p" +msgstr "Trolle" + +msgctxt "prefix" +msgid "Grau" +msgstr "Grau" + +msgid "building" +msgstr "Struktur" + +msgctxt "spell" +msgid "living_rock" +msgstr "Belebtes Gestein" + +msgid "growl0" +msgstr "Groaamm..." + +msgctxt "spellinfo" +msgid "generous" +msgstr "Dieser fröhliche Gesang wird sich wie ein Gerücht in der Region ausbreiten und alle Welt in Feierlaune versetzen. Überall werden Tavernen und Theater gut gefüllt sein und selbst die Bettler satt werden." + +msgid "growl1" +msgstr "Tschrrrk..." + +msgid "growl2" +msgstr "Schhhhh..." + +msgid "growl3" +msgstr "Roaarrr..." + +msgctxt "spell" +msgid "treegrow" +msgstr "Hainzauber" + +msgctxt "race" +msgid "troll_x" +msgstr "Troll" + +msgctxt "skill" +msgid "bow" +msgstr "Bogenschießen" + +msgid "growl4" +msgstr "Chrrr..." + +msgid "h4_p" +msgstr "Blaue Baumringel" + +msgid "leave" +msgstr "VERLASSEN" + +msgid "weight_unit_p" +msgstr "GE" + +msgid "nr_level" +msgstr "Stufe" + +msgid "healing" +msgstr "Heiltrank" + +msgid "vortex_desc" +msgstr "Ein Wirbel aus reinem Chaos zieht über die Region" + +msgctxt "race" +msgid "ghast_d" +msgstr "Ghasten" + +msgctxt "spellinfo" +msgid "mindblast" +msgstr "Mit diesem Zauber greift der Magier direkt den Geist seiner Gegner an. Ein Schlag aus astraler und elektrischer Energie trifft die Gegner, wird die Magieresistenz durchbrochen, verliert ein Opfer permanent einen Teil seiner Erinnerungen. Wird es zu oft ein Opfer dieses Zaubers kann es daran sterben. " + +msgid "h7_p" +msgstr "Knotige Saugwurze" + +msgid "nr_spell_description" +msgstr "Beschreibung:" + +msgid "attack_magical" +msgstr "ein magischer Angriff" + +msgid "unit_guards" +msgstr "bewacht die Region" + +msgid "pavilion" +msgstr "Pavillion" + +msgctxt "race" +msgid "spell_d" +msgstr "Zauber" + +msgctxt "race" +msgid "juju_d" +msgstr "Juju-Zombies" + +msgid "nr_guarding_postfix" +msgstr " bewacht." + +msgctxt "border" +msgid "fogwall" +msgstr "Nebelwand" + +msgid "stat_attack" +msgstr "Angriff" + +msgctxt "keyword" +msgid "banner" +msgstr "BANNER" + +msgctxt "race" +msgid "ghast_p" +msgstr "Ghaste" + +msgctxt "spell" +msgid "wdwpyramid_gwyrrd" +msgstr "Kraft der Natur" + +msgctxt "spell" +msgid "insectfur" +msgstr "Firuns Fell" + +msgctxt "race" +msgid "spell_p" +msgstr "Zauber" + +msgctxt "spellinfo" +msgid "illaundestroymagic" +msgstr "Dieser Zauber ermöglicht es dem Traumweber die natürlichen und aufgezwungenen Traumbilder einer Person, eines Gebäudes, Schiffes oder einer Region zu unterscheiden und diese zu entwirren." + +msgctxt "race" +msgid "juju_p" +msgstr "Juju-Zombies" + +msgid "museumticket" +msgstr "Eintrittskarte des Großen Museum" + +msgctxt "race" +msgid "ghast_x" +msgstr "Ghast" + +msgctxt "spell" +msgid "seduction" +msgstr "Lied der Verführung" + +msgctxt "keyword" +msgid "use" +msgstr "BENUTZE" + +msgctxt "spell" +msgid "create_trollbelt" +msgstr "Erschaffe einen Gürtel der Trollstärke" + +msgctxt "race" +msgid "spell_x" +msgstr "Zauber" + +msgctxt "race" +msgid "juju_x" +msgstr "Juju-Zombie" + +msgctxt "spellinfo" +msgid "summonfireelemental" +msgstr "Dieses Ritual beschwört wütende Elementargeister der Hitze. Eine Dürre sucht das Land heim. Bäume verdorren, Tiere verenden, und die Ernte fällt aus. Für Tagelöhner gibt es kaum noch Arbeit in der Landwirtschaft zu finden." + +msgid "XEPOTION" +msgstr "XETRANK" + +msgctxt "race" +msgid "undead" +msgstr "Untoter" + +msgid "p10" +msgstr "Berserkerblut" + +msgid "toadslime_p" +msgstr "Tiegel mit Krötenschleim" + +msgid "p11" +msgstr "Bauernlieb" + +msgid "ring" +msgstr "Ring" + +msgid "p13" +msgstr "Elixier der Macht" + +msgid "wand_p" +msgstr "Zauberstäbe" + +msgctxt "spellinfo" +msgid "earn_silver#cerddor" +msgstr "Cerddormagier sind _die_ Gaukler unter den Magiern, sie lieben es das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 50 Silber pro Stufe verdient haben." + +msgctxt "spell" +msgid "strength" +msgstr "Unbekannter Effekt" + +msgctxt "skill" +msgid "unarmed" +msgstr "Waffenloser Kampf" + +msgctxt "keyword" +msgid "tax" +msgstr "TREIBE" + +msgid "rustyshield_p" +msgstr "Rostige Schilde" + +msgctxt "keyword" +msgid "promote" +msgstr "BEFÖRDERE" + +msgid "skeleton_prefix_0" +msgstr "Klapperige" + +msgctxt "spell" +msgid "forestfire" +msgstr "Feuerteufel" + +msgid "stone" +msgstr "Stein" + +msgid "skeleton_prefix_1" +msgstr "Stöhnende" + +msgctxt "spell" +msgid "auratransfer" +msgstr "Auratransfer" + +msgid "skeleton_prefix_2" +msgstr "Schwarzknochige" + +msgid "skeleton_prefix_3" +msgstr "Schwarzgewandete" + +msgid "aurafocus_p" +msgstr "Aurafocuse" + +msgid "skeleton_prefix_4" +msgstr "Angsteinflößende" + +msgid "wente_ring_p" +msgstr "Wildentes Hochzeitsringe" + +msgctxt "spell" +msgid "summonshadowlords" +msgstr "Beschwöre Schattenmeister" + +msgid "snowball_p" +msgstr "Schneebälle" + +msgid "apple_p" +msgstr "Äpfel" + +msgid "skeleton_prefix_5" +msgstr "Heulende" + +msgid "skeleton_prefix_6" +msgstr "Wartende" + +msgid "tree_p" +msgstr "Bäume" + +msgid "skeleton_prefix_7" +msgstr "Grauenvolle" + +msgid "skeleton_prefix_8" +msgstr "Schwarze" + +msgid "myrrh_p" +msgstr "Myrrhe" + +msgid "skeleton_prefix_9" +msgstr "Dunkle" + +msgctxt "spellinfo" +msgid "earn_silver#illaun" +msgstr "Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 50 Silber pro Stufe." + +msgctxt "spell" +msgid "big_recruit" +msgstr "Hohe Kunst der Überzeugung" + +msgctxt "iteminfo" +msgid "magicherbbag" +msgstr "Kräuter, die in diesem Beutelchen aufbewahrt werden, sind erheblich besser konserviert." + +msgctxt "keyword" +msgid "sell" +msgstr "VERKAUFE" + +msgctxt "spellinfo" +msgid "auratransfer" +msgstr " Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes oder im Verhältnis 3:1 auf einen Magier eines anderen Magiegebietes übertragen. " + +msgctxt "race" +msgid "wyrm" +msgstr "Wyrm" + +msgid "birthdaycake" +msgstr "Geburtstagstorte" + +msgctxt "spell" +msgid "oldrace" +msgstr "Unbekannter Effekt" + +msgctxt "skill" +msgid "armorer" +msgstr "Rüstungsbau" + +msgctxt "spell" +msgid "itemcloak" +msgstr "Schleieraura" + +msgid "an_unknown_spell" +msgstr "ein unbekannter Zauber" + +msgid "status_aggressive" +msgstr "aggressiv" + +msgctxt "spellinfo" +msgid "song_resist_magic" +msgstr " Dieses magische Lied wird, einmal mit Inbrunst gesungen, sich in der Region fortpflanzen, von Mund zu Mund springen und eine Zeitlang überall zu vernehmen sein. Nach wie vielen Wochen der Gesang aus dem Gedächtnis der Region entschwunden ist, ist von dem Geschick des Barden abhängig. Bis das Lied ganz verklungen ist, wird seine Magie allen Verbündeten des Barden (HELFE BEWACHE), und natürlich auch seinen eigenem Volk, einen einmaligen Bonus von 15% auf die natürliche Widerstandskraft gegen eine Verzauberung verleihen. " + +msgctxt "keyword" +msgid "contact" +msgstr "KONTAKT" + +msgctxt "spell" +msgid "view_reality" +msgstr "Blick in die Realität" + +msgid "dragonhead_p" +msgstr "Drachenköpfe" + +msgctxt "keyword" +msgid "plant" +msgstr "PFLANZE" + +msgctxt "border" +msgid "wisps" +msgstr "Irrlichter" + +msgid "wente_dress_p" +msgstr "Fräcke" + +msgctxt "spell" +msgid "riotzone" +msgstr "Aufruhr" + +msgid "catapult" +msgstr "Katapult" + +msgid "undead_prefix_10" +msgstr "Dunkle" + +msgid "undead_prefix_11" +msgstr "Fürchterliche" + +msgctxt "spell" +msgid "headache" +msgstr "Schaler Wein" + +msgid "undead_prefix_12" +msgstr "Grauenhafte" + +msgctxt "spellinfo" +msgid "maelstrom" +msgstr " Dieses Ritual beschört einen großen Wasserelementar aus den Tiefen des Ozeans. Der Elementar erzeugt einen gewaltigen Strudel, einen Mahlstrom, welcher alle Schiffe, die ihn passieren, schwer beschädigen kann. " + +msgid "undead_prefix_13" +msgstr "Furchtbare" + +msgid "dolphin_p" +msgstr "Delphine" + +msgid "factiondefault" +msgstr "Partei" + +msgid "undead_prefix_14" +msgstr "Entsetzliche" + +msgid "NICHT" +msgstr "NICHT" + +msgid "undead_prefix_15" +msgstr "Schauderhafte" + +msgid "undead_prefix_16" +msgstr "Schreckliche" + +msgctxt "spellinfo" +msgid "view_reality" +msgstr " Der Magier kann mit Hilfe dieses Zaubers aus der Astral- in die materielle Ebene blicken und die Regionen und Einheiten genau erkennen. " + +msgid "vortex" +msgstr "Wirbel" + +msgid "undead_prefix_17" +msgstr "Gespenstische" + +msgid "undead_prefix_18" +msgstr "Ekelhafte" + +msgid "GIB" +msgstr "GIB" + +msgid "undead_prefix_19" +msgstr "Düstere" + +msgid "maelstrom_trail" +msgstr "ein %s" + +msgctxt "skill" +msgid "forestry" +msgstr "Holzfällen" + +msgctxt "spell" +msgid "earn_silver#draig" +msgstr "Kleine Flüche" + +msgid "lmsreward_p" +msgstr "Gürtel der Heldentaten" + +msgid "academy" +msgstr "Akademie" + +msgctxt "race" +msgid "catdragon_d" +msgstr "Katzendrachen" + +msgctxt "spell" +msgid "wolfhowl" +msgstr "Wolfsgeheul" + +msgctxt "spell" +msgid "song_of_confusion" +msgstr "Gesang der Verwirrung" + +msgctxt "race" +msgid "skeleton" +msgstr "Skelett" + +msgid "mallornsapling_p" +msgstr "Mallornschößlinge" + +msgctxt "spell" +msgid "melancholy" +msgstr "Gesang der Melancholie" + +msgctxt "spell" +msgid "bloodthirst" +msgstr "Kriegsgesang" + +msgctxt "describe" +msgid "ointment" +msgstr "Ist man nach einem einem harten Kampf schwer verwundet, ist es ratsam, etwas Wundsalbe parat zu haben. Streicht man diese magische Paste auf die Wunden, schließen sich diese augenblicklich. Für die Herstellung benötigt der Alchemist nebst einem Blauen Baumringel einen Würzigen Wagemut und einen Weißen Wüterich. Eine solche Portion heilt bis zu 400 Lebenspunkte." + +msgid "section_none" +msgstr "Verschiedenes" + +msgctxt "race" +msgid "catdragon_p" +msgstr "Katzendrachen" + +msgctxt "race" +msgid "songdragon" +msgstr "Singdrache" + +msgid "myrrh" +msgstr "Myrrhe" + +msgid "nr_guarding_unknown" +msgstr "unbekannten Einheiten" + +msgctxt "race" +msgid "catdragon_x" +msgstr "Katzendrachen" + +msgctxt "skill" +msgid "alchemy" +msgstr "Alchemie" + +msgid "undead_prefix_20" +msgstr "Schaurige" + +msgid "undead_prefix_21" +msgstr "Erbarmungslose" + +msgctxt "race" +msgid "owl_d" +msgstr "Eulen" + +msgid "undead_prefix_22" +msgstr "Hungrige" + +msgid "ghoul_postfix_0" +msgstr "der Nacht" + +msgid "ghoul_postfix_1" +msgstr "der Schatten" + +msgid "wente_dress" +msgstr "Frack" + +msgid "BAEUME" +msgstr "BÄUME" + +msgid "ghoul_postfix_2" +msgstr "der Finsternis" + +msgid "ghoul_postfix_3" +msgstr "des Bösen" + +msgid "ghoul_postfix_4" +msgstr "der Erschlagenen" + +msgid "ghoul_postfix_5" +msgstr "der Verfluchten" + +msgid "ghoul_postfix_6" +msgstr "der Ruhelosen" + +msgid "ghoul_postfix_7" +msgstr "aus dem Nebel" + +msgid "ghoul_postfix_8" +msgstr "aus dem Dunkel" + +msgid "ghoul_postfix_9" +msgstr "der Tiefe" + +msgctxt "race" +msgid "owl_p" +msgstr "Eulen" + +msgid "attack_structural" +msgstr "ein Angriff, der Gebäudeschaden verursacht" + +msgctxt "spell" +msgid "antimagiczone" +msgstr "Astrale Schwächezone" + +msgid "boat" +msgstr "Boot" + +msgctxt "spell" +msgid "dreamreading" +msgstr "Traumlesen" + +msgctxt "spellinfo" +msgid "magicstreet" +msgstr "Durch Ausführung dieser Rituale ist der Magier in der Lage einen mächtigen Erdelementar zu beschwören. Solange dieser in den Boden gebannt ist, wird kein Regen die Wege aufweichen und kein Fluß Brücken zerstören können. Alle Reisende erhalten damit die gleichen Vorteile, die sonst nur ein ausgebautes gepflastertes Straßennetz bietet. Selbst Sümpfe und Gletscher können so verzaubert werden. Je mehr Kraft der Magier in den Bann legt, desto länger bleibt die Straße bestehen." + +msgid "soc_p" +msgstr "Beutel des negativen Gewichts" + +msgctxt "prefix" +msgid "arch" +msgstr "Erz" + +msgctxt "race" +msgid "owl_x" +msgstr "Eulen" + +msgctxt "skill" +msgid "roadwork" +msgstr "Straßenbau" + +msgctxt "spell" +msgid "fish_shield" +msgstr "Schild des Fisches" + +msgctxt "race" +msgid "dolphin_d" +msgstr "Delphinen" + +msgid "join" +msgstr "BEITRETEN" + +msgid "corridor1_trail" +msgstr "die %s" + +msgid "lebkuchenherz_p" +msgstr "Lebkuchenherzen mit der Aufschrift 'Erz und Stein, das ist fein'" + +msgctxt "spell" +msgid "analysedream" +msgstr "Traumbilder analysieren" + +msgctxt "prefix" +msgid "Tal" +msgstr "Tal" + +msgid "ZIPPED" +msgstr "ZIPPED" + +msgid "dir_west" +msgstr "West" + +msgctxt "spellinfo" +msgid "dreamreading" +msgstr "Dieser Zauber ermöglicht es dem Traumweber, in die Träume einer Einheit einzudringen und so einen Bericht über die Umgebung zu erhalten." + +msgid "roqf" +msgstr "Ring der flinken Finger" + +msgctxt "race" +msgid "shadowdragon" +msgstr "Schattendrache" + +msgctxt "race" +msgid "dolphin_p" +msgstr "Delphine" + +msgid "herb" +msgstr "Kraut" + +msgctxt "spell" +msgid "mindblast" +msgstr "Tod des Geistes" + +msgctxt "spellinfo" +msgid "analysedream" +msgstr "Mit diesem Spruch kann der Traumweber versuchen, die Verzauberungen einer einzelnen Einheit zu erkennen. Von allen Sprüchen, die seine eigenen Fähigkeiten nicht überschreiten, wird er einen Eindruck ihres Wirkens erhalten können. Bei stärkeren Sprüchen benötigt er ein wenig Glück für eine gelungene Analyse." + +msgctxt "race" +msgid "unicorn_d" +msgstr "Einhörnern" + +msgctxt "race" +msgid "dolphin_x" +msgstr "Delphin" + +msgctxt "keyword" +msgid "give" +msgstr "GIB" + +msgid "dir_ne" +msgstr "NO" + +msgctxt "spell" +msgid "create_bagofholding" +msgstr "Erschaffe einen Beutel des Negativen Gewichts" + +msgctxt "spellinfo" +msgid "orkdream" +msgstr "Dieser Zauber - dessen Anwendung in den meisten Kulturen streng verboten ist - löst im Opfer ein unkontrollierbares Verlangen nach körperlicher Liebe aus. Die betroffenen Personen werden sich Hals über Kopf in ein Liebesabenteuer stürzen, zu blind vor Verlangen, um an etwas anderes zu denken. Meistens bereuen sie es einige Wochen später..." + +msgctxt "spell" +msgid "hail" +msgstr "Hagel" + +msgid "hero" +msgstr "Held" + +msgid "SILBERPOOL" +msgstr "SILBERPOOL" + +msgctxt "keyword" +msgid "prefix" +msgstr "PRÄFIX" + +msgid "section_nr" +msgstr "Hinweise" + +msgctxt "calendar" +msgid "firstweek" +msgstr "die erste Woche" + +msgctxt "spell" +msgid "undeadhero" +msgstr "Untote Helden" + +msgctxt "race" +msgid "unicorn_p" +msgstr "Einhörner" + +msgid "catspoil" +msgstr "Katzenschwanz" + +msgctxt "keyword" +msgid "show" +msgstr "ZEIGE" + +msgid "dir_nw" +msgstr "NW" + +msgctxt "race" +msgid "unicorn_x" +msgstr "Einhorn" + +msgctxt "race" +msgid "shadowdragon_d" +msgstr "Schattendrachen" + +msgctxt "spell" +msgid "combatrust" +msgstr "Rosthauch" + +msgctxt "race" +msgid "mountainguard" +msgstr "Bergwächter" + +msgid "tunnel" +msgstr "Tunnel" + +msgid "hp_p" +msgstr "Trefferpunkte" + +msgctxt "calendar" +msgid "spring" +msgstr "Frühling" + +msgid "magicbag_p" +msgstr "Zauberbeutel" + +msgid "dragonship" +msgstr "Drachenschiff" + +msgctxt "spell" +msgid "deathcloud" +msgstr "Todeswolke" + +msgctxt "spellinfo" +msgid "reanimate" +msgstr "Stirbt ein Krieger im Kampf so macht sich seine Seele auf die lange Wanderung zu den Sternen. Mit Hilfe eines Rituals kann ein Traumweber versuchen, die Seele wieder einzufangen und in den Körper des Verstorbenen zurückzubringen. Zwar heilt der Zauber keine körperlichen Verwundungen, doch ein Behandelter wird den Kampf überleben." + +msgctxt "spellinfo" +msgid "transfer_aura_song" +msgstr "Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes übertragen." + +msgctxt "race" +msgid "shadowdragon_p" +msgstr "Schattendrachen" + +msgid "monument" +msgstr "Monument" + +msgid "west" +msgstr "Westen" + +msgctxt "spell" +msgid "create_firesword" +msgstr "Erschaffe ein Flammenschwert" + +msgctxt "iteminfo" +msgid "roqf" +msgstr "Der Zauber in diesem Ring bewirkt eine um das zehnfache verbesserte Geschicklichkeit und Gewandheit der Finger. Handwerker können somit das zehnfache produzieren, und bei einigen anderen Tätigkeiten könnte dies ebenfalls von Nutzen sein." + +msgctxt "race" +msgid "shadowdragon_x" +msgstr "Schattendrachen" + +msgctxt "keyword" +msgid "piracy" +msgstr "PIRATERIE" + +msgctxt "raceinfo" +msgid "lynx" +msgstr "Der Luchs ist bekannt für seine Geschicklichkeit im Verbergen und Beobachten. Mit ein wenig Geduld kann er zu einem hervorragenden Späher ausgebildet werden. Im Kampf verteidigt er sich mit seinen scharfen Krallen und weiß seine Gewandheit zu nutzen." + +msgid "greatsword" +msgstr "Bihänder" + +msgctxt "spellinfo" +msgid "show_astral" +msgstr " Der Magier kann kurzzeitig in die Astralebene blicken und erfährt so alle Einheiten innerhalb eines astralen Radius von Stufe/5 Regionen. " + +msgctxt "race" +msgid "demon_d" +msgstr "Dämonen" + +msgid "laen" +msgstr "Laen" + +msgid "relativ viele" +msgstr "relativ viele" + +msgid "and" +msgstr "und" + +msgctxt "race" +msgid "demon_p" +msgstr "Dämonen" + +msgctxt "race" +msgid "lynx_d" +msgstr "Luchsen" + +msgctxt "spellinfo" +msgid "keeploot" +msgstr "Dieser Zauber verhindert, dass ein Teil der sonst im Kampf zerstörten Gegenstände beschädigt wird. Die Verluste reduzieren sich um 5% pro Stufe des Zaubers bis zu einem Minimum von 25%." + +msgctxt "race" +msgid "demon_x" +msgstr "Dämonen" + +msgid "mountain" +msgstr "Berge" + +msgctxt "race" +msgid "lynx_p" +msgstr "Luchse" + +msgctxt "spellinfo" +msgid "cerddor_destroymagic" +msgstr " Jede Verzauberung beeinflußt das Lebenslied, schwächt und verzerrt es. Der kundige Barde kann versuchen, das Lebenslied aufzufangen und zu verstärken und die Veränderungen aus dem Lied zu tilgen. " + +msgctxt "spellinfo" +msgid "treegrow" +msgstr "Wo sonst aus einem Stecken nur ein Baum sprießen konnte, so treibt nun jeder Ast Wurzeln. " + +msgctxt "race" +msgid "lynx_x" +msgstr "Luchs" + +msgid "rustysword" +msgstr "Schartiges Schwert" + +msgid "spear_p" +msgstr "Speere" + +msgctxt "spellinfo" +msgid "coldfront" +msgstr "Tötet die Feinde mit Kälte." + +msgid "insectspoil" +msgstr "Insektenfühler" + +msgctxt "spell" +msgid "shapeshift" +msgstr "Gestaltwandlung" + +msgctxt "race" +msgid "youngdragon" +msgstr "Jungdrache" + +msgctxt "calendar" +msgid "firstweek_d" +msgstr "der ersten Woche" + +msgid "swamp_trail" +msgstr "der Sumpf von %s" + +msgid "nr_nb_final" +msgstr "und im " + +msgid "aoc" +msgstr "Katzenamulett" + +msgid "balm_p" +msgstr "Balsam" + +msgctxt "spell" +msgid "maelstrom" +msgstr "Mahlstrom" + +msgctxt "race" +msgid "zombie_d" +msgstr "Zombies" + +msgid "aod" +msgstr "Amulett der Dunkelheit" + +msgctxt "border" +msgid "wall" +msgstr "Wand" + +msgctxt "skill" +msgid "trade" +msgstr "Handeln" + +msgid "aog" +msgstr "Amulett des Treffens" + +msgid "dragonblood" +msgstr "Drachenblut" + +msgid "aquarianspoil_p" +msgstr "Meermenschschuppen" + +msgctxt "spell" +msgid "calmmonster" +msgstr "Monster friedlich stimmen" + +msgctxt "spell" +msgid "auraleak" +msgstr "Astraler Riss" + +msgid "activevolcano" +msgstr "Aktiver Vulkan" + +msgctxt "race" +msgid "zombie_p" +msgstr "Zombies" + +msgid "trollbelt" +msgstr "Gürtel der Trollstärke" + +msgid "laenshield" +msgstr "Laenschild" + +msgid "BEWACHE" +msgstr "BEWACHEN" + +msgid "h0" +msgstr "Flachwurz" + +msgid "humanspoil" +msgstr "Menschenskalp" + +msgctxt "coast" +msgid "ne" +msgstr "Nordostküste" + +msgid "h1" +msgstr "Würziger Wagemut" + +msgid "healingpotion" +msgstr "Heiltrank" + +msgid "AUSWERTUNG" +msgstr "AUSWERTUNG" + +msgid "h2" +msgstr "Eulenauge" + +msgid "rm_adamantium" +msgstr "Adamantium" + +msgid "h3" +msgstr "Grüner Spinnerich" + +msgctxt "race" +msgid "zombie_x" +msgstr "Zombie" + +msgid "h4" +msgstr "Blauer Baumringel" + +msgid "nr_spell_components" +msgstr "Komponenten:" + +msgid "h5" +msgstr "Elfenlieb" + +msgid "ghoul_name_0" +msgstr "Ghoule" + +msgid "h6" +msgstr "Gurgelkraut" + +msgid "ghoul_name_1" +msgstr "Kreaturen" + +msgid "h7" +msgstr "Knotiger Saugwurz" + +msgid "ghoul_name_2" +msgstr "Verlorene" + +msgid "h8" +msgstr "Blasenmorchel" + +msgid "ghoul_name_3" +msgstr "Erschlagene" + +msgctxt "spellinfo" +msgid "protective_runes" +msgstr " Zeichnet man diese Runen auf die Wände eines Gebäudes oder auf die Planken eines Schiffes, so wird es schwerer durch Zauber zu beeinflussen sein. Jedes Ritual erhöht die Widerstandskraft des Gebäudes oder Schiffes gegen Verzauberung um 20%. Werden mehrere Schutzzauber übereinander gelegt, so addiert sich ihre Wirkung, doch ein hundertprozentiger Schutz läßt sich so nicht erreichen. Der Zauber hält mindestens drei Wochen an, je nach Talent des Magiers aber auch viel länger. " + +msgid "h9" +msgstr "Wasserfinder" + +msgid "section_errors" +msgstr "Warnungen und Fehler" + +msgid "ghoul_name_4" +msgstr "Verdammte" + +msgctxt "race" +msgid "ghast" +msgstr "Ghast" + +msgid "ghoul_name_5" +msgstr "Schlurfende Ghoule" + +msgctxt "prefix" +msgid "ice" +msgstr "Eis" + +msgctxt "spell" +msgid "create_invisibility_sphere" +msgstr "Erschaffe eine Sphäre der Unsichtbarkeit" + +msgctxt "spellinfo" +msgid "song_of_healing" +msgstr "Nicht nur der Feldscher kann den Verwundeten einer Schlacht helfen. Die Barden kennen verschiedene Lieder, die die Selbstheilungskräfte des Körpers unterstützen. Dieses Lied vermag Wunden zu schließen, gebrochene Knochen zu richten und selbst abgetrennte Glieder wieder zu regenerieren." + +msgctxt "keyword" +msgid "research" +msgstr "FORSCHE" + +msgctxt "coast" +msgid "nw" +msgstr "Nordwestküste" + +msgid "adamantium_p" +msgstr "Adamantium" + +msgid "seashell_p" +msgstr "Muscheln" + +msgid "undead_prefix_0" +msgstr "Grausige" + +msgid "undead_prefix_1" +msgstr "Stöhnende" + +msgid "undead_prefix_2" +msgstr "Schlurfende" + +msgid "undead_prefix_3" +msgstr "Schwarzgewandete" + +msgid "nr_spell_type" +msgstr "Art:" + +msgid "undead_prefix_4" +msgstr "Faulende" + +msgid "undead_prefix_5" +msgstr "Angsteinflößende" + +msgctxt "race" +msgid "template_d" +msgstr "Schablonen" + +msgid "undead_prefix_6" +msgstr "Heulende" + +msgctxt "skill" +msgid "melee" +msgstr "Hiebwaffen" + +msgid "birthday_firework" +msgstr "Feuerwerk" + +msgid "undead_prefix_7" +msgstr "Wartende" + +msgctxt "prefix" +msgid "Chaos" +msgstr "Chaos" + +msgid "undead_prefix_8" +msgstr "Grauenvolle" + +msgid "undead_prefix_9" +msgstr "Schwarze" + +msgctxt "race" +msgid "mountainguard_d" +msgstr "Bergwächtern" + +msgctxt "prefix" +msgid "Licht" +msgstr "Licht" + +msgctxt "spellinfo" +msgid "flee" +msgstr "Der Traumweber beschwört vor dem Kampf grauenerregende Trugbilder herauf, die viele Gegner in Panik versetzen. Die Betroffenen werden versuchen, vor den Trugbildern zu fliehen." + +msgctxt "spell" +msgid "ironkeeper" +msgstr "Bergwächter" + +msgctxt "spellinfo" +msgid "enterastral" +msgstr "Alte arkane Formeln ermöglichen es dem Magier, sich und andere in die astrale Ebene zu schicken. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 11 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen. " + +msgctxt "spell" +msgid "flyingship" +msgstr "Luftschiff" + +msgctxt "race" +msgid "template_p" +msgstr "Schablonen" + +msgid "STRASSEN" +msgstr "STRAßEN" + +msgid "jewel" +msgstr "Juwel" + +msgid "horse" +msgstr "Pferd" + +msgid "mallornbow" +msgstr "Mallornbogen" + +msgctxt "prefix" +msgid "flame" +msgstr "Flammen" + +msgctxt "spell" +msgid "magic_roots" +msgstr "Wurzeln der Magie" + +msgid "thickfog" +msgstr "Dichter Nebel" + +msgctxt "spell" +msgid "leaveastral" +msgstr "Astraler Ausgang" + +msgctxt "race" +msgid "mountainguard_p" +msgstr "Bergwächter" + +msgid "clone_of" +msgstr "Klon von %s" + +msgid "travelthru_header" +msgstr "Die Region wurde durchquert von " + +msgctxt "race" +msgid "template_x" +msgstr "Schablonen" + +msgid "questkey1_p" +msgstr "Achatene Schlüssel" + +msgctxt "spellinfo" +msgid "treewalkenter" +msgstr "Große Macht liegt in Orten, an denen das Leben pulsiert. Der Druide kann diese Kraft sammeln und so ein Tor in die Welt der Geistwesen erschaffen. Der Druide kann dann Stufe*5 Gewichtseinheiten durch das Tor entsenden." + +msgid "soc" +msgstr "Beutel des negativen Gewichts" + +msgid "hall1_trail" +msgstr "die %s" + +msgctxt "spell" +msgid "draigdestroymagic" +msgstr "Pentagramm" + +msgctxt "race" +msgid "tiger" +msgstr "Tiger" + +msgid "dragonship_a" +msgstr "ein Drachenschiff" + +msgctxt "race" +msgid "mountainguard_x" +msgstr "Bergwächter" + +msgid "unitdefault" +msgstr "Einheit" + +msgid "nr_youaredead" +msgstr "Unglücklicherweise wurde deine Partei ausgelöscht. Du kannst gerne an einer anderen Stelle wieder einsteigen. Melde Dich einfach wieder an." + +msgid "invite" +msgstr "EINLADEN" + +msgid "scale" +msgstr "Schuppenpanzer" + +msgid "cookie" +msgstr "Keks" + +msgid "fairyboot" +msgstr "Feenstiefel" + +msgid "hp" +msgstr "Trefferpunkt" + +msgctxt "raceinfo" +msgid "eagle" +msgstr "Der Adler ist ein ausgezeichneter Späher, fliegend überquert er sogar kurze Meerengen, doch ist er hoch oben am Himmel auch sehr exponiert, was ihn beim Rasten zu einem leichten Ziel macht." + +msgctxt "spell" +msgid "firewall" +msgstr "Feuerwand" + +msgctxt "spell" +msgid "cerddorfumbleshield" +msgstr "Bannlied" + +msgctxt "spellinfo" +msgid "earn_silver#tybied" +msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche verdienen." + +msgid "ANZAHL" +msgstr "ANZAHL" + +msgid "dir_se" +msgstr "SO" + +msgctxt "keyword" +msgid "teach" +msgstr "LEHRE" + +msgctxt "keyword" +msgid "combat" +msgstr "KÄMPFE" + +msgid "ao_healing_p" +msgstr "Amulette der Heilung" + +msgid "ocean" +msgstr "Ozean" + +msgctxt "spellinfo" +msgid "headache" +msgstr " Aufzeichung des Vortrags von Selen Ard'Ragorn in Bar'Glingal: 'Es heisst, dieser Spruch wäre wohl in den Spelunken der Westgassen entstanden, doch es kann genausogut in jedem andern verrufenen Viertel gewesen sein. Seine wichtigste Zutat ist etwa ein Fass schlechtesten Weines, je billiger und ungesunder, desto wirkungsvoller wird die Essenz. Die Kunst, diesen Wein in pure Essenz zu destillieren, die weitaus anspruchsvoller als das einfache Rezeptmischen eines Alchemisten ist, und diese dergestalt zu binden und konservieren, das sie sich nicht gleich wieder verflüchtigt, wie es ihre Natur wäre, ja, dies ist etwas, das nur ein Meister des Cerddor vollbringen kann. Nun besitzt Ihr eine kleine Phiola mit einer rubinrotschimmernden - nun, nicht flüssig, doch auch nicht ganz Dunst - nennen wir es einfach nur Elixier. Doch nicht dies ist die wahre Herausforderung, sodann muss, da sich ihre Wirkung leicht verflüchtigt, diese innerhalb weniger Tage unbemerkt in das Getränk des Opfers geträufelt werden. Ihr Meister der Betöhrung und Verführung, hier nun könnt Ihr Eure ganze Kunst unter Beweis stellen. Doch gebt Acht, nicht unbedacht selbst von dem Elixier zu kosten, denn wer einmal gekostet hat, der kann vom Weine nicht mehr lassen, und er säuft sicherlich eine volle Woche lang. Jedoch nicht die Verführung zum Trunke ist die wahre Gefahr, die dem Elixier innewohnt, sondern das der Trunkenheit so sicher ein gar fürchterliches Leid des Kopfes folgen wird, wie der Tag auf die Nacht folgt. Und er wird gar sicherlich von seiner besten Fähigkeit einige Tage bis hin zu den Studien zweier Wochen vergessen haben. Noch ein Wort der Warnung: dieses ist sehr aufwendig, und so Ihr noch weitere Zauber in der selben Woche wirken wollt, so werden sie Euch schwerer fallen.' " + +msgid "spear" +msgstr "Speer" + +msgctxt "keyword" +msgid "sabotage" +msgstr "SABOTIERE" + +msgctxt "describe" +msgid "truthpotion" +msgstr "Dieses wirkungsvolle einfache Gebräu schärft die Sinne des Trinkenden derart, dass er in der Lage ist, eine Woche lang auch die komplexesten Illusionen zu durchschauen." + +msgid "plate_p" +msgstr "Plattenpanzer" + +msgid "tradepost" +msgstr "Handelsposten" + +msgid "p0_p" +msgstr "Siebenmeilentees" + +msgid "STATISTIK" +msgstr "STATISTIK" + +msgid "dir_sw" +msgstr "SW" + +msgctxt "spellinfo" +msgid "wolfhowl" +msgstr "Nicht wenige Druiden freunden sich im Laufe ihres Lebens in der Natur mit den ältesten Freunden der großen Völker an. Sie erlernen, mit einem einzigen heulenden Ruf viele ihrer Freunde herbeizurufen, um ihnen im Kampf beizustehen." + +msgid "p3_p" +msgstr "Schaffenstrünke" + +msgctxt "spell" +msgid "great_drought" +msgstr "Tor in die Ebene der Hitze" + +msgid "status_flee" +msgstr "flieht" + +msgid "elvenhorse" +msgstr "Elfenpferd" + +msgid "ao_chastity_p" +msgstr "Amulette der Keuschheit" + +msgid "p10_p" +msgstr "Berserkerblut" + +msgctxt "keyword" +msgid "maketemp" +msgstr "MACHE TEMP" + +msgctxt "spell" +msgid "reanimate" +msgstr "Wiederbelebung" + +msgctxt "spellinfo" +msgid "create_bagofholding" +msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." + +msgid "questkey1" +msgstr "Achatener Schlüssel" + +msgctxt "spell" +msgid "armor_shield" +msgstr "Rüstschild" + +msgid "questkey2" +msgstr "Saphirner Schlüssel" + +msgid "stat_cut" +msgstr "Ist durch Hiebwaffen schwer zu verwunden." + +msgid "BAUERN" +msgstr "BAUERN" + +msgid "p6_p" +msgstr "Gehirnschmalz" + +msgctxt "spell" +msgid "summondragon" +msgstr "Drachenruf" + +msgctxt "iteminfo" +msgid "elvenhorse" +msgstr "Ein Elfenpferd wird sich nur den wenigsten jemals anschließen. Hat es jedoch seine Scheu überwunden ist es ein sehr wertvoller Gefährte. Ein Elfenpferd ist schneller als ein Pferd. Zudem hilft es seinem Reiter im Kampf und unterstützt ihn mit seiner Magie. Es sind schwarze Elfenpferde bekannt, die sich sogar Orks angeschlossen haben." + +msgid "ring_p" +msgstr "Ringe" + +msgctxt "iteminfo" +msgid "trollbelt" +msgstr "Dieses magische Artefakt verleiht seinem Träger die Stärke eines ausgewachsenen Höhlentrolls. Seine Tragkraft erhöht sich auf das 50fache und auch im Kampf werden sich die erhöhte Kraft und die trollisch zähe Haut positiv auswirken." + +msgid "VOR" +msgstr "VOR" + +msgid "p13_p" +msgstr "Elixiere der Macht" + +msgid "nr_owner" +msgstr "Eigentümer" + +msgid "nr_template" +msgstr "Vorlage für den nächsten Zug:" + +msgctxt "skill" +msgid "espionage" +msgstr "Spionage" + +msgctxt "spell" +msgid "reelingarrows" +msgstr "Wirbelwind" + +msgid "p9_p" +msgstr "Pferdeglück" + +msgctxt "spellinfo" +msgid "versteinern" +msgstr "Dieser schwierige, aber effektive Kampfzauber benutzt die Elementargeister des Steins, um eine Reihe von Gegnern für die Dauer des Kampfes in Stein zu verwandeln. Die betroffenen Personen werden nicht mehr kämpfen, können jedoch auch nicht verwundet werden." + +msgctxt "spellinfo" +msgid "armor_shield" +msgstr " Diese vor dem Kampf zu zaubernde Ritual gibt den eigenen Truppen einen zusätzlichen Bonus auf ihre Rüstung. Jeder Treffer reduziert die Kraft des Zaubers, so dass der Schild sich irgendwann im Kampf auflösen wird. " + +msgid "desert_trail" +msgstr "die Wüste von %s" + +msgid "catapultammo_p" +msgstr "Katapultmunition" + +msgid "greatsword_p" +msgstr "Bihänder" + +msgid "zombie_postfix_10" +msgstr "in Ketten" + +msgctxt "spellinfo" +msgid "summondragon" +msgstr "Mit diesem dunklen Ritual erzeugt der Magier einen Köder, der für Drachen einfach unwiderstehlich riecht. Ob die Drachen aus der Umgebung oder aus der Sphäre des Chaos stammen, konnte noch nicht erforscht werden. Es soll beides bereits vorgekommen sein. Der Köder hält etwa 6 Wochen, muss aber in einem drachengenehmen Terrain platziert werden." + +msgid "zombie_postfix_11" +msgstr "aus dem Totenreich" + +msgid "zombie_postfix_12" +msgstr "aus der Unterwelt" + +msgctxt "spell" +msgid "icy_dragonbreath" +msgstr "Eisiger Drachenodem" + +msgctxt "damage" +msgid "badly" +msgstr "schwer verwundet" + +msgctxt "race" +msgid "halfling_d" +msgstr "Halblingen" + +msgctxt "race" +msgid "smurf_d" +msgstr "Schlümpfen" + +msgctxt "spell" +msgid "aura_of_fear" +msgstr "Furchteinflößende Aura" + +msgid "mountain_trail" +msgstr "das Bergland von %s" + +msgctxt "race" +msgid "halfling_p" +msgstr "Halblinge" + +msgctxt "race" +msgid "greenscarab" +msgstr "grüner Scarabäus" + +msgctxt "keyword" +msgid "quit" +msgstr "STIRB" + +msgid "AURA" +msgstr "AURA" + +msgid "smithy" +msgstr "Schmiede" + +msgid "laen_p" +msgstr "Laen" + +msgctxt "spellinfo" +msgid "incite_riot" +msgstr " Mit Hilfe dieses magischen Gesangs versetzt der Magier eine ganze Region in Aufruhr. Rebellierende Bauernhorden machen jedes Besteuern unmöglich, kaum jemand wird mehr für Gaukeleien Geld spenden und es können keine neuen Leute angeworben werden. Nach einigen Wochen beruhigt sich der Mob wieder. " + +msgid "longboat" +msgstr "Langboot" + +msgctxt "spellinfo" +msgid "appeasement" +msgstr "Dieses Lied zähmt selbst den wildesten Ork und macht ihn friedfertig und sanftmütig. Jeder Gedanke, dem Sänger zu schaden, wird ihm entfallen. Unbehelligt kann der Magier in eine Nachbarregion ziehen." + +msgctxt "spell" +msgid "coldfront" +msgstr "Eisnebel" + +msgctxt "race" +msgid "halfling_x" +msgstr "Halblings" + +msgctxt "race" +msgid "smurf_p" +msgstr "Schlümpfe" + +msgid "dir_east" +msgstr "Ost" + +msgctxt "spell" +msgid "depression" +msgstr "Gesang der Melancholie" + +msgid "battle_opponents" +msgstr "Kämpft gegen:" + +msgid "GEGENSTAENDE" +msgstr "GEGENSTÄNDE" + +msgid "greatbow" +msgstr "Elfenbogen" + +msgctxt "spellinfo" +msgid "aura_of_fear" +msgstr "Panik." + +msgctxt "race" +msgid "smurf_x" +msgstr "Schlumpf" + +msgctxt "spell" +msgid "cold_protection" +msgstr "Firuns Fell" + +msgctxt "spellinfo" +msgid "mallorntreegrow" +msgstr "Diese Ritual verstärkt die Wirkung des magischen Trankes um ein vielfaches. Wo sonst aus einem Stecken nur ein Baum sprießen konnte, so treibt nun jeder Ast Wurzeln." + +msgid "ointment_p" +msgstr "Wundsalben" + +msgid "see_travel" +msgstr "durchgereist" + +msgctxt "spellinfo" +msgid "pull_astral" +msgstr "Ein Magier, der sich in der astralen Ebene befindet, kann mit Hilfe dieses Zaubers andere Einheiten zu sich holen. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen." + +msgid "smod_far" +msgstr "Fernzauber" + +msgid "oil_p" +msgstr "Öl" + +msgctxt "keyword" +msgid "end" +msgstr "ENDE" + +msgctxt "raceinfo" +msgid "tunnelworm" +msgstr "Diese aus den Tiefen Eresseas stammende gigantische Geschöpf ist dem Leben im Untergrund hervorragend angepasst. Blind, taub und nicht besonders intelligent, aber mit seinen gewaltigen Kräften kann es ganze Berge versetzen oder Wälder roden." + +msgctxt "race" +msgid "aquarian_d" +msgstr "Meermenschen" + +msgctxt "iteminfo" +msgid "fairyboot" +msgstr "Diese aus Leder gefertigten und mit Einhornfell verzierten Stiefel ermöglichen es ihrem Träger, sich mit der doppelten Geschwindigkeit fortzubewegen, wenn er zu Fuß reist." + +msgctxt "spell" +msgid "skillmod" +msgstr "Unbekannter Effekt" + +msgctxt "race" +msgid "dreamcat" +msgstr "Traumkatze" + +msgid "elfspoil_p" +msgstr "Elfenohren" + +msgid "moneychest" +msgstr "Silberkassette" + +msgctxt "spell" +msgid "auraboost" +msgstr "Gabe des Chaos" + +msgctxt "race" +msgid "aquarian_p" +msgstr "Meermenschen" + +msgid "amulet" +msgstr "Amulett" + +msgctxt "spell" +msgid "magicresistance" +msgstr "Magieresistenz" + +msgctxt "race" +msgid "fairy" +msgstr "Fee" + +msgctxt "spell" +msgid "drain_skills" +msgstr "Schattenodem" + +msgctxt "race" +msgid "sphinx_d" +msgstr "Spinxen" + +msgctxt "coast" +msgid "se" +msgstr "Südostküste" + +msgctxt "race" +msgid "troll" +msgstr "Troll" + +msgctxt "race" +msgid "aquarian_x" +msgstr "Meermenschen" + +msgctxt "spellinfo" +msgid "meteor_rain" +msgstr "Ein Schauer von Meteoren regnet über das Schlachtfeld." + +msgctxt "school" +msgid "nomagic" +msgstr "Kein Magiegebiet" + +msgid "weight_unit" +msgstr "GE" + +msgid "BZIP2" +msgstr "BZIP2" + +msgid "firesword" +msgstr "Flammenschwert" + +msgid "nr_spells" +msgstr "Zauber" + +msgctxt "spellinfo" +msgid "earthquake" +msgstr "Der Druide beschwört mit diesem Ritual einen Elementargeist der Erde und bringt ihn dazu, die Erde erbeben zu lassen. Dieses Erdbeben wird alle Gebäude in der Region beschädigen." + +msgctxt "race" +msgid "sphinx_p" +msgstr "Spinxen" + +msgid "status_rear" +msgstr "hinten" + +msgid "east" +msgstr "Osten" + +msgctxt "spellinfo" +msgid "drain_skills" +msgstr "Entzieht Talentstufen und macht Schaden wie Großer Odem." + +msgctxt "race" +msgid "wolf" +msgstr "Wolf" + diff --git a/res/translations/strings.en.po b/res/translations/strings.en.po new file mode 100644 index 000000000..1e2dfdb1a --- /dev/null +++ b/res/translations/strings.en.po @@ -0,0 +1,5601 @@ +msgid "rustychainmail" +msgstr "rustychainmail" + +msgctxt "spellinfo" +msgid "destroy_magic" +msgstr "This spell lets a magician destroy spells on a ship, building or region." + +msgctxt "spell" +msgid "shadowknights" +msgstr "Shadow Knights" + +msgctxt "race" +msgid "snowman" +msgstr "snowman" + +msgid "par_unit" +msgstr "unitid" + +msgctxt "race" +msgid "shadowdemon_d" +msgstr "shadowdemons" + +msgctxt "coast" +msgid "sw" +msgstr "southwest coast" + +msgid "pegasus" +msgstr "pegasus" + +msgctxt "race" +msgid "sphinx_x" +msgstr "sphinx" + +msgid "truthpotion_p" +msgstr "potions of truth" + +msgid "aurafocus" +msgstr "aurafocus" + +msgid "firewall" +msgstr "firewall" + +msgid "nut_p" +msgstr "nuts" + +msgctxt "spell" +msgid "gwyrrddestroymagic" +msgstr "Banish Spirits" + +msgid "AGGRESSIV" +msgstr "AGGRESSIVE" + +msgctxt "spell" +msgid "transferauratraum" +msgstr "Dream of Magic" + +msgctxt "race" +msgid "shadowdemon_p" +msgstr "shadowdemons" + +msgid "h10_p" +msgstr "peyote" + +msgid "stat_tribe_p" +msgstr " tribes" + +msgctxt "spell" +msgid "speed" +msgstr "Double Time" + +msgctxt "race" +msgid "shadowdemon_x" +msgstr "shadowdemon" + +msgid "jadee_dress" +msgstr "wedding dress" + +msgid "halberd_p" +msgstr "halberds" + +msgctxt "spell" +msgid "fumblecurse" +msgstr "Chaos Curse" + +msgid "h13_p" +msgstr "fjord fungi" + +msgctxt "keyword" +msgid "entertain" +msgstr "ENTERTAIN" + +msgid "laensword" +msgstr "laen sword" + +msgid "greatbow_p" +msgstr "elven bows" + +msgid "person" +msgstr "man" + +msgid "JEDEM" +msgstr "EACH" + +msgctxt "spell" +msgid "eternal_walls" +msgstr "Eternal Walls" + +msgctxt "skill" +msgid "sailing" +msgstr "sailing" + +msgid "h16_p" +msgstr "gapgrowths" + +msgid "TRAENKE" +msgstr "POTIONS" + +msgid "northwest" +msgstr "northwest" + +msgctxt "race" +msgid "undeadpharaoh_d" +msgstr "undead Pharaoh" + +msgid "h19_p" +msgstr "white hemlocks" + +msgctxt "spell" +msgid "protective_runes" +msgstr "Protective Runes" + +msgid "birthdaycake_p" +msgstr "birthday cakes" + +msgctxt "keyword" +msgid "default" +msgstr "DEFAULT" + +msgid "volcano" +msgstr "volcano" + +msgid "magicbag" +msgstr "magic bag" + +msgctxt "spellinfo" +msgid "create_roqf" +msgstr "The famous bard Mirim was known for exceptionally limber play of the harp. Her spell, which is easy to ban into a little silver ring, increases the wearer's dexterity by a factor of ten, which is siad to be useful to both craftsmen and shady natures." + +msgid "rustysword_p" +msgstr "rusty swords" + +msgctxt "race" +msgid "apophis_d" +msgstr "apophis" + +msgctxt "race" +msgid "undeadpharaoh_p" +msgstr "undead Pharaohs" + +msgctxt "iteminfo" +msgid "magicbag" +msgstr "This bag encloses a dimensional fold, which can store up to 200 stones of weight without any extra burden on the bearer. Large items such as horses or carts cannot be placed inside." + +msgid "lighthouse" +msgstr "lighthouse" + +msgid "iceberg_sleep_trail" +msgstr "the glacier of %s" + +msgctxt "keyword" +msgid "reserve" +msgstr "RESERVE" + +msgctxt "calendar" +msgid "age_1" +msgstr "of the new age" + +msgctxt "prefix" +msgid "Frost" +msgstr "cold " + +msgctxt "calendar" +msgid "age_2" +msgstr "the second age" + +msgctxt "calendar" +msgid "age_3" +msgstr "the third age" + +msgctxt "race" +msgid "undeadpharaoh_x" +msgstr "undead Pharaoh" + +msgctxt "race" +msgid "youngdragon_d" +msgstr "young dragons" + +msgctxt "iteminfo" +msgid "no_info" +msgstr "No Information available." + +msgid "insectspoil_p" +msgstr "insect antenna" + +msgctxt "spell" +msgid "barkskin" +msgstr "Barkskin" + +msgctxt "spellinfo" +msgid "auraleak" +msgstr "With this dark ritual the chaos sorcerer causes a deep rift to appear in the astral balance that will tear all magical power from a region. All spellcasters in that region will lose most of their aura." + +msgctxt "race" +msgid "apophis_p" +msgstr "apophis" + +msgctxt "spell" +msgid "calm_monster" +msgstr "Calm Monster" + +msgctxt "spellinfo" +msgid "sound_out" +msgstr " Should the unit succumb to the spell, they will tell the mage everything they know about the region is question. Is no unit of their faction in that region, they'll have nothing to report. Also, they can only report, what they themselves could see. " + +msgctxt "spell" +msgid "readmind" +msgstr "Mind Probe" + +msgctxt "race" +msgid "apophis_x" +msgstr "apophis" + +msgid "nr_options" +msgstr "Options" + +msgid "GRUPPE" +msgstr "GROUP" + +msgctxt "race" +msgid "youngdragon_p" +msgstr "young dragons" + +msgctxt "spellinfo" +msgid "cerddorfumbleshield" +msgstr "The screeching sounds of this melody can be heard across the whole battlefield. Wizards exposed to these special dissonances find it nearly impossible to concentrate on their spells." + +msgctxt "prefix" +msgid "Sonnen" +msgstr "sun " + +msgctxt "race" +msgid "youngdragon_x" +msgstr "young dragon" + +msgctxt "spellinfo" +msgid "calm_monster" +msgstr " This disarming chant can tame almost any intelligent monster. It will refrain from attacks on the mage and his companions. But one should not deceive oneself about the persisting unpredictable nature of the creature. " + +msgctxt "spell" +msgid "clone" +msgstr "Doppelganger" + +msgctxt "spellinfo" +msgid "concealing_aura" +msgstr "This spell will hide the whole equipment of a target unit from the looks of others." + +msgctxt "spell" +msgid "bloodsacrifice" +msgstr "Lesser Sacrifice" + +msgid "EINHEIT" +msgstr "UNIT" + +msgid "magictower" +msgstr "mage tower" + +msgctxt "spellinfo" +msgid "migration" +msgstr " This ritual facilitates the migration of an unit to the own faction. The candidate has to be able and willing to leave his previous faction. He attests to that by CONTACTing the mage and will otherwise be occupied with preparations for the ritual. The ritual will fail, if the candidate owes the previous faction fealty for an expensive training. The mage performing the ritual has to invest permanent aura to bind the candidate to the faction. Per level and per point of permanent aura the mage can bind one person. " + +msgctxt "race" +msgid "illusion" +msgstr "illusion" + +msgid "stonecircle" +msgstr "stonecircle" + +msgid "p0" +msgstr "seven mile tea" + +msgid "p3" +msgstr "busybeer" + +msgid "balloon_a" +msgstr "a balloon" + +msgid "jadee_ring" +msgstr "Jadee's wedding ring" + +msgid "mallorntree" +msgstr "mallorn" + +msgid "p6" +msgstr "brain wax" + +msgid "p7" +msgstr "duncebun" + +msgctxt "iteminfo" +msgid "firesword" +msgstr "The flaming sword gives its bearer an attack of 3d6+10 plus an additional fireball causing 2d6 damage to 1-10 victims. Using a flaming sword requires a minimum skill of 7. It grants an additional +1 to your skill and your resistance to magic will be increased." + +msgid "p9" +msgstr "horsepower potion" + +msgid "stat_hitpoints" +msgstr "hitpoints" + +msgctxt "damage" +msgid "strong" +msgstr "strong" + +msgctxt "race" +msgid "dragon_d" +msgstr "dragons" + +msgid "stat_defense" +msgstr "defense" + +msgid "demonspoil_p" +msgstr "demon blood" + +msgid "dwarfspoil_p" +msgstr "dwarven beards" + +msgid "sword" +msgstr "sword" + +msgctxt "race" +msgid "cat" +msgstr "cat" + +msgctxt "race" +msgid "mummy" +msgstr "mummy" + +msgctxt "race" +msgid "braineater" +msgstr "braineater" + +msgid "nr_size" +msgstr "size" + +msgid "axe" +msgstr "axe" + +msgid "blessedstonecircle" +msgstr "blessed stonecircle" + +msgctxt "race" +msgid "dragon_p" +msgstr "dragons" + +msgid "aots_p" +msgstr "amulets of true seeing" + +msgctxt "race" +msgid "dragon_x" +msgstr "dragon" + +msgctxt "spellinfo" +msgid "gwyrrdfumbleshield" +msgstr "This ritual summons some Elemental Spirits of Magic and sends them into the ranks of the enemy mages. Casting spells will be much harder for them during the battle." + +msgid "antimagic_p" +msgstr "antimagic crystals" + +msgctxt "race" +msgid "shadowdemon" +msgstr "shadowdemon" + +msgid "weight_per" +msgstr "stone per" + +msgid "nestwarmth_p" +msgstr "potions of nest warmth" + +msgctxt "race" +msgid "irongolem_d" +msgstr "irongolems" + +msgid "sphereofinv_p" +msgstr "spheres of invisibility" + +msgid "nr_trade_end" +msgstr "." + +msgctxt "spellinfo" +msgid "firewall" +msgstr "The spell creates an opaque wall of fire in the gives direction that will harm anyone passing through it." + +msgctxt "border" +msgid "gate_open" +msgstr "massive open door" + +msgctxt "spellinfo" +msgid "magicboost" +msgstr "The sorcerer opens his mind to the Spheres of Chaos so that he can access a greater ammount of magical power for a while. But the help of the Chaos Lords has its price - and so the period of power will be followed by a period of weakness." + +msgctxt "race" +msgid "irongolem_p" +msgstr "irongolems" + +msgid "snowman_p" +msgstr "snowmen" + +msgid "Sommer" +msgstr "summer" + +msgid "laenshield_p" +msgstr "laen shields" + +msgctxt "spellinfo" +msgid "break_curse" +msgstr "This spell allows a magician to remove a specific enchantment from a unit, ship, bulding or region. " + +msgctxt "race" +msgid "irongolem_x" +msgstr "irongolem" + +msgid "balloon" +msgstr "balloon" + +msgctxt "spellinfo" +msgid "draigfumbleshield" +msgstr "This ritual, performed before a battle, causes the astral energies on the battlefield to whirl and churn and thereby makes spellcasting more difficult for the enemy mages." + +msgid "nr_schemes_postfix" +msgstr " can be discerned." + +msgid "SILBER" +msgstr "SILVER" + +msgid "h0_p" +msgstr "flatroots" + +msgid "humanspoil_p" +msgstr "human scalps" + +msgctxt "keyword" +msgid "forget" +msgstr "FORGET" + +msgid "nestwarmth" +msgstr "potion of nest warmth" + +msgctxt "skill" +msgid "tactics" +msgstr "tactics" + +msgid "laenmail" +msgstr "laen chainmail" + +msgid "orcspoil" +msgstr "orc tusk" + +msgctxt "spell" +msgid "sleep" +msgstr "Sleep" + +msgctxt "race" +msgid "rat" +msgstr "rat" + +msgid "faction_help" +msgstr "We are helping" + +msgid "lifepotion" +msgstr "water of life" + +msgid "rustyhalberd" +msgstr "rusty halberd" + +msgid "h3_p" +msgstr "spider ivies" + +msgctxt "skill" +msgid "building" +msgstr "masonry" + +msgctxt "spell" +msgid "summonshadow" +msgstr "Summon Shadowdemons" + +msgid "unknown_faction_dative" +msgstr "an unknown faction" + +msgid "SHOWSKCHANGE" +msgstr "SKILLCHANGES" + +msgid "h6_p" +msgstr "bugleweeds" + +msgid "firesword_p" +msgstr "flaming swords" + +msgctxt "keyword" +msgid "origin" +msgstr "ORIGIN" + +msgctxt "spellinfo" +msgid "raise_mob" +msgstr " Employing this magic chant the mage convinces the peasants of the region to join him. The peasants won't leave their home region and won't give up their possessions, though. Additionally each week some peasants will shake off the spell and return to their fields. How many peasants join the mage depends on the power of his chant. " + +msgid "wand" +msgstr "wand" + +msgctxt "spellinfo" +msgid "summonshadow" +msgstr "With the help of dark rituals the sorcerer summons demons from the Sphere of Shadows. These fearsome creatures can walk almost unseen among the living, but their dark aura can be sensed by everyone. Shadow demons are feared in combat for they are hard to hit and have the ability to drain strength from their victims." + +msgid "aurapotion50" +msgstr "aura potion" + +msgid "h9_p" +msgstr "waterfinders" + +msgid "tree" +msgstr "tree" + +msgctxt "race" +msgid "redscarab" +msgstr "red scarab" + +msgctxt "race" +msgid "wolf_d" +msgstr "wolves" + +msgctxt "race" +msgid "museumghost_d" +msgstr "museumghosts" + +msgid "sehr viele" +msgstr "a great many" + +msgid "section_economy" +msgstr "Economy and Trade" + +msgid "mallornlance_p" +msgstr "mallorn lances" + +msgctxt "spell" +msgid "sparkle" +msgstr "Unknown Effect" + +msgctxt "race" +msgid "wolf_p" +msgstr "wolves" + +msgctxt "spellinfo" +msgid "living_rock" +msgstr " This draining ritual summons a gigantic earth elemental from a sphere of laen and binds it to a building. The elemental can then be commanded to move the building with all its occupants to a neighbouring region. The strength of the elemental depends of the mage's skill: it can move up to [level-12]*250 size units of building. The building won't remain undamaged by the process. " + +msgctxt "race" +msgid "museumghost_p" +msgstr "museumghosts" + +msgctxt "race" +msgid "catdragon" +msgstr "catdragon" + +msgctxt "spell" +msgid "summonundead" +msgstr "Animate Dead" + +msgctxt "race" +msgid "gnome_d" +msgstr "gnomes" + +msgctxt "race" +msgid "wolf_x" +msgstr "wolf" + +msgctxt "race" +msgid "hellcat_d" +msgstr "hellcats" + +msgctxt "race" +msgid "museumghost_x" +msgstr "museumghost" + +msgid "stat_armor" +msgstr "armor" + +msgctxt "race" +msgid "snowman_p" +msgstr "snowmen" + +msgctxt "spellinfo" +msgid "hail" +msgstr "During a battle the druid calls the Elemental Spirits of Cold and binds them to himself. Then he commands them to attack his foes with hail and ice missiles." + +msgctxt "keyword" +msgid "pay" +msgstr "PAY" + +msgctxt "race" +msgid "gnome_p" +msgstr "gnomes" + +msgid "mine" +msgstr "mine" + +msgctxt "calendar" +msgid "secondweek" +msgstr "the second week" + +msgctxt "race" +msgid "hellcat_p" +msgstr "hellcats" + +msgctxt "spellinfo" +msgid "summonundead" +msgstr "For many nights the sorcerer has to roam the graveyards and former battlefields of a region in order to find corpses to animate. The Undead will serve his will, but beware! Dealing with the mysteries of unlife can be a dangerous thing." + +msgctxt "keyword" +msgid "buy" +msgstr "BUY" + +msgid "southwest" +msgstr "southwest" + +msgid "forest_trail" +msgstr "the forests of %s" + +msgctxt "spell" +msgid "gbdream" +msgstr "Good Dreams or Bad Dreams" + +msgctxt "race" +msgid "gnome_x" +msgstr "gnome" + +msgctxt "race" +msgid "dracoid" +msgstr "dracoid" + +msgctxt "race" +msgid "hellcat_x" +msgstr "hellcat" + +msgid "TEMP" +msgstr "TEMPORARY" + +msgctxt "race" +msgid "shadowmaster_d" +msgstr "shadowmasters" + +msgctxt "race" +msgid "redscarab_d" +msgstr "red scarab" + +msgid "aurapotion50_p" +msgstr "aura potions" + +msgctxt "spell" +msgid "sound_out" +msgstr "Sound out" + +msgctxt "race" +msgid "seaserpent_d" +msgstr "sea serpents" + +msgctxt "spellinfo" +msgid "antimagiczone" +msgstr "This spell allows a magician to create a local instability in the astral field. This zone needs to return to its equilibrium, soaking up part of the power of all spells cast in the region - or even all of some of the weaker ones. " + +msgid "villagers" +msgstr "Villagers" + +msgctxt "spellinfo" +msgid "disturbingdreams" +msgstr "This spell causes insomnia and restlessness in a whole region for several weeks. All affected persons will learn much slower than normal." + +msgctxt "spellinfo" +msgid "raindance" +msgstr "This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasant's harvest will be extraordinary good." + +msgid "wdw_pyramid" +msgstr "pyramid" + +msgid "plain" +msgstr "plain" + +msgctxt "race" +msgid "shadowmaster_p" +msgstr "shadowmaster" + +msgid "unarmed" +msgstr "unarmed" + +msgctxt "race" +msgid "redscarab_p" +msgstr "red scarabs" + +msgctxt "race" +msgid "seaserpent_p" +msgstr "sea serpents" + +msgctxt "spell" +msgid "cerddor_destroymagic" +msgstr "Silence Dissonance" + +msgid "birthday_firework_p" +msgstr "fireworks" + +msgctxt "spellinfo" +msgid "homestone" +msgstr "With this spell the druid eternally binds the powers of earth to the walls of the castle in which he currently is. No magic and no ballistic attacks will ever be able to destroy a wall that has been fortified in this way and the castle will also be less affected by aging. In addition, the building will provide a better protection against attacks by sword or by magic." + +msgctxt "spell" +msgid "fogtrap" +msgstr "an unknown spell" + +msgid "dreameye" +msgstr "dreameye" + +msgctxt "race" +msgid "shadowmaster_x" +msgstr "shadowmaster" + +msgid "adamantium" +msgstr "adamantium" + +msgid "seashell" +msgstr "seashell" + +msgctxt "race" +msgid "redscarab_x" +msgstr "red scarab" + +msgid "adamantiumplate" +msgstr "adamantium plate" + +msgctxt "spell" +msgid "transferauradruide" +msgstr "Meditate" + +msgctxt "iteminfo" +msgid "dreameye" +msgstr "This enchanted dragon-eye has to be eaten by the leader of your forces on the eve before battle. During the night he gains insight into the dreams of the enemy leaders and may potentially glean a decisive advantage." + +msgid "nr_mallorntree_p" +msgstr "mallorn trees" + +msgctxt "iteminfo" +msgid "seashell" +msgstr "This badge pronounces its wearer an official visitor to the embassies of Muschelplateau." + +msgctxt "border" +msgid "a_road" +msgstr "a road" + +msgctxt "race" +msgid "seaserpent_x" +msgstr "sea serpent" + +msgctxt "spell" +msgid "astralblock" +msgstr "Astral Disruption" + +msgctxt "spell" +msgid "migration" +msgstr "Rit of Acceptance" + +msgid "SCHIFF" +msgstr "SHIP" + +msgctxt "race" +msgid "littlescarab" +msgstr "little scarab" + +msgid "spice_p" +msgstr "spice" + +msgctxt "spell" +msgid "sacrifice_strength" +msgstr "Sacrifice Strength" + +msgid "nr_building_inprogress" +msgstr " (under construction)" + +msgid "ring_of_levitation_p" +msgstr "rings of levitation" + +msgctxt "spell" +msgid "song_resist_magic" +msgstr "Song of the Youthful Spirit" + +msgid "attack_standard" +msgstr "an attack with a weapon or an unarmed attack" + +msgid "b_armor" +msgstr "armour" + +msgctxt "skill" +msgid "riding" +msgstr "riding" + +msgctxt "calendar" +msgid "thirdweek" +msgstr "the last week" + +msgid "furious_mob" +msgstr "Furious peasants" + +msgctxt "skill" +msgid "catapult" +msgstr "catapult" + +msgid "pyramid" +msgstr "pyramid" + +msgctxt "spellinfo" +msgid "big_recruit" +msgstr " From 'Journeys' by Firudin the Wise: 'There's a small, scarcely visited inn in Weilersweide, near Wytharhafen. It is a little known fact, that it was home to the banished itinerant preacher Grauwolf until a few years ago. After he recruited almost the whole peasantry with one of his notorious speeches, he was convicted and banished for inciting unrest. Only hesitantly did he disclose the secret to his powers of persuasion to me.' " + +msgid "catapultammo" +msgstr "ammunition" + +msgctxt "skill" +msgid "quarrying" +msgstr "quarrying" + +msgid "HELFE" +msgstr "HELP" + +msgctxt "describe" +msgid "healing" +msgstr "For a healing potion one takes the peel of a windbag and some bugleweed, stirr in some chopped elvendear and sprinkle it with the blossoms of an ice begonia. This has to cook through for four days, while a gapgrowth has to be added on the second day. Then one carefully scoops off the top layer of liquid. One such potion gives four men (or one man four times) a 50% chance to survive otherwise lethal wounds. The potion is automatically used in case of injury." + +msgctxt "race" +msgid "orc_d" +msgstr "orcs" + +msgid "stat_pierce" +msgstr "Is hard to hit by piercing weapons." + +msgid "snowglobe" +msgstr "snow globe" + +msgid "rustygreatsword_p" +msgstr "rusty claymores" + +msgctxt "keyword" +msgid "email" +msgstr "EMAIL" + +msgctxt "spellinfo" +msgid "analysesong_unit" +msgstr "Each and every living being has its own, individual 'life-song'. No two of these songs are alike, even though songs of creatures of the same species are similar. Every spell alters this song of life in one way or the other and this can be identified. By casting this spell, the bard can detect all those magic variations in a person's 'life-song'. You will be able to decipher all enchantments or spells, which aren't disguised beyond your capability." + +msgctxt "spell" +msgid "fiery_dragonbreath" +msgstr "Fiery Dragonbreath" + +msgid "oil" +msgstr "oil" + +msgctxt "iteminfo" +msgid "birthdaycake" +msgstr "A birthday cake with 10 candles. Happy Birthday, Eressea!" + +msgid "jewel_p" +msgstr "gems" + +msgid "boat_a" +msgstr "a boat" + +msgctxt "race" +msgid "orc_p" +msgstr "orcs" + +msgctxt "race" +msgid "nymph" +msgstr "nymph" + +msgctxt "spellinfo" +msgid "immolation" +msgstr "Injures all enemies." + +msgctxt "race" +msgid "sphinx" +msgstr "sphinx" + +msgctxt "coast" +msgid "e" +msgstr "east coast" + +msgid "harbour" +msgstr "harbour" + +msgid "truthpotion" +msgstr "potion of truth" + +msgid "northeast" +msgstr "northeast" + +msgctxt "spell" +msgid "analyze_magic" +msgstr "Analyze Magic" + +msgid "sehr wenige" +msgstr "very few" + +msgctxt "race" +msgid "orc_x" +msgstr "orc" + +msgctxt "race" +msgid "tunnelworm" +msgstr "tunnelworm" + +msgid "stardust_p" +msgstr "stardust" + +msgctxt "race" +msgid "peasant" +msgstr "peasant" + +msgid "mallorncrossbow_p" +msgstr "mallorn crossbows" + +msgctxt "spellinfo" +msgid "summonent" +msgstr "With the help of this spell the druid awakens the ents who are slumbering in the forests of a region from aeons of sleep. These strange tree-creatures will join him and aid his cause, but after a while they will sink back into their slumber." + +msgid "LOCALE" +msgstr "LOCALE" + +msgctxt "coast" +msgid "w" +msgstr "west coast" + +msgctxt "keyword" +msgid "message" +msgstr "MESSAGE" + +msgctxt "spellinfo" +msgid "barkskin" +msgstr "Performing this ritual before going into battle gives your troups an additional bonus to their armor. Every hit reduces the energy of the spell, dissolving it at some point during battle." + +msgid "goliathwater" +msgstr "goliath water" + +msgid "person_p" +msgstr "men" + +msgctxt "spellinfo" +msgid "readmind" +msgstr "With this spell the mentalist penetrates the thoughts and dreams of his victim to reveal his most intimate secrets. The target's faction, skills and possessions will no longer be unknown." + +msgid "lance" +msgstr "lance" + +msgid "almond" +msgstr "almond" + +msgctxt "spell" +msgid "acidrain" +msgstr "Acid Rain" + +msgid "battle_attack" +msgstr "Attacked against" + +msgctxt "race" +msgid "insect_d" +msgstr "insects" + +msgctxt "spellinfo" +msgid "bad_dreams" +msgstr " This spell enables the dreamer to disturb the sleep of all non-allied units (HELP GUARD) in the region so severely they lose parts of their memories. " + +msgctxt "spellinfo" +msgid "bloodthirst" +msgstr " Like many magic chants this one also originates from the ancient knowledge of the cats who always were aware of the powerful effect of the voice. This song inflames the temper of the warriors, enrages them even, into a murderous frenzy. Ignoring their own pain, they fight until death and will never flee from battle. They fight with little regard for themselves. " + +msgctxt "spell" +msgid "nodrift" +msgstr "Water Elemental" + +msgctxt "spell" +msgid "combat_speed" +msgstr "Acceleration" + +msgctxt "spell" +msgid "Feuerwand" +msgstr "Firewall" + +msgctxt "race" +msgid "irongolem" +msgstr "irongolem" + +msgid "snowman" +msgstr "snowman" + +msgid "PRIVAT" +msgstr "PRIVATE" + +msgid "PUNKTE" +msgstr "SCORE" + +msgctxt "race" +msgid "insect_p" +msgstr "insects" + +msgctxt "spellinfo" +msgid "goodwinds" +msgstr "While being aboard a ship, the druid uses this ritual to force the Elemental Spirits of Water to serve him and commands them to carry the ship across the water at a higher speed. In addition, the ship will not be affected by unfavourable winds or currents." + +msgctxt "spellinfo" +msgid "astral_disruption" +msgstr " This spell causes a severe disturbance of the atral plane. Within an astral radius of level/5 regions all astral creatures not able to resist the spell will be thrown from the astral plane. The astral contact with all affected regions will be disrupted for level/3 weeks. " + +msgctxt "spell" +msgid "earthquake" +msgstr "Summon Earth Elemental" + +msgid "unknownunit" +msgstr "an unknown unit" + +msgctxt "spell" +msgid "raise_mob" +msgstr "Mob Rule" + +msgid "stat_bash" +msgstr "Is hard to hit by blunt weapons and catapults." + +msgctxt "spellinfo" +msgid "combat_speed" +msgstr " This spell accelerates some fighters of the own side, which empowers them to attack twice every round throughout the battle. " + +msgctxt "keyword" +msgid "claim" +msgstr "CLAIM" + +msgctxt "race" +msgid "insect_x" +msgstr "insect" + +msgid "corridor1" +msgstr "corridor" + +msgctxt "spellinfo" +msgid "windshield" +msgstr "Calling the Elemental Spirits of Wind conjurs up sudden breezes, small whirlwinds and minor turbulences that will hinder enemy archers." + +msgid "papyrus_p" +msgstr "papyri" + +msgid "trireme" +msgstr "trireme" + +msgctxt "keyword" +msgid "alliance" +msgstr "ALLIANCE" + +msgctxt "spell" +msgid "song_of_healing" +msgstr "Blessed Harvest" + +msgid "sapling" +msgstr "sapling" + +msgid "vial_p" +msgstr "vials" + +msgid "rustyshield" +msgstr "rusty shield" + +msgid "quarry" +msgstr "quarry" + +msgid "scale_p" +msgstr "pangolins" + +msgctxt "spellinfo" +msgid "firestorm" +msgstr "Kills enemies with fire." + +msgctxt "spellinfo" +msgid "strongwall" +msgstr "At the beginning of a battle, the magician binds some Elemental Spirits of Rock to the walls of the builing in which he currently is. The structure will then provide a better protection against attacks by sword or by magic." + +msgctxt "race" +msgid "seaserpent" +msgstr "sea serpent" + +msgctxt "spellinfo" +msgid "fish_shield" +msgstr " This spell can project a slightly distorted image of the own troops, like the surface of the lake distorts the position of a fish. Half the damage of each hit can be deflected harmlessly through those means. The shield will only last a few hundred hits before it dissipates. The stronger the mage, the more damage the shield can take. " + +msgid "section_newpotions" +msgstr "New Potions" + +msgctxt "border" +msgid "an_illusionwall" +msgstr "an illusionary wall" + +msgctxt "race" +msgid "apepsnake" +msgstr "apepsnake" + +msgctxt "race" +msgid "dracoid_d" +msgstr "dracoids" + +msgid "roqf_p" +msgstr "rings of quick fingers" + +msgctxt "spell" +msgid "create_chastitybelt" +msgstr "Create An Amulet of Chastity" + +msgctxt "school" +msgid "common" +msgstr "common" + +msgid "fairyboot_p" +msgstr "fairy boots" + +msgid "FREMDES" +msgstr "FOREIGN" + +msgctxt "race" +msgid "dracoid_p" +msgstr "dracoids" + +msgid "nr_trade_final" +msgstr "and" + +msgid "Winter" +msgstr "winter" + +msgid "mistletoe" +msgstr "mistletoe" + +msgid "mallorncrossbow" +msgstr "mallorn crossbow" + +msgctxt "spell" +msgid "illaundestroymagic" +msgstr "Remove Dreams" + +msgctxt "race" +msgid "goblin_d" +msgstr "goblins" + +msgid "eyeofdragon_p" +msgstr "eye of dragons" + +msgctxt "spellinfo" +msgid "shockwave" +msgstr "A wave of pure force spreads out from the magician, crashing into the enemy ranks. Many warriors are thrown off balance and are briefly unable to attack." + +msgctxt "race" +msgid "dracoid_x" +msgstr "dracoid" + +msgctxt "race" +msgid "special" +msgstr "special" + +msgid "lebkuchenherz" +msgstr "gingerbread heart" + +msgid "desert" +msgstr "desert" + +msgctxt "iteminfo" +msgid "snowglobe" +msgstr " A sphere with a diameter of three inches made of crystal glass, sitting on a granite base. On the inside countless tiny snowflakes dance around lively. On the bottom of the base a golden compass rose is engraved. A beautiful sight to behold, but it emanates a nameless cold. Among mages and others knowledgeable in the arcane arts the function and effect of the artefact are disputed intensely. Although there is agreement about something: upon release the intensity of the contained cold would have permanent repercussions for a large area. Gigantic fires would be extinguished, volcanos quelled and large bodies of water frozen solid. In less extreme environments permanent changes were also probable. Therefore it isn't recommended to drop the cold treasure. It should be thrown far off instead, while making sure there is no living being within the impact zone, if one is willing to risk the usage. (USE \"snow globe\" ) " + +msgctxt "race" +msgid "dolphin" +msgstr "dolphin" + +msgid "bow_p" +msgstr "bows" + +msgctxt "race" +msgid "goblin_p" +msgstr "goblins" + +msgctxt "spellinfo" +msgid "song_of_slavery" +msgstr " This powerful spell robs the victim of their own free will and enslaves them to the commands of the bard. For some time the victim will turn their back on their own people and join the faction of the bard. " + +msgctxt "spell" +msgid "healingzone" +msgstr "Zone of Healing" + +msgctxt "keyword" +msgid "follow" +msgstr "FOLLOW" + +msgctxt "race" +msgid "goblin_x" +msgstr "goblin" + +msgctxt "spellinfo" +msgid "earn_silver#gwyrrd" +msgstr "The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets, their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 50 silver pieces per level in this way." + +msgctxt "spell" +msgid "raindance" +msgstr "Rain Dance" + +msgid "goblinspoil_p" +msgstr "goblinheads" + +msgctxt "keyword" +msgid "study" +msgstr "LEARN" + +msgctxt "describe" +msgid "nestwarmth" +msgstr "A potion of nest warmth allows an insect to recruit outside of a desert region in winter. The learned alchemist prepares this by taking a peyote, mixing it with a portion of gapgrowth which has been gathered during a clear, starry night. To dispell winter, add some blossoms of the ice begonia in the mix, and stirr everything together with a spider ivy until it turns a nice shade of violet. One vial supplies an entire region for a whole week." + +msgid "attack_natural" +msgstr "an unarmed attack" + +msgid "ZAUBER" +msgstr "SPELLS" + +msgid "mallorn" +msgstr "mallorn" + +msgid "mallorn_p" +msgstr "mallorn" + +msgctxt "describe" +msgid "lifepotion" +msgstr "The \"Water of Life\" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood." + +msgid "thickfog_trail" +msgstr "%s" + +msgctxt "spell" +msgid "homestone" +msgstr "Homestone" + +msgid "permaura" +msgstr "permaura" + +msgctxt "race" +msgid "skeletonlord" +msgstr "skeleton lord" + +msgid "nr_inventory" +msgstr "has" + +msgid "section_events" +msgstr "Events" + +msgid "battle_helpers" +msgstr "Helping" + +msgid "incense_p" +msgstr "incense" + +msgid "iron" +msgstr "iron" + +msgctxt "spellinfo" +msgid "gooddreams" +msgstr "This spell allows the mentalist to influence the sleep of all allied units in a region in such a way that they will gain a bonus to all talents for some time." + +msgctxt "spell" +msgid "earn_silver#illaun" +msgstr "Divination" + +msgid "hero_p" +msgstr "heroes" + +msgid "mallornspear" +msgstr "mallorn spear" + +msgctxt "prefix" +msgid "Schnee" +msgstr "snow " + +msgid "ao_healing" +msgstr "amulet of healing" + +msgid "inn" +msgstr "inn" + +msgctxt "border" +msgid "firewall" +msgstr "firewall" + +msgctxt "spellinfo" +msgid "create_invisibility_sphere" +msgstr "Using this spell the magician can create a Sphere of Invisibility. This artefact hides the person bearing it and one hundred persons in the same unit." + +msgid "unit" +msgstr "unit" + +msgid "smod_nofamiliar" +msgstr "magicians only" + +msgid "seed_p" +msgstr "seeds" + +msgctxt "spellinfo" +msgid "transferaurachaos" +msgstr "With the help of this spell, the caster can transfer aura at a ratio of 2:1 to another member of the same school of magic." + +msgid "trollspoil" +msgstr "troll horn" + +msgctxt "spellinfo" +msgid "great_drought" +msgstr " This powerful ritual opens a gate to the elemental plane of fire. A great drought comes over the land. Farmers, animals and plants of the region are fighting for survival, but only half of all living things will be able to survive a drought like this. The region will suffer the consequences of such a drought for years to come. " + +msgid "fog" +msgstr "fog" + +msgid "catspoil_p" +msgstr "cat tails" + +msgid "iron_p" +msgstr "iron" + +msgctxt "prefix" +msgid "See" +msgstr "sea " + +msgctxt "spell" +msgid "disturbingdreams" +msgstr "Insomnia" + +msgid "elfspoil" +msgstr "elven ear" + +msgctxt "iteminfo" +msgid "trollspoil" +msgstr "The horn of an adult troll. No troll would ever part with this while he's alive." + +msgctxt "spellinfo" +msgid "icastle" +msgstr "With this spell the mentalist can create the illusion of any building. The illusion can be entered, but it has no function and requires no maintenance. It will remain existing for several weeks." + +msgid "dreameye_p" +msgstr "dreameyes" + +msgid "peasantblood" +msgstr "peasant blood" + +msgid "caravan" +msgstr "caravanserei" + +msgctxt "race" +msgid "human" +msgstr "human" + +msgid "museumexitticket_p" +msgstr "returntickets for the grand museum" + +msgctxt "spell" +msgid "summonent" +msgstr "Awakening of the Ents" + +msgid "southeast" +msgstr "southeast" + +msgctxt "spellinfo" +msgid "reelingarrows" +msgstr "This summons opens a gate to the plane of Elemental Spirits of Wind. Immediately, strong winds or even storms will rise near the gate and hinder all archers during a battle." + +msgid "adamantiumplate_p" +msgstr "adamantium plates" + +msgid "log" +msgstr "wood" + +msgid "presspass_p" +msgstr "presspasses" + +msgctxt "race" +msgid "bluescarab" +msgstr "blue scarab" + +msgctxt "school" +msgid "draig" +msgstr "Draig" + +msgctxt "spellinfo" +msgid "create_runesword" +msgstr "This spell creates a magical sword. It requires a skill of at least 7, but adds +4 to the combat skill of its' owner as well as making them almost immune against magical attacks." + +msgctxt "spell" +msgid "magicboost" +msgstr "Chaos Gift" + +msgctxt "iteminfo" +msgid "mistletoe" +msgstr "The magical misteltoe has a wonderous property: It's use will make one person able to escape unharmed from every conflict, no enemy will lay hand on the bearer for one week." + +msgctxt "skill" +msgid "taxation" +msgstr "taxation" + +msgctxt "race" +msgid "undeadpharaoh" +msgstr "undead Pharaoh" + +msgctxt "spell" +msgid "heroic_song" +msgstr "Epic Heroes" + +msgctxt "spell" +msgid "mallorntreegrow" +msgstr "Bless Mallorn Logs" + +msgctxt "race" +msgid "littlescarab_d" +msgstr "little scarab" + +msgctxt "keyword" +msgid "hide" +msgstr "HIDE" + +msgctxt "keyword" +msgid "move" +msgstr "MOVE" + +msgctxt "spellinfo" +msgid "create_dreameye" +msgstr "An enchanted eye of a dragon gives the person who eats it for supper the power to see other people's dreams. For a long time this abillity was counted as beeing useless until the former elfish mistress for theurgy of war, Liarana Sonnentau from the academy Thall, presented a special appliance for this artefact: Before a battle captains often have an uncomfortable sleep and betray their plans in their dreams. This might give the user of the artefact a small advantage in the upcoming battle, but be warned: Interpreting dreams is a difficult exercise." + +msgid "demonspoil" +msgstr "demon blood" + +msgctxt "damage" +msgid "plusstrong" +msgstr "super strong" + +msgctxt "race" +msgid "littlescarab_p" +msgstr "little scarab" + +msgid "an_unknown_ship" +msgstr "an unknown ship" + +msgctxt "keyword" +msgid "describe" +msgstr "DESCRIBE" + +msgid "roi" +msgstr "ring of invisibility" + +msgid "caravel_a" +msgstr "a caravel" + +msgid "mallornspear_p" +msgstr "mallorn spear" + +msgid "DEBUG" +msgstr "DEBUG" + +msgid "GEBAEUDE" +msgstr "BUILDING" + +msgctxt "spell" +msgid "goodwinds" +msgstr "Summon Water Elemental" + +msgctxt "spellinfo" +msgid "blessedharvest" +msgstr "This ritual increases the output of the local farms. Peasants in the region produce an extra silverpiece. The stronger the druid's spell is, the longer the effect will last." + +msgid "KRAEUTER" +msgstr "HERBS" + +msgctxt "spellinfo" +msgid "rustweapon" +msgstr "This ritual conjurs up a dark thunderstorm that affects a whole region. The magic rain will let rust any ore. Iron weapons and armor will get rusty. The exact number of items affected by the rain depends on the ammount of power invested by the magician. Up to ten weapons can be destroyed per level - a Ring of Power increases the effect like an additional level." + +msgctxt "race" +msgid "littlescarab_x" +msgstr "little scarab" + +msgid "rop" +msgstr "ring of power" + +msgid "wall1" +msgstr "Wall" + +msgid "ror" +msgstr "ring of regeneration" + +msgctxt "spell" +msgid "analysesong_unit" +msgstr "Analyze Song of Life" + +msgid "runesword_p" +msgstr "runeswords" + +msgctxt "race" +msgid "ghost" +msgstr "ghost" + +msgctxt "spell" +msgid "farvision" +msgstr "an unknown spell" + +msgctxt "spell" +msgid "icastle" +msgstr "Castle of Illusion" + +msgid "newbie_info_cr" +msgstr "With the first two turns, you will get a computer report (CR). It can be used with some tools like Magellan. If you want to continue getting it after the second turn, please make one of your units give the order OPTION COMPUTER." + +msgctxt "keyword" +msgid "report" +msgstr "REPORT" + +msgctxt "spellinfo" +msgid "puttorest" +msgstr "This ritual calms the tortured souls of those who died a violent death and finally releases them to the Otherlands. About 50 souls per level of the spell will be released. The spell will not affect existing undead, because they are too strongly tied to the Material World." + +msgid "aura_p" +msgstr "auras" + +msgid "key_p" +msgstr "keys" + +msgctxt "spell" +msgid "song_of_peace" +msgstr "Song of Peace" + +msgctxt "spell" +msgid "firestorm" +msgstr "Firestorm" + +msgctxt "school" +msgid "cerddor" +msgstr "Cerddor" + +msgctxt "spell" +msgid "create_aots" +msgstr "Create An Amulet of True Sight" + +msgctxt "prefix" +msgid "black" +msgstr "black " + +msgctxt "spellinfo" +msgid "magic_roots" +msgstr " Through a elaborate ritual a druid permanently channels a fragment of his power into the soil and the forests of the region. This forever changes the equilibrium of nature in the region. From this point on only the fierce but strong mallorn trees will grow there. " + +msgctxt "race" +msgid "undead_d" +msgstr "undead" + +msgctxt "calendar" +msgid "thirdweek_d" +msgstr "of the third week" + +msgctxt "spellinfo" +msgid "leaveastral" +msgstr "By concentrating on the structure of reality, the magician can breach it and thus briefly make a gateway to leave the astral plane. He can transport up to (level-3)*15 GE through the portal. If the magician is able to cast at at least level 11, he can even transport other units against their will." + +msgid "VORNE" +msgstr "FRONT" + +msgctxt "spellinfo" +msgid "tybiedfumbleshield" +msgstr "This spell creates an antimagic field around the mages of the enemies and considerably hinders their spells. Only few will have the power to break through the field and be able to help their troops in battle." + +msgid "adamantiumaxe" +msgstr "adamantium axe" + +msgid "skillpotion_p" +msgstr "potions of skills" + +msgctxt "race" +msgid "undead_p" +msgstr "undead" + +msgctxt "race" +msgid "imp" +msgstr "imp" + +msgid "ZUGVORLAGE" +msgstr "TEMPLATE" + +msgctxt "race" +msgid "shadowbat_d" +msgstr "darkbats" + +msgctxt "race" +msgid "nightmare_d" +msgstr "nightmares" + +msgid "sptype_precombat" +msgstr "pre-combat spell" + +msgid "nr_spell_level" +msgstr "Level:" + +msgctxt "spell" +msgid "create_magicherbbag" +msgstr "Create A Magical Herb Pouch" + +msgctxt "spell" +msgid "shockwave" +msgstr "Shockwave" + +msgctxt "race" +msgid "undead_x" +msgstr "undead" + +msgid "mallorntree_p" +msgstr "mallorn" + +msgid "castle" +msgstr "castle" + +msgid "nr_borderlist_infix" +msgstr ", to the " + +msgctxt "race" +msgid "shadowbat_p" +msgstr "darkbats" + +msgctxt "iteminfo" +msgid "apple" +msgstr "A tasty fruit." + +msgctxt "race" +msgid "nightmare_p" +msgstr "nightmares" + +msgctxt "spellinfo" +msgid "shadowknights" +msgstr "This spell creates illusionary duplicates of allied troops. The shadow knights can't do real damage and are instantly destroyed if wounded." + +msgctxt "keyword" +msgid "password" +msgstr "PASSWORD" + +msgctxt "prefix" +msgid "Nacht" +msgstr "night " + +msgctxt "spell" +msgid "fetch_astral" +msgstr "Call of Reality" + +msgid "nr_mourning" +msgstr " (in mourning)" + +msgctxt "spellinfo" +msgid "analyse_object" +msgstr " Like creatures ships, buildings and even regions also have their own song, even though it's faint and harder to hear. Like it can be discerned from the life song of a person, if the person is affected by a spell, it can also be done for ships, buildings and regions. " + +msgctxt "race" +msgid "shadowbat_x" +msgstr "darkbat" + +msgctxt "race" +msgid "nightmare_x" +msgstr "nightmare" + +msgid "stat_attacks" +msgstr "attacks" + +msgctxt "spell" +msgid "transfer_aura_song" +msgstr "Hymn of Aura Sharing" + +msgctxt "race" +msgid "ghoul" +msgstr "ghoul" + +msgid "eyeofdragon" +msgstr "eye of dragon" + +msgctxt "spellinfo" +msgid "fetch_astral" +msgstr "A magician in the material world can summon units from the adjacent part of the astral plane. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will. " + +msgid "chainmail_p" +msgstr "chainmails" + +msgctxt "race" +msgid "goblin" +msgstr "goblin" + +msgctxt "skill" +msgid "training" +msgstr "taming" + +msgctxt "race" +msgid "demon" +msgstr "demon" + +msgctxt "calendar" +msgid "summer" +msgstr "summer" + +msgctxt "spellinfo" +msgid "acidrain" +msgstr "Kills enemies with acid." + +msgctxt "prefix" +msgid "Wald" +msgstr "wood " + +msgid "trollspoil_p" +msgstr "troll horns" + +msgctxt "spellinfo" +msgid "steal_aura" +msgstr "Aided by this spell, a magician can steal another magician's aura against his will." + +msgctxt "race" +msgid "mummy_d" +msgstr "mummy" + +msgctxt "race" +msgid "braineater_d" +msgstr "braineaters" + +msgctxt "describe" +msgid "goliathwater" +msgstr "'First roast the Gurgelkraut quickly and add some Fjordwuchs to spice it up. Let it all boil slowly until almost all liquid has evaporated. Leave the mash overnight and finally squeeze it the next morning until a thick fluid drips out.' The liquid thus produced, 'Goliath Water' as we call it, is enough for 10 men and gives each man the carrying capacity of a horse for one week." + +msgctxt "spellinfo" +msgid "eternal_walls" +msgstr "With this spell, the magician binds the power of the earth into the walls of a building for all eternity. Such a building is immune to the sands of time and needs no maintenance cost." + +msgid "snowglobe_p" +msgstr "snow globes" + +msgctxt "skill" +msgid "weaponsmithing" +msgstr "weaponsmithing" + +msgid "an_unknown_building" +msgstr "an unknown building" + +msgid "museumexitticket" +msgstr "returnticket for the grand museum" + +msgctxt "race" +msgid "mummy_p" +msgstr "mummys" + +msgctxt "race" +msgid "braineater_p" +msgstr "braineaters" + +msgctxt "keyword" +msgid "attack" +msgstr "ATTACK" + +msgctxt "spell" +msgid "concealing_aura" +msgstr "Concealing Aura" + +msgctxt "race" +msgid "mummy_x" +msgstr "mummy" + +msgctxt "race" +msgid "braineater_x" +msgstr "braineater" + +msgctxt "spell" +msgid "unholypower" +msgstr "Unholy Strength" + +msgctxt "school" +msgid "illaun" +msgstr "Illaun" + +msgid "nr_calendar" +msgstr "It is %s of the month of %s in the %d. year of %s." + +msgid "caravel" +msgstr "caravel" + +msgid "stone_p" +msgstr "stones" + +msgctxt "keyword" +msgid "locale" +msgstr "LOCALE" + +msgctxt "spellinfo" +msgid "song_suscept_magic" +msgstr " This song, which is woven into the magical essence of the region, weakens the natural resistance against a singular enchantment by 15%. Only the allies of the bard (HELP GUARD) are immune to the effect of the chant. " + +msgid "plate" +msgstr "platemail" + +msgid "herbbag_p" +msgstr "herbbags" + +msgid "skillpotion" +msgstr "potion of skills" + +msgid "speedsail_p" +msgstr "solar sails" + +msgctxt "skill" +msgid "cartmaking" +msgstr "cartmaking" + +msgctxt "race" +msgid "nightmare" +msgstr "nightmare" + +msgid "nr_alliances" +msgstr "Political Status" + +msgid "cart_p" +msgstr "carts" + +msgid "section_study" +msgstr "Learning and Teaching" + +msgctxt "skill" +msgid "stealth" +msgstr "stealth" + +msgctxt "spell" +msgid "magicwalls" +msgstr "Homestone" + +msgctxt "race" +msgid "smurf" +msgstr "smurf" + +msgctxt "spell" +msgid "badmagicresistancezone" +msgstr "Song of the Aging Spirit" + +msgid "peasant" +msgstr "peasant" + +msgctxt "spell" +msgid "tiredsoldiers" +msgstr "Tiredness" + +msgctxt "spell" +msgid "immolation" +msgstr "Immolation" + +msgctxt "race" +msgid "aquarian" +msgstr "aquarian" + +msgctxt "prefix" +msgid "star" +msgstr "star " + +msgid "xmastree_p" +msgstr "christmas trees" + +msgctxt "race" +msgid "tunnelworm_d" +msgstr "tunnelworms" + +msgctxt "border" +msgid "a_wisps" +msgstr "a cloud of wisps" + +msgid "NAECHSTER" +msgstr "NEXT" + +msgctxt "keyword" +msgid "leave" +msgstr "LEAVE" + +msgctxt "spell" +msgid "wdwpyramid_cerddor" +msgstr "Song of the Gods" + +msgid "nr_skills" +msgstr "skills" + +msgctxt "race" +msgid "tunnelworm_p" +msgstr "tunnelworms" + +msgid "section_movement" +msgstr "Movement and Travel" + +msgctxt "race" +msgid "tunnelworm_x" +msgstr "tunnelworm" + +msgid "weight_per_p" +msgstr "stones per" + +msgid "h12_p" +msgstr "windbags" + +msgctxt "spell" +msgid "fumble" +msgstr "Chaos Curse" + +msgctxt "spell" +msgid "wdwpyramid_illaun" +msgstr "Dream of the gods" + +msgctxt "race" +msgid "bluescarab_d" +msgstr "blue scarab" + +msgctxt "race" +msgid "snotling" +msgstr "snotling" + +msgctxt "spellinfo" +msgid "berserk" +msgstr "During this bloody ritual the sorcerer sacrifices a newborn child before a battle right in front of his army. In this way he attracts spirits of blood that will take control of the soldiers who are present and force them into a blood frenzy." + +msgid "h15_p" +msgstr "rock weed" + +msgctxt "race" +msgid "wyrm_d" +msgstr "wyrms" + +msgctxt "spell" +msgid "bad_dreams" +msgstr "Bad Dreams" + +msgctxt "skill" +msgid "shipcraft" +msgstr "shipcraft" + +msgctxt "spell" +msgid "goodmagicresistancezone" +msgstr "Song of the Youthful Spirit" + +msgctxt "prefix" +msgid "Klein" +msgstr "gully " + +msgid "citadel" +msgstr "citadel" + +msgctxt "race" +msgid "bluescarab_p" +msgstr "blue scarabs" + +msgctxt "spell" +msgid "puttorest" +msgstr "Eternal Rest" + +msgid "list_and" +msgstr " and " + +msgid "h18_p" +msgstr "ice begonias" + +msgctxt "spell" +msgid "godcursezone" +msgstr "Curse of the Gods" + +msgid "sptype_postcombat" +msgstr "post-combat spell" + +msgctxt "race" +msgid "wyrm_p" +msgstr "wyrms" + +msgid "viele" +msgstr "many" + +msgctxt "race" +msgid "bluescarab_x" +msgstr "blue scarab" + +msgctxt "spell" +msgid "wdwpyramid_draig" +msgstr "Power of the Gods" + +msgid "nr_nospells" +msgstr "none" + +msgctxt "prefix" +msgid "Sumpf" +msgstr "swamp " + +msgctxt "race" +msgid "wyrm_x" +msgstr "wyrm" + +msgctxt "spell" +msgid "windshield" +msgstr "Air Shield" + +msgctxt "race" +msgid "museumghost" +msgstr "museumghost" + +msgctxt "spellinfo" +msgid "fumblecurse" +msgstr "This wicked curse affects the magical abilities of the target. A field of raw chaos magic around the target lessens its concentration and makes it very hard to cast any spells." + +msgctxt "keyword" +msgid "option" +msgstr "OPTION" + +msgctxt "border" +msgid "roads" +msgstr "roads" + +msgid "battle_army" +msgstr "army" + +msgctxt "race" +msgid "giantturtle_d" +msgstr "giant turtles" + +msgctxt "spell" +msgid "create_runesword" +msgstr "Create A Runesword" + +msgctxt "spell" +msgid "strongwall" +msgstr "Strong Wall And Sturdy Gate" + +msgctxt "spell" +msgid "double_time" +msgstr "Double Time" + +msgid "wente_ring" +msgstr "Wildente's wedding ring" + +msgid "apple" +msgstr "apple" + +msgctxt "spell" +msgid "earn_silver#tybied" +msgstr "Miracle Doctor" + +msgid "snowball" +msgstr "snowball" + +msgctxt "prefix" +msgid "Mond" +msgstr "moon " + +msgctxt "iteminfo" +msgid "snowball" +msgstr "These items stay frozen all year round. There seem to be bits of ice in them - in the right hands, these might put an eye out!" + +msgid "nr_spell_syntax" +msgstr "Syntax:" + +msgid "seaserpenthead_p" +msgstr "seaserpentheads" + +msgid "forest" +msgstr "forest" + +msgctxt "raceinfo" +msgid "no_info" +msgstr "No information available for this race." + +msgctxt "race" +msgid "giantturtle_p" +msgstr "giant turtles" + +msgid "ring_of_levitation" +msgstr "ring of levitation" + +msgctxt "skill" +msgid "herbalism" +msgstr "herbalism" + +msgctxt "spell" +msgid "berserk" +msgstr "Blood Frenzy" + +msgid "nr_spell_rank" +msgstr "Rank:" + +msgctxt "spellinfo" +msgid "stonegolem" +msgstr "'Take a flawless block of crystaline stone and humidify it with a vial of Water of Life until the potion has been soaked up completely. Then focus your power on the forming aura of life and shape a container for the unbound forces'. The more power a magician invests, the more golems can be created before the aura dissipates. Every week, there is a 10 percent chance that the golem will crumble to dust. If you command a golem to 'MAKE CASTLE' or 'MAKE ROAD', it will turn itself into 4 stones that it uses in construction, and disintegrate afterwards. " + +msgid "dolphin" +msgstr "dolphin" + +msgctxt "race" +msgid "snotling_d" +msgstr "snotlings" + +msgid "lmsreward" +msgstr "Belt of Heroic Legends" + +msgctxt "race" +msgid "giantturtle_x" +msgstr "giant turtle" + +msgid "crossbow" +msgstr "crossbow" + +msgctxt "race" +msgid "orc" +msgstr "orc" + +msgctxt "spellinfo" +msgid "create_antimagic" +msgstr "This spell creates a portable crystal of antimagic which can be used by anybody to reduce or even eliminate the power of all spells cast in the region during the same week." + +msgid "goliathwater_p" +msgstr "goliath waters" + +msgid "stardust" +msgstr "stardust" + +msgid "illusioncastle" +msgstr "fairy castle" + +msgctxt "iteminfo" +msgid "stardust" +msgstr "This vial of dust, made from the remains of a star that fell from the sky one cold winter night, is said to have aphrodisiacal powers." + +msgctxt "race" +msgid "snotling_p" +msgstr "snotlings" + +msgctxt "calendar" +msgid "fall" +msgstr "fall" + +msgid "glacier" +msgstr "glacier" + +msgid "halflingspoil_p" +msgstr "halfling feet" + +msgid "aod_p" +msgstr "amulets of darkness" + +msgctxt "race" +msgid "snotling_x" +msgstr "snotling" + +msgctxt "spellinfo" +msgid "create_magicherbbag" +msgstr "The druid takes some specially prepared leather and performes a great ritual during which the leather is cleansed of all impure spirits. Then he binds some minor spirits of air and water to the material. After completing this process, the druid works the enchanted leather into a small pouch which is suitable to contain herbs, for it is able to preserve them for a long time and prevents rot." + +msgctxt "border" +msgid "road" +msgstr "road" + +msgid "status_defensive" +msgstr "defensive" + +msgctxt "keyword" +msgid "spy" +msgstr "SPY" + +msgctxt "describe" +msgid "peasantblood" +msgstr "Knowledge of this potion is amongst the most dangerous and secret wisdom of the alchemist. Snatched from the darkest hells, the knowledge of this formula enables the production of an elixer which serves Demons as nourishment. If used by normal beings it leads to a swift death and eternal undeath. The creation requires Fjord Fungus together with some Cave Lichen and Cobalt Fungus, and an unfortunate peasant from the region, who is killed in the bloody days-long ritual. One vial of the potion satisfies the hunger of 100 Demons for a week." + +msgctxt "spell" +msgid "powerful_dragonbreath" +msgstr "Powerful Dragonbreath" + +msgid "dragonblood_p" +msgstr "dragonblood" + +msgid "aog_p" +msgstr "amulets of gathering" + +msgid "DURCHREISE" +msgstr "TRAVEL" + +msgctxt "describe" +msgid "p10" +msgstr "The use of the berserkers blood potion is advised to increase one's warriors abilities to new heights. To create this, one needs a white hemlock, some flatroot, sand reeker and a mandrake. All ingredients have to be sliced as finely as possible, after which it is boiled for two hours. The cooled brew is strained through a cloth. The resulting juice is enough to improve up to ten warriors." + +msgctxt "describe" +msgid "p11" +msgstr "The peasant love potion enamors both Man and Woman to the same degree and results in a strong wish for children. For a big portion scoop out a mandrake, fill it with finely chopped bubblemorel, elvendear and snowcrystal petal, sprinkle grated rock weed on top and let it simmer on low heat for twenty hours. The potion can grant up to 1000 peasants the happiness of twins." + +msgctxt "describe" +msgid "p13" +msgstr "One of the most rare and prized of all alchemist elixers, this potion grants the user a dragon's power for a few weeks. The potion increases the life-energy of a maximum of ten people fivefold. The effect is strongest right after drinking and slowly decreases over time. To brew this potion the alchemist needs an elvendear, a windbag, a piece of waterfinder and a spider ivy. Finally he dusts it with some minced bubblemorel and stirrs the powder into some dragon's blood. " + +msgid "an_unknown_curse" +msgstr "an unknown curse" + +msgctxt "spell" +msgid "gooddreams" +msgstr "Pleasant Dreams" + +msgctxt "race" +msgid "zombie" +msgstr "zombie" + +msgid "sptype_normal" +msgstr "regular spell" + +msgid "PERSONEN" +msgstr "MEN" + +msgctxt "race" +msgid "ent_d" +msgstr "ents" + +msgid "amulet_p" +msgstr "amulets" + +msgid "unit_hungers" +msgstr "hungry" + +msgctxt "race" +msgid "rat_d" +msgstr "rats" + +msgid "laenmail_p" +msgstr "laen chainmails" + +msgid "orcspoil_p" +msgstr "orc tusks" + +msgctxt "keyword" +msgid "loot" +msgstr "loot" + +msgctxt "keyword" +msgid "guard" +msgstr "GUARD" + +msgctxt "calendar" +msgid "month_1" +msgstr "harvest moon" + +msgid "status_front" +msgstr "front" + +msgid "activevolcano_trail" +msgstr "the volcano of %s" + +msgctxt "calendar" +msgid "month_2" +msgstr "impenetrable fog" + +msgid "PAUSE" +msgstr "PAUSE" + +msgctxt "calendar" +msgid "month_3" +msgstr "storm moon" + +msgctxt "spellinfo" +msgid "stormwinds" +msgstr "Calling the Elemental Spirits of Storm is an ancient ritual. The druid binds the elementals to a ship's sails where they can help to carry the vessel across the waves at an amazing speed. The more power the druid invests, the greater is the number of spirits bound. Each ship needs an own spirit." + +msgid "trollbelt_p" +msgstr "trollbelts" + +msgctxt "calendar" +msgid "month_4" +msgstr "hearth fire" + +msgctxt "spellinfo" +msgid "summon_familiar" +msgstr "During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them." + +msgctxt "spell" +msgid "courting" +msgstr "Song of Courting" + +msgctxt "race" +msgid "ghost_d" +msgstr "ghosts" + +msgid "rop_p" +msgstr "rings of power" + +msgctxt "calendar" +msgid "month_5" +msgstr "icewind" + +msgctxt "spellinfo" +msgid "healing" +msgstr "Combat medics are not the only ones who can help those who got injured during a battle. Druids are, with the help of a summons of the Elemental Spirits of Life, able to heal wounds, mend broken bones or even regenerate separated limbs as well." + +msgctxt "race" +msgid "vampunicorn_d" +msgstr "vampiric unicorns" + +msgctxt "calendar" +msgid "month_6" +msgstr "snowbane" + +msgctxt "race" +msgid "ent_p" +msgstr "ents" + +msgctxt "calendar" +msgid "month_7" +msgstr "flowerrain" + +msgctxt "calendar" +msgid "month_8" +msgstr "mild winds" + +msgctxt "calendar" +msgid "month_9" +msgstr "sunfire" + +msgid "aura" +msgstr "aura" + +msgctxt "race" +msgid "rat_p" +msgstr "rats" + +msgid "key" +msgstr "key" + +msgctxt "spell" +msgid "badlearn" +msgstr "Insomnia" + +msgctxt "race" +msgid "ent_x" +msgstr "ent" + +msgctxt "race" +msgid "ghost_p" +msgstr "ghosts" + +msgid "ao_chastity" +msgstr "amulet of chastity" + +msgctxt "race" +msgid "vampunicorn_p" +msgstr "vampiric unicorns" + +msgctxt "race" +msgid "rat_x" +msgstr "rat" + +msgid "new" +msgstr "NEW" + +msgctxt "spell" +msgid "draigfumbleshield" +msgstr "Astral Chaos" + +msgid "lifepotion_p" +msgstr "waters of life" + +msgid "rustyhalberd_p" +msgstr "rusty halberds" + +msgid "section_magic" +msgstr "Magic and Artefacts" + +msgctxt "race" +msgid "ghost_x" +msgstr "ghost" + +msgctxt "race" +msgid "vampunicorn_x" +msgstr "vampiric unicorn" + +msgid "h2_p" +msgstr "owlsgazes" + +msgctxt "race" +msgid "halfling" +msgstr "halfling" + +msgid "shield" +msgstr "shield" + +msgctxt "race" +msgid "eagle" +msgstr "eagle" + +msgctxt "spellinfo" +msgid "calm_riot" +msgstr " By means of this magical chant the mage can calm a rioting region. The peasant mobs will disperse and return to their fields. " + +msgctxt "race" +msgid "stonegolem" +msgstr "stone golem" + +msgid "ointment" +msgstr "ointment" + +msgid "h5_p" +msgstr "elvendears" + +msgid "describe_braineater" +msgstr "Wobbling green vapours drift through the mists to form an eldritch creature that seems to be entirely made up of huge jaws and a long tail." + +msgid "maelstrom" +msgstr "maelstrom" + +msgctxt "race" +msgid "skeleton_d" +msgstr "skeletons" + +msgid "xmastree" +msgstr "christmas tree" + +msgid "h8_p" +msgstr "bubblemorels" + +msgctxt "iteminfo" +msgid "xmastree" +msgstr "In the winter months, this beautifully decorated tree has a magical effect on the entire forest." + +msgctxt "keyword" +msgid "besiege" +msgstr "BESIEGE" + +msgid "h10" +msgstr "peyote" + +msgid "h11" +msgstr "sand reeker" + +msgid "h12" +msgstr "windbag" + +msgid "h13" +msgstr "fjord fungus" + +msgid "trireme_a" +msgstr "a trireme" + +msgctxt "spell" +msgid "healing" +msgstr "Heal" + +msgid "h14" +msgstr "mandrake" + +msgid "tower" +msgstr "tower" + +msgctxt "prefix" +msgid "Dunkel" +msgstr "dark " + +msgid "h15" +msgstr "rock weed" + +msgid "smod_ship" +msgstr "ship" + +msgid "h16" +msgstr "gapgrowth" + +msgctxt "race" +msgid "skeleton_p" +msgstr "skeletons" + +msgid "h17" +msgstr "cave lichen" + +msgid "h18" +msgstr "ice begonia" + +msgid "MATERIALPOOL" +msgstr "ITEMPOOL" + +msgid "h19" +msgstr "white hemlock" + +msgctxt "race" +msgid "skeleton_x" +msgstr "skeleton" + +msgctxt "prefix" +msgid "Blut" +msgstr "blood " + +msgid "nr_guarding_prefix" +msgstr "The region is guarded by " + +msgctxt "race" +msgid "giantturtle" +msgstr "giant turtle" + +msgid "magicherbbag" +msgstr "bag of conservation" + +msgid "rustychainmail_p" +msgstr "rustychainmails" + +msgctxt "spellpar" +msgid "direction" +msgstr "direction" + +msgid "halflingspoil" +msgstr "halfling foot" + +msgid "ALLES" +msgstr "ALL" + +msgctxt "race" +msgid "songdragon_d" +msgstr "song dragons" + +msgctxt "describe" +msgid "p0" +msgstr "For Seven Mile Tea, boil up a Cobalt Fungus and pour the resulting brew into a Windbag. Catch and filter the liquid that drips out and administer it. This tea allows up to ten men to move as fast as a horse." + +msgid "nr_damaged" +msgstr "damage" + +msgid "aots" +msgstr "amulet of true seeing" + +msgctxt "spellinfo" +msgid "analyze_magic" +msgstr "With this spell the magician can try to identify the enchantments of a single object. He will get an impression of the operation of all spells that don't exceed his own capabilities. For more powerful spells he will need some luck for a successful analysis." + +msgctxt "spell" +msgid "rustweapon" +msgstr "Rain of Rust" + +msgctxt "describe" +msgid "p3" +msgstr "Allow a Tangy Temerity to simmer for three hours in a litre of water, then add a grated Mandrake, and sprinkle in a Gapgrowth harvested at full moon. The whole brew should then be allowed to stew for three days in a warm place. This potion increases the strength and endurance of ten men so that they can achieve twice as much in a week." + +msgctxt "spell" +msgid "drought" +msgstr "Summon Fire Elemental" + +msgid "pegasus_p" +msgstr "pegasi" + +msgctxt "describe" +msgid "p6" +msgstr "To create the brain wax potion, mix the juice of a waterfinder with quite a bit of grated windbag and a pinch of bugleweed. Let this steep for just a minute. When the liquid is only lukewarm, add some rock weed. Using a large spoon, stirr exactly seven times clockwise and then seven times counterclockwise. Fill the vial when the liquid has gone still. The juice gives ten people a 33% chance of an additional attempt at learning a skill." + +msgctxt "describe" +msgid "p7" +msgstr "A duncebun is a nasty piece of work, negating any attempt at learning a skill, or even causing the subject to forget things! For ten servings knead a rasped fjord fungus, an abraded owlsgaze and a finely sliced spider ivy to a smooth dough. Bake for an hour at moderate heat and brush the result with some cave lichen. Who eats this bread will not learn what he's attempting to learn, and, in case there is no attempt to learn anything, will forget a week's worth of study in his best skill." + +msgid "h20" +msgstr "snowcrystal petal" + +msgctxt "spell" +msgid "resist_magic" +msgstr "Resist Magic" + +msgctxt "describe" +msgid "p9" +msgstr "To make a horsepower potion, chop a peyote, a cobalt fungus and some knotroot, and boil it in a bucketful of water. Then add some sand reeker and let the mixture steep for three days. Finally one gives this to the horses to drink, to double their procreation." + +msgid "REGION" +msgstr "REGION" + +msgctxt "race" +msgid "songdragon_p" +msgstr "song dragons" + +msgid "sapling_p" +msgstr "saplings" + +msgid "STUFE" +msgstr "LEVEL" + +msgid "kick" +msgstr "KICK" + +msgctxt "keyword" +msgid "recruit" +msgstr "RECRUIT" + +msgctxt "spell" +msgid "frighten" +msgstr "Song of Fear" + +msgctxt "race" +msgid "songdragon_x" +msgstr "song dragon" + +msgctxt "border" +msgid "illusionwall" +msgstr "illusionary wall" + +msgctxt "spellinfo" +msgid "summonshadowlords" +msgstr "With the help of dark rituals the sorcerer summons demons from the Sphere of Shadows. These fearsome creatures can walk almost unseen among the living, but their dark aura can be sensed by everyone. Shadowmasters are feared in combat for they are hard to hit and have the ability to drain strength and life force from their victims." + +msgid "nr_herbsrequired" +msgstr "Herbs required" + +msgid "mallornlance" +msgstr "mallorn lance" + +msgctxt "race" +msgid "juju" +msgstr "juju-zombie" + +msgctxt "keyword" +msgid "steal" +msgstr "STEAL" + +msgctxt "spellinfo" +msgid "resist_magic" +msgstr "This spell enhances natural magic resistence. Protected units are less vulnerable to battle magic. The spell protects 5 people per level." + +msgid "ADRESSEN" +msgstr "ADDRESSES" + +msgctxt "race" +msgid "apepsnake_d" +msgstr "apepsnakes" + +msgid "section_production" +msgstr "Resources and Production" + +msgid "adamantiumaxe_p" +msgstr "adamantium axes" + +msgid "COMPUTER" +msgstr "COMPUTER" + +msgctxt "spell" +msgid "chaossuction" +msgstr "Chaos Gate" + +msgctxt "race" +msgid "apepsnake_p" +msgstr "apepsnakes" + +msgid "PARTEITARNUNG" +msgstr "FACTIONSTEALTH" + +msgctxt "race" +msgid "imp_d" +msgstr "imps" + +msgctxt "school" +msgid "tybied" +msgstr "Tybied" + +msgctxt "keyword" +msgid "name" +msgstr "NAME" + +msgctxt "race" +msgid "apepsnake_x" +msgstr "apepsnake" + +msgid "KOMMANDO" +msgstr "CONTROL" + +msgid "glacier_trail" +msgstr "the glacier of %s" + +msgctxt "spellinfo" +msgid "chaossuction" +msgstr "By sacrificing the lives of 200 peasants, the chaossorcerer is able to open a planar gate. This gate can be used during the following week to transfer units to the astral plane. It dissipates at the end of the following week." + +msgctxt "spell" +msgid "create_focus" +msgstr "Create An Aurafocus" + +msgid "nr_combatspells" +msgstr "combat spells" + +msgctxt "race" +msgid "imp_p" +msgstr "imps" + +msgctxt "race" +msgid "owl" +msgstr "owl" + +msgctxt "spellinfo" +msgid "holyground" +msgstr "This ritual binds various rural spirits to a specific territory to guard the land. In a region blessed in this way the dead won't ever rise from their graves again. Existing undead also shun the sacred grounds and will avoid entering the protected area whenever possible." + +msgctxt "race" +msgid "imp_x" +msgstr "imp" + +msgid "silk" +msgstr "silk" + +msgid "manacrystal" +msgstr "astralcrystal" + +msgid "vial" +msgstr "vial" + +msgctxt "race" +msgid "unicorn" +msgstr "unicorn" + +msgid "magicstorm" +msgstr "magical storm" + +msgctxt "spellinfo" +msgid "create_focus" +msgstr "Creates an aurafocus crystal." + +msgctxt "spellinfo" +msgid "earn_silver#draig" +msgstr "In the dark alleys you can find those who sell curses and hexes on demand - but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 50 silver pieces per level." + +msgctxt "spell" +msgid "song_of_slavery" +msgstr "Song of Slavery" + +msgctxt "spellinfo" +msgid "song_of_confusion" +msgstr "If is used before battle, this chant, taken from the ancient tunes of the cats, might give you the critical tactical advantage. Those under the spell's influence will act uncoordinated and inconsequent due to the nonsensical ideas planted into their minds through the melody. So it is supposed to have come to pass that well-organized armies found their archers up at the front (while the cavalry was back at the camp playing cards) or that even a famous general overslept a battle in his tent, as tale-tellers claim it really happened during the Great Wars in the Old World. " + +msgctxt "border" +msgid "gate_locked" +msgstr "massive locked door" + +msgid "rustyaxe_p" +msgstr "rusty axes" + +msgctxt "border" +msgid "an_incomplete_road" +msgstr "an incomplete road" + +msgctxt "spellinfo" +msgid "plague" +msgstr "In a complicated ritual the sorcerer sacrifices the lives of ten peasants and magically spreads their corpses within the wells of a region." + +msgid "jadee_dress_p" +msgstr "wedding dresses" + +msgctxt "spell" +msgid "magicstreet" +msgstr "Magic Path" + +msgid "crossbow_p" +msgstr "crossbows" + +msgctxt "spell" +msgid "steal_aura" +msgstr "Steal Aura" + +msgid "mallornbow_p" +msgstr "mallorn bows" + +msgid "horse_p" +msgstr "horses" + +msgid "aquarianspoil" +msgstr "aquarian scale" + +msgid "mistletoe_p" +msgstr "mistletoes" + +msgctxt "spell" +msgid "wyrm_transformation" +msgstr "Wyrmtransformation" + +msgid "sptype_combat" +msgstr "combat spell" + +msgid "laensword_p" +msgstr "laen swords" + +msgctxt "spell" +msgid "gwyrrdfumbleshield" +msgstr "Astral Guardian Spirits" + +msgid "presspass" +msgstr "presspass" + +msgctxt "spell" +msgid "wdwpyramid_tybied" +msgstr "Web of the Gods" + +msgctxt "spell" +msgid "create_antimagic" +msgstr "Create An Antimagic Crystal" + +msgctxt "race" +msgid "special_d" +msgstr "special" + +msgctxt "iteminfo" +msgid "catapultammo" +msgstr "Ammunition for catapults." + +msgctxt "prefix" +msgid "Nebel" +msgstr "mist " + +msgid "dragonhoard" +msgstr "dragonhoard" + +msgctxt "race" +msgid "tiger_d" +msgstr "tigers" + +msgid "b_defense" +msgstr "defense" + +msgid "fortress" +msgstr "fortress" + +msgid "runesword" +msgstr "runesword" + +msgid "hall1" +msgstr "hallway" + +msgid "PARTEI" +msgstr "FACTION" + +msgctxt "race" +msgid "special_p" +msgstr "special" + +msgid "par_building" +msgstr "buildingid" + +msgctxt "race" +msgid "tiger_p" +msgstr "tiger" + +msgid "nr_addresses" +msgstr "Addresses" + +msgctxt "spellpar" +msgid "race" +msgstr "race" + +msgctxt "spell" +msgid "calm_riot" +msgstr "Calm Riot" + +msgctxt "keyword" +msgid "//" +msgstr "//" + +msgctxt "race" +msgid "special_x" +msgstr "special" + +msgid "flyingcarpet" +msgstr "flying carpet" + +msgctxt "race" +msgid "tiger_x" +msgstr "tiger" + +msgid "hell_trail" +msgstr "%s" + +msgctxt "prefix" +msgid "Hoch" +msgstr "high " + +msgid "fortification" +msgstr "fortification" + +msgctxt "calendar" +msgid "secondweek_d" +msgstr "of the second week" + +msgctxt "keyword" +msgid "enter" +msgstr "ENTER" + +msgid "ERESSEA" +msgstr "ERESSEA" + +msgctxt "spellinfo" +msgid "airship" +msgstr "These magic runes allow a boat with a capacity of up to 50 weight units to fly for a week and allow the boat to cross land. The enchanted ink's components include a windbag and a snowcrystal petal. " + +msgid "bagpipeoffear_p" +msgstr "bagpipes of fear" + +msgid "herbbag" +msgstr "herbbag" + +msgctxt "spell" +msgid "astral_disruption" +msgstr "Astral Disruption" + +msgid "cart" +msgstr "cart" + +msgctxt "keyword" +msgid "work" +msgstr "WORK" + +msgid "iceberg_trail" +msgstr "the glacier of %s" + +msgid "silk_p" +msgstr "silk" + +msgid "manacrystal_p" +msgstr "astralcrystals" + +msgid "fog_trail" +msgstr "fog_trail %s" + +msgctxt "spell" +msgid "show_astral" +msgstr "Astral Gaze" + +msgctxt "iteminfo" +msgid "skillpotion" +msgstr " The recipe of this potion is a well kept secret. Some even say it couldn't be brewed by mere mortals. One thing is certain though, the drinker receives further insight into any learned skills, which furthers their progress towards the mastery of those skills. " + +msgctxt "keyword" +msgid "cast" +msgstr "CAST" + +msgctxt "damage" +msgid "wounded" +msgstr "wounded" + +msgid "par_ship" +msgstr "shipid" + +msgctxt "race" +msgid "dwarf" +msgstr "dwarf" + +msgctxt "spellinfo" +msgid "irongolem" +msgstr "The more power a magician invests, the more golems can be created before the aura dissipates. Each golem has a 15% chance per week to turn to dust. If you command a golem to 'MAKE SWORD/MAKE CLAYMORE' or 'MAKE SHIELD/CHAINMAIL/PLATEMAIL',it will work 5 iron ingots and disintegrate afterwards. " + +msgid "cookie_p" +msgstr "cookies" + +msgctxt "race" +msgid "ghoul_d" +msgstr "ghouls" + +msgid "santa2004" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a solar sail. (To claim this item, one of your units must issue the order 'CLAIM 1 solar sail'." + +msgid "santa2005" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a vial of stardust. (To get more information about this item, use the CLAIM and SHOW commands)." + +msgid "santa2006" +msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a beautifully decorated tree. (To get more information about this item, use the CLAIM and SHOW commands)." + +msgid "volcano_trail" +msgstr "the volcano of %s" + +msgctxt "race" +msgid "ghoul_p" +msgstr "ghouls" + +msgid "moneybag" +msgstr "silverbag" + +msgid "smod_none" +msgstr "none" + +msgctxt "keyword" +msgid "destroy" +msgstr "DESTROY" + +msgctxt "spell" +msgid "create_dreameye" +msgstr "Create a Visioneye" + +msgid "nr_trade_intro" +msgstr "Traders can sell" + +msgid "unknown_unit_dative" +msgstr "an unknown unit" + +msgctxt "skill" +msgid "stamina" +msgstr "endurance" + +msgctxt "prefix" +msgid "Schatten" +msgstr "shadow " + +msgctxt "prefix" +msgid "Hoehlen" +msgstr "cave " + +msgctxt "race" +msgid "ghoul_x" +msgstr "ghoul" + +msgctxt "spell" +msgid "airship" +msgstr "Airship" + +msgid "sphereofinv" +msgstr "sphere of invisibility" + +msgctxt "spell" +msgid "plague" +msgstr "Curse of Pestilence" + +msgid "section_battle" +msgstr "Battles" + +msgctxt "skill" +msgid "entertainment" +msgstr "entertainment" + +msgctxt "border" +msgid "a_road_connection" +msgstr "a connection to another road" + +msgctxt "spellinfo" +msgid "courting" +msgstr "From the 'Songs of the Elder' by Firudin the Sage: 'This enticing little melody and its ingratiating words will lure the peasants in no time. They will leave home and hearth to follow your lead.'" + +msgid "healing_p" +msgstr "healing potions" + +msgctxt "spell" +msgid "fireball" +msgstr "Fireball" + +msgid "nr_trade_next" +msgstr "," + +msgctxt "race" +msgid "gnome" +msgstr "gnome" + +msgctxt "iteminfo" +msgid "snowman" +msgstr "Orange nose, black hat, frosty character. A snowman. He'll make a fine guard if you use him in a cold place. (USE 1 snowman)" + +msgctxt "spell" +msgid "stonegolem" +msgstr "Create Stone Golems" + +msgctxt "race" +msgid "skeletonlord_d" +msgstr "skeleton lords" + +msgid "rustyaxe" +msgstr "rusty axe" + +msgid "mallornsapling" +msgstr "mallorn sapling" + +msgid "permaura_p" +msgstr "permauras" + +msgctxt "spellinfo" +msgid "song_of_peace" +msgstr " This powerful spell prevents any attacks. Noone in the entire region will be able to raise his weapon against another. The effect can last for weeks. " + +msgctxt "spell" +msgid "nocostbuilding" +msgstr "Eternal Walls" + +msgctxt "race" +msgid "skeletonlord_p" +msgstr "skeleton lords" + +msgctxt "spellpar" +msgid "buildingtype" +msgstr "buildingtype" + +msgctxt "spellinfo" +msgid "create_roi" +msgstr "With this spell the caster can create a Ring of Invisibility. The wearer of this ring will be invisible to all units of other factions, no matter how good their perception skill may be. In an invisible unit, each person must wear a Ring of Invisibility." + +msgctxt "spell" +msgid "sparkledream" +msgstr "Dream" + +msgctxt "race" +msgid "skeletonlord_x" +msgstr "skeleton lord" + +msgctxt "race" +msgid "insect" +msgstr "insect" + +msgid "bagpipeoffear" +msgstr "bagpipe of fear" + +msgctxt "spellinfo" +msgid "create_rop" +msgstr "A ring of power adds +1 to the power of each spell cast by its' wearer." + +msgid "papyrus" +msgstr "papyrus" + +msgctxt "spellinfo" +msgid "create_ror" +msgstr "Creates a ring of regeneration." + +msgctxt "spell" +msgid "blessedharvest" +msgstr "Blessed Harvest" + +msgid "stat_equipment" +msgstr "May use weapons." + +msgctxt "border" +msgid "a_firewall" +msgstr "a firewall" + +msgid "Herbst" +msgstr "autumn" + +msgctxt "spell" +msgid "enterastral" +msgstr "Astral Path" + +msgctxt "spellinfo" +msgid "sparkledream" +msgstr "The mentalist sends a dream to the target of the spell." + +msgid "bow" +msgstr "bow" + +msgctxt "border" +msgid "a_gate_open" +msgstr "a massive open door" + +msgctxt "spell" +msgid "transferaurachaos" +msgstr "Transfer Power" + +msgctxt "prefix" +msgid "Huegel" +msgstr "hill " + +msgctxt "spellinfo" +msgid "blessstonecircle" +msgstr "This ritual blesses a circle of stones that has to be constructed from stones and some wood before. The druid's blessing turns the circle into a place of great magic that is suitable for rituals of all kinds. It protects from hostile magic and improves aura regeneration. Virgins are said to have been visited by strange creatures in the vicinity of these places." + +msgid "incense" +msgstr "incense" + +msgctxt "race" +msgid "elf_d" +msgstr "elves" + +msgctxt "spellinfo" +msgid "gwyrrddestroymagic" +msgstr "Old legends of the druids say that what normal people call 'magic' consists of elemental spirits. A magician summons these spirits and binds them to various forms to achieve the desired effects. This ritual is able to expel any elemental spirits that have been summoned to this world and thereby dispels any magic on the target." + +msgctxt "spell" +msgid "shipspeedup" +msgstr "Acceleration" + +msgctxt "spellinfo" +msgid "clone" +msgstr " This powerful spell can keep the mage from certain death. The mage creates a clone of himself from a small blood sample and puts it into a bath of dragon's blood and thinned water of life. Subsequently he transfers a fragment of his soul into the clone in a complex ritual. If the mage dies afterwards, his soul takes possession of the clone which will serve as his new vessel. There is however a small chance the soul is to weak to reach the vessel in the wake of the mage's death. " + +msgctxt "race" +msgid "elf_p" +msgstr "elves" + +msgid "elvenhorse_p" +msgstr "elven horses" + +msgctxt "spellinfo" +msgid "frighten" +msgstr " This warsong sows panic among the enemy front line and weakens their fighting strength significantly. Fear will weaken their sword arm and dread will freeze their shield arm. " + +msgctxt "keyword" +msgid "ride" +msgstr "RIDE" + +msgctxt "spell" +msgid "stormwinds" +msgstr "Summon Storm Elemental" + +msgctxt "race" +msgid "elf" +msgstr "elf" + +msgid "museumticket_p" +msgstr "tickets to the grand museum" + +msgctxt "race" +msgid "elf_x" +msgstr "elves" + +msgctxt "keyword" +msgid "sort" +msgstr "SORT" + +msgctxt "spellinfo" +msgid "draigdestroymagic" +msgstr "At midnight, when the Powers of Darkness are at their peak, the sorcerer can use his powers to destroy enchantments. In order to do so, he draws a pentagram on a surface of the enchanted object and begins calling the Lords of Darkness. The Lords will aid him, but whether he is able to undo the target spell or not depends upon his own power." + +msgctxt "race" +msgid "shadowknight" +msgstr "shadow knight" + +msgid "unknown_faction" +msgstr "unknown faction" + +msgid "money" +msgstr "silver" + +msgid "questkey2_p" +msgstr "sapphire keys" + +msgctxt "spell" +msgid "chaosrow" +msgstr "Madness of War" + +msgctxt "race" +msgid "kraken" +msgstr "kraken" + +msgctxt "race" +msgid "shadowbat" +msgstr "darkbat" + +msgid "group_help" +msgstr "is helping" + +msgctxt "spell" +msgid "analyse_object" +msgstr "Analysis" + +msgid "nr_borderlist_lastfix" +msgstr ", and to the " + +msgctxt "race" +msgid "shadowknight_d" +msgstr "shadow knights" + +msgid "chainmail" +msgstr "chainmail" + +msgctxt "race" +msgid "illusion_d" +msgstr "illusions" + +msgid "angry_mob" +msgstr "Angry mob" + +msgctxt "race" +msgid "toad" +msgstr "toad" + +msgid "command" +msgstr "COMMAND" + +msgid "xmas_exit" +msgstr "portal" + +msgctxt "spellinfo" +msgid "heroic_song" +msgstr "This ancient battle chant lifts the spirit of your troops and helps them withstand even the fear-inspiring aura of demonic and undead beings. A fighter thus fortified against evil will not flee even in the face of terror, and his defenses will be strengthened." + +msgid "firewall_trail" +msgstr "a %s" + +msgid "iceberg_sleep" +msgstr "glacier" + +msgctxt "race" +msgid "shadowknight_p" +msgstr "shadow knight" + +msgid "speedsail" +msgstr "solar sail" + +msgctxt "spellinfo" +msgid "forestfire" +msgstr "This elemental summoning calls a fire fiend, a creature from the deepest hell. The demon will eagerly rush into the forests of a region and set them ablaze." + +msgctxt "race" +msgid "illusion_p" +msgstr "illusions" + +msgid "magicstorm_trail" +msgstr "a %s" + +msgctxt "spell" +msgid "versteinern" +msgstr "Gaze of the Basilisk" + +msgctxt "race" +msgid "shadowknight_x" +msgstr "shadow knight" + +msgid "portal" +msgstr "portal" + +msgctxt "spell" +msgid "magicrunes" +msgstr "Protective Runes" + +msgctxt "spell" +msgid "stormwind" +msgstr "Storm Elemental" + +msgctxt "spell" +msgid "irongolem" +msgstr "Create Iron Golems" + +msgctxt "race" +msgid "illusion_x" +msgstr "illusion" + +msgctxt "keyword" +msgid "number" +msgstr "NUMBER" + +msgid "DEFENSIV" +msgstr "DEFENSIVE" + +msgid "swamp" +msgstr "swamp" + +msgid "firedragon" +msgstr "fire dragon" + +msgctxt "race" +msgid "kraken_d" +msgstr "krakens" + +msgid "money_p" +msgstr "silver" + +msgid "jadee_ring_p" +msgstr "Jadee's wedding rings" + +msgctxt "race" +msgid "apophis" +msgstr "apophis" + +msgctxt "shipinfo" +msgid "no_info" +msgstr "No Information available for this type of ship." + +msgid "p11_p" +msgstr "peasant love potion" + +msgid "site" +msgstr "foundation" + +msgid "missing_key" +msgstr "Fehler: Unbekannter Schlüssel" + +msgctxt "spell" +msgid "generous" +msgstr "Song of Generosity" + +msgctxt "race" +msgid "kraken_p" +msgstr "krakens" + +msgctxt "spellinfo" +msgid "sleep" +msgstr "This spell causes several enemies to fall asleep. Sleeping warriors don't attack and defend themselves worse than normal, but they'll wake up if they get hit during combat. " + +msgctxt "spellinfo" +msgid "tiredsoldiers" +msgstr "This combat spell causes several enemies to suffer from an unnatural tiredness during combat. The soldiers will defend themselves worse than normal and sometimes sink into a slumber instead of attacking." + +msgctxt "spell" +msgid "incite_riot" +msgstr "Riot" + +msgid "p7_p" +msgstr "duncebuns" + +msgctxt "spell" +msgid "appeasement" +msgstr "Appeasing Song" + +msgid "dwarfspoil" +msgstr "dwarven beard" + +msgctxt "keyword" +msgid "group" +msgstr "GROUP" + +msgctxt "race" +msgid "dragon" +msgstr "dragon" + +msgctxt "race" +msgid "kraken_x" +msgstr "kraken" + +msgid "artacademy" +msgstr "academy of arts" + +msgid "antimagic" +msgstr "antimagic crystal" + +msgid "mallornseed" +msgstr "mallorn seed" + +msgctxt "spellinfo" +msgid "create_aots" +msgstr "This spell enables the caster to create an Amulet of True Sight. Wearing such an amulet, a person can discover anyone wearing a Ring of Invisibility. Anyway, units concealed by the use of their stealth skill will remain undiscovered." + +msgctxt "race" +msgid "ent" +msgstr "ent" + +msgctxt "iteminfo" +msgid "dwarfspoil" +msgstr "Sniff... Bleah. Don't they ever wash these?" + +msgctxt "race" +msgid "clone" +msgstr "clone" + +msgctxt "race" +msgid "vampunicorn" +msgstr "vampiric unicorn" + +msgid "wormhole" +msgstr "wormhole" + +msgctxt "skill" +msgid "polearm" +msgstr "polearm" + +msgid "unit_p" +msgstr "units" + +msgctxt "spell" +msgid "pull_astral" +msgstr "Astral Call" + +msgid "ALLIANZ" +msgstr "ALLIANCE" + +msgctxt "race" +msgid "eagle_d" +msgstr "eagles" + +msgctxt "race" +msgid "toad_d" +msgstr "toads" + +msgid "XEBALLOON" +msgstr "XEBALLOON" + +msgctxt "spell" +msgid "treewalkenter" +msgstr "Path of Trees" + +msgid "toadslime" +msgstr "pot of toadslime" + +msgctxt "race" +msgid "cat_d" +msgstr "cats" + +msgctxt "race" +msgid "stonegolem_d" +msgstr "stone golems" + +msgid "shield_p" +msgstr "shields" + +msgctxt "spellinfo" +msgid "melancholy" +msgstr " With this chant the bard spreads a melancholic, sad mood among the peasants. For a few weeks they will retreat to their huts and not spend any silver in the theatres and taverns. " + +msgctxt "spell" +msgid "earn_silver#gwyrrd" +msgstr "Cattle Healing" + +msgctxt "race" +msgid "eagle_p" +msgstr "eagles" + +msgctxt "race" +msgid "hellcat" +msgstr "hellcat" + +msgctxt "border" +msgid "a_wall" +msgstr "a wall" + +msgctxt "race" +msgid "toad_p" +msgstr "toads" + +msgid "section_mail" +msgstr "Dispatches" + +msgctxt "race" +msgid "eagle_x" +msgstr "eagle" + +msgctxt "spell" +msgid "meteor_rain" +msgstr "Meteor Shower" + +msgid "sword_p" +msgstr "swords" + +msgctxt "spell" +msgid "peacezone" +msgstr "Song of Peace" + +msgctxt "race" +msgid "cat_p" +msgstr "cats" + +msgctxt "race" +msgid "stonegolem_p" +msgstr "stone golems" + +msgid "spice" +msgstr "spice" + +msgid "dragonhead" +msgstr "dragonhead" + +msgctxt "race" +msgid "toad_x" +msgstr "toad" + +msgctxt "race" +msgid "cat_x" +msgstr "cats" + +msgid "peasant_p" +msgstr "peasants" + +msgctxt "race" +msgid "stonegolem_x" +msgstr "stone golem" + +msgid "b_damage" +msgstr "damage" + +msgid "ocean_trail" +msgstr "the %s" + +msgctxt "raceinfo" +msgid "songdragon" +msgstr "Song Dragons are roughly the size of a fully grown tiger. Their coloring ranges from bright red, through a dark green shade to a deep black. All known dragons of this species display a high level of intelligence and highly developed magical skills. Like their larger cousins, Song Dragons posess a firegland. They love singing and a good meal. From time to time one of these magnificent creatures will bond with a mage. When this happens, the mage is assured of a most loyal and useful familiar at his side." + +msgid "axe_p" +msgstr "axes" + +msgctxt "keyword" +msgid "carry" +msgstr "CARRY" + +msgid "status_avoid" +msgstr "not fighting" + +msgid "see_neighbour" +msgstr "neighbour" + +msgctxt "iteminfo" +msgid "dragonhead" +msgstr "The head of a dead dragon or wyrm. They say that it has magical powers." + +msgid "dam" +msgstr "dam" + +msgctxt "prefix" +msgid "Wild" +msgstr "wild " + +msgctxt "spellinfo" +msgid "create_trollbelt" +msgstr "This artifact gives the wearer the strength of a cavetroll. He will be able to carry fifty times his normal load, as well as gain strength and tough troll skin in combat." + +msgctxt "spell" +msgid "holyground" +msgstr "Sacred Ground" + +msgctxt "border" +msgid "a_gate_locked" +msgstr "a massive locked door" + +msgctxt "race" +msgid "nymph_d" +msgstr "nymphs" + +msgctxt "spell" +msgid "orcish" +msgstr "Unknown Effect" + +msgid "section_newspells" +msgstr "New Spells" + +msgid "nr_borderlist_prefix" +msgstr "To the " + +msgctxt "race" +msgid "greenscarab_d" +msgstr "green scarab" + +msgctxt "iteminfo" +msgid "speedsail" +msgstr "A unit setting this sail on a ship temporarily will permanently increase the ship's range by 1." + +msgctxt "race" +msgid "nymph_p" +msgstr "nymphs" + +msgctxt "spell" +msgid "flee" +msgstr "Unspeakable Horrors" + +msgctxt "race" +msgid "greenscarab_p" +msgstr "green scarab" + +msgid "studypotion_p" +msgstr "brain boosts" + +msgid "stables" +msgstr "stable" + +msgctxt "race" +msgid "nymph_x" +msgstr "nymph" + +msgid "goblinspoil" +msgstr "goblin head" + +msgid "longboat_a" +msgstr "a longboat" + +msgctxt "race" +msgid "lynx" +msgstr "lynx" + +msgctxt "race" +msgid "human_d" +msgstr "humans" + +msgctxt "race" +msgid "greenscarab_x" +msgstr "green scarab" + +msgctxt "spellinfo" +msgid "unholypower" +msgstr "Only whispered the knowledge of performing this ritual is passed to the adepts of the dark academies, for it is one of the darkest that has ever been written down. By calling unholy demons the strength of the living dead is greatly increased and they are turned into undead monsters of immense power." + +msgid "balm" +msgstr "balm" + +msgctxt "spellinfo" +msgid "transferauratraum" +msgstr "With the help of this spell the mentalist can transfer aura at a ratio of 2:1 to another mentalist." + +msgctxt "school" +msgid "gray" +msgstr "no magic school" + +msgctxt "spell" +msgid "summonfireelemental" +msgstr "Summon Fire Elemental" + +msgid "seed" +msgstr "seed" + +msgid "nr_nb_next" +msgstr ", to the " + +msgid "peasantblood_p" +msgstr "peasant bloods" + +msgctxt "spellinfo" +msgid "undeadhero" +msgstr "This ritual binds the escaping souls of some casualties back to their dead bodies and thus condemns them to an undead existance under the control of the sorcerer. The ritual affects the corpses of allies and foes alike - no matter on which side of the battle the soldiers fought before their death." + +msgctxt "spell" +msgid "create_roqf" +msgstr "Quick Fingers" + +msgctxt "race" +msgid "human_p" +msgstr "humans" + +msgid "highland_trail" +msgstr "the highlands of %s" + +msgid "caldera" +msgstr "caldera" + +msgid "h11_p" +msgstr "sand reekers" + +msgid "ZEITUNG" +msgstr "EXPRESS" + +msgctxt "prefix" +msgid "Duester" +msgstr "black " + +msgctxt "race" +msgid "peasant_d" +msgstr "peasants" + +msgctxt "race" +msgid "human_x" +msgstr "human" + +msgctxt "race" +msgid "template" +msgstr "template" + +msgctxt "spell" +msgid "earn_silver#cerddor" +msgstr "Jugglery" + +msgctxt "spellinfo" +msgid "fireball" +msgstr "The sorcerer hurls a ball of concentrated chaos into the ranks of his enemies. It will seriously hurt anyone who gets hit." + +msgctxt "spell" +msgid "summon_familiar" +msgstr "Summon Familiar" + +msgctxt "spellinfo" +msgid "combatrust" +msgstr "This ritual conjurs up a dark thunderstorm that affects a whole region. The magic rain will let rust any ore and thus destroy many weapons of the enemy." + +msgctxt "iteminfo" +msgid "antimagic" +msgstr "It may look like just another quartz, but your magician will tell you tha great power emenates from these crystals. Using it at the begining of a week will release a strong negative energy that reduce the power of all spells cast in the region during that week." + +msgid "HINTEN" +msgstr "REAR" + +msgid "h14_p" +msgstr "mandrakes" + +msgid "HINTER" +msgstr "AFTER" + +msgctxt "spellinfo" +msgid "seduction" +msgstr " With this song a unit can be bewitched in a manner, which compels them to bequeath a large portion of their possessions to the bard. They will keep enough for their own survival, though. " + +msgctxt "race" +msgid "dwarf_d" +msgstr "dwarves" + +msgctxt "race" +msgid "peasant_p" +msgstr "peasants" + +msgctxt "spellpar" +msgid "aura" +msgstr "aura" + +msgid "anonymous" +msgstr "anonymous" + +msgid "FLIEHE" +msgstr "FLEE" + +msgid "log_p" +msgstr "wood" + +msgctxt "prefix" +msgid "Finster" +msgstr "gloom " + +msgctxt "spellinfo" +msgid "deathcloud" +msgstr "By performing a gruesome ritual and sacrificing his own blood the Sorcerer conjurs up a spirit from the Elemental Plane of Poison. It will take the form of a green cloud of toxic gases that envelops a whole region and that will harm anyone within." + +msgid "iceberg" +msgstr "iceberg" + +msgctxt "race" +msgid "peasant_x" +msgstr "peasant" + +msgid "h17_p" +msgstr "cave lichen" + +msgid "nr_calendar_season" +msgstr "It is %s of the month of %s in the %d. year of %s. It is %s." + +msgctxt "race" +msgid "dwarf_p" +msgstr "dwarves" + +msgctxt "spell" +msgid "worse" +msgstr "Nightmare" + +msgid "nr_spell_modifiers" +msgstr "Modifications:" + +msgid "status_noaid" +msgstr "gets no aid" + +msgctxt "race" +msgid "dwarf_x" +msgstr "dwarf" + +msgctxt "spell" +msgid "blabbermouth" +msgstr "Blabbermouth" + +msgctxt "spell" +msgid "blessstonecircle" +msgstr "Bless Stone Circle" + +msgctxt "iteminfo" +msgid "roi" +msgstr "This magical artifact has been used since ancient times by Elves to conceal themselves from their enemies. Other races have also learned the value of these rings after encountering Elves - after all the ring makes its wearer invisible to normal eyes, and only magical methods enable the wearer to be discovered." + +msgctxt "prefix" +msgid "Berg" +msgstr "mountain " + +msgid "highland" +msgstr "highland" + +msgctxt "iteminfo" +msgid "rop" +msgstr "A ring of power increases a magician's power. The level of all the spells he casts will be increased by one without increasing their costs." + +msgid "enterpasswd" +msgstr "insert_your_password_here" + +msgctxt "skill" +msgid "mining" +msgstr "mining" + +msgid "studypotion" +msgstr "brain boost" + +msgctxt "keyword" +msgid "make" +msgstr "MAKE" + +msgctxt "border" +msgid "a_road_percent" +msgstr "a road that is $percent% complete" + +msgctxt "spell" +msgid "sparklechaos" +msgstr "Hex" + +msgid "KAEMPFE" +msgstr "COMBAT" + +msgid "nut" +msgstr "nut" + +msgctxt "spellinfo" +msgid "transferauradruide" +msgstr "The caster can transfer aura at a ratio of 2:1 to another member of the same school of magic with the help of this spell." + +msgctxt "spellinfo" +msgid "blabbermouth" +msgstr "The persons of the bewitched unit starts to babble without control about what it is said, speaking about their talents, the objects they carry or wear and if the unit is a magician, he or she will even list the spells they know. Unfortunately, this spell does not influence the memory of the subjects and afterwards, the enchanted will realize that they probably talked too much." + +msgid "halberd" +msgstr "halberd" + +msgid "temple" +msgstr "temple" + +msgctxt "spellinfo" +msgid "sacrifice_strength" +msgstr "This spell allows the magician to transfer part of his magical powers to another magician. Magicians of the seam school will receive half the power invested, magicians of other schoolsreceive receive one third." + +msgid "nr_undercons" +msgstr "under construction" + +msgctxt "spellinfo" +msgid "cold_protection" +msgstr "This spell enables the druid to magically protect insects from the paralysing cold of a glacier. Under the effect of this spell, insects are able to enter glaciers and act normally there. Ten insects per level can be protected in this way. A Ring of Power increases the number by additional ten." + +msgctxt "keyword" +msgid "route" +msgstr "ROUTE" + +msgid "BURG" +msgstr "CASTLE" + +msgctxt "spellinfo" +msgid "sparklechaos" +msgstr "The target of this spell becomes subject to a harmless curse." + +msgid "sawmill" +msgstr "sawmill" + +msgctxt "spell" +msgid "tybiedfumbleshield" +msgstr "Protection from Magic" + +msgid "XELAEN" +msgstr "XELAEN" + +msgid "magicherbbag_p" +msgstr "bags of conservation" + +msgid "seaserpenthead" +msgstr "seaserpenthead" + +msgctxt "spellinfo" +msgid "shapeshift" +msgstr "With the help of this ritual the mentalist is able to conceal the true form of a target unit. To unknowing observers all persons in the target unit appear to be of a different race." + +msgctxt "skill" +msgid "crossbow" +msgstr "crossbow" + +msgctxt "spell" +msgid "destroy_magic" +msgstr "Destroy Magic" + +msgctxt "skill" +msgid "magic" +msgstr "magic" + +msgid "see_lighthouse" +msgstr "from lighthouse" + +msgid "nr_schemes_prefix" +msgstr "Schemes of " + +msgid "aoc_p" +msgstr "amulets of the kitten" + +msgctxt "spell" +msgid "orkdream" +msgstr "Sweet Dreams" + +msgctxt "border" +msgid "a_fogwall" +msgstr "a wall of fog" + +msgctxt "calendar" +msgid "winter" +msgstr "winter" + +msgid "wall1_trail" +msgstr "a solid wall" + +msgctxt "spellinfo" +msgid "double_time" +msgstr "Abstract theories of space and time at last find practical application in this spell which warps the very fabric of time around a person. Such a person has twice as many movement points and doubles their attacks per round for a few weeks." + +msgctxt "race" +msgid "direwolf" +msgstr "direwolf" + +msgctxt "race" +msgid "dreamcat_d" +msgstr "dreamcats" + +msgid "Frühling" +msgstr "spring" + +msgctxt "spell" +msgid "slavery" +msgstr "Song of Slavery" + +msgctxt "spell" +msgid "break_curse" +msgstr "Negate Curse" + +msgid "catapult_p" +msgstr "catapults" + +msgctxt "spell" +msgid "treewalkexit" +msgstr "Ties of Life" + +msgid "lance_p" +msgstr "lances" + +msgid "almond_p" +msgstr "almonds" + +msgctxt "race" +msgid "spell" +msgstr "spell" + +msgid "roi_p" +msgstr "rings of invisibility" + +msgctxt "spellinfo" +msgid "chaosrow" +msgstr "Before the eyes of the enemy soldiers the sorcerer sacrifices ten peasants in a bloody ritual and thereby summons spirits of madness upon the enemy troops. The enemy soldiers will be in confusion during battle and no more be able to follow the commands of their leaders." + +msgctxt "race" +msgid "dreamcat_p" +msgstr "dreamcats" + +msgctxt "keyword" +msgid "ready" +msgstr "COMBATSPELL" + +msgid "wenige" +msgstr "few" + +msgctxt "keyword" +msgid "help" +msgstr "HELP" + +msgid "b_attacke" +msgstr "attack" + +msgctxt "race" +msgid "dreamcat_x" +msgstr "dreamcat" + +msgid "mallornseed_p" +msgstr "mallorn seeds" + +msgctxt "spellinfo" +msgid "treewalkexit" +msgstr "A druid who has traveled to the World of Spirits can use this spell to send level*5 weight units of living or dead matter back to a forest in the material world." + +msgctxt "race" +msgid "shadowmaster" +msgstr "shadowmaster" + +msgctxt "race" +msgid "fairy_d" +msgstr "fairies" + +msgid "nr_mallorntree" +msgstr "mallorn tree" + +msgctxt "school" +msgid "gwyrrd" +msgstr "Gwyrrd" + +msgid "smod_sea" +msgstr "sea" + +msgctxt "damage" +msgid "exhausted" +msgstr "exhausted" + +msgctxt "race" +msgid "clone_d" +msgstr "clones" + +msgctxt "skill" +msgid "perception" +msgstr "perception" + +msgctxt "spell" +msgid "song_of_fear" +msgstr "Song of Terror" + +msgctxt "spellinfo" +msgid "bloodsacrifice" +msgstr "With this ritual the sorcerer can sacrifice part of his life force in order to gain raw astral power. Experienced mages report that this ritual, once started, is hard to control and that the ammount of power gained in this way varies." + +msgctxt "race" +msgid "fairy_p" +msgstr "fairies" + +msgid "rustygreatsword" +msgstr "rusty claymore" + +msgid "an_unknown_unit" +msgstr "an unknown unit" + +msgctxt "race" +msgid "direwolf_d" +msgstr "direwolves" + +msgctxt "spellinfo" +msgid "ironkeeper" +msgstr "Creates a guardian spirit on a mountain or glacier that keeps all factions that are not allied (HELP GUARD) from mining iron or laen as long as it guards the region. The Mountain Guardian is bound to the location where it has been summoned." + +msgid "h20_p" +msgstr "snowcrystal petals" + +msgid "hell" +msgstr "hell" + +msgid "mailcmd" +msgstr "ORDERS" + +msgctxt "spellpar" +msgid "spellid" +msgstr "spellid" + +msgctxt "spell" +msgid "create_roi" +msgstr "Create A Ring of Invisibility" + +msgctxt "race" +msgid "fairy_x" +msgstr "fairy" + +msgid "ror_p" +msgstr "rings of regeneration" + +msgctxt "race" +msgid "troll_d" +msgstr "trolls" + +msgctxt "race" +msgid "clone_p" +msgstr "clones" + +msgctxt "race" +msgid "direwolf_p" +msgstr "direwolves" + +msgctxt "spellinfo" +msgid "song_of_fear" +msgstr "This antique, powerful song, passed down by the cats, will penetrate the hearts of the enemy and bereave them of courage and hope. Both their minds and bodies will be ruled by panic. Shivering with fear, they will flee from the dreadful chants and try to make their escape." + +msgctxt "spell" +msgid "create_rop" +msgstr "Create A Ring of Power" + +msgctxt "keyword" +msgid "grow" +msgstr "GROW" + +msgctxt "spell" +msgid "create_ror" +msgstr "Create A Ring of Regeneration" + +msgid "plain_trail" +msgstr "the plain of %s" + +msgctxt "spell" +msgid "keeploot" +msgstr "Save Spoils" + +msgctxt "race" +msgid "clone_x" +msgstr "clone" + +msgid "h1_p" +msgstr "tangy temerities" + +msgid "healingpotion_p" +msgstr "healingpotions" + +msgctxt "spellinfo" +msgid "create_firesword" +msgstr "'So take the blood of a fierce warrior and apply it to the steel of the blade. Then start calling the Spheres of Chaos. If you did everything to their pleasure, they will send a minor one of their kind to fulfill the sword with his power.'" + +msgctxt "spell" +msgid "song_suscept_magic" +msgstr "Song of the Aging Spirit" + +msgctxt "race" +msgid "direwolf_x" +msgstr "direwolf" + +msgctxt "race" +msgid "troll_p" +msgstr "trolls" + +msgctxt "prefix" +msgid "Grau" +msgstr "grey " + +msgid "building" +msgstr "structure" + +msgctxt "spell" +msgid "living_rock" +msgstr "Living Rock" + +msgctxt "spellinfo" +msgid "generous" +msgstr "This joyous song will spread like wildfire throughout the region and cause festive spirits in all the population. All the taverns and theaters will be packed to the brim and even the beggars will not go hungry." + +msgid "growl1" +msgstr "Tshrrrk..." + +msgid "growl2" +msgstr "Shhhhhh..." + +msgctxt "skill" +msgid "bow" +msgstr "bow" + +msgid "h4_p" +msgstr "cobalt fungi" + +msgctxt "spell" +msgid "treegrow" +msgstr "Grove of Oak Trees" + +msgctxt "race" +msgid "troll_x" +msgstr "troll" + +msgid "leave" +msgstr "LEAVE" + +msgid "weight_unit_p" +msgstr "stones" + +msgid "nr_level" +msgstr "Level" + +msgid "healing" +msgstr "healing potion" + +msgid "vortex_desc" +msgstr "A vortex of pure chaos energy pulls over the region" + +msgctxt "race" +msgid "ghast_d" +msgstr "ghasts" + +msgid "h7_p" +msgstr "knotroots" + +msgctxt "spellinfo" +msgid "mindblast" +msgstr "With this spell the mentalist directly attacks his enemies' souls. A blast of astral and electrical energy strikes the foes. If a victim fails to resist the magic, he will permanently lose part of his memories. Being the target of this spell for too many times may result in death. " + +msgid "nr_spell_description" +msgstr "Description:" + +msgid "attack_magical" +msgstr "a magical attack" + +msgid "unit_guards" +msgstr "guards the region" + +msgid "pavilion" +msgstr "pavilion" + +msgctxt "race" +msgid "spell_d" +msgstr "spell" + +msgctxt "race" +msgid "juju_d" +msgstr "juju-zombies" + +msgid "nr_guarding_postfix" +msgstr "." + +msgctxt "border" +msgid "fogwall" +msgstr "wall of fog" + +msgctxt "keyword" +msgid "banner" +msgstr "BANNER" + +msgid "stat_attack" +msgstr "attack" + +msgctxt "race" +msgid "ghast_p" +msgstr "ghasts" + +msgctxt "spell" +msgid "wdwpyramid_gwyrrd" +msgstr "force of nature" + +msgctxt "spell" +msgid "insectfur" +msgstr "Firun's Coat" + +msgctxt "race" +msgid "spell_p" +msgstr "spell" + +msgid "museumticket" +msgstr "ticket to the grand museum" + +msgctxt "spellinfo" +msgid "illaundestroymagic" +msgstr "This spell allows the mentalist to distinguish between the natural and unnatural dreams of a person, a ship, a building or a region and remove those that are of magical origin." + +msgctxt "race" +msgid "juju_p" +msgstr "juju-zombies" + +msgctxt "race" +msgid "ghast_x" +msgstr "ghast" + +msgctxt "keyword" +msgid "use" +msgstr "USE" + +msgctxt "spell" +msgid "seduction" +msgstr "Song of Seduction" + +msgctxt "spell" +msgid "create_trollbelt" +msgstr "Create A Belt of Troll Strength" + +msgctxt "race" +msgid "spell_x" +msgstr "spell" + +msgctxt "race" +msgid "juju_x" +msgstr "juju-zombie" + +msgctxt "spellinfo" +msgid "summonfireelemental" +msgstr "This Ritual summons an angry elemental spirit that puts a drought on the entire region. Trees wither, animals die of thirst and the harvest is destroyed. Workers find little to no work in farming." + +msgid "XEPOTION" +msgstr "XEPOTION" + +msgctxt "race" +msgid "undead" +msgstr "undead" + +msgid "p10" +msgstr "berserkers blood potion" + +msgid "toadslime_p" +msgstr "pots of toadslime" + +msgid "p11" +msgstr "peasant love potion" + +msgid "ring" +msgstr "ring" + +msgid "p13" +msgstr "elixir of power" + +msgid "wand_p" +msgstr "wands" + +msgctxt "spellinfo" +msgid "earn_silver#cerddor" +msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 50 silver per level. " + +msgctxt "spell" +msgid "strength" +msgstr "Unknown Effect" + +msgctxt "skill" +msgid "unarmed" +msgstr "unarmed combat" + +msgctxt "keyword" +msgid "tax" +msgstr "TAX" + +msgid "rustyshield_p" +msgstr "rusty shields" + +msgctxt "keyword" +msgid "promote" +msgstr "PROMOTE" + +msgid "stone" +msgstr "stone" + +msgctxt "spell" +msgid "forestfire" +msgstr "Fire Fiend" + +msgctxt "spell" +msgid "auratransfer" +msgstr "Transfer Aura" + +msgid "aurafocus_p" +msgstr "aurafocuses" + +msgid "wente_ring_p" +msgstr "Wildente's wedding rings" + +msgid "apple_p" +msgstr "apples" + +msgctxt "spell" +msgid "summonshadowlords" +msgstr "Summon Shadowmasters" + +msgid "snowball_p" +msgstr "snowball" + +msgid "tree_p" +msgstr "trees" + +msgid "myrrh_p" +msgstr "myrrh" + +msgctxt "spellinfo" +msgid "earn_silver#illaun" +msgstr "No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 50 silver pieces per level and week for offering these services to peasants." + +msgctxt "spell" +msgid "big_recruit" +msgstr "High art of persuasion" + +msgctxt "iteminfo" +msgid "magicherbbag" +msgstr "Herbs stored in this bag will be much better preserved." + +msgctxt "keyword" +msgid "sell" +msgstr "SELL" + +msgctxt "spellinfo" +msgid "auratransfer" +msgstr " With this spell the mage can transfer aura of his own to a mage of the same school with a rate of 2:1 or to a mage of a different school with a rate of 3:1. " + +msgctxt "race" +msgid "wyrm" +msgstr "wyrm" + +msgid "birthdaycake" +msgstr "birthday cake" + +msgctxt "spell" +msgid "oldrace" +msgstr "Unknown Effect" + +msgctxt "skill" +msgid "armorer" +msgstr "armoursmithing" + +msgctxt "spell" +msgid "itemcloak" +msgstr "Concealing Aura" + +msgid "an_unknown_spell" +msgstr "an unknown spell" + +msgid "status_aggressive" +msgstr "aggressive" + +msgctxt "spellinfo" +msgid "song_resist_magic" +msgstr " This magical song, once performed with vigor, will propagate in the region by wandering from mouth to mouth. It will be heard everywhere. How long the song will last in the public perception depends on the bard's skill. Until it is gone it will give him and all his allies (HELP GUARD) a bonus of 15% to their natural resistance to magic. " + +msgctxt "keyword" +msgid "contact" +msgstr "CONTACT" + +msgid "dragonhead_p" +msgstr "dragonheads" + +msgctxt "spell" +msgid "view_reality" +msgstr "Gaze Upon Reality" + +msgctxt "keyword" +msgid "plant" +msgstr "PLANT" + +msgctxt "border" +msgid "wisps" +msgstr "wisps" + +msgid "wente_dress_p" +msgstr "tuxedos" + +msgid "catapult" +msgstr "catapult" + +msgctxt "spell" +msgid "riotzone" +msgstr "Riot" + +msgctxt "spell" +msgid "headache" +msgstr "Hangover" + +msgctxt "spellinfo" +msgid "maelstrom" +msgstr " This ritual summons a mighty water elemental from the depths of the ocean. The elemental creates an enormous maelstrom which damages any passing ships. " + +msgid "dolphin_p" +msgstr "dolphins" + +msgid "factiondefault" +msgstr "Faction" + +msgid "NICHT" +msgstr "NOT" + +msgctxt "spellinfo" +msgid "view_reality" +msgstr " With this spell the mage can glance from the astral to the material plane and recognize regions and units. " + +msgid "vortex" +msgstr "vortex" + +msgid "GIB" +msgstr "GIVE" + +msgid "maelstrom_trail" +msgstr "a %s" + +msgctxt "skill" +msgid "forestry" +msgstr "forestry" + +msgid "lmsreward_p" +msgstr "Belts of Heroic Legends" + +msgid "academy" +msgstr "academy" + +msgctxt "spell" +msgid "earn_silver#draig" +msgstr "Minor Curses" + +msgctxt "race" +msgid "catdragon_d" +msgstr "catdragons" + +msgctxt "spell" +msgid "wolfhowl" +msgstr "Timber Wolves" + +msgctxt "spell" +msgid "song_of_confusion" +msgstr "Song of Confusion" + +msgctxt "race" +msgid "skeleton" +msgstr "skeleton" + +msgid "mallornsapling_p" +msgstr "mallorn saplings" + +msgctxt "spell" +msgid "melancholy" +msgstr "Song of Melancholy" + +msgctxt "spell" +msgid "bloodthirst" +msgstr "Song of War" + +msgctxt "describe" +msgid "ointment" +msgstr "When one is severely wounded after a hard battle it is advisable to have some Ointment to hand. Applied to wounds, this magical paste closes them in the blink of an eye. For the preparation the alchemist requires a cobalt fungus, tangy temerity, and white hemlock. A dose of the potion heals up to 400 hitpoints." + +msgid "section_none" +msgstr "Miscellaneous" + +msgctxt "race" +msgid "catdragon_p" +msgstr "catdragons" + +msgctxt "race" +msgid "songdragon" +msgstr "song dragon" + +msgid "myrrh" +msgstr "myrrh" + +msgid "nr_guarding_unknown" +msgstr "unknown units" + +msgctxt "race" +msgid "catdragon_x" +msgstr "catdragon" + +msgctxt "skill" +msgid "alchemy" +msgstr "alchemy" + +msgctxt "race" +msgid "owl_d" +msgstr "owls" + +msgid "wente_dress" +msgstr "tuxedo" + +msgid "BAEUME" +msgstr "TREES" + +msgctxt "race" +msgid "owl_p" +msgstr "owls" + +msgid "attack_structural" +msgstr "an attack causing structural damage to buildings" + +msgctxt "spell" +msgid "antimagiczone" +msgstr "Antimagic" + +msgid "boat" +msgstr "boat" + +msgctxt "spell" +msgid "dreamreading" +msgstr "Read Dreams" + +msgid "soc_p" +msgstr "sacks of holding" + +msgctxt "spellinfo" +msgid "magicstreet" +msgstr "By performing these rituals the druid is able to summon a powerful earth elemental. As long as this elemental remains bound to a region, no rain can turn a path into mud and no river can destroy a bridge. All travelers in this region gain the same advantages as if they were travelling on a road. Even swamps and glaciers can be enchanted in this way. The more power the druid invests, the longer the roads remain intact." + +msgctxt "skill" +msgid "roadwork" +msgstr "roadwork" + +msgctxt "prefix" +msgid "arch" +msgstr "arch" + +msgctxt "race" +msgid "owl_x" +msgstr "owl" + +msgctxt "spell" +msgid "fish_shield" +msgstr "Shield of the Fish" + +msgid "corridor1_trail" +msgstr "a %s" + +msgctxt "race" +msgid "dolphin_d" +msgstr "dolphins" + +msgid "join" +msgstr "JOIN" + +msgid "lebkuchenherz_p" +msgstr "gingerbread hearts" + +msgctxt "spell" +msgid "analysedream" +msgstr "Analyse Dreams" + +msgctxt "prefix" +msgid "Tal" +msgstr "valley " + +msgid "ZIPPED" +msgstr "ZIPPED" + +msgid "dir_west" +msgstr "West" + +msgctxt "spellinfo" +msgid "dreamreading" +msgstr "This spell enables the mentalist to penetrate the dreams of a target unit and gather information about that unit's surroundings. He will receive a report from the corresponding region." + +msgid "roqf" +msgstr "ring of quick fingers" + +msgctxt "race" +msgid "shadowdragon" +msgstr "shadow dragon" + +msgctxt "race" +msgid "dolphin_p" +msgstr "dolphins" + +msgid "herb" +msgstr "herb" + +msgctxt "spell" +msgid "mindblast" +msgstr "Mental Death" + +msgctxt "spellinfo" +msgid "analysedream" +msgstr "With this spell the mentalist can attempt to detect enchantments on a target unit. He will get an idea of the effect of all spells that don't exceed his own abilities. If a spell is stronger, it takes a little luck for a successful analysis." + +msgctxt "keyword" +msgid "give" +msgstr "GIVE" + +msgctxt "race" +msgid "unicorn_d" +msgstr "unicorns" + +msgctxt "race" +msgid "dolphin_x" +msgstr "dolphin" + +msgid "dir_ne" +msgstr "NE" + +msgctxt "spell" +msgid "create_bagofholding" +msgstr "Create A Bag of Holding" + +msgctxt "spellinfo" +msgid "orkdream" +msgstr "This spell - whose use is forbidden in most cultures - creates an uncontrollable desire for physical love in the victim. The affected persons will rush head over heels into a love affair, unable to think of anything else. Most of them will regret this a few months later... " + +msgctxt "spell" +msgid "hail" +msgstr "Hail" + +msgid "hero" +msgstr "hero" + +msgctxt "keyword" +msgid "prefix" +msgstr "PREFIX" + +msgid "SILBERPOOL" +msgstr "SILVERPOOL" + +msgid "section_nr" +msgstr "Notifications" + +msgctxt "calendar" +msgid "firstweek" +msgstr "the first week" + +msgctxt "spell" +msgid "undeadhero" +msgstr "Undead Heroes" + +msgctxt "race" +msgid "unicorn_p" +msgstr "unicorns" + +msgid "catspoil" +msgstr "cat tail" + +msgctxt "keyword" +msgid "show" +msgstr "SHOW" + +msgid "dir_nw" +msgstr "NW" + +msgctxt "race" +msgid "unicorn_x" +msgstr "unicorn" + +msgctxt "race" +msgid "shadowdragon_d" +msgstr "shadow dragons" + +msgctxt "spell" +msgid "combatrust" +msgstr "Winds of Rust" + +msgctxt "race" +msgid "mountainguard" +msgstr "mountainguard" + +msgid "tunnel" +msgstr "tunnel" + +msgid "hp_p" +msgstr "hps" + +msgctxt "calendar" +msgid "spring" +msgstr "spring" + +msgid "magicbag_p" +msgstr "magic bags" + +msgid "dragonship" +msgstr "dragonship" + +msgctxt "spell" +msgid "deathcloud" +msgstr "Death Cloud" + +msgctxt "spellinfo" +msgid "reanimate" +msgstr "When a warrior dies in a battle, his soul begins its long journey to the stars. With the help of this ritual, the mentalist can try to catch those escaping souls and bring them back to their bodies. The spell does not heal physical injuries, but an affected person will survive the battle." + +msgid "monument" +msgstr "monument" + +msgid "west" +msgstr "west" + +msgctxt "spellinfo" +msgid "transfer_aura_song" +msgstr "This spell enables the wizard to transfer aura at a rate of 2:1 to another sorcerer of the same school of magic." + +msgctxt "race" +msgid "shadowdragon_p" +msgstr "shadow dragons" + +msgctxt "spell" +msgid "create_firesword" +msgstr "Create A Flamesword" + +msgctxt "iteminfo" +msgid "roqf" +msgstr "The magic in this ring makes the fingers ten times more nimble. a craftsman can produce ten times his normal quota, and other abilities might also be improved." + +msgctxt "race" +msgid "shadowdragon_x" +msgstr "shadow dragon" + +msgctxt "keyword" +msgid "piracy" +msgstr "PIRACY" + +msgid "greatsword" +msgstr "claymore" + +msgctxt "spellinfo" +msgid "show_astral" +msgstr " The mage kann glance in the astral plane for a short time and perceives all units within an astral radius of level/5 regions. " + +msgctxt "race" +msgid "demon_d" +msgstr "demons" + +msgid "laen" +msgstr "laen" + +msgid "relativ viele" +msgstr "rather many" + +msgid "and" +msgstr "and" + +msgctxt "race" +msgid "demon_p" +msgstr "demons" + +msgctxt "race" +msgid "lynx_d" +msgstr "lynx" + +msgctxt "spellinfo" +msgid "keeploot" +msgstr "This spell prevents damage to a portion of the items that would otherwise be lost in battle. The loss of items is reduced by 5% for every level of the spell, up to a minimum of 25%." + +msgctxt "race" +msgid "demon_x" +msgstr "demon" + +msgid "mountain" +msgstr "mountain" + +msgctxt "race" +msgid "lynx_p" +msgstr "lynx" + +msgctxt "spellinfo" +msgid "cerddor_destroymagic" +msgstr " Every enchantment influences the life song, weakens and distorts it. The skillful bard can try to catch the life song, to strengthen it and cleanse the alteration from the song. " + +msgctxt "spellinfo" +msgid "treegrow" +msgstr "Every branch becomes a sturdy oak where before only one could be grown from a log." + +msgctxt "keyword" +msgid "bid" +msgstr "BID" + +msgctxt "race" +msgid "lynx_x" +msgstr "lynx" + +msgid "spear_p" +msgstr "spears" + +msgid "rustysword" +msgstr "rusty sword" + +msgctxt "spellinfo" +msgid "coldfront" +msgstr "Kills enemies with cold." + +msgid "insectspoil" +msgstr "insect antenna" + +msgctxt "spell" +msgid "shapeshift" +msgstr "Shapeshift" + +msgctxt "race" +msgid "youngdragon" +msgstr "young dragon" + +msgctxt "calendar" +msgid "firstweek_d" +msgstr "of the first week" + +msgid "swamp_trail" +msgstr "the swamps of %s" + +msgid "nr_nb_final" +msgstr "and to the " + +msgid "aoc" +msgstr "amulet of the kitten" + +msgid "balm_p" +msgstr "balm" + +msgid "aod" +msgstr "amulet of darkness" + +msgctxt "spell" +msgid "maelstrom" +msgstr "Maelstrom" + +msgctxt "race" +msgid "zombie_d" +msgstr "zombies" + +msgctxt "border" +msgid "wall" +msgstr "wall" + +msgctxt "skill" +msgid "trade" +msgstr "trade" + +msgid "dragonblood" +msgstr "dragonblood" + +msgid "aog" +msgstr "amulet of gathering" + +msgid "aquarianspoil_p" +msgstr "aquarian scales" + +msgctxt "spell" +msgid "calmmonster" +msgstr "Calm Monster" + +msgid "activevolcano" +msgstr "active volcano" + +msgctxt "spell" +msgid "auraleak" +msgstr "Astral Leak" + +msgid "trollbelt" +msgstr "trollbelt" + +msgctxt "race" +msgid "zombie_p" +msgstr "zombies" + +msgid "laenshield" +msgstr "laen shield" + +msgid "BEWACHE" +msgstr "GUARD" + +msgid "h0" +msgstr "flatroot" + +msgid "humanspoil" +msgstr "human scalp" + +msgctxt "coast" +msgid "ne" +msgstr "northeast coast" + +msgid "h1" +msgstr "tangy temerity" + +msgid "healingpotion" +msgstr "healingpotion" + +msgid "AUSWERTUNG" +msgstr "REPORT" + +msgid "h2" +msgstr "owlsgaze" + +msgid "rm_adamantium" +msgstr "adamantium" + +msgid "h3" +msgstr "spider ivy" + +msgid "h4" +msgstr "cobalt fungus" + +msgctxt "race" +msgid "zombie_x" +msgstr "zombie" + +msgid "nr_spell_components" +msgstr "Components:" + +msgid "h5" +msgstr "elvendear" + +msgid "h6" +msgstr "bugleweed" + +msgid "h7" +msgstr "knotroot" + +msgid "h8" +msgstr "bubblemorel" + +msgid "h9" +msgstr "waterfinder" + +msgid "section_errors" +msgstr "Warnings and Errors" + +msgctxt "spellinfo" +msgid "protective_runes" +msgstr " Drawn on the walls of a building or on the planks of a ship these runes will protect it from magic influence. Every ritual increases the resistance of the building or ship against enchantments by 20%. The effect can be increased by performing the ritual multiple times, but perfect protection is unlikely. The runes last at least three weeks, depending on the mage's skill maybe much longer. " + +msgctxt "race" +msgid "ghast" +msgstr "ghast" + +msgctxt "prefix" +msgid "ice" +msgstr "ice" + +msgctxt "spell" +msgid "create_invisibility_sphere" +msgstr "Create a Sphere of Invisbility" + +msgctxt "keyword" +msgid "research" +msgstr "RESEARCH" + +msgctxt "spellinfo" +msgid "song_of_healing" +msgstr "The field medic isn't the only one capable of tending the wounds of battle. The bards know a number of magic melodies to enhance the natural healing process of the body. This song is able to close wounds, mend fractured bones and even regenerate lost lims. " + +msgctxt "coast" +msgid "nw" +msgstr "northwest coast" + +msgid "adamantium_p" +msgstr "adamantium" + +msgid "seashell_p" +msgstr "seashells" + +msgid "nr_spell_type" +msgstr "Type:" + +msgctxt "race" +msgid "template_d" +msgstr "templates" + +msgctxt "skill" +msgid "melee" +msgstr "melee" + +msgid "birthday_firework" +msgstr "firework" + +msgctxt "prefix" +msgid "Chaos" +msgstr "chaos " + +msgctxt "race" +msgid "mountainguard_d" +msgstr "mountainguards" + +msgctxt "prefix" +msgid "Licht" +msgstr "light " + +msgctxt "spellinfo" +msgid "flee" +msgstr "Before a battle the mentalist creates terrifying illusions of hideous creatures that will cause panic among the enemies. Those who believe in the illusions will try to flee from battle." + +msgctxt "spell" +msgid "ironkeeper" +msgstr "Mountain Guardian" + +msgctxt "spellinfo" +msgid "enterastral" +msgstr "Ancient arcane formulae permit the magician to transport himself or other units into the astral plane. The magician can transport (level-3) * 15 GE through the transient portal. If the magician is experienced enough to cast level 11 spells, he can also transport units against their will." + +msgctxt "spell" +msgid "flyingship" +msgstr "Airship" + +msgctxt "race" +msgid "template_p" +msgstr "templates" + +msgid "STRASSEN" +msgstr "ROADS" + +msgid "jewel" +msgstr "gem" + +msgid "mallornbow" +msgstr "mallorn bow" + +msgid "horse" +msgstr "horse" + +msgid "thickfog" +msgstr "thick fog" + +msgctxt "prefix" +msgid "flame" +msgstr "flame" + +msgctxt "spell" +msgid "magic_roots" +msgstr "Roots of Magic" + +msgctxt "spell" +msgid "leaveastral" +msgstr "Astral Exit" + +msgctxt "race" +msgid "mountainguard_p" +msgstr "mountainguard" + +msgid "clone_of" +msgstr "Clone of %s" + +msgid "travelthru_header" +msgstr "The region was crossed by " + +msgctxt "race" +msgid "template_x" +msgstr "template" + +msgid "questkey1_p" +msgstr "agate keys" + +msgid "soc" +msgstr "sack of holding" + +msgid "hall1_trail" +msgstr "the %s" + +msgctxt "spellinfo" +msgid "treewalkenter" +msgstr "A great power lies within those places that are pulsing with life. A druid can focus this power and thereby create a gate into the World of Spirits. He can then send level*5 weight units of living or dead matter through the gate." + +msgctxt "spell" +msgid "draigdestroymagic" +msgstr "Pentagram" + +msgctxt "race" +msgid "tiger" +msgstr "tiger" + +msgid "dragonship_a" +msgstr "a dragonship" + +msgctxt "race" +msgid "mountainguard_x" +msgstr "mountainguard" + +msgid "unitdefault" +msgstr "Unit" + +msgid "nr_youaredead" +msgstr "Your faction has been eliminated. We hope that you had a good time, and if you liked the game, you should sign up and play again." + +msgid "invite" +msgstr "INVITE" + +msgid "scale" +msgstr "pangolin" + +msgid "cookie" +msgstr "cookie" + +msgid "fairyboot" +msgstr "fairy boots" + +msgid "hp" +msgstr "hp" + +msgctxt "spell" +msgid "firewall" +msgstr "Wall of Fire" + +msgctxt "spell" +msgid "cerddorfumbleshield" +msgstr "Countersong" + +msgctxt "spellinfo" +msgid "earn_silver#tybied" +msgstr "If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 50 silver per level that way." + +msgctxt "keyword" +msgid "teach" +msgstr "TEACH" + +msgid "ANZAHL" +msgstr "NUMBER" + +msgid "dir_se" +msgstr "SE" + +msgctxt "keyword" +msgid "combat" +msgstr "COMBAT" + +msgid "ao_healing_p" +msgstr "amulets of healing" + +msgid "ocean" +msgstr "ocean" + +msgctxt "spellinfo" +msgid "headache" +msgstr " Transcript to the lecture of Selen Ard'Ragorn in Bar'Glingal: 'It is said, this spell had its beginnings in the drinking holes of the Westgassen, but every other disreputable quarter is just as likely. Its most important ingredient is about a cask of terrible wine, the cheaper and more unbecoming, the more effective will be the essence. The art to distill this wine into pure essence is far more demanding than the simple brewery of an alchemist. Even more so to bind and conserve it, preventing its natural tendency to evaporate. This can only be accomplished by a master of Cerddor. Say, you manage to produce a vial of this ruby red, shimmering - well, not fluid, but also not exactly vapor - let's call it elixir. More challenges still lie ahead. The effective properties of the elixir are quick to dissipate. Therefore it has to be dribbled into the drink of the chosen victim within days. That is when you masters of infatuation and seduction can truly proof your worth. But take care not to drink of the concoction yourselves, for one taste will ensnare you to the tastes of wine and you will spend a full week on a bender. And as sure as day follows night, a dreadful agony will claim your head afterwards. You will lose knowledge of your best skill, two weeks worth of study just gone. Another word of warning: this spell is very complex. Should you try further spells during the same week, they will be far more difficult to perform.' " + +msgctxt "keyword" +msgid "sabotage" +msgstr "SABOTAGE" + +msgid "spear" +msgstr "spear" + +msgid "plate_p" +msgstr "platemails" + +msgctxt "describe" +msgid "truthpotion" +msgstr "This simple but very potent brew sharpens the senses of anyone that drinks of it and makes him able to see through even the most complex illusions for one week." + +msgid "tradepost" +msgstr "tradepost" + +msgid "p0_p" +msgstr "seven mile teas" + +msgid "INFO" +msgstr "INFO" + +msgid "STATISTIK" +msgstr "STATISTICS" + +msgid "dir_sw" +msgstr "SW" + +msgid "p3_p" +msgstr "busybeers" + +msgctxt "spellinfo" +msgid "wolfhowl" +msgstr "During their life in the wilderness, many druids make friends with the wolves who are the oldest friends of the great races. They learn to call many of them with a single howl to aid them in combat." + +msgid "elvenhorse" +msgstr "elven horse" + +msgid "ao_chastity_p" +msgstr "amulets of chastity" + +msgctxt "spell" +msgid "great_drought" +msgstr "Great Drought" + +msgid "status_flee" +msgstr "fleeing" + +msgid "p10_p" +msgstr "berserkers blood potions" + +msgctxt "keyword" +msgid "maketemp" +msgstr "MAKETEMP" + +msgctxt "spell" +msgid "reanimate" +msgstr "Resurrection" + +msgctxt "spellinfo" +msgid "create_bagofholding" +msgstr "This bag encloses a dimensional rift in which up to 200 units of weight can be carries. Horses and other large objects cannot be put into the bag. The bag itself has a weight of 1." + +msgid "questkey1" +msgstr "agate key" + +msgctxt "spell" +msgid "armor_shield" +msgstr "Shield Shine" + +msgid "questkey2" +msgstr "sapphire key" + +msgid "stat_cut" +msgstr "Is hard to hit by slashing weapons." + +msgid "BAUERN" +msgstr "PEASANTS" + +msgid "p6_p" +msgstr "brain waxes" + +msgctxt "spell" +msgid "summondragon" +msgstr "Call Dragons" + +msgid "ring_p" +msgstr "rings" + +msgid "VOR" +msgstr "BEFORE" + +msgid "p13_p" +msgstr "elixirs of power" + +msgctxt "iteminfo" +msgid "trollbelt" +msgstr "This artifact grants its wearer the strength of a cavetroll. He will be able to carry fifty times as much as normal and also in combat his enhanced strength and tough troll skin will serve him well." + +msgid "nr_owner" +msgstr "Owner" + +msgid "nr_template" +msgstr "Template for the next turn:" + +msgctxt "skill" +msgid "espionage" +msgstr "espionage" + +msgid "p9_p" +msgstr "horsepower potions" + +msgctxt "spell" +msgid "reelingarrows" +msgstr "Whirlwind" + +msgctxt "spellinfo" +msgid "versteinern" +msgstr "This complicated but effective spell uses the Elemental Spirits of Stone to turn a number of enemies to stone for the duration of combat. The affected persons won't be able to fight any more, but they can't be wounded either." + +msgctxt "spellinfo" +msgid "armor_shield" +msgstr " This ritual, to be performed before battle, gives the own troops an added bonus to their armor. Every hit reduces the strength of the spell until it dissipates during battle. " + +msgid "desert_trail" +msgstr "the deserts of %s" + +msgid "catapultammo_p" +msgstr "ammunition" + +msgid "greatsword_p" +msgstr "claymores" + +msgctxt "spellinfo" +msgid "summondragon" +msgstr "Performing this dark ritual, the sorcerer creates a bait that exhales an irresistable scent to dragons. It is not known whether the dragons come from surrounding regions or if they have their origin in the Sphere of Chaos. The bait will exist for about six weeks, but it must be placed in a tarrain that is suitable for dragons." + +msgctxt "spell" +msgid "icy_dragonbreath" +msgstr "Icy Dragonbreath" + +msgctxt "damage" +msgid "badly" +msgstr "badly wounded" + +msgctxt "race" +msgid "halfling_d" +msgstr "halflings" + +msgctxt "race" +msgid "smurf_d" +msgstr "smurfs" + +msgid "mountain_trail" +msgstr "the mountains of %s" + +msgctxt "spell" +msgid "aura_of_fear" +msgstr "Panic" + +msgctxt "race" +msgid "halfling_p" +msgstr "halflings" + +msgctxt "keyword" +msgid "quit" +msgstr "QUIT" + +msgctxt "race" +msgid "greenscarab" +msgstr "green scarab" + +msgid "AURA" +msgstr "AURA" + +msgid "smithy" +msgstr "smithy" + +msgid "laen_p" +msgstr "laen" + +msgctxt "spellinfo" +msgid "incite_riot" +msgstr " By means of this magical chant the mage incites riots in a region. Rebelling peasant mobs prevent taxation and recruiting and almost noone will pay money for entertainment. After a few weeks the mob will calm down again. " + +msgid "longboat" +msgstr "longboat" + +msgid "dir_east" +msgstr "East" + +msgctxt "spellinfo" +msgid "appeasement" +msgstr "This little melody calms even the wildest orc to a gentle and serene creature who will not even think about putting the singer to harm. The magician may travel to a neighboring region without being harassed by annoying troublemakers." + +msgctxt "spell" +msgid "coldfront" +msgstr "Coldfront" + +msgctxt "race" +msgid "halfling_x" +msgstr "halfling" + +msgctxt "race" +msgid "smurf_p" +msgstr "smurfs" + +msgctxt "spell" +msgid "depression" +msgstr "Song of Melancholy" + +msgid "battle_opponents" +msgstr "Fighting against" + +msgid "GEGENSTAENDE" +msgstr "ITEMS" + +msgid "greatbow" +msgstr "elven bow" + +msgctxt "spellinfo" +msgid "aura_of_fear" +msgstr "Panic." + +msgctxt "race" +msgid "smurf_x" +msgstr "smurf" + +msgctxt "spell" +msgid "cold_protection" +msgstr "Firun's Coat" + +msgctxt "spellinfo" +msgid "mallorntreegrow" +msgstr "This ritual greatly increases the effect of the potion. Now every branch becomes a mallorn tree where before only one could be grown from a log." + +msgid "ointment_p" +msgstr "ointments" + +msgid "see_travel" +msgstr "travel" + +msgid "oil_p" +msgstr "oil" + +msgctxt "spellinfo" +msgid "pull_astral" +msgstr "A magician in the astral plane can summon units from the material world. The magician can bring (level-3)*15 GE through the temporary portal. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will. " + +msgid "smod_far" +msgstr "far" + +msgctxt "keyword" +msgid "end" +msgstr "END" + +msgctxt "race" +msgid "aquarian_d" +msgstr "aquarians" + +msgctxt "iteminfo" +msgid "fairyboot" +msgstr "These leather boots are embroidere with unicorn hair and allow their wearer to walk at twice his normal speed." + +msgctxt "spell" +msgid "skillmod" +msgstr "Unknown Effect" + +msgctxt "race" +msgid "dreamcat" +msgstr "dreamcat" + +msgid "elfspoil_p" +msgstr "elven ears" + +msgid "moneychest" +msgstr "silverchest" + +msgid "amulet" +msgstr "amulet" + +msgctxt "spell" +msgid "auraboost" +msgstr "Chaos Gift" + +msgctxt "race" +msgid "aquarian_p" +msgstr "aquarians" + +msgctxt "spell" +msgid "magicresistance" +msgstr "Magic Resistance" + +msgctxt "race" +msgid "fairy" +msgstr "fairy" + +msgctxt "spell" +msgid "drain_skills" +msgstr "Shadowbreath" + +msgctxt "race" +msgid "sphinx_d" +msgstr "sphinx" + +msgctxt "coast" +msgid "se" +msgstr "southeast coast" + +msgctxt "race" +msgid "troll" +msgstr "troll" + +msgctxt "race" +msgid "aquarian_x" +msgstr "aquarian" + +msgctxt "spellinfo" +msgid "meteor_rain" +msgstr "A meteor shower rains down on the battlefield." + +msgctxt "school" +msgid "nomagic" +msgstr "no magic school yet" + +msgid "BZIP2" +msgstr "BZIP2" + +msgid "weight_unit" +msgstr "stone" + +msgid "firesword" +msgstr "flaming sword" + +msgid "nr_spells" +msgstr "spells" + +msgctxt "spellinfo" +msgid "earthquake" +msgstr "With this ritual the druid summons an Elemental Spirit of Earth that brings the ground to shake. This earthquake damages all buildings in the target region." + +msgctxt "race" +msgid "sphinx_p" +msgstr "sphinxs" + +msgid "east" +msgstr "east" + +msgid "status_rear" +msgstr "rear" + +msgctxt "race" +msgid "wolf" +msgstr "wolf" + diff --git a/src/bindings.c b/src/bindings.c index 276fe1dd4..7d9534c21 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -918,11 +918,16 @@ static void export_locale(const struct locale *lang, const char *name) { char fname[64]; FILE * F; - sprintf(fname, "strings.%s.po", name); + sprintf(fname, "strings.%2s.po", name); F = fopen(fname, "wt"); if (F) { export_strings(lang, F); - export_messages(lang, F); + fclose(F); + } + sprintf(fname, "messages.%2s.po", name); + F = fopen(fname, "wt"); + if (F) { + export_messages(lang, F, NULL); fclose(F); } } diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 0f8dbb9d0..0f538639f 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -191,12 +191,12 @@ void free_nrmesssages(void) { } } -void export_messages(const struct locale * lang, FILE *F) { +void export_messages(const struct locale * lang, FILE *F, const char *context) { int i; for (i = 0; i != NRT_MAXHASH; ++i) { nrmessage_type *nrt = nrtypes[i]; while (nrt) { - po_write_msg(F, nrt->mtype->name, nrt->string, "message"); + po_write_msg(F, nrt->mtype->name, nrt->string, context); nrt = nrt->next; } } diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index 7234d5b2a..7c4201010 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -47,14 +47,7 @@ extern "C" { int nr_level(const struct message *msg); const char *nr_section(const struct message *msg); - void export_messages(const struct locale * lang, FILE *F); - /* before: - * fogblock;movement:0;de;{unit} konnte von {region} nicht nach {$dir direction} ausreisen, der Nebel war zu dicht. - * after: - * fogblock:movement:0 - * $unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht. - * unit:unit region:region direction:int - */ + void export_messages(const struct locale * lang, FILE *F, const char *context); #ifdef __cplusplus } From 9ca945cb2c7ef0ba42e81cf933c7687faf960429 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 16:53:56 +0200 Subject: [PATCH 189/231] add a string escaping function. start some work on nrmessage.c. --- res/translations/strings.de.po | 5 +++- src/util/nrmessage.c | 7 ++++-- src/util/strings.c | 35 ++++++++++++++++++++++++++++ src/util/strings.h | 4 +++- src/util/strings.test.c | 14 ++++++++++++ src/xmlreader.c | 42 +++++++++++++++++----------------- 6 files changed, 82 insertions(+), 25 deletions(-) diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po index faf8a7982..d739a0b6d 100644 --- a/res/translations/strings.de.po +++ b/res/translations/strings.de.po @@ -3,7 +3,10 @@ msgstr "Rostiges Kettenhemd" msgctxt "spellinfo" msgid "destroy_magic" -msgstr "Dieser Zauber ermöglicht dem Magier, Verzauberungen einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen." +msgstr "" +"Dieser Zauber ermöglicht dem Magier, Verzauberungen " +"einer Einheit, eines Schiffes, Gebäudes oder auch " +"der Region aufzulösen." msgctxt "spell" msgid "shadowknights" diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 0f538639f..f74d6ab51 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -32,7 +32,10 @@ static nrmessage_type *nrtypes[NRT_MAXHASH]; const char *nrt_string(const struct nrmessage_type *type) { - return type->string; + if (type->string) { + return type->string; + } + return locale_get(type->lang, type->mtype->name); } nrmessage_type *nrt_find(const struct locale * lang, @@ -148,7 +151,7 @@ size_t size, const void *userdata) if (nrt) { const char *m = - translate(nrt->string, userdata, nrt->vars, msg->parameters); + translate(nrt_string(nrt), userdata, nrt->vars, msg->parameters); if (m) { return str_strlcpy((char *)buffer, m, size); } diff --git a/src/util/strings.c b/src/util/strings.c index 4959fba6c..38cb020f9 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -270,3 +270,38 @@ void sbs_strcpy(struct sbstring *sbs, const char *str) } sbs->end = sbs->begin + len; } + +char *str_unescape(char *str) { + char *read = str, *write = str; + while (*read) { + char * pos = strchr(read, '\\'); + if (pos) { + size_t len = pos - read; + memmove(write, read, len); + write += len; + read += (len + 1); + switch (read[0]) { + case 'r': + *write++ = '\r'; + break; + case 'n': + *write++ = '\n'; + break; + case 't': + *write++ = '\t'; + break; + default: + *write++ = read[0]; + } + *write = 0; + ++read; + } + else { + size_t len = strlen(read); + memmove(write, read, len); + write[len] = 0; + break; + } + } + return str; +} diff --git a/src/util/strings.h b/src/util/strings.h index b50f27a30..fdf4a6c7c 100644 --- a/src/util/strings.h +++ b/src/util/strings.h @@ -26,13 +26,15 @@ extern "C" { #endif void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, const char *value); - const char *str_escape(const char *str, char *buffer, size_t len); unsigned int str_hash(const char *s); size_t str_slprintf(char * dst, size_t size, const char * format, ...); size_t str_strlcpy(char *dst, const char *src, size_t len); size_t str_strlcat(char *dst, const char *src, size_t len); char *str_strdup(const char *s); + const char *str_escape(const char *str, char *buffer, size_t len); + char *str_unescape(char *str); + unsigned int jenkins_hash(unsigned int a); unsigned int wang_hash(unsigned int a); diff --git a/src/util/strings.test.c b/src/util/strings.test.c index 89c880a70..a04d0fe53 100644 --- a/src/util/strings.test.c +++ b/src/util/strings.test.c @@ -9,6 +9,19 @@ #include #include "strings.h" +static void test_str_unescape(CuTest * tc) +{ + char scratch[64]; + + strcpy(scratch, "1234 5678"); + str_unescape(scratch); + CuAssertStrEquals(tc, "1234 5678", scratch); + + strcpy(scratch, "\\\"\\\\\\n\\t\\r\\a"); + str_unescape(scratch); + CuAssertStrEquals(tc, "\"\\\n\t\ra", scratch); +} + static void test_str_escape(CuTest * tc) { char scratch[64]; @@ -122,6 +135,7 @@ CuSuite *get_strings_suite(void) CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_str_hash); SUITE_ADD_TEST(suite, test_str_escape); + SUITE_ADD_TEST(suite, test_str_unescape); SUITE_ADD_TEST(suite, test_str_replace); SUITE_ADD_TEST(suite, test_str_slprintf); SUITE_ADD_TEST(suite, test_str_strlcat); diff --git a/src/xmlreader.c b/src/xmlreader.c index c3f3ac5fd..afb421ce2 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -10,12 +10,23 @@ This program may not be used, modified or distributed without prior permission by the authors of Eressea. */ +#ifdef _MSC_VER #include -#include +#endif #include "xmlreader.h" +#include "alchemy.h" +#include "guard.h" +#include "keyword.h" +#include "move.h" +#include "prefix.h" + +#include "attributes/attributes.h" +#include "modules/score.h" + #include "kernel/building.h" +#include "kernel/calendar.h" #include "kernel/item.h" #include "kernel/messages.h" #include "kernel/race.h" @@ -27,26 +38,15 @@ without prior permission by the authors of Eressea. #include "kernel/spell.h" #include "kernel/spellbook.h" -#include "alchemy.h" -#include "kernel/calendar.h" -#include "guard.h" -#include "keyword.h" -#include "move.h" -#include "prefix.h" - -#include -#include - -/* util includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "util/attrib.h" +#include "util/crmessage.h" +#include "util/functions.h" +#include "util/language.h" +#include "util/log.h" +#include "util/message.h" +#include "util/nrmessage.h" +#include "util/strings.h" +#include "util/xml.h" /* libxml includes */ #include From c596402e4a046f613ac10cbbdeb8b94b0d3159ee Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 16:54:59 +0200 Subject: [PATCH 190/231] load strings from po file, not xml. --- conf/e2/locales.json | 4 +- src/CMakeLists.txt | 1 + src/jsonconf.c | 40 ++++++++++++++- src/pofile.c | 116 +++++++++++++++++++++++++++++++++++++++++++ src/pofile.h | 8 +++ 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 src/pofile.c create mode 100644 src/pofile.h diff --git a/conf/e2/locales.json b/conf/e2/locales.json index 4a3a100ef..0c17a7700 100644 --- a/conf/e2/locales.json +++ b/conf/e2/locales.json @@ -1,8 +1,8 @@ { "include": [ + "config://res/translations/strings.de.po", + "config://res/translations/strings.en.po", "config://res/core/messages.xml", - "config://res/core/de/strings.xml", - "config://res/core/en/strings.xml", "config://res/eressea/strings.xml", "config://res/eressea/spellinfo.xml", "config://res/names-undead.xml", diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bdf0465d2..ee2dbe9da 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -126,6 +126,7 @@ set (ERESSEA_SRC summary.c travelthru.c monsters.c + pofile.c wormhole.c xmlreader.c ${SPELLS_SRC} diff --git a/src/jsonconf.c b/src/jsonconf.c index b16097d51..e04c7690c 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -45,6 +45,7 @@ without prior permission by the authors of Eressea. #include "keyword.h" #include "move.h" #include "prefix.h" +#include "pofile.h" #include "skill.h" /* external libraries */ @@ -1020,6 +1021,40 @@ static int include_xml(const char *uri) { return err; } +static int add_po_string(const char *msgid, const char *msgstr, const char *msgctxt, void *data) { + struct locale * lang = (struct locale *)data; + const char * key = msgid; + if (msgctxt) { + key = mkname(msgctxt, msgid); + } + locale_setstring(lang, key, msgstr); + return 0; +} + +static int include_po(const char *uri) { + char name[PATH_MAX], lname[8]; + const char *filename = uri_to_file(uri, name, sizeof(name)); + const char *pos = strstr(filename, ".po"); + if (pos) { + const char *str = --pos; + while (str > filename && *str != '.') --str; + if ((pos - str) < sizeof(lname)) { + struct locale * lang; + memcpy(lname, str+1, pos - str); + lname[pos - str] = 0; + lang = get_or_create_locale(lname); + if (lang) { + int err = pofile_read(filename, add_po_string, lang); + if (err < 0) { + log_error("could not parse XML from %s", uri); + } + return err; + } + } + } + return -1; +} + static void json_include(cJSON *json) { cJSON *child; if (json->type != cJSON_Array) { @@ -1030,7 +1065,10 @@ static void json_include(cJSON *json) { const char *uri = child->valuestring; int err; - if (strstr(uri, ".xml") != NULL) { + if (strstr(uri, ".po") != NULL) { + err = include_po(uri); + } + else if (strstr(uri, ".xml") != NULL) { err = include_xml(uri); } else { diff --git a/src/pofile.c b/src/pofile.c new file mode 100644 index 000000000..7cb1a5460 --- /dev/null +++ b/src/pofile.c @@ -0,0 +1,116 @@ +#ifdef _MSC_VER +#include +#endif + +#include "pofile.h" + +#include "util/log.h" +#include "util/strings.h" + +#include +#include +#include + +#define MAXLINE 2048 +static char po_line[MAXLINE]; +static int po_lineno; + +char * read_line(FILE *F) { + char * read = fgets(po_line, MAXLINE, F); + ++po_lineno; + return read; +} + +char * read_multiline(FILE *F, char *line, char *buffer, size_t size) { + char *output = buffer; + while (line) { + size_t len; + char *read = line; + while (read[0] && isspace(read[0])) { + /* eat whitespace */ + ++read; + } + if (read[0] != '"') { + break; + } + ++read; + str_unescape(read); + len = strlen(read); + if (len >= 2) { + /* strip trailing quote (and possible newline) */ + if (read[len - 1] == '\n') { + --len; + } + if (read[len - 1] == '"') { + --len; + } + if (size > len) { + /* copy into buffer */ + memcpy(output, read, len); + output += len; + size -= len; + output[0] = '\0'; + } + } + line = read_line(F); + } + return line; +} + +int pofile_read(const char *filename, int (*callback)(const char *msgid, const char *msgstr, const char *msgctxt, void *data), void *data) { + FILE * F = fopen(filename, "rt"); + char msgctxt[32]; + char msgid[64]; + char msgstr[2048]; + char *line; + int err = 0; + + if (!F) { + log_error("could not open %s", filename); + } + + msgctxt[0] = 0; + msgid[0] = 0; + line = read_line(F); + while (line) { + char token[8]; + int err = sscanf(line, "%8s", token); + if (err == 1) { + char *text = NULL; + size_t size, len = strlen(token); + + line = line + len + 1; + if (len == 7 && memcmp(token, "msgctxt", 7) == 0) { + text = msgctxt; + size = sizeof(msgctxt); + } + else if (len == 5 && memcmp(token, "msgid", 5) == 0) { + text = msgid; + size = sizeof(msgid); + } + else if (len == 6 && memcmp(token, "msgstr", 6) == 0) { + line = read_multiline(F, line, msgstr, sizeof(msgstr)); + if (msgid[0]) { + err = callback(msgid, msgstr, msgctxt[0] ? msgctxt : NULL, data); + if (err != 0) { + break; + } + msgctxt[0] = 0; + msgid[0] = 0; + } + } + if (text) { + line = read_multiline(F, line, text, size); + } + } + else { + line = read_line(F); + } + } + if (ferror(F)) { + log_error("read error in %s:%d.", filename, po_lineno); + return -1; + } + fclose(F); + return err; +} diff --git a/src/pofile.h b/src/pofile.h new file mode 100644 index 000000000..0e6f6db7a --- /dev/null +++ b/src/pofile.h @@ -0,0 +1,8 @@ +#pragma once + +#ifndef H_POFILE +#define H_POFILE + +int pofile_read(const char *filename, int (*callback)(const char *msgid, const char *msgstr, const char *msgctxt, void *data), void *data); + +#endif From 7a10a586057143dee31df917ae2b3c9248c42eb2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 19:03:49 +0200 Subject: [PATCH 191/231] 1. nrmessage is locale-independent, uses locale_getstring 2. unique strings: rename aurapotion50 message. delete unused bithday_firework definitions. --- res/core/de/strings.xml | 6 ---- res/core/en/strings.xml | 6 ---- res/core/fr/strings.xml | 6 ---- res/core/messages.xml | 34 +---------------------- scripts/tests/e2/items.lua | 2 +- src/bindings.c | 6 ---- src/creport.c | 4 +-- src/items.c | 2 +- src/util/nrmessage.c | 55 +++++++------------------------------ src/util/nrmessage.h | 14 +++------- src/util/nrmessage_struct.h | 3 -- src/xmlreader.c | 5 ++-- 12 files changed, 22 insertions(+), 121 deletions(-) diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml index 2be2f04e4..82174da28 100644 --- a/res/core/de/strings.xml +++ b/res/core/de/strings.xml @@ -1688,12 +1688,6 @@ Mallornsamen - - Feuerwerk - - - Feuerwerke - Lebkuchenherz mit der Aufschrift 'Erz und Stein, das ist fein' diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml index 096dace78..c4663d1b1 100644 --- a/res/core/en/strings.xml +++ b/res/core/en/strings.xml @@ -874,12 +874,6 @@ mallorn seeds - - firework - - - fireworks - gingerbread heart diff --git a/res/core/fr/strings.xml b/res/core/fr/strings.xml index d6c61e00c..1c9c524f4 100644 --- a/res/core/fr/strings.xml +++ b/res/core/fr/strings.xml @@ -881,12 +881,6 @@ graines de mallorn - - feu d'artifice - - - feux d'artifice - coeur de pain d'épices diff --git a/res/core/messages.xml b/res/core/messages.xml index 371369dbf..afc391650 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -750,38 +750,6 @@ "$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount)." "$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount)." - - - - - "$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel." - "A large firework is visible all over the sky." - - - - - - - "In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel." - "A large firework, visible all over the sky, has been started in $region($region)." - - - - - - - "Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel." - "A large firework in honor of ${name} is visible all over the sky." - - - - - - - - "Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel." - "A large firework in honor of ${name}, visible all over the sky, has been started in $region($region)." - @@ -7628,7 +7596,7 @@ "$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster." - + diff --git a/scripts/tests/e2/items.lua b/scripts/tests/e2/items.lua index 99b32cc52..d4b09e363 100644 --- a/scripts/tests/e2/items.lua +++ b/scripts/tests/e2/items.lua @@ -86,7 +86,7 @@ function test_aurapotion50() turn_begin() turn_process() assert_equal(0, u:get_item("aurapotion50")) - assert_equal(1, f:count_msg_type('aurapotion50')) + assert_equal(1, f:count_msg_type('aurapotion50_effect')) assert_equal(50, u.aura) turn_end() end diff --git a/src/bindings.c b/src/bindings.c index 7d9534c21..11a049c5d 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -924,12 +924,6 @@ static void export_locale(const struct locale *lang, const char *name) { export_strings(lang, F); fclose(F); } - sprintf(fname, "messages.%2s.po", name); - F = fopen(fname, "wt"); - if (F) { - export_messages(lang, F, NULL); - fclose(F); - } } static int tolua_export_locales(lua_State *L) { diff --git a/src/creport.c b/src/creport.c index 4fc1cdd99..d48c61739 100644 --- a/src/creport.c +++ b/src/creport.c @@ -512,14 +512,14 @@ static void report_crtypes(FILE * F, const struct locale *lang) for (i = 0; i != MTMAXHASH; ++i) { struct known_mtype *kmt; for (kmt = mtypehash[i]; kmt; kmt = kmt->nexthash) { - const struct nrmessage_type *nrt = nrt_find(lang, kmt->mtype); + const struct nrmessage_type *nrt = nrt_find(kmt->mtype); if (nrt) { char buffer[DISPLAYSIZE]; int hash = (int)kmt->mtype->key; assert(hash > 0); fprintf(F, "MESSAGETYPE %d\n", hash); fputc('\"', F); - fputs(str_escape(nrt_string(nrt), buffer, sizeof(buffer)), F); + fputs(str_escape(nrt_string(nrt, lang), buffer, sizeof(buffer)), F); fputs("\";text\n", F); fprintf(F, "\"%s\";section\n", nrt_section(nrt)); } diff --git a/src/items.c b/src/items.c index d0f6f7b0b..574c1da3b 100644 --- a/src/items.c +++ b/src/items.c @@ -224,7 +224,7 @@ int amount, struct order *ord) change_spellpoints(u, 50); - ADDMSG(&u->faction->msgs, msg_message("aurapotion50", + ADDMSG(&u->faction->msgs, msg_message("aurapotion50_effect", "unit region command", u, u->region, ord)); use_pooled(u, itype->rtype, GET_DEFAULT, 1); diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index f74d6ab51..f35734f37 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -30,38 +30,26 @@ #define NRT_MAXHASH 1021 static nrmessage_type *nrtypes[NRT_MAXHASH]; -const char *nrt_string(const struct nrmessage_type *type) +const char *nrt_string(const struct nrmessage_type *nrt, const struct locale *lang) { - if (type->string) { - return type->string; - } - return locale_get(type->lang, type->mtype->name); + return locale_getstring(lang, nrt->mtype->name); } -nrmessage_type *nrt_find(const struct locale * lang, - const struct message_type * mtype) +nrmessage_type *nrt_find(const struct message_type * mtype) { nrmessage_type *found = NULL; unsigned int hash = mtype->key % NRT_MAXHASH; nrmessage_type *type = nrtypes[hash]; while (type) { if (type->mtype == mtype) { - if (found == NULL) + if (found == NULL) { found = type; - else if (type->lang == NULL) - found = type; - if (lang == type->lang) { - found = type; - break; } } type = type->next; } if (!found) { - log_warning("could not find nr-type %s for locale %s\n", mtype->name, locale_name(lang)); - } - if (lang && found && found->lang != lang) { - log_warning("could not find nr-type %s for locale %s, using %s\n", mtype->name, locale_name(lang), locale_name(found->lang)); + log_warning("could not find nr-type %s\n", mtype->name); } return found; } @@ -100,12 +88,11 @@ const nrsection *section_add(const char *name) } void -nrt_register(const struct message_type *mtype, const struct locale *lang, -const char *string, int level, const char *section) +nrt_register(const struct message_type *mtype, const char *section) { unsigned int hash = mtype->key % NRT_MAXHASH; nrmessage_type *nrt = nrtypes[hash]; - while (nrt && (nrt->lang != lang || nrt->mtype != mtype)) { + while (nrt && nrt->mtype != mtype) { nrt = nrt->next; } if (nrt) { @@ -117,10 +104,8 @@ const char *string, int level, const char *section) char zNames[256]; char *c = zNames; nrt = malloc(sizeof(nrmessage_type)); - nrt->lang = lang; nrt->mtype = mtype; nrt->next = nrtypes[hash]; - nrt->level = level; if (section) { const nrsection *s = section_find(section); if (s == NULL) { @@ -131,8 +116,6 @@ const char *string, int level, const char *section) else nrt->section = NULL; nrtypes[hash] = nrt; - assert(string && *string); - nrt->string = str_strdup(string); *c = '\0'; for (i = 0; i != mtype->nparameters; ++i) { if (i != 0) @@ -147,11 +130,11 @@ size_t nr_render(const struct message *msg, const struct locale *lang, char *buffer, size_t size, const void *userdata) { - struct nrmessage_type *nrt = nrt_find(lang, msg->type); + struct nrmessage_type *nrt = nrt_find(msg->type); if (nrt) { const char *m = - translate(nrt_string(nrt), userdata, nrt->vars, msg->parameters); + translate(nrt_string(nrt, lang), userdata, nrt->vars, msg->parameters); if (m) { return str_strlcpy((char *)buffer, m, size); } @@ -164,15 +147,9 @@ size_t size, const void *userdata) return 0; } -int nr_level(const struct message *msg) -{ - nrmessage_type *nrt = nrt_find(NULL, msg->type); - return nrt ? nrt->level : 0; -} - const char *nr_section(const struct message *msg) { - nrmessage_type *nrt = nrt_find(default_locale, msg->type); + nrmessage_type *nrt = nrt_find(msg->type); return nrt ? nrt->section : NULL; } @@ -187,20 +164,8 @@ void free_nrmesssages(void) { while (nrtypes[i]) { nrmessage_type *nr = nrtypes[i]; nrtypes[i] = nr->next; - free(nr->string); free(nr->vars); free(nr); } } } - -void export_messages(const struct locale * lang, FILE *F, const char *context) { - int i; - for (i = 0; i != NRT_MAXHASH; ++i) { - nrmessage_type *nrt = nrtypes[i]; - while (nrt) { - po_write_msg(F, nrt->mtype->name, nrt->string, context); - nrt = nrt->next; - } - } -} diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index 7c4201010..abb47551c 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -34,21 +34,15 @@ extern "C" { void free_nrmesssages(void); - void nrt_register(const struct message_type *mtype, - const struct locale *lang, const char *script, - int level, const char *section); - struct nrmessage_type *nrt_find(const struct locale *, - const struct message_type *); - const char *nrt_string(const struct nrmessage_type *type); - const char *nrt_section(const struct nrmessage_type *mt); + void nrt_register(const struct message_type *mtype, const char *section); + struct nrmessage_type *nrt_find(const struct message_type *); + const char *nrt_string(const struct nrmessage_type *nrt, const struct locale *lang); + const char *nrt_section(const struct nrmessage_type *nrt); size_t nr_render(const struct message *msg, const struct locale *lang, char *buffer, size_t size, const void *userdata); - int nr_level(const struct message *msg); const char *nr_section(const struct message *msg); - void export_messages(const struct locale * lang, FILE *F, const char *context); - #ifdef __cplusplus } #endif diff --git a/src/util/nrmessage_struct.h b/src/util/nrmessage_struct.h index 57f8e644d..a25a6341a 100644 --- a/src/util/nrmessage_struct.h +++ b/src/util/nrmessage_struct.h @@ -7,11 +7,8 @@ typedef struct nrmessage_type { const struct message_type *mtype; - const struct locale *lang; - char *string; char *vars; struct nrmessage_type *next; - int level; const char *section; } nrmessage_type; diff --git a/src/xmlreader.c b/src/xmlreader.c index afb421ce2..e9b30d060 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1368,6 +1368,8 @@ static int parse_messages(xmlDocPtr doc) if (propSection == NULL) propSection = BAD_CAST default_section; + nrt_register(mtype, (const char *)propSection); + /* strings */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "text", xpath); @@ -1380,8 +1382,7 @@ static int parse_messages(xmlDocPtr doc) xml_readtext(node, &lang, &propText); if (lang) { xml_cleanup_string(propText); - nrt_register(mtype, lang, (const char *)propText, 0, - (const char *)propSection); + locale_setstring(lang, mtype->name, (const char *)propText); } xmlFree(propText); From c0ed53b679f912c7ad0ed4bf232114842249dc1b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 22:15:24 +0200 Subject: [PATCH 192/231] last of the duplicate names. battles have lost their separators, though. --- res/core/messages.xml | 9 +-------- src/battle.c | 12 +----------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index afc391650..8adc9dfd1 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -1650,7 +1650,7 @@ "$string" "$string" - + @@ -7186,13 +7186,6 @@ "Units after the battle:" - - - - "" - "" - - diff --git a/src/battle.c b/src/battle.c index b69bab5d6..fa7d70ca5 100644 --- a/src/battle.c +++ b/src/battle.c @@ -110,8 +110,6 @@ typedef enum combatmagic { static int missile_range[2] = { FIGHT_ROW, BEHIND_ROW }; static int melee_range[2] = { FIGHT_ROW, FIGHT_ROW }; -static message *msg_separator; - const troop no_troop = { 0, 0 }; #define FORMULA_ORIG 0 @@ -2888,9 +2886,7 @@ static void print_stats(battle * b) message *msg; char buf[1024]; - battle_message_faction(b, f, msg_separator); - - msg = msg_message("battle_army", "index name", army_index(s), sname); + msg = msg_message("battle_army_index", "index name", army_index(s), sname); battle_message_faction(b, f, msg); msg_release(msg); @@ -2959,8 +2955,6 @@ static void print_stats(battle * b) print_fighters(b, s); } - message_all(b, msg_separator); - /* Besten Taktiker ermitteln */ b->max_tactics = 0; @@ -3501,7 +3495,6 @@ static int battle_report(battle * b) bool komma = false; sbs_init(&sbs, buf, sizeof(buf)); - battle_message_faction(b, fac, msg_separator); if (cont) m = msg_message("lineup_battle", "turn", b->turn); @@ -4008,9 +4001,6 @@ void do_battle(region * r) battle *b = NULL; bool fighting = false; ship *sh; - if (msg_separator == NULL) { - msg_separator = msg_message("section_battle", ""); - } fighting = start_battle(r, &b); From 615dfe7ec5d8d239b1ecb7890d11fd095385847c Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 22:47:16 +0200 Subject: [PATCH 193/231] Get the NR message text from locale. --- res/core/messages.xml | 6 +- res/translations/messages.de.po | 2821 +------------------------------ res/translations/messages.en.po | 2821 +------------------------------ src/battle.c | 6 +- src/bindings.c | 4 +- src/report.c | 4 + src/util/language.c | 23 - src/util/language.h | 1 - src/util/nrmessage.c | 18 +- src/util/nrmessage.h | 2 + 10 files changed, 47 insertions(+), 5659 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index 8adc9dfd1..b8f8125dc 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -1650,7 +1650,7 @@ "$string" "$string" - + @@ -7179,7 +7179,7 @@ "$unit($mage) casts $spell($spell), but nobody was in range." - + "Einheiten nach dem Kampf:" @@ -7245,7 +7245,7 @@ "$unit($mage) causes the walls of $building($building) to glow in an eerie magic light." - + diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po index 3a9ee2ed0..8e882a435 100644 --- a/res/translations/messages.de.po +++ b/res/translations/messages.de.po @@ -1,5595 +1,2790 @@ -msgid "homestone_effect" -msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\"" - msgid "homestone_effect" msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\"" -msgid "nogive_reserved" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has this item, but all $int($reservation) $resource($resource,$reservation) are reserved.\"" - msgid "nogive_reserved" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand zwar, aber sämtliche $int($reservation) $resource($resource,$reservation) sind reserviert.\"" -msgid "recruit" -msgstr "\"$unit($unit) in $region($region) recruits $int($amount) of $int($want) people.\"" - msgid "recruit" msgstr "\"$unit($unit) in $region($region) rekrutiert $int($amount) von $int($want) Personen.\"" -msgid "sp_dreamreading_effect" -msgstr "\"$unit($mage) is lost in the dreams of $unit($unit) and gets a glimps into $region($region).\"" - msgid "sp_dreamreading_effect" msgstr "\"$unit($mage) verliert sich in die Träume von $unit($unit) und erhält einen Eindruck von $region($region).\"" -msgid "analyse_ship_age" -msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for, about $int($months) more weeks.\"" - msgid "analyse_ship_age" msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" -msgid "curseinfo::sparkle_2" -msgstr "\"$unit($unit) is haunted by terrbile nightmares. ($int36($id))\"" - msgid "curseinfo::sparkle_2" msgstr "\"$unit($unit) wird von bösen Alpträumen geplagt. ($int36($id))\"" -msgid "absorbpeasants" -msgstr "\"$int($amount) peasants become $race($race,0) and join the ranks of $unit($unit).\"" - msgid "absorbpeasants" msgstr "\"$int($amount) Bauern werden zu $race($race,0) und schliessen sich $unit($unit) an.\"" -msgid "unholypower_effect" -msgstr "\"$unit($mage) tranforms $unit($target) to $race($race,0).\"" - msgid "unholypower_effect" msgstr "\"$unit($mage) verwandelt $unit($target) in $race($race,0).\"" -msgid "give_person" -msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to $unit($target).\"" - msgid "give_person" msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an $unit($target).\"" -msgid "rust_effect_2" -msgstr "\"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty.\"" - msgid "rust_effect_2" msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde. Der magischen Regen lässt alles Eisen rosten.\"" -msgid "heroes_maxed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction already has $int($count) of $int($max) heroes.\"" - msgid "heroes_maxed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits $int($count) von $int($max) Helden.\"" -msgid "error_build_skill_low" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires a skill of at least $int($value) to build.\"" - msgid "error_build_skill_low" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um das zu bauen, braucht man ein Talent von mindestens $int($value).\"" -msgid "analyse_building_age" -msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" - msgid "analyse_building_age" msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" -msgid "curseinfo::auraboost_1" -msgstr "\"$unit($unit) finds it difficult to gather its magical energies. ($int36($id))\"" - msgid "curseinfo::auraboost_1" msgstr "\"$unit($unit) hat Schwierigkeiten seine magischen Energien zu sammeln. ($int36($id))\"" -msgid "harbor_trade" -msgstr "\"$unit($unit) received $resources($items) from the $ship($ship).\"" - msgid "harbor_trade" msgstr "\"$unit($unit) erhielt $resources($items) von der $ship($ship).\"" -msgid "reduce_spell" -msgstr "\"In $region($region), anti-magic from $unit($self) reduces the effect of $unit($mage)'s spell.\"" - msgid "reduce_spell" msgstr "\"$unit($self) schwächt in $region($region) einen Zauber von $unit.dative($mage) durch Antimagie ab.\"" -msgid "raised" -msgstr "\"$unit($unit) breeds $int($amount) horses.\"" - msgid "raised" msgstr "\"$unit($unit) züchtet $int($amount) Pferde.\"" -msgid "speed_time_effect" -msgstr "\"In $region($region), $unit($unit) bends time for $int($amount) men.\"" - msgid "speed_time_effect" msgstr "\"In $region($region) dehnt $unit($unit) die Zeit für $int($amount) Personen.\"" -msgid "error199" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a familiar.\"" - msgid "error199" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Vertrauten.\"" -msgid "error195" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" - msgid "error195" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" -msgid "healall" -msgstr "\"Life itself touches the world and all beings are healed.\"" - msgid "healall" msgstr "\"Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt.\"" -msgid "build_required" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required).\"" - msgid "build_required" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required).\"" -msgid "newbie_immunity_error" -msgstr "\"A faction must be at least $int($turns) weeks old before it can be attacked or stolen from.\"" - msgid "newbie_immunity_error" msgstr "\"Eine Partei muß mindestens $int($turns) Wochen alt sein, bevor sie angegriffen oder bestohlen werden kann.\"" -msgid "error191" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in forests.\"" - msgid "error191" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in Wäldern.\"" -msgid "error156" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many alchemists in the faction.\"" - msgid "error156" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Alchemisten in der Partei.\"" -msgid "error266" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only functions in the entry hall.\"" - msgid "error266" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der Eingangshalle.\"" -msgid "error81" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must first guard the region.\"" - msgid "error81" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit muß zuerst die Region bewachen.\"" -msgid "hornofpeace_u_nosuccess" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No region could be pacified.\"" - msgid "hornofpeace_u_nosuccess" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine Region konnte befriedet werden.\"" -msgid "error70" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by a non-allied faction.\"" - msgid "error70" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von Nichtalliierten bewacht.\"" -msgid "error92" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no normal forest in this region.\"" - msgid "error92" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keinen normalen Wald.\"" -msgid "error262" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot have any more wyrms.\"" - msgid "error262" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei kann keine weiteren Wyrme besitzen.\"" -msgid "massive_overload" -msgstr "\"The $ship($ship) is massively overloaded and is damaged heavily.\"" - msgid "massive_overload" msgstr "\"Die $ship($ship) ist zu stark überladen und wird stark beschädigt.\"" -msgid "curseinfo::shipspeedup" -msgstr "\"The winds seem to favor this ship. ($int36($id))\"" - msgid "curseinfo::shipspeedup" msgstr "\"Die Winde scheinen dieses Schiff besonders zu beguenstigen. ($int36($id))\"" -msgid "error152" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit jumps over board and drowns.\"" - msgid "error152" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit springt über Bord und ertrinkt.\"" -msgid "error108" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No herbs could be found.\"" - msgid "error108" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es sind keine Kräuter zu finden.\"" -msgid "spellfail::contact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit $unit($target) did not contact us.\"" - msgid "spellfail::contact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" -msgid "error214" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit is not a magician.\"" - msgid "error214" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist kein Magier.\"" -msgid "patzer6" -msgstr "\"A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'\"" - msgid "patzer6" msgstr "\"Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'\"" -msgid "lucky_item" -msgstr "\"$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount).\"" - msgid "lucky_item" msgstr "\"$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount).\"" -msgid "error104" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This metal can be excavated only in a mine.\"" - msgid "error104" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Metall kann nur in einem Bergwerk abgebaut werden.\"" -msgid "error100" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here is a skilled ship builder.\"" - msgid "error100" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier ist gelernter Schiffbauer.\"" -msgid "curseinfo::gooddream" -msgstr "\"The people in this region have sweet dreams. ($int36($id))\"" - msgid "curseinfo::gooddream" msgstr "\"Die Leute haben schöne Träume. ($int36($id))\"" -msgid "error2" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot guard off shore.\"" - msgid "error2" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf hoher See kann man nicht bewachen.\"" -msgid "nr_stat_maxentertainment" -msgstr "\"entertainment: max. $int($max) silver\"" - msgid "nr_stat_maxentertainment" msgstr "\"Unterhaltung: max. $int($max) Silber\"" -msgid "blessedstonecircle_effect" -msgstr "\"$unit($mage) blesses $building($building).\"" - msgid "blessedstonecircle_effect" msgstr "\"$unit($mage) weiht $building($building).\"" -msgid "income_tax_reduced" -msgstr "\"$unit($unit) collects taxes of$if($eq($wanted,$amount),\"\",\" only\") $int($amount) silver$if($eq($wanted,$amount),\"\",\" instead of $int($wanted) silver\") \") in $region($region).\"" - msgid "income_tax_reduced" msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber ein.\"" -msgid "curseinfo::holyground" -msgstr "\"The undead turn away from this region. ($int36($id))\"" - msgid "curseinfo::holyground" msgstr "\"Untote schrecken vor dieser Region zurück. ($int36($id))\"" -msgid "changemail" -msgstr "\"Address has been changed to '$value'.\"" - msgid "changemail" msgstr "\"Die Reportadresse wurde auf ${value} geändert.\"" -msgid "song_of_peace_effect_0" -msgstr "\"The marvelous singing of $unit($mage) enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" - msgid "song_of_peace_effect_0" msgstr "\"Die Gesangskunst von $unit($mage) begeistert die Leute. Die friedfertige Stimmung des Lieds überträgt sich auf alle Zuhörer. Einige werfen ihre Waffen weg.\"" -msgid "emptyeog" -msgstr "\"There is no more laen left in $region($region).\"" - msgid "emptyeog" msgstr "\"Die Laenader in $region($region) ist erschöpft.\"" -msgid "entrise" -msgstr "\"In $region($region), the Lords of the Trees have risen.\"" - msgid "entrise" msgstr "\"In $region($region) erschienen die Herren der Bäume.\"" -msgid "victory_murder_cfulfilled" -msgstr "\"Attention: $faction($faction) has fulfilled the victory condition and will be declared winner in $if($eq($remain,1),\"one week\",\"$int($remain) weeks\").\"" - msgid "victory_murder_cfulfilled" msgstr "\"Achtung: $faction($faction) hat die Siegbedingungen erfüllt und wird in $if($eq($remain,1),\"einer Woche\",\"$int($remain) Wochen\") zum Sieger erklärt werden.\"" -msgid "headache_effect_1" -msgstr "\"$unit($unit) has a splitting headache and can hardly remember last week. Except that it all started in the tavern...\"" - msgid "headache_effect_1" msgstr "\"$unit($unit) hat höllische Kopfschmerzen und kann sich an die vergangene Woche nicht mehr erinnern. Nur noch daran, wie alles mit einer fröhlichen Feier in irgendeiner Taverne anfing....\"" -msgid "feedback_no_contact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us.\"" - msgid "feedback_no_contact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" -msgid "sailforbiddendir" -msgstr "\"The crew of the $ship($ship) refuses to travel to the $direction($direction).\"" - msgid "sailforbiddendir" msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen.\"" -msgid "receive" -msgstr "\"$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit).\"" - msgid "receive" msgstr "\"$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit).\"" -msgid "missing_feedback" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Internal Error: Message '$name' is undefined.\"" - msgid "missing_feedback" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Interner Fehler: Meldung '$name' nicht definiert.\"" -msgid "thiefdiscover" -msgstr "\"$unit($target) caught $unit($unit) in attempted theft.\"" - msgid "thiefdiscover" msgstr "\"$unit($target) ertappte $unit($unit) beim versuchten Diebstahl.\"" -msgid "museumgiveback" -msgstr "\"In $region($region), $unit($unit) received $resources($items) from $unit($sender)\"" - msgid "museumgiveback" msgstr "\"In $region($region) erhielt $unit($unit) von $unit.dative($sender) $resources($items)\"" -msgid "curseinfo::sparkle_17" -msgstr "\"A dark and mysterious fairy appears before $unit($unit). She is of bewitching beauty. ($int36($id))\"" - msgid "curseinfo::sparkle_17" msgstr "\"Eine dunkle Fee erscheint $unit($unit) im Schlaf. Sie ist von schauriger Schönheit. ($int36($id))\"" -msgid "caldera_handle_0" -msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" - msgid "caldera_handle_0" msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" -msgid "researchherb_none" -msgstr "\"$unit($unit) could not find any herbs in $region($region).\"" - msgid "researchherb_none" msgstr "\"$unit($unit) in $region($region) kann keine Kräuter finden.\"" -msgid "moveblockedbyguard" -msgstr "\"$unit($unit) was kept in $region($region) by $unit($guard).\"" - msgid "moveblockedbyguard" msgstr "\"$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten.\"" -msgid "cast_frighten_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were intimidated.\"" - msgid "cast_frighten_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden eingeschüchtert.\"" -msgid "curseinfo::Feuerwand" -msgstr "A wall of fire blocks entry and exit. ($int36($id))" - msgid "curseinfo::Feuerwand" msgstr "Eine Feuerwand blockiert die Ein- und Ausreise. ($int36($id))" -msgid "renamed_building_notseen" -msgstr "\"$building($building) in $region($region) received a nickname.\"" - msgid "renamed_building_notseen" msgstr "\"$building($building) in $region($region) bekommt einen Spitznamen.\"" -msgid "heroes_race" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be heroes.\"" - msgid "heroes_race" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können keine Helden erwählen.\"" -msgid "summon_effect" -msgstr "\"$unit($mage) summons $int($amount) $race($race,$amount).\"" - msgid "summon_effect" msgstr "\"$unit($mage) beschwört $int($amount) $race($race,$amount).\"" -msgid "error28" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasant morale is low.\"" - msgid "error28" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern sind schlecht gelaunt.\"" -msgid "error39" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has not yet learned espionage.\"" - msgid "error39" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Spionage gelernt.\"" -msgid "destroy_magic_noeffect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician could not destroy any curse.\"" - msgid "destroy_magic_noeffect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier konnte keinen Fluch zerstören.\"" -msgid "cast_auraleak_effect" -msgstr "\"$unit($mage) in $region($region) caused a tear in the fabric of magic, that sucked all magical energies out of the region.\"" - msgid "cast_auraleak_effect" msgstr "\"$unit($mage) rief in $region($region) einen Riss in dem Gefüge der Magie hervor, der alle magische Kraft aus der Region riss.\"" -msgid "newbie_info_game" -msgstr "Remember to send your orders to $email with the subject ${subject}." - msgid "newbie_info_game" msgstr "Bitte denke daran, deine Befehle mit dem Betreff $subject an $email zu senden." -msgid "mob_warning" -msgstr "\"An angry mob forms and hunts practitioners of the dark arts.\"" - msgid "mob_warning" msgstr "\"Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier.\"" -msgid "dissolve_units_5" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) disappeared in the night.\"" - msgid "dissolve_units_5" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verschwand\", \"verschwanden\") über Nacht.\"" -msgid "fleescared" -msgstr "\"$int($amount) peasants fled in fear of $unit($unit).\"" - msgid "fleescared" msgstr "\"$int($amount) Bauern flohen aus Furcht vor $unit($unit).\"" -msgid "drought_effect_3" -msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds. The drought permanently alters the region.\"" - msgid "drought_effect_3" msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt. Die Dürre verändert die Region für immer.\"" -msgid "spellfail_pump" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Despite intense questioning, $unit($target) did not have anything to tell about $region($tregion).\"" - msgid "spellfail_pump" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wusste trotz intensivem Verhör nichts über $region($tregion) zu berichten.\"" -msgid "maintenance_nowork" -msgstr "\"$building($building) was nonfunctional because upkeep could not be paid at the beginning of the week.\"" - msgid "maintenance_nowork" msgstr "\"$building($building) hat diese Woche nicht funktioniert, da zu Beginn der Woche der Unterhalt nicht gezahlt werden konnte.\"" -msgid "error_spell_on_flying_ship" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is far too dangerous to put this spell on the flying ship $ship($ship).\"" - msgid "error_spell_on_flying_ship" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, diesen Zauber auf das fliegende Schiff $ship($ship) zu legen.\"" -msgid "error275" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings cannot be built here.\"" - msgid "error275" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Gebäude errichten.\"" -msgid "error165" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit.\"" - msgid "error165" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht.\"" -msgid "siege_catapults" -msgstr "\"$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction.\"" - msgid "siege_catapults" msgstr "\"$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an.\"" -msgid "curseinfo::magicstreet" -msgstr "\"The roads are extremely dry and well-kept. ($int36($id))\"" - msgid "curseinfo::magicstreet" msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))\"" -msgid "curseinfo::sparkle_13" -msgstr "\"A group of vultures circles above $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_13" msgstr "\"Über $unit($unit) zieht eine Gruppe Geier ihre Kreise. ($int36($id))\"" -msgid "error161" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" - msgid "error161" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit besitzt den Trank nicht.\"" -msgid "error271" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot attack here.\"" - msgid "error271" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden angreifen.\"" -msgid "renamed_faction_notseen" -msgstr "\"Your faction received a nickname.\"" - msgid "renamed_faction_notseen" msgstr "\"Die Partei bekommt einen Spitznamen.\"" -msgid "error227" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A herbalism skill of 7 or higher is required.\"" - msgid "error227" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht ein Einheit mindestens Kräuterkunde 7.\"" -msgid "error117" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot produce that.\"" - msgid "error117" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann das nicht herstellen.\"" -msgid "sp_depression_effect" -msgstr "\"$unit($mage) causes great sadness among the peasants of $region($region).\"" - msgid "sp_depression_effect" msgstr "\"$unit($mage) sorgt in $region($region) für Trübsal unter den Bauern.\"" -msgid "sp_mindblast_effect" -msgstr "\"$unit($mage) casts $spell($spell). $int($amount) warriors lose their memories, $int($dead) were killed.\"" - msgid "sp_mindblast_effect" msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren Erinnerungen, $int($dead) wurden getötet.\"" -msgid "error113" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Item to be handed over was not supplied.\"" - msgid "error113" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nichts angegeben, was wir übergeben sollen.\"" -msgid "undeadrise" -msgstr "\"The dead rise from their graves in $region($region).\"" - msgid "undeadrise" msgstr "\"In $region($region) erhoben sich die Toten aus den Gräbern.\"" -msgid "reanimate_effect_0" -msgstr "\"$unit($mage) begins a ritual of resurrection. $int($amount) warriors rise from the dead.\"" - msgid "reanimate_effect_0" msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung. $int($amount) Krieger stehen von den Toten auf.\"" -msgid "error223" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot guard.\"" - msgid "error223" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht bewachen.\"" -msgid "sp_confusion_effect_1" -msgstr "\"$unit($mage) begins a mysterious chant. Great confusion sweeps through the ranks of the enemy.\"" - msgid "sp_confusion_effect_1" msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" -msgid "itemcloak" -msgstr "\"$unit($mage) shrouds the equipment of $unit($target) in shadows.\"" - msgid "itemcloak" msgstr "\"$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($target).\"" -msgid "error5" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" - msgid "error5" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" -msgid "tactics_lost" -msgstr "\"$unit($unit) lured the enemy into an ambush.\"" - msgid "tactics_lost" msgstr "\"$unit($unit) konnte dem Gegner eine Falle stellen.\"" -msgid "error_lowstealth" -msgstr "\"$unit($unit) in $region($region): '$order($command)' -The unit cannot hide that well.\"" - msgid "error_lowstealth" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht so gut tarnen.\"" -msgid "chaosgate_effect_1" -msgstr "\"$unit($mage) opens a chaos gate.\"" - msgid "chaosgate_effect_1" msgstr "\"$unit($mage) öffnet ein Chaostor.\"" -msgid "shipsail" -msgstr "\"The $ship($ship) sails from $region($from) to $region($to).\"" - msgid "shipsail" msgstr "\"Die $ship($ship) segelt von $region($from) nach $region($to).\"" -msgid "magicresistance_unit" -msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" - msgid "magicresistance_unit" msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" -msgid "destroy_partial" -msgstr "\"$unit($unit) tears down parts of $building($building).\"" - msgid "destroy_partial" msgstr "\"$unit($unit) reißt einen Teil von $building($building) ein.\"" -msgid "nr_stat_morale" -msgstr "\"peasant morale: $int($morale)\"" - msgid "nr_stat_morale" msgstr "\"Moral der Bauern: $int($morale)\"" -msgid "changemail_invalid" -msgstr "\"Address not changed, '$value' is an invalid email.\"" - msgid "changemail_invalid" msgstr "\"Die Reportadresse wurde nicht geändert, '${value}' ist keine gültige email.\"" -msgid "block_spell" -msgstr "\"In $region($region), anti-magic from $unit($self) blocks the spell of $unit($mage).\"" - msgid "block_spell" msgstr "\"Antimagie von $unit.dative($self) blockiert in $region($region) einen Zauber von $unit.dative($mage).\"" -msgid "enter_overload" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot go aboard, the ship would be overloaded.\"" - msgid "enter_overload" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen, da sie das Schiff überladen würde.\"" -msgid "herbfound" -msgstr "\"$unit($unit) in $region($region) finds $int($amount) $resource($herb,$amount).\"" - msgid "herbfound" msgstr "\"$unit($unit) in $region($region) findet $int($amount) $resource($herb,$amount).\"" -msgid "maintenance" -msgstr "\"$unit($unit) pays the maintenance for $building($building).\"" - msgid "maintenance" msgstr "\"$unit($unit) bezahlt den Unterhalt von $building($building).\"" -msgid "heroes_cost" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has $int($have) of $int($cost) silver required.\"" - msgid "heroes_cost" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nur $int($have) von $int($cost) benötigtem Silber.\"" -msgid "error36" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this item.\"" - msgid "error36" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand nicht.\"" -msgid "error58" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know how to entertain.\"" - msgid "error58" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nicht, wie man gaukelt.\"" -msgid "magiccreate_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) creates $int($amount) ${object}.\"" - msgid "magiccreate_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) erschafft $int($amount) ${object}.\"" -msgid "error25" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevents this from happening.\"" - msgid "error25" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Fluch verhindert das.\"" -msgid "error47" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our allies.\"" - msgid "error47" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit uns alliiert.\"" -msgid "error69" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region is guarded.\"" - msgid "error69" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird bewacht.\"" -msgid "overrun_by_iceberg" -msgstr "\"The $ship($ship) has been damaged by a collision with an iceberg.\"" - msgid "overrun_by_iceberg" msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg beschädigt.\"" -msgid "song_of_peace_effect_1" -msgstr "\"A wondrous song fills the air and enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" - msgid "song_of_peace_effect_1" msgstr "\"In der Luft liegt ein wunderschönes Lied, dessen friedfertiger Stimmung sich niemand entziehen kann. Einige Leute werfen sogar ihre Waffen weg.\"" -msgid "error99" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not want to be transported.\"" - msgid "error99" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit will nicht transportiert werden.\"" -msgid "disrupt_astral" -msgstr "\"$unit($unit) is sent from the astral plain to $region($region).\"" - msgid "disrupt_astral" msgstr "\"$unit($unit) wird aus der astralen Ebene nach $region($region) geschleudert.\"" -msgid "curseinfo::badmagicresistancezone" -msgstr "\"The magical resistance of some units in this region was weakened. ($int36($id))\"" - msgid "curseinfo::badmagicresistancezone" msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde geschwächt. ($int36($id))\"" -msgid "error288" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - How much shall we tear down?\"" - msgid "error288" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wieviel sollen wir einreißen?\"" -msgid "curseinfo::badlearn" -msgstr "\"People in this region suffer from insomnia. ($int36($id))\"" - msgid "curseinfo::badlearn" msgstr "\"Alle Leute in der Region haben Schlafstörungen. ($int36($id))\"" -msgid "error_nopeasants" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no peasants in this region.\"" - msgid "error_nopeasants" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Bauern.\"" -msgid "spellregionresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region could not be charmed.\"" - msgid "spellregionresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region konnte nicht verzaubert werden.\"" -msgid "curseinfo::calmmonster" -msgstr "This enchantment appears to make the unit well-disposed towards a particular faction. ($int36($id))" - msgid "curseinfo::calmmonster" msgstr "Dieser Beeinflussungszauber scheint die Einheit einem ganz bestimmten Volk wohlgesonnen zu machen. ($int36($id))" -msgid "error169" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know this spell.\"" - msgid "error169" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Zauber kennt die Einheit nicht.\"" -msgid "error174" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only makes sense in combat.\"" - msgid "error174" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber ist nur im Kampf sinnvoll.\"" -msgid "error284" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Undead can only be affected once by this spell.\"" - msgid "error284" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein.\"" -msgid "growtree_effect" -msgstr "$if($isnull($mage),\"An unknown magician\",$unit($mage)) created a holy forest of $int($amount) young trees." - msgid "growtree_effect" msgstr "$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen." msgid "error280" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muss erst die Spezialeigenschaft erworben werden.\"" -msgid "curseinfo::shipnodrift_0" -msgstr "\"A silvery shimmer surrounds the $ship($ship). ($int36($id))\"" - msgid "curseinfo::shipnodrift_0" msgstr "\"Ein silberner Schimmer umgibt die $ship($ship). ($int36($id))\"" -msgid "error170" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasants did not accept this gracious gift.\"" - msgid "error170" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern nehmen dieses großzügige Geschenk nicht an.\"" -msgid "dumbeffect" -msgstr "\"$unit($unit) eats a duncebuns and forgets $int($weeks) weeks worth of $skill($skill).\"" - msgid "dumbeffect" msgstr "\"$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill).\"" -msgid "renamed_ship_seen" -msgstr "\"$ship($ship) in $region($region) received a nickname from $unit($renamer).\"" - msgid "renamed_ship_seen" msgstr "\"Die $ship($ship) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" -msgid "error126" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sell this.\"" - msgid "error126" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht verkaufen.\"" -msgid "error236" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not finished yet.\"" - msgid "error236" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist noch nicht fertig gebaut.\"" -msgid "error_unit_size" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units may not have more than $int($maxsize) members.\"" - msgid "error_unit_size" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten dürfen nicht mehr als $int($maxsize) Personen enthalten.\"" -msgid "error232" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This type of unit cannot enter a building.\"" - msgid "error232" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Gebäude betreten.\"" -msgid "error122" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can only breed horses in a stable.\"" - msgid "error122" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde kann man nur in einer Pferdezucht züchten.\"" -msgid "error307" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - We snotlings is too stupid fer dat!\"" - msgid "error307" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Snotlinge sind zu dumm, um auf den Feldern zu arbeiten.\"" -msgid "godcurse_destroy_ship" -msgstr "\"Her sailors sick from the poisened ocean, planks, rudder und sails corroded by the waters of the cursed ocean, the $ship($ship) finally succumbs to her destiny and sinks.\"" - msgid "godcurse_destroy_ship" msgstr "\"Die Mannschaft krank vom vergifteten Wasser, Planken, Ruder und Segel zerfressen von den Wassern des verfluchten Meeres, ergibt sich die $ship($ship) in ihr Schicksal und sinkt.\"" -msgid "too_many_units_in_faction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A faction may not consist of more than $int($allowed) units.\"" - msgid "too_many_units_in_faction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei darf nicht aus mehr als $int($allowed) Einheiten bestehen.\"" -msgid "entermaelstrom" -msgstr "\"The $ship($ship) sails into the maelstrom of $region($region) and takes $int($damage) damage$if($sink,\". The ship sinks\",\"\").\"" - msgid "entermaelstrom" msgstr "\"Die $ship($ship) fährt in den Mahlstrom von $region($region) und nimmt $int($damage) Schaden$if($sink,\" und sinkt\",\"\").\"" -msgid "error303" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No trade is possible in this region.\"" - msgid "error303" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region kann man nichts verkaufen.\"" -msgid "patzer3" -msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), a sudden disturbance ripples through the magical realm and a terrible force attempts to drag the magician to another dimension. However, with a final effort of strength, $unit($unit) manages to save himself.\"" - msgid "patzer3" msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern, scheint plötzlich ein Beben durch die magische Essenz zu laufen und ein furchtbarer Sog versucht $unit($unit) in eine andere Dimension zu ziehen. Mit letzter Kraft gelingt es $unit($unit) sich zu retten.\"" -msgid "heat_effect" -msgstr "\"$unit($mage) puts protection from cold on $unit($target).\"" - msgid "heat_effect" msgstr "\"$unit($mage) belegt $unit($target) mit einem Kälteschutz.\"" -msgid "gbdream_noteach" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is an active spell in this region that prevents this.\"" - msgid "gbdream_noteach" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Zauber in dieser Region verhindert das.\"" -msgid "path_effect" -msgstr "\"$unit($mage) creates dry and well-repaired roads in $region($region).\"" - msgid "path_effect" msgstr "\"$unit($mage) sorgt für trockene Straßen in $region($region).\"" -msgid "summonshadow_effect" -msgstr "\"$unit($mage) summons $int($number) demons from the realm of shadows.\"" - msgid "summonshadow_effect" msgstr "\"$unit($mage) beschwört $int($number) Dämonen aus dem Reich der Schatten.\"" -msgid "error8" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That is useless.\"" - msgid "error8" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist sinnlos.\"" -msgid "eathorse" -msgstr "\"$unit($unit) ate $int($amount) horses.\"" - msgid "eathorse" msgstr "\"$unit($unit) verspeiste $int($amount) Pferde.\"" -msgid "confusion_result" -msgstr "\"$unit($mage) summons a fog of confusion.\"" - msgid "confusion_result" msgstr "\"$unit($mage) beschwört einen Schleier der Verwirrung.\"" -msgid "resource_missing" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires $resource($missing,0).\"" - msgid "resource_missing" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu benötigt man $resource($missing,0).\"" -msgid "give_person_peasants" -msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to the local peasants.\"" - msgid "give_person_peasants" msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an die Bauern.\"" -msgid "curseinfo::magicwalls" -msgstr "\"These walls appear to have grown straight out of the earth. ($int36($id))\"" - msgid "curseinfo::magicwalls" msgstr "\"Diese Mauern wirken, als wären sie direkt aus der Erde gewachsen und nicht erbaut. ($int36($id))\"" -msgid "sp_clone_effect" -msgstr "\"$unit($mage) creates a clone.\"" - msgid "sp_clone_effect" msgstr "\"$unit($mage) erschafft einen Klon.\"" -msgid "enemy_discovers_spy_msg" -msgstr "\"$unit($unit) was spotted sinking $ship($ship).\"" - msgid "enemy_discovers_spy_msg" msgstr "\"$unit($unit) wurde beim versenken von $ship($ship) entdeckt.\"" -msgid "curseinfo::nocostbuilding" -msgstr "\"Time cannot touch these walls. ($int36($id))\"" - msgid "curseinfo::nocostbuilding" msgstr "\"Der Zahn der Zeit kann diesen Mauern nichts anhaben. ($int36($id))\"" -msgid "income_fishing" -msgstr "\"In $region($region), $unit($unit) catches fish worth $int($amount) silver.\"" - msgid "income_fishing" msgstr "\"$unit($unit) fängt in $region($region) Fische im Wert von $int($amount) Silber.\"" -msgid "analyse_unit_noage" -msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)', which will last for centuries.\"" - msgid "analyse_unit_noage" msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" -msgid "buildingcrash" -msgstr "\"$building($building) in $region($region) collapses.$if($road,\" The collapse ruined half of the road.\",\"\")$if($opfer,\" There are $int($opfer) casualties.\",\"\")\"" - msgid "buildingcrash" msgstr "\"In $region($region) stürzte $building($building) ein.$if($road,\" Beim Einsturz wurde die halbe Straße vernichtet.\",\"\")$if($opfer,\" $int($opfer) Opfer $if($eq($opfer,1),\"ist\",\"sind\") zu beklagen.\",\"\")\"" -msgid "alliance::kickattempt" -msgstr "\"$int($votes) members of $alliance($alliance) tried to kick you out of the alliance.\"" - msgid "alliance::kickattempt" msgstr "\"$int($votes) Mitglieder von $alliance($alliance) haben versucht, Deine Partei aus der Allianz auszuschliessen.\"" -msgid "becomewyrm" -msgstr "\"$unit($mage) turns into a wyrm.\"" - msgid "becomewyrm" msgstr "\"$unit($mage) verwandelt sich in einen Wyrm.\"" -msgid "casualties" -msgstr "\"$unit($unit) lost $int($fallen) people$if($alive,\", $int($alive) survived\",\"\")$if($run,\" and $int($run) fled$if($isnull($runto),\"\",\" to $region($runto)\")\",\"\").\"" - msgid "casualties" msgstr "\"$unit($unit) verlor $int($fallen) Personen$if($alive,\", $int($alive) überlebten\",\"\")$if($run,\" und $int($run) flohen$if($isnull($runto),\"\",\" nach $region($runto)\")\",\"\").\"" -msgid "lineup_battle" -msgstr "\"Units before turn $int($turn):\"" - -msgid "lineup_battle" -msgstr "\"Einheiten vor der $int($turn). Runde:\"" - -msgid "feedback_give_forbidden" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot give anything to this unit.\"" - msgid "feedback_give_forbidden" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Einheit kann nichts gegeben werden.\"" -msgid "babbler_effect" -msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told everyone the story of his entire life.\"" - msgid "babbler_effect" msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl die ganze Taverne mit seiner Lebensgeschichte unterhalten zu haben.\"" -msgid "babbler_resist" -msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told $unit($mage) the story of his entire life.\"" - msgid "babbler_resist" msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl $unit($mage) seine ganze Lebensgeschichte erzählt zu haben.\"" -msgid "tidalwave_kill" -msgstr "\"A tidal wave wipes out $region($region) and kills $unit($unit).\"" - msgid "tidalwave_kill" msgstr "\"Eine gewaltige Flutwelle verschlingt $unit($unit) in $region($region).\"" -msgid "error14" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is off shore.\"" - msgid "error14" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist auf hoher See.\"" -msgid "renamed_notseen" -msgstr "\"$unit($renamed) in $region($region) received a nickname.\"" - msgid "renamed_notseen" msgstr "\"$unit($renamed) in $region($region) bekommt einen Spitznamen.\"" -msgid "curseinfo::goodmagicresistancezone" -msgstr "\"The magical resistance of some units in this region was boosted. ($int36($id))\"" - msgid "curseinfo::goodmagicresistancezone" msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde gestärkt. ($int36($id))\"" -msgid "error66" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction could not be found.\"" - msgid "error66" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei wurde nicht gefunden.\"" -msgid "error88" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is lacking materials for building the ship.\"" - msgid "error88" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genügend Materialien für den Schiffbau.\"" -msgid "error55" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot move.\"" - msgid "error55" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht fortbewegen.\"" -msgid "error77" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The skill could not be recognized.\"" - msgid "error77" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent wurde nicht erkannt.\"" -msgid "error178" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No magic sphere was supplied.\"" - msgid "error178" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Magiegebiet angegeben.\"" -msgid "error297" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings on the ocean may not be entered.\"" - msgid "error297" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude auf dem Ozean können nicht betreten werden.\"" -msgid "generous_effect_1" -msgstr "\"A touring minstrel entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" - msgid "generous_effect_1" msgstr "\"Die Darbietungen eines fahrenden Gauklers begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" -msgid "unit_unarmed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" - msgid "unit_unarmed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" msgid "error293" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Verbände können nur zwischen Einheiten derselben Partei gebildet werden.\"" -msgid "error183" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" - msgid "error183" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" -msgid "error_nograves" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no graves in $region($target).\"" - msgid "error_nograves" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In $region($target) sind keine Gräber.\"" -msgid "error139" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Different types do not mix.\"" - msgid "error139" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unterschiedliche Typen können nicht gemischt werden.\"" -msgid "error249" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot sail into the open seas.\"" - msgid "error249" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann nicht aufs offene Meer hinaus segeln.\"" -msgid "killedbygm" -msgstr "\"$unit($unit) in $region($region) was removed by a GM: \\\"$string\\\".\"" - msgid "killedbygm" msgstr "\"$unit($unit) wurde in $region($region) von einem GM gelöscht: \\\"$string\\\".\"" -msgid "spellfail_distance" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That region is too far away.\"" - msgid "spellfail_distance" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region ist zu weit entfernt.\"" -msgid "error245" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already named.\"" +msgid "para_lineup_battle" +msgstr "\"Einheiten vor der $int($turn). Runde:\"" msgid "error245" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat schon einen Namen.\"" -msgid "sp_chaosrow_effect_0" -msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub, but order is restored quickly.\"" - msgid "sp_chaosrow_effect_0" msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" -msgid "error135" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown option.\"" - msgid "error135" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Option.\"" -msgid "error131" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a tunnel before building roads through glaciers.\"" - msgid "error131" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden.\"" -msgid "error241" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction must be at least 81 weeks old to restart with a new race.\"" - msgid "error241" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 81 Wochen alt sein, um einen Neustart mit einer anderen Rasse zu versuchen.\"" -msgid "feedback_unit_not_found" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit could not be found.\"" - msgid "feedback_unit_not_found" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wurde nicht gefunden.\"" -msgid "error206" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is alrady a spell on that building.\"" - msgid "error206" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Gebäude liegt bereits so ein Zauber.\"" -msgid "error316" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Without ingredients an alchemist can not produce anything.\"" - msgid "error316" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne Zutaten kann ein Alchemist nichts herstellen.\"" -msgid "error312" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes may not be mixed with normal people.\"" - msgid "error312" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht mit anderen Personen gemischt werden.\"" -msgid "mallorn_effect" -msgstr "\"The power of $unit($mage) flows into the ground and the trees which survived the spell appear much stronger now.\"" - msgid "mallorn_effect" msgstr "\"$unit($mage) läßt einen Teil seiner selbst in die Erde fliessen. Die Bäume, die Transformation überlebt haben, erscheinen nun viel kräftiger.\"" -msgid "useflamingsword" -msgstr "\"$int($amount) fighters of $unit($unit) are using their flaming sword.\"" - msgid "useflamingsword" msgstr "\"$int($amount) Krieger von $unit($unit) benutzen ihre Flammenschwerter.\"" -msgid "error202" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a valid race.\"" - msgid "error202" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine gültige Rasse.\"" -msgid "curseinfo::magicrunes_building" -msgstr "\"The walls of $building($building) are inscribed with strange runes. ($int36($id))\"" - msgid "curseinfo::magicrunes_building" msgstr "\"Auf den Mauern von $building($building) erkennt man seltsame Runen. ($int36($id))\"" -msgid "analyse_unit_fail" -msgstr "\"It appears to $unit($mage) that $unit($unit) is charmed, but no details have been revealed.\"" - msgid "analyse_unit_fail" msgstr "\"$unit($mage) meint, dass $unit($unit) verzaubert ist, konnte aber über den Zauber nichts herausfinden.\"" -msgid "spellunitresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) resists the spell.\"" - msgid "spellunitresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) widersteht dem Zauber.\"" -msgid "give_peasants" -msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants.\"" - msgid "give_peasants" msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern.\"" -msgid "leftship" -msgstr "\"$unit($unit) has just landed and cannot continue moving to $region($region).\"" - msgid "leftship" msgstr "\"$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen.\"" -msgid "astral_appear" -msgstr "\"$unit($unit) appears.\"" - msgid "astral_appear" msgstr "\"$unit($unit) erscheint plötzlich.\"" -msgid "magicresistance_effect" -msgstr "\"$unit($unit) is briefly surrounded by a magical light.\"" - msgid "magicresistance_effect" msgstr "\"$unit($unit) wird kurz von einem magischen Licht umhüllt.\"" -msgid "siege" -msgstr "\"$building($building) is under siege by $unit($unit).\"" - msgid "siege" msgstr "\"$unit($unit) belagert $building($building).\"" -msgid "missing_force" -msgstr "\"$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level).\"" - msgid "missing_force" msgstr "\"$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern.\"" -msgid "shipdestroy_partial" -msgstr "\"$unit($unit) in $region($region) damages the $ship($ship).\"" - msgid "shipdestroy_partial" msgstr "\"$unit($unit) in $region($region) beschädigt die $ship($ship).\"" -msgid "forget" -msgstr "\"$unit($unit) forgets $skill($skill).\"" - msgid "forget" msgstr "\"$unit($unit) vergisst $skill($skill).\"" -msgid "spell_astral_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell can only be cast on the astral plane.\"" - msgid "spell_astral_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur im Astralraum gezaubert werden.\"" -msgid "sp_movecastle_fail_0" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental is too small to carry the building.\"" - msgid "sp_movecastle_fail_0" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen.\"" -msgid "summonundead_effect_1" -msgstr "\"$unit($mage) calls $int($amount) undead from their graves in $region($region).\"" - msgid "summonundead_effect_1" msgstr "\"$unit($mage) erweckt in $region($region) $int($amount) Untote aus ihren Gräbern.\"" -msgid "drown" -msgstr "\"$unit($unit) drowns in $region($region).\"" - msgid "drown" msgstr "\"$unit($unit) ertrinkt in $region($region).\"" -msgid "travel" -msgstr "\"$unit($unit) $if($eq($mode,1),\"rides\", \"walks\") from $region($start) to $region($end)$if($isnull($regions),\"\",\" by way of $trail($regions)\").\"" - msgid "travel" msgstr "\"$unit($unit) $if($eq($mode,1),\"reitet\", \"wandert\") von $region($start) nach $region($end).$if($isnull($regions),\"\",\" Dabei wurde $trail($regions) durchquert.\")\"" -msgid "curseinfo::skill_1" -msgstr "\"$unit($unit) is incredibly skilled at $skill($skill). ($int36($id))\"" - msgid "curseinfo::skill_1" msgstr "\"$unit($unit) ist ungewöhnlich geschickt in $skill($skill). ($int36($id))\"" -msgid "error11" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is still off shore.\"" - msgid "error11" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff befindet sich auf hoher See.\"" -msgid "error33" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in our castle.\"" - msgid "error33" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht in unserer Burg.\"" -msgid "error22" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown command.\"" - msgid "error22" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl wurde nicht erkannt.\"" -msgid "error44" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is off shore.\"" - msgid "error44" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf hoher See.\"" -msgid "spydetect" -msgstr "\"$unit($target) feels watched$if($isnull($spy),\"\",\" by $unit($spy)\").\"" - msgid "spydetect" msgstr "\"$unit($target) fühlt sich $if($isnull($spy),\"\",\"durch $unit($spy) \")beobachtet.\"" -msgid "income_trade" -msgstr "\"$unit($unit) earned $int($amount) silver in $region($region) by selling luxury items.\"" - msgid "income_trade" msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch den Verkauf von Luxusgütern.\"" -msgid "error74" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot give anybody away.\"" - msgid "error74" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kann niemanden weggeben.\"" -msgid "error96" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody in this unit can be transferred.\"" - msgid "error96" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Einheit gibt es niemanden, den man transferieren könnte.\"" -msgid "error187" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has moved.\"" - msgid "error187" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie sich bewegt hat.\"" -msgid "error85" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No email address was supplied.\"" - msgid "error85" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde keine Emailadresse angegeben.\"" -msgid "starvation" -msgstr "\"$unit($unit) loses $int($dead) of $int($add($live,$dead)) people due to starvation in $region($region).\"" - msgid "starvation" msgstr "\"$unit($unit) verliert in $region($region) $int($dead) von $int($add($live,$dead)) Personen durch Unterernährung.\"" -msgid "error258" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The target unit is invalid.\"" - msgid "error258" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zieleinheit ist ungültig.\"" -msgid "curseinfo::fogtrap" -msgstr "\"Heavy fog makes it impossible to leave the region. ($int36($id))\"" - msgid "curseinfo::fogtrap" msgstr "\"Dichte Nebel bedecken diese Woche die Region. Keine Einheit schafft es, diese Nebel zu durchdringen und die Region zu verlassen. ($int36($id))\"" -msgid "error148" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of a castle.\"" - msgid "error148" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Burgherr.\"" -msgid "poison_damage" -msgstr "\"$unit($unit) is taking poison damage in $region($region).\"" - msgid "poison_damage" msgstr "\"$unit($unit) nimmt Schaden durch den Giftelementar in $region($region).\"" -msgid "error144" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board a ship.\"" - msgid "error144" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf keinem Schiff.\"" -msgid "magicboost_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The Spheres of Chaos return a part of his power to the magician.\"" - msgid "magicboost_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Sphären des Chaos geben dem Magier einen Teil ihrer Kraft.\"" -msgid "error254" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid aura specification or not enough aura.\"" - msgid "error254" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft oder zuwenig Aura.\"" -msgid "error250" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not enough karma.\"" - msgid "error250" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht genug Karma.\"" -msgid "error140" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is neither in a castle nor on board a ship.\"" - msgid "error140" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich weder in einer Burg noch auf einem Schiff.\"" -msgid "error215" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot reach the astral plane from here.\"" - msgid "error215" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Von hier aus kann man die astrale Ebene nicht erreichen.\"" msgid "destroy_ship_4" msgstr "\"$ship($ship) wurde zerstört.\"" -msgid "destroy_ship_4" -msgstr "\"$ship($ship) was destroyed.\"" - -msgid "error211" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already under this spell.\"" - msgid "error211" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff liegt bereits so ein Zauber.\"" -msgid "forestfire_effect" -msgstr "\"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall victim to the flames.\"" - msgid "forestfire_effect" msgstr "\"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer.\"" -msgid "error101" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can construct a building.\"" - msgid "error101" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann ein Gebäude errichten.\"" -msgid "orcgrowth" -msgstr "\"$unit($unit) breeds $int($amount) new $race($race,$amount).\"" - msgid "orcgrowth" msgstr "\"$unit($unit) vermehrt sich um $int($amount) $race($race,$amount).\"" -msgid "sp_wolfhowl_effect" -msgstr "\"$unit($mage) calls for the help of $int($amount) $race($race, $amount).\"" - msgid "sp_wolfhowl_effect" msgstr "\"$unit($mage) ruft $int($amount) $race($race, $amount) zu Hilfe.\"" -msgid "tidalwave" -msgstr "\"A tidal wave wipes out $region($region) and all who lived there.\"" - msgid "tidalwave" msgstr "\"Eine gewaltige Flutwelle verschlingt $region($region) und alle Bewohner.\"" -msgid "cast_hero_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their moral boosted.\"" - msgid "cast_hero_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden moralisch gestärkt.\"" -msgid "detectforbidden" -msgstr "\"$unit($unit) refuses to travel to $region($region).\"" - msgid "detectforbidden" msgstr "\"$unit($unit) weigert sich, nach $region($region) zu reisen.\"" -msgid "parse_error" -msgstr "\"$unit($unit): '$command' - Parse error, unknown command.\"" - msgid "parse_error" msgstr "\"$unit($unit): '$command' - Dieser Befehl ist unbekannt.\"" -msgid "fogblock" -msgstr "\"$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense.\"" - msgid "fogblock" msgstr "\"$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht.\"" msgid "curseinfo::antimagiczone" msgstr "\"Dieser Zauber scheint magische Energien irgendwie abzuleiten und so alle in der Region gezauberten Sprüche in ihrer Wirkung zu schwächen oder ganz zu verhindern. ($int36($id))\"" -msgid "curseinfo::antimagiczone" -msgstr "\"A spell is deflecting magical energies and weakening all other spells cast in the region. ($int36($id))\"" - -msgid "nr_market_sale" -msgstr "\"The local market offers $resource($product,0) at a price of $int($price) silver.\"" - msgid "nr_market_sale" msgstr "\"Auf dem Markt wird für $resource($product,0) $int($price) Silber verlangt.\"" -msgid "stealfail" -msgstr "\"$unit($unit) could not sneak close enough to $unit($target).\"" - msgid "stealfail" msgstr "\"$unit($unit) gelang es nicht, sich nahe genug an $unit($target) heranzuschleichen.\"" -msgid "section_battle" -msgstr "\"\"" - -msgid "section_battle" -msgstr "\"\"" - -msgid "sp_disturbingdreams_effect" -msgstr "\"$unit($mage) disturbs everyone's dreams in $region($region).\"" - msgid "sp_disturbingdreams_effect" msgstr "\"$unit($mage) sorgt für schlechten Schlaf in $region($region).\"" -msgid "spy_discovered_msg" -msgstr "\"$unit($unit) caught $unit($saboteur) trying to sink $ship($ship).\"" - msgid "spy_discovered_msg" msgstr "\"$unit($unit) entdeckte $unit($saboteur) beim Versenken von $ship($ship).\"" -msgid "wrongpasswd" -msgstr "\"Your orders had the wrong password (${password}).\"" - msgid "wrongpasswd" msgstr "\"Deine Befehle hatten ein falsches Passwort (${password}).\"" -msgid "curseinfo::sparkle_9" -msgstr "\"A large green snake offers $unit($unit) a fine-looking apple. ($int36($id))\"" - msgid "curseinfo::sparkle_9" msgstr "\"$unit($unit) bekommt von einer Schlange einen Apfel angeboten. ($int36($id))\"" -msgid "birthday_firework_noname" -msgstr "\"A large firework, visible all over the sky, has been started in $region($region).\"" - -msgid "birthday_firework_noname" -msgstr "\"In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - -msgid "skill_needed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires the skill $skill($skill).\"" - msgid "skill_needed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu braucht man das Talent $skill($skill).\"" -msgid "renamed_seen" -msgstr "\"$unit($renamed) in $region($region) received a nickname from $unit($renamer).\"" - msgid "renamed_seen" msgstr "\"$unit($renamed) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" -msgid "analyse_unit_nospell" -msgstr "\"It appears to $unit($mage) that $unit($target) is not charmed.\"" - msgid "analyse_unit_nospell" msgstr "\"$unit($mage) meint, dass auf $unit($target) kein Zauber liegt.\"" -msgid "army_report" -msgstr "\"Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors.\"" - msgid "army_report" msgstr "\"Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende.\"" -msgid "receive_person" -msgstr "\"$unit($target) receives $int($amount) person$if($eq($amount,1),\"\",\"s\") from $unit($unit).\"" - msgid "receive_person" msgstr "\"$unit($target) erhält $int($amount) Person$if($eq($amount,1),\"\",\"en\") von $unit($unit).\"" -msgid "donation" -msgstr "\"$faction($from) donates $int($amount) silver to $faction($to).\"" - msgid "donation" msgstr "\"$faction($from) gibt ein Almosen von $int($amount) Silber an $faction($to).\"" -msgid "scunicorn" -msgstr "\"$int($amount) $resource($rtype,$amount) $if($eq($amount,1),\"joins\",\"join\") $unit($unit).\"" - msgid "scunicorn" msgstr "\"$unit($unit) $if($eq($amount,1),\"schließt\",\"schließen\") sich $int($amount) $resource($rtype,$amount) an.\"" -msgid "try_astral" -msgstr "\"$unit($unit) tried but failed to send $unit($target) to another world.\"" - msgid "try_astral" msgstr "\"$unit($unit) versuchte erfolglos, $unit($target) in eine andere Welt zu schleudern.\"" -msgid "error196" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a forest region.\"" - msgid "error196" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine Waldregion.\"" -msgid "objmagic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on ${target}.\"" - msgid "objmagic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) verzaubert ${target}.\"" -msgid "puttorest" -msgstr "\"$unit($mage) redeems the tormented souls of the dead.\"" - msgid "puttorest" msgstr "\"$unit($mage) erlöst die gequälten Seelen der Toten.\"" -msgid "error41" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" - msgid "error41" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" -msgid "error30" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The message does not contain text.\"" - msgid "error30" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Botschaft enthält keinen Text.\"" -msgid "error52" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute more long orders.\"" - msgid "error52" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren langen Befehle ausführen.\"" -msgid "recruit_effect" -msgstr "\"$unit($mage) managed to recruit $int($amount) $if($eq($amount,1),\"peasant\",\"peasants\").\"" - msgid "recruit_effect" msgstr "\"$unit($mage) konnte $int($amount) $if($eq($amount,1),\"Bauer\",\"Bauern\") anwerben.\"" -msgid "spell_failed" -msgstr "\"$unit($unit) tries to cast $spell($spell), but the spell fails!\"" - msgid "spell_failed" msgstr "\"$unit($unit) versucht $spell($spell) zu zaubern, doch der Zauber schlägt fehl!\"" -msgid "error157" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has a different magic sphere.\"" - msgid "error157" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat ein anderes Magiegebiet.\"" -msgid "auratransfer_success" -msgstr "\"$unit($unit) transfers $int($aura) aura to $unit($target).\"" - msgid "auratransfer_success" msgstr "\"$unit($unit) transferiert $int($aura) Aura auf $unit($target).\"" -msgid "error267" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only a single person can use the ticket.\"" - msgid "error267" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur eine Einzelperson kann das Ticket benutzen.\"" -msgid "error263" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This good is not produced here.\"" - msgid "error263" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut wird hier produziert.\"" -msgid "error153" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit joins the local peasants.\"" - msgid "error153" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit schließt sich den Bauern an.\"" -msgid "error_onlandonly" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be on land.\"" - msgid "error_onlandonly" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit muß sich an Land befinden.\"" -msgid "error_herorecruit" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Heroes cannot recruit.\"" - msgid "error_herorecruit" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Helden können nicht rekrutieren.\"" -msgid "error109" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if a castle, a ship, a region, or a unit is supposed to be named.\"" - msgid "error109" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Einheit, eine Region oder eine Partei benannt werden soll.\"" msgid "msg_event" msgstr "\"$string\"" -msgid "msg_event" -msgstr "\"$string\"" - -msgid "error224" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot cast spells.\"" - msgid "error224" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht zaubern.\"" -msgid "piratesawvictim" -msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") in $region($region) made $direction($dir) a target.\"" - msgid "piratesawvictim" msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) entdeckt ein Opfer im $direction($dir).\"" -msgid "spyreport_items" -msgstr "\"$unit($target) carries $resources($items)\"" - msgid "spyreport_items" msgstr "\"Im Gepäck von $unit($target) sind $resources($items).\"" -msgid "curseinfo::shipnodrift_1" -msgstr "\"The $ship($ship) is blessed with favourable winds$if($lt($duration,3),\", but the spell is starting to wear thin\",\"\"). ($int36($id))\"" - msgid "curseinfo::shipnodrift_1" msgstr "\"Die $ship($ship) ist mit gutem Wind gesegnet$if($lt($duration,3),\", doch der Zauber beginnt sich bereits aufzulösen\",\"\"). ($int36($id))\"" -msgid "error105" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Empty units can not be handed over.\"" - msgid "error105" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Leere Einheiten können nicht übergeben werden.\"" -msgid "curseinfo::sparkle_7" -msgstr "\"The women of the nearby village cast furtive looks at $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_7" msgstr "\"Die Frauen des nahegelegenen Dorfes bewundern $unit($unit) verstohlen. ($int36($id))\"" -msgid "error110" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if description is for a castle, a ship, a region, or a unit.\"" - msgid "error110" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Region oder eine Einheit beschrieben werden soll.\"" -msgid "curseinfo::sparkle_18" -msgstr "\"The stench of decay is poring from all the orifices of $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_18" msgstr "\"Fäulnisgeruch dringt $unit($unit) aus allen Körperöffnungen. ($int36($id))\"" -msgid "error_captain_skill_low" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The captain needs a sailing skill of at least $int($value), to command $ship($ship).\"" - msgid "error_captain_skill_low" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Kapitän muß ein Segeltalent von mindestens $int($value) haben, um $ship($ship) zu befehligen.\"" -msgid "error220" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No one could be seen in the astral fog.\"" - msgid "error220" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Im astralen Nebel konnte niemand entdeckt werden.\"" -msgid "arena_enter" -msgstr "\"A portal opens in $region($region). A voice calls: 'Welcome to the Plane of Challenge'. $unit($unit) walks through the gate to another world.\"" - msgid "arena_enter" msgstr "\"In $region($region) öffnet sich ein Portal. Eine Stimme ertönt, und spricht: 'Willkommen in der Ebene der Herausforderung'. $unit($unit) durchschreitet das Tor zu einer anderen Welt.\"" -msgid "stealfatal" -msgstr "\"$unit($unit) was caught by $unit($target) in attempted theft.\"" - msgid "stealfatal" msgstr "\"$unit($unit) wurde von $unit.dative($target) beim versuchten Diebstahl ertappt.\"" -msgid "analyse_unit_age" -msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)' that will last for about $int($months) more weeks.\"" - msgid "analyse_unit_age" msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" -msgid "sp_permtransfer_effect" -msgstr "\"$unit($mage) sacrifices $int($amount) aura for $unit($target).\"" - msgid "sp_permtransfer_effect" msgstr "\"$unit($mage) opfert $unit($target) $int($amount) Aura.\"" -msgid "shipfly" -msgstr "\"The $ship($ship) flies from $region($from) to $region($to).\"" - msgid "shipfly" msgstr "\"Die $ship($ship) fliegt von $region($from) nach $region($to).\"" -msgid "curseinfo::unit_unknown" -msgstr "\"An unknown spell lies on this unit. ($int36($id))\"" - msgid "curseinfo::unit_unknown" msgstr "\"Ein unbekannter Zauber liegt auf der Einheit. ($int36($id))\"" -msgid "force_leave_ship" -msgstr "$unit($owner) asks $unit($unit) to leave $ship($ship)." - msgid "force_leave_ship" msgstr "$unit($owner) bittet $unit($unit), $ship($ship) zu verlassen." -msgid "dissolve_units_1" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) returned to the fields.\"" - msgid "dissolve_units_1" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"kehrte auf seine\", \"kehrten auf ihre\") Felder zurück.\"" -msgid "hornofpeace_r_nosuccess" -msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing, but nobody here gets into the mood.\"" - msgid "hornofpeace_r_nosuccess" msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes, doch niemand hier lässt sich von Stimmung anstecken.\"" -msgid "malnourish" -msgstr "\"$unit($unit) is weakened due to malnourishment.\"" - msgid "malnourish" msgstr "\"$unit($unit) in $region($region) wird durch unzureichende Nahrung geschwächt.\"" -msgid "iceberg_land" -msgstr "\"The iceberg $region($region) drifts onto a coast.\"" - msgid "iceberg_land" msgstr "\"Der Eisberg $region($region) treibt an eine Küste.\"" -msgid "produce_lowskill" -msgstr "\"$unit($unit) in $region($region) is not proficient enough to produce $resource($resource,0).\"" - msgid "produce_lowskill" msgstr "\"$unit($unit) in $region($region) hat ein zu niedriges Talent, um $resource($resource,0) abzubauen.\"" -msgid "income_steal_reduced" -msgstr "\"$unit($unit) steals only $int($amount) silver instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") in $region($region).\"" - msgid "income_steal_reduced" msgstr "\"$unit($unit) klaut in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" -msgid "error_cannotmake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot produce this.\"" - msgid "error_cannotmake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht machen.\"" -msgid "meow" -msgstr "\"Meeoooooow...\"" - msgid "meow" msgstr "\"Miiauuuuuu...\"" -msgid "spelltargetnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell could not find a target.\"" - msgid "spelltargetnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Ziel gefunden.\"" -msgid "curseinfo::fumble" -msgstr "\"$unit($unit) can hardly focus on anything. ($int36($id))\"" - msgid "curseinfo::fumble" msgstr "\"$unit($unit) kann sich kaum konzentrieren. ($int36($id))\"" -msgid "curseinfo::sparkle_14" -msgstr "\"The head of $unit($unit) has turned into a madly grinning skull. ($int36($id))\"" - msgid "curseinfo::sparkle_14" msgstr "\"Der Kopf von $unit($unit) hat sich in einen grinsenden Totenschädel verwandelt. ($int36($id))\"" -msgid "reanimate_effect_1" -msgstr "\"$unit($mage) begins a ritual of resurrection augmented by a $resource($item,1). $int($amount) warriors rise from the dead.\"" - msgid "reanimate_effect_1" msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Krieger stehen von den Toten auf.\"" -msgid "analyse_building_nospell" -msgstr "\"It appears to $unit($mage) that $building($building) is not charmed.\"" - msgid "analyse_building_nospell" msgstr "\"$unit($mage) meint, dass auf $building($building) kein Zauber liegt.\"" -msgid "magicresistance_building" -msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" - msgid "magicresistance_building" msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" -msgid "race_notake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) will not accept anything.\"" - msgid "race_notake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) nehmen nichts an.\"" -msgid "cast_drainlife_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their life energy drained.\"" - msgid "cast_drainlife_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurde ihre Lebenskraft entzogen.\"" -msgid "headache_effect_0" -msgstr "\"$unit($mage) invites $unit($unit) for a few too many drinks and a massive hangover.\"" - msgid "headache_effect_0" msgstr "\"$unit($mage) verschafft $unit($unit) einige feuchtfröhliche Stunden mit heftigen Nachwirkungen.\"" -msgid "unholypower_limitedeffect" -msgstr "\"$unit($mage) transforms $int($amount) from $unit($target) into $race($race,0).\"" - msgid "unholypower_limitedeffect" msgstr "\"$unit($mage) verwandelt $int($amount) aus $unit($target) in $race($race,0).\"" -msgid "income_work_reduced" -msgstr "\"$unit($unit) works in $region($region) for a wage of $int($amount) $if($eq($wanted,$amount),\"\",\" out of $int($wanted)\") silver.\"" - msgid "income_work_reduced" msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" -msgid "maintenancespecialfail" -msgstr "\"$unit($unit) lacks $resource($item,0) to operate $building($building).\"" - msgid "maintenancespecialfail" msgstr "\"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building).\"" -msgid "healing_effect_1" -msgstr "\"$unit($mage) sees after the wounded and heals $int($amount). A $resource($item,1) improves the spell.\"" - msgid "healing_effect_1" msgstr "\"$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Verwundete werden geheilt.\"" -msgid "error276" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here.\"" - msgid "error276" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen.\"" -msgid "error166" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle.\"" - msgid "error166" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern.\"" -msgid "chaosgate_effect_2" -msgstr "\"A vortex of blinding light appears.\"" - msgid "chaosgate_effect_2" msgstr "\"Ein Wirbel aus blendendem Licht erscheint.\"" -msgid "birthday_firework_local" -msgstr "\"A large firework in honor of ${name} is visible all over the sky.\"" - -msgid "birthday_firework_local" -msgstr "\"Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - -msgid "hornofpeace_u_success" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) regions have been pacified.\"" - msgid "hornofpeace_u_success" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) Regionen wurden befriedet.\"" -msgid "error71" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The given direction was not recognized.\"" - msgid "error71" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung wurde nicht erkannt.\"" -msgid "error93" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a port in this region.\"" - msgid "error93" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es schon einen Hafen.\"" -msgid "no_attack_after_advance" -msgstr "\"'$order($command)' - $unit($unit) marched into $region($region) during the last turn and is too exhausted to attack.\"" - msgid "no_attack_after_advance" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist noch zu erschöpft vom Einmarsch um zu attackieren.\"" -msgid "error82" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number.\"" - msgid "error82" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer.\"" -msgid "error60" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is under siege.\"" - msgid "error60" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert.\"" -msgid "error162" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed.\"" - msgid "error162" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt.\"" -msgid "error272" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Horses are not allowed inside.\"" - msgid "error272" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde müssen leider draußen bleiben.\"" -msgid "warn_dropout" -msgstr "\"Warning: $faction($faction) has not been sending in orders for $int($turns) turns and may be leaving the game soon.\"" - msgid "warn_dropout" msgstr "\"Achtung: $faction($faction) hat seit $int($turns) Wochen keine Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel ausscheiden.\"" -msgid "arena_leave_fail" -msgstr "\"The attempt to use wings of the gryphon failed. $unit($unit) could not leave the Plane of Challenge.\"" - msgid "arena_leave_fail" msgstr "\"Der Versuch, die Greifenschwingen zu benutzen, schlug fehl. $unit($unit) konnte die Ebene der Herausforderung nicht verlassen.\"" -msgid "battle_critical" -msgstr "\"$int36($unit.id($unit))/$int($index) does critical damage.\"" - msgid "battle_critical" msgstr "\"$int36($unit.id($unit))/$int($index) erzielt einen kritischen Treffer.\"" -msgid "error_spell_on_ship_already" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a spell on $ship($ship).\"" - msgid "error_spell_on_ship_already" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf $ship($ship) liegt beeits ein Zauber.\"" -msgid "error228" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only normal characters can collect taxes.\"" - msgid "error228" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur normale Personen können Steuern eintreiben.\"" -msgid "birthday_firework_noname_local" -msgstr "\"A large firework is visible all over the sky.\"" - -msgid "birthday_firework_noname_local" -msgstr "\"$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - -msgid "error118" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot produce that.\"" - msgid "error118" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann die Einheit nicht herstellen.\"" -msgid "curseinfo::sparkle_10" -msgstr "\"A unicorn touches $unit($unit) with its horn and vanishes into the forest quickly after. ($int36($id))\"" - msgid "curseinfo::sparkle_10" msgstr "\"Ein Einhorn berührt $unit($unit) mit seinem Horn und verschwindet kurz darauf im Unterholz. ($int36($id))\"" -msgid "error114" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is not valid.\"" - msgid "error114" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist nicht im gültigen Bereich.\"" -msgid "error233" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Swimmers cannot enter ships.\"" - msgid "error233" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Schiffe betreten.\"" -msgid "iceberg_create" -msgstr "\"The glacier in $region($region) breaks up and drifts away.\"" - msgid "iceberg_create" msgstr "\"Der Gletscher von $region($region) bricht und treibt davon.\"" -msgid "chaos_disease" -msgstr "\"$unit($unit) is stricken by a strange disease.\"" - msgid "chaos_disease" msgstr "\"$unit($unit) scheint von einer seltsamen Krankheit befallen.\"" -msgid "error1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are not enough experienced sailors on board the ship.\"" - msgid "error1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.\"" -msgid "sp_icastle_effect" -msgstr "\"Flabbergasted, the peasants of $region($region) behold a new building.\"" - msgid "sp_icastle_effect" msgstr "\"Verwundert blicken die Bauern von $region($region) auf ein neues Gebäude.\"" -msgid "curseinfo::godcurse" -msgstr "\"This region was cursed by the gods. Stinking vapors billow over the dead ground and hideous creatures move about the country. The wells are poisened and the edible plants are covered by a pink fungus. Noone can live here for long. ($int36($id))\"" - msgid "curseinfo::godcurse" msgstr "\"Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen über die tote Erde und furchtbare Kreaturen ziehen über das Land. Die Brunnen sind vergiftet, und die wenigen essbaren Früchte sind von einem rosa Pilz überzogen. Niemand kann hier lange überleben. ($int36($id))\"" -msgid "recruit_archetype" -msgstr "\"$unit($unit) recruits $int($amount) $localize($archetype).\"" - msgid "recruit_archetype" msgstr "\"$unit($unit) rekrutiert $int($amount) $localize($archetype).\"" -msgid "tactics_won" -msgstr "\"$unit($unit) surprises the enemies.\"" - msgid "tactics_won" msgstr "\"$unit($unit) überrascht den Gegner.\"" -msgid "raindance_effect" -msgstr "\"$if($isnull($mage),\"an unseen magician\",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields.\"" - msgid "raindance_effect" msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen.\"" msgid "mistake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" -msgid "mistake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" - -msgid "income_tax" -msgstr "\"$unit($unit) collects taxes of $int($amount) silver in $region($region).\"" - msgid "income_tax" msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount) Silber ein.\"" -msgid "give_person_ocean" -msgstr "\"$unit($unit) drowns $int($amount).\"" - msgid "give_person_ocean" msgstr "\"$unit($unit) ertränkt $int($amount) Person$if($eq($amount,1),\"\",\"en\").\"" -msgid "error_no_tax_skill" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not now how to tax.\"" - msgid "error_no_tax_skill" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht geschult im Eintreiben von Steuern.\"" -msgid "sparkle_effect" -msgstr "\"$unit($mage) puts a spell on $unit($target).\"" - msgid "sparkle_effect" msgstr "\"$unit($mage) belegt $unit($target) mit einem Zauber.\"" -msgid "error18" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is too heavily loaded to sail.\"" - msgid "error18" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist zu schwer beladen, um in See zu stechen.\"" -msgid "sp_raisepeasants_effect" -msgstr "\"$unit($mage) incites a revolt among $int($amount) peasants of $region($region).\"" - msgid "sp_raisepeasants_effect" msgstr "\"$unit($mage) wiegelt in $region($region) $int($amount) Bauern zum Aufstand auf.\"" -msgid "pump_effect" -msgstr "\"$unit($mage) questions $unit($unit) about $region($tregion).\"" - msgid "pump_effect" msgstr "\"$unit($mage) horcht $unit($unit) über $region($tregion) aus.\"" -msgid "curseinfo::sparkle_5" -msgstr "\"A haunting melody fills the air, and $unit($unit) dances until late into the night. ($int36($id))\"" - msgid "curseinfo::sparkle_5" msgstr "\"Eine Melodie erklingt, und $unit($unit) tanzt bis spät in die Nacht hinein. ($int36($id))\"" -msgid "dragon_growl" -msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"I smell\", \"We smell\") something in $region($target)\\\".\"" - msgid "dragon_growl" msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"Ich rieche\", \"Wir riechen\") etwas in $region($target)\\\".\"" -msgid "produce" -msgstr "\"$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") $resource($resource,$amount).\"" - msgid "produce" msgstr "\"$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),\"\",\" von $int($wanted)\") $resource($resource,$wanted).\"" -msgid "income_work" -msgstr "\"In $region($region), $unit($unit) works for a wage of $int($amount) silver.\"" - msgid "income_work" msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount) Silber.\"" -msgid "nr_stat_people" -msgstr "\"people: $int($max)\"" - msgid "nr_stat_people" msgstr "\"Personen: $int($max)\"" -msgid "destroy_curse_noeffect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell is not strong enough to destroy the curse ($id) on ${target}.\"" - msgid "destroy_curse_noeffect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber ist nicht stark genug, um den Fluch ($id) auf ${target} zu zerstören.\"" -msgid "detectocean" -msgstr "\"$unit($unit) discovered that $region($region) is $localize($terrain).\"" - msgid "detectocean" msgstr "\"$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist.\"" -msgid "spell_resist" -msgstr "\"$unit($unit) manages to cast $spell($spell), but the spell seems to have no effect.\"" - msgid "spell_resist" msgstr "\"$unit($unit) gelingt es $spell($spell) zu zaubern, doch der Spruch zeigt keine Wirkung.\"" -msgid "shipdestroy" -msgstr "\"$unit($unit) sunk $ship($ship) in $region($region).\"" - msgid "shipdestroy" msgstr "\"$unit($unit) in $region($region) versenkt die $ship($ship).\"" msgid "destroy_ship_3" msgstr "\"Es wurde versucht, $ship($ship) zu zerstören.\"" -msgid "destroy_ship_3" -msgstr "\"Somebody attempted to destroy $ship($ship).\"" - -msgid "error289" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - What should we disguise as?\"" - msgid "error289" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wie sollen wir uns tarnen?\"" -msgid "spellbuildingnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be located.\"" - msgid "spellbuildingnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) wurde nicht gefunden.\"" -msgid "error179" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this magic sphere.\"" - msgid "error179" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Magiegebiet kann die Einheit nicht lernen.\"" -msgid "sp_migranten" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) has become one of our kind.\"" - msgid "sp_migranten" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wird von uns aufgenommen.\"" -msgid "error175" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell while standing on a moving ship.\"" - msgid "error175" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht auf einem sich bewegenden Schiff stehend zaubern.\"" -msgid "error285" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit knows no recipes for potions.\"" - msgid "error285" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kennt keine Trankrezepte.\"" -msgid "dissolve_units_4" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned to dust.\"" - msgid "dissolve_units_4" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"zerfiel\", \"zerfielen\") zu Staub.\"" -msgid "error281" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - What race did you want the jihad to be against?\"" - msgid "error281" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen welche Rasse soll der Jihad ausgerufen werden?\"" -msgid "error171" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This combat spell does not exist.\"" - msgid "error171" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Kampfzauber gibt es nicht.\"" -msgid "astral_disappear" -msgstr "\"$unit($unit) disappears.\"" - msgid "astral_disappear" msgstr "\"$unit($unit) wird durchscheinend und verschwindet.\"" -msgid "error127" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction cannot hire so many strangers.\"" - msgid "error127" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann Deine Partei nicht aufnehmen.\"" -msgid "drought_effect_2" -msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds.\"" - msgid "drought_effect_2" msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt.\"" -msgid "usepotion" -msgstr "\"$unit($unit) uses $resource($potion,1).\"" - msgid "usepotion" msgstr "\"$unit($unit) benutzt $resource($potion,1).\"" -msgid "error237" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are riots in this region.\"" - msgid "error237" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region befindet sich in Aufruhr.\"" -msgid "error90" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have travel with us.\"" - msgid "error90" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit fährt nicht mit uns.\"" -msgid "orcified" -msgstr "\"People in $region($region) flee because of too many orcs.\"" - msgid "orcified" msgstr "\"Vor den vielen Orks in $region($region) fliehen die anderen Einwohner.\"" -msgid "plant_skills" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - At least $skill($skill) $int($minskill) is needed for planting $resource($product,0).\"" - msgid "plant_skills" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu pflanzen.\"" -msgid "renamed_ship_notseen" -msgstr "\"$ship($ship) in $region($region) received a nickname.\"" - msgid "renamed_ship_notseen" msgstr "\"Die $ship($ship) in $region($region) bekommt einen Spitznamen.\"" -msgid "error123" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have such a thing.\"" - msgid "error123" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas hat die Einheit nicht.\"" -msgid "error308" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This skill cannot be raised any higher.\"" - msgid "error308" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann nicht höher gelernt werden.\"" -msgid "spyreport_faction" -msgstr "\"$unit($target) belongs to $faction($faction).\"" - msgid "spyreport_faction" msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\"" -msgid "ship_drift" -msgstr "\"The ship $ship($ship) drifts to the $direction($dir).\"" - msgid "ship_drift" msgstr "\"Die $ship($ship) treibt nach $direction($dir).\"" -msgid "error_max_magicians" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more than $int($amount) magicians in your faction.\"" - msgid "error_max_magicians" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Magier pro Partei geben.\"" -msgid "error304" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units of a faction that can't be attacked may not guard.\"" - msgid "error304" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen.\"" -msgid "error300" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid synonym.\"" - msgid "error300" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Synonym.\"" -msgid "error4" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already completed.\"" - msgid "error4" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist bereits fertig.\"" -msgid "curseinfo::magicstreetwarn" -msgstr "\"The roads are extremely dry and well-kept, but some areas show the first signs of potholes reappearing. ($int36($id))\"" - msgid "curseinfo::magicstreetwarn" msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar, doch an manchen Stellen bilden sich wieder die erste Schlammlöcher. ($int36($id))\"" -msgid "moveblocked" -msgstr "\"$unit($unit) discovers that there is no route going $direction($direction).\"" - msgid "moveblocked" msgstr "\"$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt.\"" -msgid "nr_market_info_p" -msgstr "\"The local market offers $resource($p1,0) and $resource($p2,0).\"" - msgid "nr_market_info_p" msgstr "\"Auf dem Markt werden $resource($p1,0) und $resource($p2,0) feilgeboten.\"" -msgid "stealeffect" -msgstr "\"In $region($region), thieves stole $int($amount) silver from $unit($unit).\"" - msgid "stealeffect" msgstr "\"$unit($unit) wurden in $region($region) $int($amount) Silberstücke geklaut.\"" -msgid "curseinfo::calm_1" -msgstr "\"$unit($unit) likes $faction($faction). ($int36($id))\"" - msgid "curseinfo::calm_1" msgstr "\"$unit($unit) scheint $faction($faction) zu mögen. ($int36($id))\"" -msgid "plant" -msgstr "\"$unit($unit) plants $int($amount) $resource($herb,$amount) in $region($region).\"" - msgid "plant" msgstr "\"$unit($unit) pflanzt in $region($region) $int($amount) $resource($herb,$amount).\"" -msgid "nr_region_owner" -msgstr "\"The region is owned by $faction($faction).\"" - msgid "nr_region_owner" msgstr "\"Die Region ist im Besitz von $faction($faction).\"" -msgid "analyse_region_nospell" -msgstr "\"It appears to $unit($mage) that $region($region) is not charmed.\"" - msgid "analyse_region_nospell" msgstr "\"$unit($mage) meint, dass auf $region($region) kein Zauber liegt.\"" -msgid "one_circle_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has already chosen a magical school.\"" - msgid "one_circle_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits ein Magiegebiet.\"" -msgid "race_nosteal" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot steal anything.\"" - msgid "race_nosteal" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts stehelen.\"" -msgid "error26" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items to buy is missing.\"" - msgid "error26" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu kaufender Produkte fehlt.\"" -msgid "error48" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" - msgid "error48" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" -msgid "sailfail" -msgstr "\"The $ship($ship) could not leave $region($region).\"" - msgid "sailfail" msgstr "\"Die $ship($ship) konnte $region($region) nicht verlassen.\"" -msgid "error15" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has not yet been completed.\"" - msgid "error15" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist noch nicht fertig gebaut.\"" -msgid "error37" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" - msgid "error37" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Trank nicht.\"" -msgid "error59" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know anything about herbalism.\"" - msgid "error59" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nichts über Botanik.\"" -msgid "ent_effect" -msgstr "\"$unit($mage) animates $int($amount) trees.\"" - msgid "ent_effect" msgstr "\"$unit($mage) belebt $int($amount) Bäume.\"" -msgid "error89" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Money offer is missing.\"" - msgid "error89" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Geldgebot fehlt.\"" -msgid "nr_header_date" -msgstr "\"Report for $game, $date\"" - msgid "nr_header_date" msgstr "\"Report für $game, $date\"" -msgid "error188" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a swamp.\"" - msgid "error188" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht im Sumpf gezaubert werden.\"" -msgid "error298" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a clone.\"" - msgid "error298" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Klon.\"" -msgid "fail_tooheavy" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is too heavy.\"" - msgid "fail_tooheavy" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist zu schwer.\"" -msgid "familiar_farcast" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions.\"" - msgid "familiar_farcast" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten.\"" -msgid "error184" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not move.\"" - msgid "error184" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit bewegt sich nicht.\"" -msgid "income_entertainment" -msgstr "\"$unit($unit) earns $int($amount) in $region($region) with entertainment.\"" - msgid "income_entertainment" msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Unterhaltung.\"" -msgid "error180" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell fails.\"" - msgid "error180" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber schlägt fehl.\"" -msgid "sp_shapeshift_fail" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) cannot take the form of $race($race,1).\"" - msgid "sp_shapeshift_fail" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) kann nicht $race($race,1) werden.\"" msgid "error290" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Einheit kann nur in einem Verband Mitglied sein.\"" -msgid "cast_rally_effect" -msgstr "\"$unit($mage) quells the uprising in $region($region).\"" - msgid "cast_rally_effect" msgstr "\"$unit($mage) besänftigt den Bauernaufstand in $region($region).\"" -msgid "error246" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already named.\"" - msgid "error246" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude hat schon einen Namen.\"" -msgid "stealaura_fail" -msgstr "\"$unit($unit) could not draw aura from $unit($target).\"" - msgid "stealaura_fail" msgstr "\"$unit($unit) konnte $unit($target) keine Aura entziehen.\"" -msgid "nmr_warning" -msgstr "No orders were received for your faction!" - msgid "nmr_warning" msgstr "Deine Partei hat letzte Runde keinen Zug abgegeben!" -msgid "destroy" -msgstr "\"$unit($unit) destroys $building($building).\"" - msgid "destroy" msgstr "\"$unit($unit) zerstört $building($building).\"" -msgid "volcanooutbreaknn" -msgstr "\"The volcano in $region($region) erupts.\"" - msgid "volcanooutbreaknn" msgstr "\"Der Vulkan in $region($region) bricht aus.\"" -msgid "error132" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a dam before building roads through swamps.\"" - msgid "error132" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Sümpfen Straßen bauen zu können, muß zuerst ein Damm errichtet werden.\"" -msgid "error251" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot improve this power.\"" - msgid "error251" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen.\"" -msgid "error207" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer aura to this unit.\"" - msgid "error207" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu dieser Einheit kann keine Aura übertragen werden.\"" -msgid "error317" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object is indestructible.\"" - msgid "error317" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Objekt ist unzerstörbar.\"" -msgid "error_different_magic" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) does not understand our kind of magic.\"" - msgid "error_different_magic" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) versteht unsere Art von Magie nicht.\"" -msgid "curseinfo::sparkle_3" -msgstr "\"$unit($unit) is surrounded by a shower of glittering sparkles. ($int36($id))\"" - msgid "curseinfo::sparkle_3" msgstr "\"$unit($unit) wird von einem glitzernden Funkenregen umgeben. ($int36($id))\"" -msgid "error313" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes don't work.\"" - msgid "error313" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht arbeiten.\"" -msgid "mail_result" -msgstr "\"A message from $unit($unit): '$message'\"" - msgid "mail_result" msgstr "\"Eine Botschaft von $unit($unit): '$message'\"" -msgid "error203" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No target has been supplied.\"" - msgid "error203" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Ziel wurde vergessen.\"" -msgid "cast_storm_effect" -msgstr "\"$unit($mage) casts $spell($spell): Strong stormwinds are blowing and the archers are having a hard time aiming.\"" - msgid "cast_storm_effect" msgstr "\"$unit($mage) zaubert $spell($spell): Ein Sturm kommt auf und die Schützen können kaum noch zielen.\"" -msgid "patzer4" -msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), strong winds suddenly rise. Bizarre ghostlike creatures circle around the magician and seem to be leeching magical energy. However, with a final effort of strength, $unit($unit) manages to complete the spell.\"" - msgid "patzer4" msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern erhebt sich plötzlich ein dunkler Wind. Bizarre geisterhafte Gestalten kreisen um den Magier und scheinen sich von den magischen Energien des Zaubers zu ernähren. Mit letzter Kraft gelingt es $unit($unit) dennoch den Spruch zu zaubern.\"" -msgid "curseinfo::magicrunes_ship" -msgstr "\"The plank of $ship($ship) are inscribed with strange runes. ($int36($id))\"" - msgid "curseinfo::magicrunes_ship" msgstr "\"Auf den Planken von $ship($ship) erkennt man seltsame Runen. ($int36($id))\"" -msgid "santa_f" -msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." - msgid "santa_f" msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei eine $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." -msgid "cast_spell_effect" -msgstr "\"$unit($mage) casts $spell($spell).\"" - msgid "cast_spell_effect" msgstr "\"$unit($mage) zaubert $spell($spell).\"" -msgid "curseinfo::disorientationzone" -msgstr "\"A veil of confusion lies over the region. ($int36($id))\"" - msgid "curseinfo::disorientationzone" msgstr "\"Ein Schleier der Verwirrung liegt über der Region. ($int36($id))\"" -msgid "calm_effect" -msgstr "\"$unit($mage) calms $unit($unit).\"" - msgid "calm_effect" msgstr "\"$unit($mage) besänftigt $unit($unit).\"" -msgid "error7" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is no longer possible.\"" - msgid "error7" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das geht nicht mehr.\"" -msgid "summonundead_effect_2" -msgstr "\"$unit($mage) communicates with the dead in $region($region).\"" - msgid "summonundead_effect_2" msgstr "\"$unit($mage) stört in $region($region) die Ruhe der Toten.\"" -msgid "generous_effect_0" -msgstr "\"$unit($mage) entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" - msgid "generous_effect_0" msgstr "\"Die Darbietungen von $unit($mage) begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" -msgid "curseinfo::generous" -msgstr "\"Everyone in this region seems to be having a very good time. ($int36($id))\"" - msgid "curseinfo::generous" msgstr "\"Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))\"" -msgid "buildroad" -msgstr "\"$unit($unit) extends the road network in $region($region) by $int($size).\"" - msgid "buildroad" msgstr "\"$unit($unit) erweitert in $region($region) das Straßennetz um $int($size).\"" -msgid "nr_borderlist_postfix" -msgstr "\"$if($transparent,\" there is\",\" sight is blocked by \") ${object}.\"" - msgid "nr_borderlist_postfix" msgstr "\"$if($transparent,\" befindet sich\",\" versperrt\") ${object}$if($transparent,\"\",\" die Sicht\").\"" -msgid "effectstrength" -msgstr "\"$unit($mage) increases the strength of $unit($target) dramatically.\"" - msgid "effectstrength" msgstr "\"$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich.\"" -msgid "wormhole_appear" -msgstr "\"A wormhole appears in $region($region).\"" - msgid "wormhole_appear" msgstr "\"In $region($region) erscheint ein Wurmloch.\"" -msgid "givecommand" -msgstr "\"$unit($unit) gave control to $unit($recipient).\"" - msgid "givecommand" msgstr "\"$unit($unit) gibt das Kommando an $unit($recipient).\"" -msgid "sink_msg" -msgstr "\"$ship($ship) disappears in the depths of $region($region).\"" - msgid "sink_msg" msgstr "\"$ship($ship) versinkt in den Fluten von $region($region).\"" -msgid "force_leave_building" -msgstr "$unit($owner) asks $unit($unit) to leave $building($building)." - msgid "force_leave_building" msgstr "$unit($owner) bittet $unit($unit), $building($building) zu verlassen." -msgid "hero_promotion" -msgstr "\"$unit($unit) uses $int($cost) silber for a promotion.\"" - msgid "hero_promotion" msgstr "\"$unit($unit) wird mit $int($cost) Silber zum Helden ernannt.\"" -msgid "renumber_inuse" -msgstr "\"NUMBER FACTION $int36($id): This number is being used by another faction.\"" - msgid "renumber_inuse" msgstr "\"NUMMER PARTEI $int36($id): Diese Nummer wird von einer anderen Partei benutzt.\"" -msgid "firewall_death" -msgstr "\"$unit($unit) dies trying to cross the wall of fire into $region($region).\"" - msgid "firewall_death" msgstr "\"$unit($unit) stirbt beim Versuch, die Feuerwand nach $region($region) zu durchqueren.\"" -msgid "skillpotion_use" -msgstr "\"$unit($unit) uses a potion of skills and feels his knowledge grow.\"" - msgid "skillpotion_use" msgstr "\"$unit($unit) benutzt einen Talenttrunk und fühlt, wie sein Wissen zunimmt.\"" -msgid "drown_on_ship" -msgstr "\"$unit($unit) drowns when $ship($ship) in $region($region) sinks.\"" - msgid "drown_on_ship" msgstr "\"$unit($unit) ertrinkt beim Untergang der $ship($ship) in $region($region).\"" -msgid "curseinfo::riotzone" -msgstr "\"A fog of negative energy enshrouds the region. ($int36($id))\"" - msgid "curseinfo::riotzone" msgstr "\"Eine Wolke negativer Energie liegt über der Region. ($int36($id))\"" -msgid "send_astral" -msgstr "\"$unit($unit) sends $unit($target) to another world.\"" - msgid "send_astral" msgstr "\"$unit($target) wird von $unit($unit) in eine andere Welt geschleudert.\"" -msgid "earthquake_effect" -msgstr "\"$unit($mage) makes the earth shake in $region($region).\"" - msgid "earthquake_effect" msgstr "\"$unit($mage) läßt die Erde in $region($region) erzittern.\"" -msgid "error56" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot tame that many horses.\"" - msgid "error56" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann soviele Pferde nicht bändigen.\"" -msgid "error78" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevented the transfer from happening.\"" - msgid "error78" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Fluch verhindert die Übergabe.\"" -msgid "questportal_lock" -msgstr "\"$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" - msgid "questportal_lock" msgstr "\"$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" -msgid "error45" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our own.\"" - msgid "error45" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist eine der unsrigen.\"" -msgid "error67" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The horses would drown.\"" - msgid "error67" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Pferde würden ertrinken.\"" -msgid "detectforbiddendir" -msgstr "\"$unit($unit) refuses to travel to the $direction($direction).\"" - msgid "detectforbiddendir" msgstr "\"$unit($unit) weigert sich, nach $direction($direction) zu reisen.\"" -msgid "error197" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician has to be in a castle to create a homestone.\"" - msgid "error197" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um einen Heimstein zu erschaffen, muß der Zauberer in einer Burg sein.\"" -msgid "sp_flee_effect_1" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were consumed by fear.\"" - msgid "sp_flee_effect_1" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden von Furcht gepackt.\"" -msgid "overrun_by_iceberg_des" -msgstr "\"The $ship($ship) has been destroyed by a collision with an iceberg.\"" - msgid "overrun_by_iceberg_des" msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg zerstört.\"" -msgid "curseinfo::region_unknown" -msgstr "\"An unknown spell lies on this region. ($int36($id))\"" - msgid "curseinfo::region_unknown" msgstr "\"Ein unbekannter Zauber liegt auf der Region. ($int36($id))\"" -msgid "nr_market_price" -msgstr "\"$resource($product,0) for $int($price) silver\"" - msgid "nr_market_price" msgstr "\"$resource($product,0) $int($price) Silber\"" -msgid "error259" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That order only applies to units in the same building or ship.\"" - msgid "error259" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl ist nur auf Einheiten innerhalb des selben Gebäudes oder Schiffes anwendbar.\"" -msgid "building_needed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be in a $localize($building) to produce this.\"" - msgid "building_needed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit steht nicht im benötigten Gebäude, $localize($building).\"" -msgid "error149" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Who is supposed to get this message?\"" - msgid "error149" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wohin soll die Botschaft gehen?\"" -msgid "curseinfo::building_unknown" -msgstr "\"An unknown spell lies on this building. ($int36($id))\"" - msgid "curseinfo::building_unknown" msgstr "\"Ein unbekannter Zauber liegt auf dem Gebäude. ($int36($id))\"" -msgid "error145" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a castle.\"" - msgid "error145" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Burg.\"" -msgid "piratenovictim" -msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") could not capture other ships in $region($region).\"" - msgid "piratenovictim" msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) kann keine Schiffe aufbringen.\"" -msgid "questportal_unlock" -msgstr "\"$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" - msgid "questportal_unlock" msgstr "\"$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" -msgid "error255" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this.\"" - msgid "error255" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern.\"" -msgid "entrance_besieged" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege.\"" - msgid "entrance_besieged" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert.\"" -msgid "error260" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted.\"" - msgid "error260" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden.\"" -msgid "nr_market_info_s" -msgstr "\"The local market offers $resource($p1,0).\"" - msgid "nr_market_info_s" msgstr "\"Auf dem Markt wird $resource($p1,0) feilgeboten.\"" -msgid "error141" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough crystals left for this many people.\"" - msgid "error141" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht mehr genug Kristalle für so viele Personen.\"" -msgid "error106" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - When studying, magicians need to be alone.\"" - msgid "error106" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier müssen zum studieren allein sein.\"" -msgid "race_no_attack" -msgstr "\"'$order($command)' - $race($race,0) are peace-loving and will not attack anyone.\"" - msgid "race_no_attack" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) sind friedliebend und attackieren niemand.\"" -msgid "error216" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" - msgid "error216" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Verbindung zur astralen Welt.\"" -msgid "error771" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this skill.\"" - msgid "error771" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann die Einheit nicht lernen.\"" -msgid "error212" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" - msgid "error212" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" -msgid "stormwinds_effect" -msgstr "\"$unit($unit) calls up a magical storm that whips the ship over the waters.\"" - msgid "stormwinds_effect" msgstr "\"$unit($unit) beschwört einen magischen Wind, der die Schiffe über das Wasser treibt.\"" -msgid "error102" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade any more goods.\"" - msgid "error102" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren Güter handeln.\"" -msgid "sp_drought_effect" -msgstr "\"$unit($mage) puts a curse on the lands of $region($region) and a drought sets in.\"" - msgid "sp_drought_effect" msgstr "\"$unit($mage) verflucht das Land in $region($region), und eine Dürreperiode beginnt.\"" -msgid "error_giveeye" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A higher power prevents $unit($unit) from giving the object away. 'IT IS YOURS MY CHILD. ONLY YOURS.'.\"" - msgid "error_giveeye" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine höhere Macht hindert $unit($unit) daran, das Objekt zu übergeben. 'ES IST DEINS, MEIN KIND. DEINS GANZ ALLEIN'.\"" -msgid "curseinfo::buildingunknown" -msgstr "\"A magical shimmer lies on these walls. ($int36($id))\"" - msgid "curseinfo::buildingunknown" msgstr "\"Ein magischer Schimmer liegt auf diesen Mauern. ($int36($id))\"" -msgid "changebanner" -msgstr "\"Banner has been changed to '$value'.\"" - msgid "changebanner" msgstr "\"Das Banner wurde auf '$value' geändert.\"" -msgid "curseinfo::skill_2" -msgstr "\"$unit($unit) has some troubles with $skill($skill). ($int36($id))\"" - msgid "curseinfo::skill_2" msgstr "\"$unit($unit) ist ungewöhnlich ungeschickt in $skill($skill). ($int36($id))\"" -msgid "spellfail::noway" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" - msgid "spellfail::noway" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" -msgid "spellbuildingresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be charmed.\"" - msgid "spellbuildingresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) konnte nicht verzaubert werden.\"" -msgid "after_battle" -msgstr "\"Units after the battle:\"" - -msgid "after_battle" -msgstr "\"Einheiten nach dem Kampf:\"" - -msgid "nr_claims" -msgstr "\"Units can claim the following items: $resources($items)\"" - msgid "nr_claims" msgstr "\"Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)\"" msgid "destroy_ship_2" msgstr "\"$unit($unit) wurde beim Versuch $ship($ship) zu zerstören entdeckt.\"" -msgid "destroy_ship_2" -msgstr "\"$unit($unit) was detected while trying to destroy $ship($ship).\"" - -msgid "destroy_magic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys $int($succ) spells on ${target}.\"" - msgid "destroy_magic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört $int($succ) Flüche auf ${target}.\"" -msgid "battle_row" -msgstr "\"... in combat rank $int($row):\"" - msgid "battle_row" msgstr "\"... in der $int($row). Kampflinie:\"" -msgid "renamed_faction_seen" -msgstr "\"Your faction received a nickname from $unit($unit) in $region($region).\"" - msgid "renamed_faction_seen" msgstr "\"Die Partei bekommt von $unit.dative($unit) in $region($region) einen Spitznamen.\"" -msgid "error_not_on_undead" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast upon undead.\"" - msgid "error_not_on_undead" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" -msgid "iceberg_melt" -msgstr "\"The iceberg $region($region) melts.\"" - msgid "iceberg_melt" msgstr "\"Der Eisberg $region($region) schmilzt.\"" -msgid "cast_berserk_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters went into a mindless rage.\"" - msgid "cast_berserk_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in einen Blutrausch versetzt.\"" -msgid "curseinfo::sparkle_1" -msgstr "\"In a dream, a fairy appears to $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_1" msgstr "\"$unit($unit) ist im Traum eine Fee erschienen. ($int36($id))\"" -msgid "rust_effect_0" -msgstr "\"$unit($mage) calls forth a terrible torment over the enemy side, but there was nobody who could be affected by it.\"" - msgid "rust_effect_0" msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte.\"" -msgid "error1222" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" - msgid "error1222" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" -msgid "header_battle" -msgstr "\"There is a battle in $region($region).\"" - msgid "header_battle" msgstr "\"In $region($region) findet ein Kampf statt.\"" -msgid "wormhole_dissolve" -msgstr "\"The wormhole in $region($region) disappears.\"" - msgid "wormhole_dissolve" msgstr "\"Das Wurmloch in $region($region) schließt sich.\"" -msgid "error23" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege.\"" - msgid "error23" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich.\"" -msgid "error12" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is not ours.\"" - msgid "error12" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht.\"" -msgid "error34" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit has no permission to come on board.\"" - msgid "error34" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen.\"" -msgid "income_steal" -msgstr "\"$unit($unit) steals $int($amount) silver in $region($region).\"" - msgid "income_steal" msgstr "\"$unit($unit) klaut in $region($region) $int($amount) Silber.\"" -msgid "itemcrumble" -msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) turn to dust.\"" - msgid "itemcrumble" msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) zerfallen zu Staub.\"" -msgid "error86" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong password.\"" - msgid "error86" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Falsches Passwort.\"" -msgid "luxury_notsold" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - These goods are not on sale here.\"" - msgid "luxury_notsold" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Luxusgut wird hier nicht verkauft.\"" -msgid "error75" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit does not accept anybody.\"" - msgid "error75" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit nimmt niemanden an.\"" -msgid "error97" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insects cannot be recruited in glacier regions.\"" - msgid "error97" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In Gletschern können keine Insekten rekrutiert werden.\"" -msgid "regionmagic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on the region.\"" - msgid "regionmagic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es die Region zu verzaubern.\"" -msgid "error158" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magicians always work alone!\"" - msgid "error158" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier arbeiten grundsätzlich nur alleine!\"" -msgid "spyreport_mage" -msgstr "\"$unit($target) is a ${type}-magician\"" - msgid "spyreport_mage" msgstr "\"$unit($target) ist ein ${type}-Magier.\"" -msgid "error268" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer items here.\"" - msgid "error268" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nichts übergeben.\"" -msgid "error264" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this good.\"" - msgid "error264" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut hat die Einheit nicht.\"" -msgid "battle_army" -msgstr "\"Army $int($index): $name\"" - -msgid "battle_army" -msgstr "\"Heer $int($index): $name\"" - -msgid "error154" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Highly qualified people refuse to work for other parties.\"" - msgid "error154" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hochqualifizierte Personen weigern sich, für andere Parteien zu arbeiten.\"" -msgid "error_notstonecircle" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is not a stone circle.\"" - msgid "error_notstonecircle" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) ist kein Steinkreis.\"" -msgid "error150" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building.\"" - msgid "error150" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen.\"" -msgid "error229" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A familiar is summoned, but it disappears again when it cannot get in contact with its natural element.\"" - msgid "error229" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Vertrauter wird beschworen, verschwindet jedoch wieder, als er keine Verbindung zu seinem Element herstellen kann.\"" -msgid "error_migrants_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migrants cannot study this.\"" - msgid "error_migrants_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migranten können keine kostenpflichtigen Talente lernen.\"" -msgid "error225" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units do not fight.\"" - msgid "error225" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Soldaten kämpfen nicht.\"" -msgid "error115" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is already in use.\"" - msgid "error115" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist schon belegt.\"" -msgid "spell_out_of_range" -msgstr "\"$unit($mage) casts $spell($spell), but nobody was in range.\"" - msgid "spell_out_of_range" msgstr "\"$unit($mage) zaubert $spell($spell), aber niemand war in Reichweite.\"" -msgid "error111" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Message has been cut (too long).\"" - msgid "error111" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nachricht zu lang - gekürzt.\"" -msgid "error221" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build this here.\"" - msgid "error221" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man hier nicht bauen.\"" -msgid "error_race_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot study.\"" - msgid "error_race_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts lernen.\"" -msgid "buy" -msgstr "\"$unit($unit) pays $int($money) silver for luxury items.\"" - msgid "buy" msgstr "\"$unit($unit) bezahlt $int($money) Silber für den Kauf von Luxusgütern.\"" -msgid "curseinfo::sparkle_15" -msgstr "\"Rats follow $unit($unit)'s every step. ($int36($id))\"" - msgid "curseinfo::sparkle_15" msgstr "\"Ratten folgen $unit($unit) auf Schritt und Tritt. ($int36($id))\"" -msgid "arena_enter_fail" -msgstr "\"$region($region) reverberates from the voice of the gate keeper: 'Only those who forgo material riches and who are willing to learn my enter the Plane of Challenge. And don't forget about my tip!'. $unit($unit) was not admitted.\"" - msgid "arena_enter_fail" msgstr "\"In $region($region) erklingt die Stimme des Torwächters: 'Nur wer ohne materielle Güter und noch lernbegierig ist, der darf die Ebene der Herausforderung betreten. Und vergiß nicht mein Trinkgeld.'. $unit($unit) erhielt keinen Einlaß.\"" -msgid "aurapotion50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated.\"" - -msgid "aurapotion50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt.\"" - -msgid "curseinfo::deathcloud" -msgstr "\"A poison elemental is spreading pestilence and death. ($int36($id))\"" - msgid "curseinfo::deathcloud" msgstr "\"In der Region treibt ein Giftelementar sein Unwesen. ($int36($id))\"" -msgid "income" -msgstr "\"$unit($unit) earns $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") in $region($region) $if($eq($mode,1),\" by entertainment\",$if($eq($mode,2),\" by taxes\",$if($eq($mode,3),\" by trade\",$if($eq($mode,5),\" by stealing\",$if($eq($mode,6),\" by magic\",$if($eq($mode,7),\" by pillaging\",\"\")))))).\"" - msgid "income" msgstr "\"$unit($unit) verdient$if($eq($mode,4),\" am Handel\",\"\") in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber$if($eq($mode,1),\" durch Unterhaltung\",$if($eq($mode,2),\" durch Steuern\",$if($eq($mode,3),\" durch Handel\",$if($eq($mode,5),\" durch Diebstahl\",$if($eq($mode,6),\" durch Zauberei\",$if($eq($mode,7),\" durch Plündern\",\"\")))))).\"" -msgid "researchherb" -msgstr "\"$unit($unit) discovers that $localize($amount) $resource($herb,0) grow in $region($region).\"" - msgid "researchherb" msgstr "\"$unit($unit) in $region($region) stellt fest, dass es hier $localize($amount) $resource($herb,0) gibt.\"" -msgid "poison_death" -msgstr "\"$unit($unit) dies from poison damage taken in $region($region).\"" - msgid "poison_death" msgstr "\"$unit($unit) stirbt am Schaden durch den Giftelementar in $region($region).\"" -msgid "error_notcomplete" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) has to be complete before it can be blessed.\"" - msgid "error_notcomplete" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) muss vor der Weihe fertiggestellt sein.\"" -msgid "regenaura" -msgstr "\"$unit($unit) regenerates $int($amount) aura in $region($region).\"" - msgid "regenaura" msgstr "\"$unit($unit) in $region($region) regeneriert $int($amount) Aura.\"" -msgid "regionmagic_patzer" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) manages to put a spell on the region, but something went wrong nonetheless.\"" - msgid "regionmagic_patzer" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es zwar die Region zu verzaubern, aber irgendwas ging schief.\"" -msgid "curseinfo::sparkle_11" -msgstr "\"Bird songs follow $unit($unit) on all his travels. ($int36($id))\"" - msgid "curseinfo::sparkle_11" msgstr "\"Vogelzwitschern begleitet $unit($unit) auf all seinen Wegen. ($int36($id))\"" -msgid "wdw_pyramidspell_notfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away.\"" - msgid "wdw_pyramidspell_notfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region können keine Pyramiden gebaut werden. Die nächste Pyramidenregion ist zwischen $int($mindist) und $int($maxdist) Regionen entfernt.\"" -msgid "sailforbidden" -msgstr "\"The crew of the $ship($ship) refuses to travel to $region($region).\"" - msgid "sailforbidden" msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen.\"" -msgid "sp_raisepeasantmob_effect" -msgstr "\"$unit($mage) incites a revolt among the peasants of $region($region).\"" - msgid "sp_raisepeasantmob_effect" msgstr "\"$unit($mage) wiegelt in $region($region) die Bauern zum Aufstand auf.\"" -msgid "error31" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The castle could not be found.\"" - msgid "error31" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Burg wurde nicht gefunden.\"" -msgid "error53" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot make potions.\"" - msgid "error53" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine Tränke herstellen.\"" -msgid "error20" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship could not be found.\"" - msgid "error20" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff wurde nicht gefunden.\"" -msgid "error42" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough coachmen or has too much freights to lad the wagons.\"" - msgid "error42" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Wagenlenker oder zuviel andere Fracht, um die Wagen aufzuladen.\"" -msgid "error64" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) is not sufficiently stealthy.\"" - msgid "error64" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ist nicht ausreichend getarnt.\"" -msgid "curseinfo::itemcloak" -msgstr "\"$unit($unit)'s equipment is invisible. ($int36($id))\"" - msgid "curseinfo::itemcloak" msgstr "\"Die Ausrüstung von $unit($unit) scheint unsichtbar. ($int36($id))\"" -msgid "error277" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot do this.\"" - msgid "error277" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann die Einheit nicht.\"" -msgid "error94" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build a road here.\"" - msgid "error94" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Straße bauen.\"" -msgid "error167" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not go to the peasants.\"" - msgid "error167" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit geht nicht zu den Bauern.\"" -msgid "use_realworld_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object can only be used in the real world.\"" - msgid "use_realworld_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand kann nur in der realen Welt benutzt werden.\"" -msgid "error163" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This potion can only be used by insects.\"" - msgid "error163" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Nestwärme kann nur von Insektenvölkern benutzt werden.\"" -msgid "error273" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot teach here.\"" - msgid "error273" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht unterrichten.\"" -msgid "error238" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can recruit only orcs here.\"" - msgid "error238" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier können nur Orks rekrutiert werden.\"" -msgid "spellfail::nocontact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $region($target) could not be contacted.\"" - msgid "spellfail::nocontact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu $region($target) kann kein Kontakt hergestellt werden.\"" -msgid "error119" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no marketplace without at least a tradepost.\"" - msgid "error119" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne einen Handelsposten gibt es keinen Markt.\"" -msgid "error124" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot buy that on a market place.\"" - msgid "error124" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht auf dem Markt kaufen.\"" -msgid "santa_m" -msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." - msgid "santa_m" msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei einen $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." -msgid "error234" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is busy disembarking.\"" - msgid "error234" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit Ausschiffen beschäftigt..\"" -msgid "spellfail::nolevel" -msgstr "\"$unit($mage) in $region($region): '$order($command)' - This spell cannot be cast with variable level.\"" - msgid "spellfail::nolevel" msgstr "\"$unit($mage) in $region($region): '$order($command)' - Dieser Zauber kann nicht mit Stufenangabe gezaubert werden.\"" -msgid "nr_score" -msgstr "\"Your faction has a score of ${score}. The average score for similar factions is ${average}.\"" - msgid "nr_score" msgstr "\"Deine Partei hat ${score} Punkte. Der Durchschnitt für Parteien ähnlichen Alters ist ${average} Punkte.\"" -msgid "curseinfo::ship_unknown" -msgstr "\"An unknown spell lies on this ship. ($int36($id))\"" - msgid "curseinfo::ship_unknown" msgstr "\"Ein unbekannter Zauber liegt auf dem Schiff. ($int36($id))\"" -msgid "alliance::kickedout" -msgstr "\"$faction($member) was kicked from $alliance($alliance) by $int($votes) of the alliance's members.\"" - msgid "alliance::kickedout" msgstr "\"$faction($member) ist mit $int($votes) Stimmen aus $alliance($alliance) ausgeschlossen worden.\"" -msgid "error230" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot transport us to this place.\"" - msgid "error230" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin kann die Einheit uns nicht transportieren.\"" -msgid "error120" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Characters can be given only to human parties.\"" - msgid "error120" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Personen können nur an Menschen übergeben werden.\"" -msgid "error_max_alchemists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more tha $int($amount) alchemists in your faction.\"" - msgid "error_max_alchemists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Alchemisten pro Partei geben.\"" -msgid "error305" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Options ZIP and BZIP2 can only be switched, not turned off.\"" - msgid "error305" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Optionen ZIP und BZIP2 können nur um-, nicht ausgeschaltet werden.\"" -msgid "error301" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym missing.\"" - msgid "error301" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Kein Synonym angegeben.\"" -msgid "iceberg_drift" -msgstr "\"The iceberg $region($region) drifts $direction($dir).\"" - msgid "iceberg_drift" msgstr "\"Der Eisberg $region($region) treibt nach $direction($dir).\"" -msgid "hornofpeace_r_success" -msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing. Peaceful harmony spreads over the region.\"" - msgid "hornofpeace_r_success" msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes. In der ganzen Region breitet sich eine friedliche Feststimmmung aus.\"" -msgid "nr_vicinitystart" -msgstr "\"To the $direction($dir) lies $trailto($region)\"" - msgid "nr_vicinitystart" msgstr "\"Im $direction($dir) der Region liegt $trailto($region)\"" -msgid "giverestriction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction must be at least $int($turns) weeks old to give something to another faction.\"" - msgid "giverestriction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Deine Partei muss mindestens $int($turns) alt sein, um etwas an andere Parteien übergeben zu können.\"" -msgid "curseinfo::depression" -msgstr "\"The peasants are upset. ($int36($id))\"" - msgid "curseinfo::depression" msgstr "\"Die Bauern sind unzufrieden. ($int36($id))\"" -msgid "patzer" -msgstr "\"$unit($unit) fumbles while casting $spell($spell) in $region($region).\"" - msgid "patzer" msgstr "\"$unit($unit) unterläuft in $region($region) beim Zaubern von $spell($spell) ein Patzer.\"" -msgid "potionsave" -msgstr "\"A fighter of $unit($unit) was saved by a healing potion.\"" - msgid "potionsave" msgstr "\"Eine Person von $unit($unit) konnte durch einen Heiltrank überleben.\"" -msgid "storm" -msgstr "\"The $ship($ship) in $region($region) gets off course in heavy storm$if($sink,\" and sinks\",\"\").\"" - msgid "storm" msgstr "\"Die $ship($ship) wird in $region($region) von Stürmen abgetrieben$if($sink,\" und sinkt\",\"\").\"" -msgid "nr_insectwinter" -msgstr "It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions." - msgid "nr_insectwinter" msgstr "Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren." -msgid "spellfail_nomonsters" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on monsters.\"" - msgid "spellfail_nomonsters" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Monster gezaubert werden.\"" -msgid "bagpipeoffear_region" -msgstr "\"$unit($unit) plays the bagpipe. Stricken with fear the peasants give $int($money) silver.\"" - msgid "bagpipeoffear_region" msgstr "\"$unit($unit) spielt einen Dudelsack. Ausser sich vor Furcht geben die Bauern $int($money) Silber.\"" -msgid "sp_chaosrow_effect_1" -msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub and the battle order is disturbed.\"" - msgid "sp_chaosrow_effect_1" msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" -msgid "use_item" -msgstr "\"$unit($unit) uses $int($amount) $resource($item,$amount).\"" - msgid "use_item" msgstr "\"$unit($unit) benutzt $int($amount) $resource($item,$amount).\"" -msgid "sp_movecastle_effect" -msgstr "\"An tremor shakes $building($building). Many little pseudopods lift up the building and carry it to $direction($direction).\"" - msgid "sp_movecastle_effect" msgstr "\"Ein Beben erschüttert $building($building). Viele kleine Pseudopodien erheben das Gebäude und tragen es in Richtung $direction($direction).\"" -msgid "feedback_no_contact_resist" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, and resists the spell.\"" - msgid "feedback_no_contact_resist" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen und widersteht dem Zauber.\"" -msgid "error176" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell on a distant target.\"" - msgid "error176" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht in die Ferne richten.\"" -msgid "error286" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not transporting us.\"" - msgid "error286" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit transportiert uns nicht.\"" -msgid "error83" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No peasant could be caught.\"" - msgid "error83" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnte kein Bauer gefangen werden.\"" -msgid "error50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not experienced enough to do this.\"" - msgid "error50" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht erfahren genug dafür.\"" -msgid "error282" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot start a jihad against this race.\"" - msgid "error282" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen diese Rasse kann kein Jihad ausgerufen werden.\"" -msgid "nmr_warning_final" -msgstr "\"Please send in orders for the next turn if you want to continue playing.\"" - msgid "nmr_warning_final" msgstr "\"Bitte sende die Befehle nächste Runde ein, wenn du weiterspielen möchtest.\"" -msgid "error172" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There was no spell supplied.\"" - msgid "error172" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Zauber angegeben.\"" -msgid "entrance_denied" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Entrance to $building($building) was denied.\"" - msgid "entrance_denied" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Eintritt in $building($building) wurde verwehrt.\"" -msgid "maelstrom_effect" -msgstr "\"$unit($mage) summons the power of the seas and a giant maelstrom forms.\"" - msgid "maelstrom_effect" msgstr "\"$unit($mage) beschwört die Mächte des Wassers und ein gigantischer Strudel bildet sich.\"" -msgid "displayitem" -msgstr "\"$resource($item,1) (weight: $weight($weight)): $description\"" - msgid "displayitem" msgstr "\"$resource($item,1) (Gewicht: $weight($weight)): $description\"" -msgid "error128" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many strangers.\"" - msgid "error128" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann die Partei nicht aufnehmen.\"" -msgid "error247" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction is already named.\"" - msgid "error247" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat schon einen Namen.\"" -msgid "spellfail_generous" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mood in this region is so bad that nobody reacts to the spell.\"" - msgid "spellfail_generous" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Stimmung in der Region ist so schlecht, dass niemand auf den Zauber reagiert.\"" -msgid "healing_effect_0" -msgstr "\"$unit($mage) sees after the wounded and heals $int($amount).\"" - msgid "healing_effect_0" msgstr "\"$unit($mage) kümmert sich um die Verletzten und heilt $int($amount) Verwundete.\"" -msgid "use_questkey_wrongregion" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No fitting lock can be found here.\"" - msgid "use_questkey_wrongregion" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier ist kein passendes Schloss.\"" -msgid "error243" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You did not specify a valid race.\"" - msgid "error243" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine gültige Rasse angegeben.\"" -msgid "error133" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a caravansary before building roads through deserts.\"" - msgid "error133" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Wüsten Straßen bauen zu können, muß zuerst eine Karawanserei errichtet werden.\"" -msgid "changepasswd" -msgstr "\"The password of this faction is '$value'.\"" - msgid "changepasswd" msgstr "\"Das Passwort für diese Partei lautet ${value}.\"" -msgid "cast_combatspell" -msgstr "\"$unit($mage) casts $spell($spell): $int($dead) $if($eq($dead,1),\"enemy was\", \"enemies were\") killed.\"" - msgid "cast_combatspell" msgstr "\"$unit($mage) zaubert $spell($spell): $int($dead) $if($eq($dead,1),\"Krieger wurde\", \"Krieger wurden\") getötet.\"" -msgid "cast_petrify_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were petrified.\"" - msgid "cast_petrify_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurden versteinert.\"" -msgid "error309" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit already assumed lycantropic form.\"" - msgid "error309" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist schon ein Werwesen.\"" -msgid "nr_stat_salary_new" -msgstr "\"peasant wages: $int($max) silver\"" - msgid "nr_stat_salary_new" msgstr "\"Bauerneinnahmen: $int($max) Silber\"" -msgid "income_magic_reduced" -msgstr "\"$unit($unit) in $region($region) earns $int($amount)$if($eq($wanted,$amount),\"\",\" instead of $int($wanted)\") silver through magic.\"" - msgid "income_magic_reduced" msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Zauberei.\"" msgid "destroy_ship_1" msgstr "\"$unit($unit) konnte $ship($ship) nicht zerstören.\"" -msgid "destroy_ship_1" -msgstr "\"$unit($unit) could not destroy $ship($ship).\"" - -msgid "error314" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Restart can only be used once.\"" - msgid "error314" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei kann nur einmal neu starten.\"" -msgid "error310" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is not in lycantropic form.\"" - msgid "error310" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist kein Werwesen.\"" -msgid "error_pflnorecruit" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot recruit in this plane.\"" - msgid "error_pflnorecruit" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Ebene der Herausforderung kann niemand rekrutiert werden.\"" -msgid "sp_mindblast_temp_effect" -msgstr "\"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories.\"" - msgid "sp_mindblast_temp_effect" msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren kurzzeitig ihr Gedächtnis.\"" -msgid "buildbuilding" -msgstr "\"$unit($unit) builds $int($size) more on $building($building).\"" - msgid "buildbuilding" msgstr "\"$unit($unit) baut für $int($size) an $building($building) weiter.\"" -msgid "spellfail_astralblock" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The paths to the spirit world seem to be blocked.\"" - msgid "spellfail_astralblock" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege zwischen Geisterwelt und Realität scheinen blockiert zu sein.\"" -msgid "familiar_toofar" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot raise enough energy to channel the spell through $unit($unit).\"" - msgid "familiar_toofar" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann nicht genug Energie aufbringen, um diesen Spruch durch $unit($unit) zu wirken.\"" -msgid "wdw_pyramidspell_found" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pyramids may be build in this region.\"" - msgid "wdw_pyramidspell_found" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Regione können Pyramiden gebaut werden.\"" -msgid "deorcified" -msgstr "\"Little by little, people return to $region($region).\"" - msgid "deorcified" msgstr "\"Langsam kehren andere Völker nach $region($region) zurück.\"" -msgid "sp_movecastle_fail_1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction).\"" - msgid "sp_movecastle_fail_1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen.\"" -msgid "curseinfo::strength" -msgstr "\"Testosterone levels are at an all-time high. ($int36($id))\"" - msgid "curseinfo::strength" msgstr "\"Die Leute strotzen nur so vor Kraft. ($int36($id))\"" -msgid "magic_fumble" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is caught in their own spell.\"" - msgid "magic_fumble" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier verfängt sich im eigenen Zauber.\"" -msgid "teach_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) is not learning.\"" - msgid "teach_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) lernt nicht.\"" -msgid "regionowned" -msgstr "\"$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance.\"" - msgid "regionowned" msgstr "\"$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte.\"" -msgid "income_tradetax" -msgstr "\"$unit($unit) collected $int($amount) silver trade tax in $region($region).\"" - msgid "income_tradetax" msgstr "\"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber.\"" -msgid "error19" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - First you have to leave the ship.\"" - msgid "error19" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff muß erst verlassen werden.\"" -msgid "buyamount" -msgstr "\"$unit($unit) buys $int($amount) $resource($resource,$amount).\"" - msgid "buyamount" msgstr "\"$unit($unit) kauft $int($amount) $resource($resource,$amount).\"" -msgid "fumblecurse" -msgstr "\"$unit($unit) in $region($region) was cursed by an unknown magician.\"" - msgid "fumblecurse" msgstr "\"$unit($unit) in $region($region) wird von einem Unbekannten verflucht.\"" -msgid "regionmessage" -msgstr "\"A message by $unit($sender) from $region($region): '$string'\"" - msgid "regionmessage" msgstr "\"Eine Botschaft von $unit.dative($sender) aus $region($region): '$string'\"" -msgid "spellfail_noundead" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on undead.\"" - msgid "spellfail_noundead" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" -msgid "studycost" -msgstr "\"$unit($unit) spends $int($cost) silver in $region($region) to study $skill($skill).\"" - msgid "studycost" msgstr "\"$unit($unit) in $region($region) verbraucht $int($cost) Silber für das Studium von $skill($skill).\"" -msgid "flying_ship_result" -msgstr "\"$unit($mage) summons a wind spirit that lifts the $ship($ship) into the clouds.\"" - msgid "flying_ship_result" msgstr "\"$unit($mage) beschwört einen Luftgeist, der die $ship($ship) in die Wolken hebt.\"" -msgid "forestfire_spread" -msgstr "\"The fire in $region($region) spread to $region($next) and $int($trees) were burned.\"" - msgid "forestfire_spread" msgstr "\"Der Waldbrand in $region($region) griff auch auf $region($next) über, und $int($trees) verbrannten.\"" -msgid "maintenancefail" -msgstr "\"$unit($unit) cannot pay the maintenance for $building($building).\"" - msgid "maintenancefail" msgstr "\"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen.\"" -msgid "bagpipeoffear_faction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Stricken with fear the peasants give the bard $int($money) silver.\"" - msgid "bagpipeoffear_faction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ausser sich vor Furcht geben die Bauern dem Barden $int($money) Silber.\"" -msgid "unitmessage" -msgstr "\"In $region($region), $unit($unit) received a message by $unit($sender): '$string'\"" - msgid "unitmessage" msgstr "\"In $region($region) erhielt $unit($unit) eine Botschaft von $unit.dative($sender): '$string'\"" -msgid "error189" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot dry out an entire ocean.\"" +msgid "para_after_battle" +msgstr "\"Einheiten nach dem Kampf:\"" msgid "error189" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst der mächtigste Magier der Welt könnte keinen Ozean austrocknen lassen.\"" -msgid "teach_student" -msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill).\"" - msgid "teach_student" msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill).\"" -msgid "curseinfo::astralblock" -msgstr "\"Powerful magic disrupts our contact with reality. ($int36($id))\"" - msgid "curseinfo::astralblock" msgstr "\"Mächtige Magie verhindert den Kontakt zur Realität. ($int36($id))\"" -msgid "error299" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid prefix.\"" - msgid "error299" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Prefix.\"" -msgid "curseinfo::baddream" -msgstr "\"Nightmares plague the population. ($int36($id))\"" - msgid "curseinfo::baddream" msgstr "\"Albträume plagen die Leute. ($int36($id))\"" -msgid "error295" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only mages may use an astralcrystal.\"" - msgid "error295" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur ein Magier kann einen Astralkristall benutzen.\"" -msgid "error185" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell seems exceptionally weak. Something has interfred with the magical energies.\"" - msgid "error185" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber scheint ungewöhnlich schwach zu sein. Irgendetwas hat die magischen Energien abgeleitet.\"" -msgid "error181" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - To do this, the magician has to be in a castle or on board a ship.\"" - msgid "error181" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muß sich der Magier in der Burg oder an Bord des Schiffes befinden.\"" msgid "error291" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keinem Verband.\"" -msgid "curseinfo::calm_0" -msgstr "\"$unit($unit) seems to like $race($race, 0). ($int36($id))\"" - msgid "curseinfo::calm_0" msgstr "\"$unit($unit) scheint $race($race, 0) zu mögen. ($int36($id))\"" -msgid "error256" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot pray for this.\"" - msgid "error256" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um so etwas kann man nicht beten.\"" -msgid "desertion" -msgstr "\"$unit($unit) in $region($region) abandons your cause.\"" - msgid "desertion" msgstr "\"$unit($unit) in $region($region) desertiert.\"" -msgid "error91" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no mallorn trees here.\"" - msgid "error91" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Mallornbäume.\"" -msgid "error137" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown help mode.\"" - msgid "error137" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Hilfe-Modus.\"" -msgid "error80" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" - msgid "error80" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist nicht bewaffnet und kampffähig.\"" -msgid "error142" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver for recruiting.\"" - msgid "error142" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat zuwenig Silber, um zu rekrutieren.\"" -msgid "rust_fail" -msgstr "\"$unit($mage) puts a spell of rust on $unit($target) but it found nothing to consume.\"" - msgid "rust_fail" msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target), doch der Rosthauch fand keine Nahrung.\"" -msgid "error252" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - What and how much should be sacrificed?\"" - msgid "error252" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Was und wieviel soll geopfert werden?\"" -msgid "dissolve_units_3" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) whithered and died.\"" - msgid "dissolve_units_3" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verfaulte\", \"verfaulten\").\"" -msgid "trappedairelemental_success" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster.\"" - msgid "trappedairelemental_success" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die $ship($ship) wird jetzt schneller ihr Ziel erreichen.\"" -msgid "error208" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong aura values.\"" - msgid "error208" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft.\"" -msgid "error318" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building can be expanded only once per turn.\"" - msgid "error318" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude kann nur einmal pro Runde erweitert werden.\"" -msgid "teach_asgood" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) needs to be at least 2 levels better than $unit($student).\"" - msgid "teach_asgood" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) muß mindestens 2 Stufen besser sein als $unit($student).\"" -msgid "drought_effect_1" -msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). Ice melts and turns the lands into swamps. Powerful rivers wash away the fertile soil and drown people and animals alike. What buildings have not succumbed to the floods sink into the mire. The torrid sun changes the region forever.\"" - msgid "drought_effect_1" msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Eis schmilzt und verwandelt sich in Morast. Reißende Ströme spülen die mageren Felder weg und ersäufen Mensch und Tier. Was an Bauten nicht den Fluten zum Opfer fiel, verschlingt der Morast. Die sengende Hitze verändert die Region für immer.\"" -msgid "error204" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a region without trees.\"" - msgid "error204" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In einer Region ohne Bäume kann man diesen Zauber nicht wirken.\"" -msgid "patzer5" -msgstr "\"$unit($unit) feels far more exhausted than he should after casting $spell($spell) and assumes that any following spells will cost far more energy than usual.\"" - msgid "patzer5" msgstr "\"$unit($unit) fühlt sich nach dem Zaubern von $spell($spell) viel erschöpfter als sonst und hat das Gefühl, dass alle weiteren Zauber deutlich mehr Kraft als normalerweise kosten werden.\"" -msgid "analyse_region_age" -msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" - msgid "analyse_region_age" msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" -msgid "plague_spell" -msgstr "\"$unit($mage) sends the plague on $region($region).\"" - msgid "plague_spell" msgstr "\"$unit($mage) ruft in $region($region) eine Pest hervor.\"" -msgid "error200" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magician's maximum aura is not high enough for this spell.\"" - msgid "error200" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die maximale Aura reicht nicht für diesen Zauber.\"" -msgid "shipnoshore" -msgstr "\"The $ship($ship) discovers that $region($region) is dry land.\"" - msgid "shipnoshore" msgstr "\"Die $ship($ship) entdeckt, dass $region($region) Festland ist.\"" -msgid "sp_sweetdreams_effect" -msgstr "\"$unit($mage) causes $unit($unit) to have a wonderful night in $region($region).\"" - msgid "sp_sweetdreams_effect" msgstr "\"$unit($mage) verschafft $unit($unit) ein schönes Nachtleben in $region($region).\"" -msgid "error3" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Description has been cut (too long).\"" - msgid "error3" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Beschreibung zu lang - gekürzt.\"" -msgid "charming_effect" -msgstr "\"$unit($mage) chamrs $unit($unit). $unit($unit) will obey our orders for approximatley $int($duration) more weeks.\"" - msgid "charming_effect" msgstr "\"$unit($mage) gelingt es $unit($unit) zu verzaubern. $unit($unit) wird für etwa $int($duration) Wochen unseren Befehlen gehorchen.\"" -msgid "target_region_invalid" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - invalid target region.\"" - msgid "target_region_invalid" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültige Zielregion.\"" -msgid "nr_heroes" -msgstr "\"Your faction has promoted $int($units) heroes out of a possible total of $int($maxunits).\"" - msgid "nr_heroes" msgstr "\"Deine Partei hat $int($units) Helden und kann maximal $int($maxunits) Helden ernennen.\"" -msgid "cast_tired_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had trouble staying awake.\"" - msgid "cast_tired_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger schleppten sich müde in den Kampf.\"" -msgid "caldera_handle_1" -msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" - msgid "caldera_handle_1" msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" -msgid "weakmagic" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell of $unit($unit) was way to weak and its magic dissolves immediately.\"" - msgid "weakmagic" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber von $unit.dative($unit) war viel zu schwach und löst sich gleich wieder auf.\"" -msgid "analyse_building_fail" -msgstr "\"It appears to $unit($mage) that $building($building) is charmed, but no details have been revealed.\"" - msgid "analyse_building_fail" msgstr "\"$unit($mage) meint, dass auf $building($building) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" -msgid "spellfail_toomanytargets" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This many people exceed the powers of the magician.\"" - msgid "spellfail_toomanytargets" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Persoenen übersteigen die Kräfte des Magiers.\"" -msgid "harvest_effect" -msgstr "\"$if($isnull($mage),\"An unseen magician\",$unit($mage)) blesses the fields in a short ritual.\"" - msgid "harvest_effect" msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) segnet in einem kurzen Ritual die Felder.\"" -msgid "buildship" -msgstr "\"$unit($unit) builds $int($size) more on $ship($ship).\"" - msgid "buildship" msgstr "\"$unit($unit) baut für $int($size) an $ship($ship) weiter.\"" -msgid "spellshipnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ship $int36($id) could not be located.\"" - msgid "spellshipnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Schiff $int36($id) wurde nicht gefunden.\"" -msgid "unveileog" -msgstr "\"$unit($unit) discovers laen in $region($region).\"" - msgid "unveileog" msgstr "\"$unit($unit) in $region($region) entdeckt eine Laenader.\"" -msgid "error_roads_finished" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete.\"" - msgid "error_roads_finished" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen.\"" -msgid "item_create_spell" -msgstr "\"$unit($mage) creates $int($number) $resource($item,$number).\"" - msgid "item_create_spell" msgstr "\"$unit($mage) erschafft $int($number) $resource($item,$number).\"" -msgid "curseinfo::slavery" -msgstr "This powerful curse appears to rob the unit of its free will. As long as the curse is active, it will only obey the orders of its new lord. ($int36($id))" - msgid "curseinfo::slavery" msgstr "Dieser mächtige Bann scheint die Einheit ihres freien Willens zu berauben. Solange der Zauber wirkt, wird sie nur den Befehlen ihres neuen Herrn gehorchen. ($int36($id))" -msgid "start_battle" -msgstr "\"The battle was initiated by ${factions}.\"" - msgid "start_battle" msgstr "\"Der Kampf wurde ausgelöst von ${factions}.\"" -msgid "stealaura_fail_detect" -msgstr "\"$unit($unit) fühlt strangely weakened.\"" - msgid "stealaura_fail_detect" msgstr "\"$unit($unit) fühlt sich einen Moment seltsam geschwächt.\"" msgid "battle_msg" msgstr "\"$string\"" -msgid "battle_msg" -msgstr "\"$string\"" - -msgid "error16" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already completed.\"" - msgid "error16" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist schon fertig.\"" -msgid "error38" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have any herbs.\"" - msgid "error38" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Kräuter.\"" -msgid "volcano_dead" -msgstr "\"$int($dead) people in $unit($unit) perish when the volcano in $region($region) erupts.\"" - msgid "volcano_dead" msgstr "\"Beim Vulkanausbruch in $region($region) sterben $int($dead) Personen in $unit($unit).\"" -msgid "curseinfo::warmth_1" -msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") protected from the cold. ($int36($id))\"" - msgid "curseinfo::warmth_1" msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"fühlt\", \"fühlen\") sich vor Kälte geschützt. ($int36($id))\"" -msgid "maintenance_noowner" -msgstr "\"The upkeep for $building($building) was not paid, the building was not operational this week.\"" - msgid "maintenance_noowner" msgstr "\"Der Unterhalt von $building($building) konnte nicht gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig.\"" -msgid "error27" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items for sale is missing.\"" - msgid "error27" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu verkaufender Produkte fehlt.\"" -msgid "error49" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not the owner.\"" - msgid "error49" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Eigentümer.\"" -msgid "missing_components" -msgstr "\"$unit($unit) has insufficient components to cast $spell($spell) on level $int($level).\"" - msgid "missing_components" msgstr "\"$unit($unit) hat nicht genügend Komponenten um $spell($spell) auf Stufe $int($level) zu zaubern.\"" -msgid "seduce_effect_1" -msgstr "\"$unit($unit) gambles for high stakes and loses almost everything.\"" - msgid "seduce_effect_1" msgstr "\"$unit($unit) verfiel dem Glücksspiel und hat fast sein ganzes Hab und gut verspielt.\"" -msgid "xmastree_effect" -msgstr "\"At night, colourful lights can be seen in this region, bells are a-ringing and the laughter of happy children seems to be everywhere in the forests.\"" - msgid "xmastree_effect" msgstr "\"In der Region erstrahlen des Nachts bunte Lichter, Gloeckchen klingeln und frohes Kindergelaechter klingt durch den Wald.\"" -msgid "cast_sleep_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters have fallen asleep.\"" - msgid "cast_sleep_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in Schlaf versetzt.\"" -msgid "nr_alliance" -msgstr "\"Member of '$name ($int36($id))' for $int($age) weeks, led by $faction($leader).\"" - msgid "nr_alliance" msgstr "\"Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', angeführt von $faction($leader).\"" -msgid "deathcloud_effect" -msgstr "\"$unit($mage) summons a poison elemental in $region($region).\"" - msgid "deathcloud_effect" msgstr "\"$unit($mage) beschwört einen Giftelementar in $region($region).\"" -msgid "nr_building_besieged" -msgstr "\", besieged by $int($soldiers) soldiers$if($lt($diff,0),\"\",\" (cut off)\")\"" - msgid "nr_building_besieged" msgstr "\", belagert von $int($soldiers) Personen$if($lt($diff,0),\"\",\" (abgeschnitten)\")\"" -msgid "nr_population" -msgstr "\"Your faction has $int($population) people in $int($units) of $int($limit) possible units.\"" - msgid "nr_population" msgstr "\"Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten.\"" -msgid "curseinfo::shipdisorientation" -msgstr "This ship has lost its path. ($int36($id))" - msgid "curseinfo::shipdisorientation" msgstr "Dieses Schiff hat sich verfahren. ($int36($id))" -msgid "error198" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The flames find no kindling. The fire dies quickly, causing no damage whatsoever.\"" - msgid "error198" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Flammen finden keine Nahrung. Das Feuer erlischt, ohne Schaden anzurichten.\"" -msgid "error194" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Target region was supplied incorrectly.\"" - msgid "error194" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zielregion wurde nicht korrekt angegeben.\"" -msgid "illusionantimagic" -msgstr "\"$unit($unit) walks into an antimagical zone and dissolves.\"" - msgid "illusionantimagic" msgstr "\"$unit($unit) marschiert in eine Antimagiezone und löst sich auf.\"" -msgid "curseinfo::sparkle_8" -msgstr "\"A group of passing miners makes passes at $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_8" msgstr "\"Eine Gruppe vorbeiziehender Bergarbeiter rufen $unit($unit) eindeutig Zweideutiges nach. ($int36($id))\"" -msgid "too_many_units_in_alliance" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - An alliance may not consist of more than $int($allowed) units.\"" - msgid "too_many_units_in_alliance" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Allianz darf aus nicht mehr als $int($allowed) Einheiten bestehen.\"" -msgid "error190" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in the material world.\"" - msgid "error190" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der materiellen Welt.\"" -msgid "sp_flee_effect_0" -msgstr "\"$unit($mage) casts $spell($spell), but nobody is affected.\"" - msgid "sp_flee_effect_0" msgstr "\"$unit($mage) zaubert $spell($spell), aber es gab niemanden, der beeinflusst werden konnte.\"" -msgid "error146" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not captain of a ship.\"" - msgid "error146" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Kapitän des Schiffes.\"" -msgid "error265" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only works in the normal world.\"" - msgid "error265" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der normalen Welt.\"" -msgid "error261" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sort before the owner of a ship or a building.\"" - msgid "error261" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Vor den Besitzer eines Schiffes oder Gebäudes kann nicht sortiert werden.\"" -msgid "icastle_dissolve" -msgstr "\"$building($building) suddenly dissolves into small pink clouds.\"" - msgid "icastle_dissolve" msgstr "\"Plötzlich löst sich $building($building) in kleine Traumwolken auf.\"" -msgid "error151" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need stones to build a road.\"" - msgid "error151" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zum Straßenbau braucht man Steine.\"" -msgid "slave_active" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit will not fight.\"" - msgid "slave_active" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht.\"" -msgid "error107" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least two horses to breed more.\"" - msgid "error107" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man braucht mindestens zwei Pferde, um sie zu züchten.\"" -msgid "error213" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Incorrect parameter.\"" - msgid "error213" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Parameter nicht korrekt angegeben.\"" -msgid "error103" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can build roads.\"" - msgid "error103" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann Straßen bauen.\"" -msgid "curseinfo::slave_1" -msgstr "\"$unit($unit) will be under our influence for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" - msgid "curseinfo::slave_1" msgstr "\"$unit($unit) wird noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") unter unserem Bann stehen. ($int36($id))\"" -msgid "alliance::lost" -msgstr "\"$alliance($alliance) has to leave the game after all their temples were lost.\"" - msgid "alliance::lost" msgstr "\"$alliance($alliance) scheidet aus dem Spiel aus, nachdem alle Tempel verloren gingen.\"" -msgid "nr_stat_salary" -msgstr "\"worker salary: $int($max) silver\"" - msgid "nr_stat_salary" msgstr "\"Lohn für Arbeit: $int($max) Silber\"" -msgid "nr_stat_luxuries" -msgstr "\"luxury goods at this price: $int($max)\"" - msgid "nr_stat_luxuries" msgstr "\"Luxusgüter zum angegebenen Preis: $int($max)\"" -msgid "curseinfo::flyingship" -msgstr "\"Powerful storms have lifted this ship high into the air. ($int36($id))\"" - msgid "curseinfo::flyingship" msgstr "\"Kräftige Stürme haben dieses Schiff in die Luft gehoben. ($int36($id))\"" -msgid "curseinfo::blessedharvest" -msgstr "\"The grain in this region is especially healthy. ($int36($id))\"" - msgid "curseinfo::blessedharvest" msgstr "\"In dieser Gegend steht das Korn besonders gut im Feld. ($int36($id))\"" -msgid "killed_battle" -msgstr "\"$unit($unit) killed $int($dead) opponents.\"" - msgid "killed_battle" msgstr "\"$unit($unit) tötete $int($dead) Krieger.\"" -msgid "error6" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building could not be found.\"" - msgid "error6" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude wurde nicht gefunden.\"" -msgid "sailnolandingstorm" -msgstr "\"At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region).\"" - msgid "sailnolandingstorm" msgstr "\"Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft.\"" -msgid "teachdumb" -msgstr "\"Due to the effect of duncebuns, $unit($teacher) can only teach $int($amount) students.\"" - msgid "teachdumb" msgstr "\"$unit($teacher) kann durch Dumpfbackenbrot nur $int($amount) Schüler lehren.\"" -msgid "teleport_success" -msgstr "\"$unit($unit) was teleported from $region($source) to $unit($target).\"" - msgid "teleport_success" msgstr "\"$unit($unit) wurde von $region($source) nach $unit($target) teleportiert.\"" -msgid "becomewere" -msgstr "\"$unit($unit) in $region($region) becomes a lycantrope.\"" - msgid "becomewere" msgstr "\"$unit($unit) in $region($region) verwandelt sich in ein Werwesen.\"" -msgid "spellshipresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) resists the spell.\"" - msgid "spellshipresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) widersteht dem Zauber.\"" -msgid "nr_potion_effect" -msgstr "\"There $if($eq($left,1),\"is\",\"are\") $int($left) $if($eq($left,1),\"use\",\"uses\") of $resource($potion,1) left.\"" - msgid "nr_potion_effect" msgstr "\"Auf der Einheit $if($eq($left,1),\"liegt\",\"liegen\") $int($left) Wirkung$if($eq($left,1),\"\",\"en\") $resource($potion,1).\"" -msgid "curseinfo::peacezone" -msgstr "\"Everyone in this region seems to be in a peacful mood. ($int36($id))\"" - msgid "curseinfo::peacezone" msgstr "\"Die ganze Region ist von einer friedlichen Stimmung erfasst. ($int36($id))\"" -msgid "rust_effect_1" -msgstr "\"$unit($mage) causes a terrible storm over the enemy, but the magic rain does not do any harm.\"" - msgid "rust_effect_1" msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt.\"" -msgid "find_manual" -msgstr "\"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous.\"" - msgid "find_manual" msgstr "\"$unit($unit) stolpert bei der Erforschung der Region über $localize($location). Nähere Durchsuchung fördert ein zerfleddertes altes Buch mit dem Titel '$localize($book)' zu Tage. Der Wissensschub ist enorm.\"" -msgid "curseinfo::healingzone" -msgstr "Healing in this region is affected by magic. ($int36($id))" - msgid "curseinfo::healingzone" msgstr "Heilung ist in dieser Region magisch beeinflusst. ($int36($id))" -msgid "income_entertainment_reduced" -msgstr "\"In $region($region), $unit($unit) earns only $int($amount) instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") with entertainment.\"" - msgid "income_entertainment_reduced" msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Unterhaltung.\"" -msgid "errusingpotion" -msgstr "\"$unit($unit): '$order($command)' - The unit already uses $resource($using,0).\"" - msgid "errusingpotion" msgstr "\"$unit($unit): '$order($command)' - Die Einheit benutzt bereits $resource($using,0).\"" -msgid "missing_components_list" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Casting this spell requires an additional $resources($list).\"" - msgid "missing_components_list" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für diesen Zauber fehlen noch $resources($list).\"" -msgid "volcanostopsmoke" -msgstr "\"The volcano of $region($region) stops releasing smoke.\"" - msgid "volcanostopsmoke" msgstr "\"Aus dem Vulkankrater von $region($region) steigt kein Rauch mehr.\"" -msgid "summondragon" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) calls dragons to $region($target).\"" - msgid "summondragon" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ruft Drachen nach $region($target).\"" -msgid "use_antimagiccrystal" -msgstr "\"$unit($unit) uses an antimagic crystal.\"" - msgid "use_antimagiccrystal" msgstr "\"$unit($unit) benutzt einen Antimagiekristall.\"" -msgid "cast_stun_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were momentarily stunned.\"" - msgid "cast_stun_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger sind für einen Moment benommen.\"" -msgid "error46" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a tavern.\"" - msgid "error46" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Taverne.\"" -msgid "error35" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have these herbs.\"" - msgid "error35" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diese Kräuter nicht.\"" -msgid "error57" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is too heavily loaded to move.\"" - msgid "error57" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit trägt zuviel Gewicht, um sich bewegen zu können.\"" -msgid "feedback_no_contact_no_resist" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, but cannot resist the spell.\"" - msgid "feedback_no_contact_no_resist" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen, aber widersteht dem Zauber nicht.\"" -msgid "error79" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - A ship or a castle must be supplied.\"" - msgid "error79" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Schiff oder eine Burg muß angegeben werden.\"" -msgid "drought_effect_4" -msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The ice melts and and the region is consumed by a tidal wave.\"" - msgid "drought_effect_4" msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Das Eis zerbricht und eine gewaltige Flutwelle verschlingt die Region.\"" msgid "destroy_ship_0" msgstr "\"$ship($ship) wurde von $unit($unit) zerstört.\"" -msgid "destroy_ship_0" -msgstr "\"$ship($ship) was destroyed by $unit($unit).\"" - -msgid "curseinfo::sparkle_16" -msgstr "\"The body of $unit($unit) is disfigured by hideous boils. ($int36($id))\"" - msgid "curseinfo::sparkle_16" msgstr "\"Pestbeulen befallen den Körper von $unit($unit). ($int36($id))\"" -msgid "missing_direction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - no direction was specified.\"" - msgid "missing_direction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - keine Richtung angegeben.\"" -msgid "error159" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No person could be handed over.\"" - msgid "error159" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Personen übergeben werden.\"" -msgid "shock" -msgstr "\"$unit($mage) receives a shock when his familiar dies.\"" - msgid "shock" msgstr "\"$unit($mage) erleidet durch den Tod seines Vertrauten einen Schock.\"" -msgid "error269" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast spells here.\"" - msgid "error269" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht zaubern.\"" -msgid "sink_saved_msg" -msgstr "\"$unit($unit) survives unscathed and makes it to $region($region).\"" - msgid "sink_saved_msg" msgstr "\"$unit($unit) überlebt unbeschadet und rettet sich nach $region($region).\"" -msgid "race_noregroup" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be regrouped.\"" - msgid "race_noregroup" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht neu gruppiert werden.\"" -msgid "curseinfo::worse" -msgstr "\"$unit($unit) is chased by a nightmare. ($int36($id))\"" - msgid "curseinfo::worse" msgstr "\"$unit($unit) wird von einem Alp geritten. ($int36($id))\"" -msgid "error274" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot teach.\"" - msgid "error274" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichten.\"" -msgid "region_guarded" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by $unit($guard), a non-allied unit.\"" - msgid "region_guarded" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von $unit($guard), einer nichtalliierten Einheit, bewacht.\"" -msgid "error155" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many magicians in the faction.\"" - msgid "error155" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Magier in der Partei.\"" -msgid "curseinfo::speed_1" -msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") accelerated for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" - msgid "curseinfo::speed_1" msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"ist\", \"sind\") noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") beschleunigt. ($int36($id))\"" -msgid "error160" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be bought.\"" - msgid "error160" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter gekauft werden.\"" msgid "error270" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden bestehlen.\"" -msgid "error226" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units from the backmost rows cannot attack.\"" - msgid "error226" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten in den hinteren Reihen können nicht angreifen.\"" -msgid "sailnolanding" -msgstr "\"The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel.\"" - msgid "sailnolanding" msgstr "\"Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff.\"" -msgid "error116" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number can not be assigned.\"" - msgid "error116" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer kann nicht vergeben werden.\"" -msgid "error112" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Names may not contain parenthesis.\"" - msgid "error112" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Namen dürfen keine Klammern enthalten.\"" -msgid "error222" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Show all what?\"" - msgid "error222" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zeige alle was?\"" -msgid "teach_teacher" -msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level).\"" - msgid "teach_teacher" msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level).\"" -msgid "patzer2" -msgstr "\"$unit($unit) in $region($region) is hit by a massive headache and cannot concentrate on the spell. Some part of this ritual has gone very wrong indeed.\"" - msgid "patzer2" msgstr "\"$unit($unit) in $region($region) hat rasende Kopfschmerzen und kann sich nicht mehr richtig konzentrieren. Irgendwas bei diesem Zauber ist fürchterlich schiefgelaufen.\"" -msgid "curseinfo::magicboost" -msgstr "The magician possesses the gift of Chaos. ($int36($id))" - msgid "curseinfo::magicboost" msgstr "Der Magier besitzt die Gabe des Chaos. ($int36($id))" -msgid "illegal_password" -msgstr "\"Your password was changed because it contained illegal characters. Legal passwords may only contain numbers and letters from A to Z. Your new Password is '${newpass}'.\"" - msgid "illegal_password" msgstr "\"Dein Passwort enthält Zeichen, die bei der Nachsendung von Reports Probleme bereiten können. Bitte beachte, dass Passwortenur aus Buchstaben von A bis Z und Zahlen bestehen dürfen. Dein neues Passwort ist '${newpass}'.\"" -msgid "curseinfo::sparkle_12" -msgstr "\"Brightly coloured flowers pop up all around $unit($unit)'s camp. ($int36($id))\"" - msgid "curseinfo::sparkle_12" msgstr "\"Leuchtende Blumen erblühen rund um das Lager von $unit($unit). ($int36($id))\"" -msgid "familiar_name" -msgstr "\"Familiar of $unit($unit)\"" - msgid "familiar_name" msgstr "\"Vertrauter von $unit($unit)\"" -msgid "error9" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That cannot be sabotaged.\"" - msgid "error9" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann man nicht sabotieren.\"" -msgid "curseinfo::sparkle_6" -msgstr "\"$unit($unit) finds a small flute that plays a beautiful melody. ($int36($id))\"" - msgid "curseinfo::sparkle_6" msgstr "\"$unit($unit) findet eine kleine Flöte, die eine wundersame Melodie spielt. ($int36($id))\"" -msgid "renamed_building_seen" -msgstr "\"$building($building) in $region($region) received a nickname from $unit($renamer).\"" - msgid "renamed_building_seen" msgstr "\"$building($building) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" -msgid "sp_shadowknights_effect" -msgstr "\"$unit($mage) summons a mirage.\"" - msgid "sp_shadowknights_effect" msgstr "\"$unit($mage) beschwört Trugbilder herauf.\"" -msgid "give" -msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to $unit($target).\"" - msgid "give" msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target).\"" -msgid "sellamount" -msgstr "\"$unit($unit) sells $int($amount) $resource($resource,$amount).\"" - msgid "sellamount" msgstr "\"$unit($unit) verkauft $int($amount) $resource($resource,$amount).\"" -msgid "sp_migranten_fail1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is one of our kind, we should not waste aura on this.\"" - msgid "sp_migranten_fail1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist von unserer Art, das Ritual wäre verschwendete Aura.\"" -msgid "victory_murder_complete" -msgstr "\"VICTORY! $if($eq($n,1), \"The faction $winners has\", \"The factions $winners have\") fulfilled the victory condition for the necessary time. The game is over.\"" - msgid "victory_murder_complete" msgstr "\"SIEG! $if($eq($n,1), \"Die Partei $winners hat\", \"Die Parteien $winners haben\") die Siegbedingung für die erforderliche Zeit erfüllt. Das Spiel ist damit beendet.\"" -msgid "shipsink" -msgstr "\"The $ship($ship) has suffered too much damage and sinks.\"" - msgid "shipsink" msgstr "\"Die $ship($ship) ist zu stark beschädigt und sinkt.\"" -msgid "sp_bloodsacrifice_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) receives $int($amount) aura.\"" - msgid "sp_bloodsacrifice_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gewinnt durch das Ritual $int($amount) Aura.\"" -msgid "sp_confusion_effect_0" -msgstr "\"$unit($mage) intones a mysterious chant. There is a sudden hubbub, but order is restored quickly.\"" - msgid "sp_confusion_effect_0" msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" -msgid "pest" -msgstr "\"The region is visited by the plague and $int($dead) peasants died.\"" - msgid "pest" msgstr "\"Hier wütete die Pest, und $int($dead) Bauern starben.\"" -msgid "wormhole_exit" -msgstr "\"$unit($unit) travels through a wormhole to $region($region).\"" - msgid "wormhole_exit" msgstr "\"$unit($unit) reist durch ein Wurmloch nach $region($region).\"" -msgid "spellfail_astralonly" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell will only work in the realm of spirits.\"" - msgid "spellfail_astralonly" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der Geisterwelt.\"" -msgid "analyse_ship_noage" -msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for centuries.\"" - msgid "analyse_ship_noage" msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" -msgid "destroy_road" -msgstr "\"$unit($unit) demolishes the road between $region($from) and $region($to).\"" - msgid "destroy_road" msgstr "\"$unit($unit) reißt die Straße zwischen $region($from) und $region($to) ein.\"" -msgid "error13" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has moved already.\"" - msgid "error13" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat sich bereits bewegt.\"" -msgid "aborted_battle" -msgstr "\"The battle was aborted because all enemies escaped.\"" - msgid "aborted_battle" msgstr "\"Der Kampf wurde abgebrochen, da alle Verteidiger flohen.\"" -msgid "error24" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege.\"" - msgid "error24" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich.\"" -msgid "usecatapult" -msgstr "\"$int($amount) fighters of $unit($unit) launch their catapults.\"" - msgid "usecatapult" msgstr "\"$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab.\"" -msgid "error76" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item cannot be used.\"" - msgid "error76" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann man nicht benutzen.\"" -msgid "error98" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In winter, insects can be recruited only in deserts.\"" - msgid "error98" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insekten können im Winter nur in Wüsten rekrutiert werden.\"" -msgid "spyreport" -msgstr "\"$unit($spy) managed to gather information about $unit($target): combat status ${status}.\"" - msgid "spyreport" msgstr "\"$unit($spy) gelang es, Informationen über $unit($target) herauszubekommen: Kampfstatus ${status}.\"" -msgid "newbie_password" -msgstr "\"Your password is ${password}.\"" - msgid "newbie_password" msgstr "\"Dein Passwort lautet ${password}.\"" -msgid "error65" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Tuition was too high to be paid.\"" - msgid "error65" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Lernkosten können nicht bezahlt werden.\"" -msgid "error87" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dragon blood is required for this elixir.\"" - msgid "error87" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Elixier benötigt man Drachenblut.\"" -msgid "spellfail_block" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The connections from to this regions are blocked.\"" - msgid "spellfail_block" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege aus dieser Region sind blockiert.\"" -msgid "error278" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot change the name and description of this building.\"" - msgid "error278" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Name und Beschreibung des Gebäudes können nicht geändert werden.\"" -msgid "error168" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be sold.\"" - msgid "error168" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter verkauft werden.\"" -msgid "stormwinds_reduced" -msgstr "\"$unit($unit) could only enchant $int($ships) of $int($maxships) ships.\"" - msgid "stormwinds_reduced" msgstr "\"$unit($unit) konnte nur $int($ships) von $int($maxships) Schiffen verzaubern.\"" -msgid "error283" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your password may only contain alphanumeric symbols.\"" - msgid "error283" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Passwort darf nur Buchstaben und Ziffern enthalten.\"" -msgid "rust_effect" -msgstr "\"$unit($mage) puts a spell of rust on $unit($target). $int($amount) weapons are eaten by rust.\"" - msgid "rust_effect" msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target). $int($amount) Waffen wurden vom Rost zerfressen.\"" -msgid "nr_migrants" -msgstr "\"Your faction has $int($units) migrants out of a possible total of $int($maxunits).\"" - msgid "nr_migrants" msgstr "\"Deine Partei hat $int($units) Migranten und kann maximal $int($maxunits) Migranten aufnehmen.\"" -msgid "error239" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to get a new number?\"" - msgid "error239" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff eine neue Nummer bekommen?\"" -msgid "error129" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many people.\"" +msgid "aurapotion50_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt.\"" msgid "error129" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Leute kann die Partei nicht aufnehmen.\"" -msgid "spyreport_skills" -msgstr "\"$unit($target) knows ${skills}.\"" - msgid "spyreport_skills" msgstr "\"$unit($target) beherrscht ${skills}.\"" -msgid "sighting" -msgstr "\"$if($isnull($region),\"\",\"In $region($region), \")$int($number) $race($race,$number) were discovered.\"" - msgid "sighting" msgstr "\"$if($isnull($region),\"Es\",\"In $region($region)\") wurde$if($eq($number,1),\"\",\"n\") $int($number) $race($race,$number) gesichtet.\"" -msgid "nr_stat_recruits" -msgstr "\"recruits: $int($max) peasants\"" - msgid "nr_stat_recruits" msgstr "\"Rekruten: max. $int($max) Bauern\"" -msgid "error235" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Maintenance has not been paid yet.\"" - msgid "error235" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Gebäude wurde noch kein Unterhalt bezahlt.\"" -msgid "error231" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit or its animals would not survive there.\"" - msgid "error231" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit oder ihre Tiere würden dort nicht überleben.\"" -msgid "error121" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That resource does not exist in this region.\"" - msgid "error121" msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas gibt es hier nicht.\"" -msgid "error306" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction is not old enough to start over.\"" - msgid "error306" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 9 Wochen alt sein, um einen Neustart zu versuchen.\"" -msgid "manacrystal_use" -msgstr "\"$unit($unit) uses an astral crystal and gains $int($aura) aura.\"" - msgid "manacrystal_use" msgstr "\"$unit($unit) benutzt einen Astralkristall und gewinnt $int($aura) Aura hinzu.\"" -msgid "error302" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym already set.\"" - msgid "error302" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Bereits ein Synonym gesetzt.\"" -msgid "analyse_region_noage" -msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for centuries.\"" - msgid "analyse_region_noage" msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" -msgid "icastle_create" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building.\"" - msgid "icastle_create" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude.\"" -msgid "spyfail" -msgstr "\"$unit($spy) could not find out anything about $unit($target).\"" - msgid "spyfail" msgstr "\"$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden.\"" -msgid "firewall_damage" -msgstr "\"$unit($unit) steps through the wall of fire into $region($region) and receives severe burn damage.\"" - msgid "firewall_damage" msgstr "\"$unit($unit) erleidet beim Durchqueren der Feuerwand nach $region($region) schwere Verbrennungen.\"" -msgid "cast_speed_effect" -msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were magically accelerated.\"" - msgid "cast_speed_effect" msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden magisch beschleunigt.\"" -msgid "firewall_effect" -msgstr "\"$unit($mage) creates a wall of fire in $region($region).\"" - msgid "firewall_effect" msgstr "\"$unit($mage) erschafft in $region($region) eine Wand aus Feuer.\"" -msgid "phunger" -msgstr "\"$if($eq($dead,1),\"One peasant starves\",\"$int($dead) peasants starve\").\"" - msgid "phunger" msgstr "\"$if($eq($dead,1),\"Ein Bauer verhungert\",\"$int($dead) Bauern verhungern\").\"" -msgid "transport" -msgstr "\"$unit($unit) transported $unit($target) from $region($start) to $region($end).\"" - msgid "transport" msgstr "\"$unit($unit) transportiert $unit($target) von $region($start) nach $region($end).\"" -msgid "sp_holyground_effect" -msgstr "\"$unit($mage) summons natural spirits into the ground of $region($region).\"" - msgid "sp_holyground_effect" msgstr "\"$unit($mage) beschwört Naturgeister in den Boden von $region($region).\"" -msgid "curseinfo::maelstrom" -msgstr "The maelstrom in this area will heavily damage all ships coming into its wake. ($int36($id))" - msgid "curseinfo::maelstrom" msgstr "Der Mahlstrom in dieser Region wird alle Schiffe, die in seinen Sog geraten, schwer beschädigen. ($int36($id))" -msgid "leavefail" -msgstr "\"$unit($unit) could not leave $region($region).\"" - msgid "leavefail" msgstr "\"$unit($unit) konnte aus $region($region) nicht ausreisen.\"" -msgid "reduced_production" -msgstr "The region is ravaged, the ground infertile." - msgid "reduced_production" msgstr "Die Region ist verwüstet, der Boden karg." -msgid "feedback_no_astralregion" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" - msgid "feedback_no_astralregion" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann hier kein Kontakt zur Astralwelt aufgenommen werden.\"" -msgid "peace_active" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is so quiet and peaceful, nobody wants to attack anybody right now.\"" - msgid "peace_active" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen.\"" -msgid "peasantluck_success" -msgstr "\"The stork paid an unexpected visit to $if($eq($births,1),\"a peasant\",\"$int($births) peasants\").\"" - msgid "peasantluck_success" msgstr "\"$if($eq($births,1),\"Einen Bauern\",\"$int($births) Bauern\") besucht unverhofft der Storch.\"" -msgid "astralshield_activate" -msgstr "\"$unit($unit) reactivates the astral protection shield in $region($region).\"" - msgid "astralshield_activate" msgstr "\"$unit($unit) reaktiviert den astralen Schutzschild in $region($region).\"" -msgid "destroy_curse_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys the spell ($id) on ${target}.\"" - msgid "destroy_curse_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört den Fluch ($id) auf ${target}.\"" -msgid "analyse_region_fail" -msgstr "\"It appears to $unit($mage) that $region($region) is charmed, but no details have been revealed.\"" - msgid "analyse_region_fail" msgstr "\"$unit($mage) meint, dass auf $region($region) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" -msgid "viewreality_effect" -msgstr "\"$unit($unit) manages to catch a glimpse of reality through the fog.\"" - msgid "viewreality_effect" msgstr "\"$unit($unit) gelingt es, durch die Nebel auf die Realität zu blicken.\"" -msgid "use_speedsail" -msgstr "\"$unit($unit) sets a solar sail. The ship's speed is increased by $int($speed).\"" - msgid "use_speedsail" msgstr "\"$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht um $int($speed).\"" -msgid "error21" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no information available for the request.\"" - msgid "error21" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu gibt es keine Informationen.\"" -msgid "error43" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this.\"" - msgid "error43" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat so etwas nicht.\"" -msgid "unknown_status" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown combat status.\"" - msgid "unknown_status" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Kampfstatus.\"" -msgid "error10" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - That does not make much sense.\"" - msgid "error10" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das macht wenig Sinn.\"" -msgid "error32" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board our ship.\"" - msgid "error32" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht an Bord unseres Schiffes.\"" -msgid "error54" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade.\"" - msgid "error54" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht handeln.\"" -msgid "manufacture_skills" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0).\"" - msgid "manufacture_skills" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren.\"" -msgid "error177" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The familiar cannot cast this spell.\"" - msgid "error177" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann der Vertraute nicht zaubern.\"" -msgid "curseinfo::godcurseocean" -msgstr "\"This region was cursed by the gods. The sea is a foul cesspool, noxious gases rise from the deep, undead seamonsters attack all ships. Noone can live here for long. ($int36($id))\"" - msgid "curseinfo::godcurseocean" msgstr "\"Diese Region wurde von den Göttern verflucht. Das Meer ist eine ekelige Brühe, braunschwarze, stinkende Gase steigen aus den unergründlichen Tiefen hervor, und untote Seeungeheuer, Schiffe zerfressend und giftige grüne Galle geifernd, sind der Schrecken aller Seeleute, die diese Gewässer durchqueren. Niemand kann hier lange überleben. ($int36($id))\"" -msgid "curseinfo::sparkle_4" -msgstr "\"A circle of shimmering lights surrounds $unit($unit). ($int36($id))\"" - msgid "curseinfo::sparkle_4" msgstr "\"Ein schimmernder Lichterkranz umgibt $unit($unit). ($int36($id))\"" -msgid "error84" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - No name was supplied.\"" - msgid "error84" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Name angegeben.\"" -msgid "spellfail_noexpensives" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) have unbreakable commitments to their faction.\"" - msgid "spellfail_noexpensives" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat unaufkündbare Bindungen an seine alte Partei.\"" -msgid "error287" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - We cannot transport this unit there.\"" - msgid "error287" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin können wir die Einheit nicht transportieren.\"" -msgid "error292" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot be taught.\"" - msgid "error292" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichtet werden.\"" -msgid "error95" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusions cannot guard a region.\"" - msgid "error95" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusionen können eine Region nicht bewachen.\"" -msgid "nr_stat_header" -msgstr "\"Statistics for $region($region):\"" - msgid "nr_stat_header" msgstr "\"Statistik für $region($region):\"" -msgid "sp_strongwalls_effect" -msgstr "\"$unit($mage) causes the walls of $building($building) to glow in an eerie magic light.\"" - msgid "sp_strongwalls_effect" msgstr "\"$unit($mage) läßt die Mauern von $building($building) in einem unheimlichen magischen Licht erglühen.\"" -msgid "curseinfo::orcish" -msgstr "\"$unit($unit) goes from one amourous adventure to another. ($int36($id))\"" - msgid "curseinfo::orcish" msgstr "\"$unit($unit) stürzt sich von einem amourösen Abenteuer ins nächste. ($int36($id))\"" -msgid "target_region_not_empty" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are units in the target region.\"" - msgid "target_region_not_empty" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Zielregion befinden sich noch Einheiten.\"" -msgid "error173" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even in the Xontormia Library, this spell could not be found.\"" - msgid "error173" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst in der Bibliothek von Xontormia konnte dieser Spruch nicht gefunden werden.\"" -msgid "error138" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - We do not have anything that could be demolished.\"" - msgid "error138" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Uns gehört nichts, was man abreißen oder versenken könnte.\"" -msgid "killsandhits" -msgstr "\"$unit($unit) hit $int($hits) times and killed $int($kills) enemies.\"" - msgid "killsandhits" msgstr "\"$unit($unit) erzielte $int($hits) Treffer und tötete $int($kills) Gegner.\"" -msgid "shapeshift_effect" -msgstr "\"$unit($mage) makes $unit($target) appear as $race($race,$unit.size($target)).\"" - msgid "shapeshift_effect" msgstr "\"$unit($mage) läßt $unit($target) als $race($race,$unit.size($target)) erscheinen.\"" -msgid "error248" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has to be 10 turns old.\"" - msgid "error248" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 10 Runden alt sein.\"" -msgid "followfail" -msgstr "\"$unit($follower) could not follow $unit($unit).\"" - msgid "followfail" msgstr "\"$unit($follower) konnte $unit($unit) nicht folgen.\"" -msgid "followdetect" -msgstr "\"$unit($follower) followed $unit($unit).\"" - msgid "followdetect" msgstr "\"$unit($follower) ist $unit($unit) gefolgt.\"" -msgid "unitnotfound_id" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit $id could not be located.\"" - msgid "unitnotfound_id" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit $id wurde nicht gefunden.\"" -msgid "error244" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already named.\"" - msgid "error244" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat schon einen Namen.\"" -msgid "use_tacticcrystal" -msgstr "\"$unit($unit) uses a dreameye in $region($region).\"" - msgid "use_tacticcrystal" msgstr "\"$unit($unit) benutzt in $region($region) ein Traumauge.\"" -msgid "error134" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown report option.\"" - msgid "error134" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Meldungs-Option.\"" -msgid "error319" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has been in combat.\"" - msgid "error319" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie an einem Kampf teilgenommen hat.\"" -msgid "analyse_building_noage" -msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for centuries.\"" - msgid "analyse_building_noage" msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" -msgid "sink_lost_msg" -msgstr "\"$int($amount) people of $unit($unit) drown.$if($isnull($region),\"\",\" The unit makes it to $region($region).\")\"" - msgid "sink_lost_msg" msgstr "\"$int($amount) Personen von $unit($unit) ertrinken.$if($isnull($region),\"\",\" Die Einheit rettet sich nach $region($region).\")\"" -msgid "error130" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIC SPHERE [1-5].\"" - msgid "error130" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIEGEBIET [1-5].\"" -msgid "error240" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to be followed?\"" - msgid "error240" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff verfolgt werden?\"" msgid "travelthru_trail" msgstr "$trailto($region)" -msgid "travelthru_trail" -msgstr "$trailto($region)" - -msgid "error315" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not all ingredients present.\"" - msgid "error315" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht alle Zutaten vorhanden.\"" -msgid "volcanooutbreak" -msgstr "\"The volcano in $region($regionv) erupts. The lava devastates $region($regionn).\"" - msgid "volcanooutbreak" msgstr "\"Der Vulkan in $region($regionv) bricht aus. Die Lavamassen verwüsten $region($regionn).\"" -msgid "seduce_effect_0" -msgstr "\"$unit($unit) gives $unit($mage) $resources($items).\"" - msgid "seduce_effect_0" msgstr "\"$unit($unit) schenkt $unit($mage) $resources($items).\"" -msgid "error311" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit can not change shape.\"" - msgid "error311" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht verwandeln.\"" -msgid "error201" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Race and target unit have not been supplied.\"" - msgid "error201" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Rasse und Zieleinheit wurden vergessen.\"" -msgid "newbieimmunity" -msgstr "\"Your faction is immune against assaults for $int($turns) more weeks.\"" - msgid "newbieimmunity" msgstr "\"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe.\"" -msgid "curseinfo::auraboost_0" -msgstr "\"Powerful magical energies are pulsing through $unit($unit). ($int36($id))\"" - msgid "curseinfo::auraboost_0" msgstr "\"$unit($unit) fühlt sich von starken magischen Energien durchströmt. ($int36($id))\"" -msgid "curseinfo::drought" -msgstr "\"This region was hit by a drought. ($int36($id))\"" - msgid "curseinfo::drought" msgstr "\"In dieser Gegend herrscht eine Dürre. ($int36($id))\"" -msgid "race_cantwork" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot work.\"" - msgid "race_cantwork" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht arbeiten.\"" -msgid "stealdetect" -msgstr "\"$unit($unit) feels watched.\"" - msgid "stealdetect" msgstr "\"$unit($unit) fühlt sich beobachtet.\"" -msgid "stealaura_detect" -msgstr "\"$unit($unit) feels the powers of magic fade and loses $int($aura) aura.\"" - msgid "stealaura_detect" msgstr "\"$unit($unit) fühlt seine magischen Kräfte schwinden und verliert $int($aura) Aura.\"" -msgid "missing_message" -msgstr "\"Internal Error: Message '$name' is undefined.\"" - msgid "missing_message" msgstr "\"Interner Fehler: Meldung '$name' nicht definiert.\"" -msgid "analyse_ship_fail" -msgstr "\"It appears to $unit($mage) that $ship($ship) is charmed, but no details have been revealed.\"" - msgid "analyse_ship_fail" msgstr "\"$unit($mage) meint, dass auf $ship($ship) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" -msgid "income_magic" -msgstr "\"$unit($unit) earns $int($amount) silver through simple magical services in $region($region).\"" - msgid "income_magic" msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Zauberei.\"" -msgid "stealaura_success" -msgstr "\"$unit($mage) draws $int($aura) aura from $unit($target).\"" - msgid "stealaura_success" msgstr "\"$unit($mage) entzieht $unit($target) $int($aura) Aura.\"" -msgid "error_flying_ship_too_big" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) is too bulky to fly.\"" - msgid "error_flying_ship_too_big" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) ist zu groß, um fliegen zu können.\"" -msgid "familiar_describe" -msgstr "\"$unit($mage) summons a familiar. $race($race, 0) can learn ${skills}.\"" - msgid "familiar_describe" msgstr "\"$unit($mage) ruft einen Vertrauten. $race($race, 0) können $skills lernen.\"" -msgid "wind_effect" -msgstr "\"$unit($mage) asks the gods of wind and water on behalf of the $ship($ship).\"" - msgid "wind_effect" msgstr "\"$unit($mage) erfleht den Segen der Götter des Windes und des Wassers für $ship($ship).\"" -msgid "wormhole_requirements" -msgstr "\"$unit($unit) cannot travel through the wormhole in $region($region) because the unit is either too big or has restricted skills.\"" +msgid "para_army_index" +msgstr "\"Heer $int($index): $name\"" msgid "wormhole_requirements" msgstr "\"$unit($unit) kann in $region($region) nicht durch das Wurmloch reisen, da die Einheit entweder zu gross ist oder teure Talente besitzt.\"" -msgid "cast_escape_effect" -msgstr "\"$unit($mage) casts $spell($spell): The noise of the battle dies down and the mage is able to slip away unharmed.\"" - msgid "cast_escape_effect" msgstr "\"$unit($mage) zaubert $spell($spell): Das Kampfgetümmel erstirbt und er kann unbehelligt seines Weges ziehen.\"" -msgid "volcanostartsmoke" -msgstr "\"Columns of smoke are released by the volcano of $region($region).\"" - msgid "volcanostartsmoke" msgstr "\"Aus dem Vulkankrater von $region($region) steigt plötzlich Rauch.\"" -msgid "nr_insectfall" -msgstr "It is the last week before winter in which insects can still recruit." - msgid "nr_insectfall" msgstr "Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können." -msgid "error296" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Trees won't grow here.\"" - msgid "error296" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier werden niemals Bäume wachsen.\"" -msgid "error186" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only works on dry land.\"" - msgid "error186" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur auf Land gelegt werden.\"" -msgid "error51" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" - msgid "error51" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" -msgid "error73" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungry units cannot give anybody away.\"" - msgid "error73" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine hungernde Einheit kann niemanden weggeben.\"" -msgid "error40" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit did not contact us.\"" - msgid "error40" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keinen Kontakt mit uns aufgenommen.\"" -msgid "error182" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot leave in this direction.\"" - msgid "error182" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann in diese Richtung nicht ablegen.\"" -msgid "analyse_ship_nospell" -msgstr "\"It appears to $unit($mage) that $ship($ship) is not charmed.\"" - msgid "analyse_ship_nospell" msgstr "\"$unit($mage) meint, dass auf $ship($ship) kein Zauber liegt.\"" -msgid "birthday_firework" -msgstr "\"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region).\"" - -msgid "birthday_firework" -msgstr "\"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - -msgid "error257" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid locale.\"" - msgid "error257" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Locale.\"" -msgid "error147" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of the largest castle in the region.\"" - msgid "error147" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht Burgherr der größten Burg in der Region.\"" -msgid "unknowndirection" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Direction '$dirname' was not recognized.\"" - msgid "unknowndirection" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung '$dirname' wurde nicht erkannt.\"" -msgid "error143" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is on board a ship.\"" - msgid "error143" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf einem Schiff.\"" -msgid "spellfail_onocean" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast while you are on the ocean.\"" - msgid "spellfail_onocean" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf hoher See gezaubert werden.\"" -msgid "error253" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This magician is not strong enough to be sacrificed to the gods.\"" - msgid "error253" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier ist nicht stark genug, sich den Göttern zu opfern.\"" -msgid "battle_loot" -msgstr "\"$unit($unit) collects $int($amount) $resource($item,$amount).\"" - msgid "battle_loot" msgstr "\"$unit($unit) erbeutet $int($amount) $resource($item,$amount).\"" msgid "error209" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" -msgid "error209" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" - -msgid "summonundead_effect_0" -msgstr "\"$unit($mage) cannot summon any undead in $region($region).\"" - msgid "summonundead_effect_0" msgstr "\"$unit($mage) kann in $region($region) keine Untoten rufen.\"" -msgid "givedumb" -msgstr "\"$unit($unit) administers $int($amount) duncebuns to $unit($recipient).\"" - msgid "givedumb" msgstr "\"$unit($unit) gibt $int($amount) Dumpfbackenbrot an $unit($recipient).\"" -msgid "error205" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in an ocean region.\"" - msgid "error205" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber gelingt nur in einer Ozeanregion.\"" -msgid "error210" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is too dangerous to fly the ship in the storm.\"" - msgid "error210" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen.\"" -msgid "eatpeasants" -msgstr "\"$unit($unit) ate $int($amount) peasants.\"" - msgid "eatpeasants" msgstr "\"$unit($unit) verspeiste $int($amount) Bauern.\"" -msgid "error320" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot guard the region because it is trying to flee.\"" - msgid "error320" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht bewachen, da sie versucht zu fliehen.\"" -msgid "dissolve_units_2" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\"" - msgid "dissolve_units_2" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"wurde zum Baum\", \"wurden zu Bäumen\").\"" -msgid "sp_eternizewall_effect" -msgstr "\"$unit($mage) performs a ritual that binds the magical forces of $region($region) into the walls of $building($building).\"" - msgid "sp_eternizewall_effect" msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde von $region($region) in die Mauern von $building($building).\"" diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po index 3a9ee2ed0..558b75ee9 100644 --- a/res/translations/messages.en.po +++ b/res/translations/messages.en.po @@ -1,5595 +1,2790 @@ msgid "homestone_effect" msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\"" -msgid "homestone_effect" -msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\"" - msgid "nogive_reserved" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has this item, but all $int($reservation) $resource($resource,$reservation) are reserved.\"" -msgid "nogive_reserved" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand zwar, aber sämtliche $int($reservation) $resource($resource,$reservation) sind reserviert.\"" - msgid "recruit" msgstr "\"$unit($unit) in $region($region) recruits $int($amount) of $int($want) people.\"" -msgid "recruit" -msgstr "\"$unit($unit) in $region($region) rekrutiert $int($amount) von $int($want) Personen.\"" - msgid "sp_dreamreading_effect" msgstr "\"$unit($mage) is lost in the dreams of $unit($unit) and gets a glimps into $region($region).\"" -msgid "sp_dreamreading_effect" -msgstr "\"$unit($mage) verliert sich in die Träume von $unit($unit) und erhält einen Eindruck von $region($region).\"" - msgid "analyse_ship_age" msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for, about $int($months) more weeks.\"" -msgid "analyse_ship_age" -msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" - msgid "curseinfo::sparkle_2" msgstr "\"$unit($unit) is haunted by terrbile nightmares. ($int36($id))\"" -msgid "curseinfo::sparkle_2" -msgstr "\"$unit($unit) wird von bösen Alpträumen geplagt. ($int36($id))\"" - msgid "absorbpeasants" msgstr "\"$int($amount) peasants become $race($race,0) and join the ranks of $unit($unit).\"" -msgid "absorbpeasants" -msgstr "\"$int($amount) Bauern werden zu $race($race,0) und schliessen sich $unit($unit) an.\"" - msgid "unholypower_effect" msgstr "\"$unit($mage) tranforms $unit($target) to $race($race,0).\"" -msgid "unholypower_effect" -msgstr "\"$unit($mage) verwandelt $unit($target) in $race($race,0).\"" - msgid "give_person" msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to $unit($target).\"" -msgid "give_person" -msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an $unit($target).\"" - msgid "rust_effect_2" msgstr "\"$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty.\"" -msgid "rust_effect_2" -msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde. Der magischen Regen lässt alles Eisen rosten.\"" - msgid "heroes_maxed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction already has $int($count) of $int($max) heroes.\"" -msgid "heroes_maxed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits $int($count) von $int($max) Helden.\"" - msgid "error_build_skill_low" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires a skill of at least $int($value) to build.\"" -msgid "error_build_skill_low" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um das zu bauen, braucht man ein Talent von mindestens $int($value).\"" - msgid "analyse_building_age" msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" -msgid "analyse_building_age" -msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" - msgid "curseinfo::auraboost_1" msgstr "\"$unit($unit) finds it difficult to gather its magical energies. ($int36($id))\"" -msgid "curseinfo::auraboost_1" -msgstr "\"$unit($unit) hat Schwierigkeiten seine magischen Energien zu sammeln. ($int36($id))\"" - msgid "harbor_trade" msgstr "\"$unit($unit) received $resources($items) from the $ship($ship).\"" -msgid "harbor_trade" -msgstr "\"$unit($unit) erhielt $resources($items) von der $ship($ship).\"" - msgid "reduce_spell" msgstr "\"In $region($region), anti-magic from $unit($self) reduces the effect of $unit($mage)'s spell.\"" -msgid "reduce_spell" -msgstr "\"$unit($self) schwächt in $region($region) einen Zauber von $unit.dative($mage) durch Antimagie ab.\"" - msgid "raised" msgstr "\"$unit($unit) breeds $int($amount) horses.\"" -msgid "raised" -msgstr "\"$unit($unit) züchtet $int($amount) Pferde.\"" - msgid "speed_time_effect" msgstr "\"In $region($region), $unit($unit) bends time for $int($amount) men.\"" -msgid "speed_time_effect" -msgstr "\"In $region($region) dehnt $unit($unit) die Zeit für $int($amount) Personen.\"" - msgid "error199" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a familiar.\"" -msgid "error199" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Vertrauten.\"" - msgid "error195" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" -msgid "error195" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" - msgid "healall" msgstr "\"Life itself touches the world and all beings are healed.\"" -msgid "healall" -msgstr "\"Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt.\"" - msgid "build_required" msgstr "\"$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required).\"" -msgid "build_required" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required).\"" - msgid "newbie_immunity_error" msgstr "\"A faction must be at least $int($turns) weeks old before it can be attacked or stolen from.\"" -msgid "newbie_immunity_error" -msgstr "\"Eine Partei muß mindestens $int($turns) Wochen alt sein, bevor sie angegriffen oder bestohlen werden kann.\"" - msgid "error191" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in forests.\"" -msgid "error191" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in Wäldern.\"" - msgid "error156" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many alchemists in the faction.\"" -msgid "error156" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Alchemisten in der Partei.\"" - msgid "error266" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only functions in the entry hall.\"" -msgid "error266" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der Eingangshalle.\"" - msgid "error81" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must first guard the region.\"" -msgid "error81" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit muß zuerst die Region bewachen.\"" - msgid "hornofpeace_u_nosuccess" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No region could be pacified.\"" -msgid "hornofpeace_u_nosuccess" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine Region konnte befriedet werden.\"" - msgid "error70" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by a non-allied faction.\"" -msgid "error70" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von Nichtalliierten bewacht.\"" - msgid "error92" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no normal forest in this region.\"" -msgid "error92" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keinen normalen Wald.\"" - msgid "error262" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot have any more wyrms.\"" -msgid "error262" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei kann keine weiteren Wyrme besitzen.\"" - msgid "massive_overload" msgstr "\"The $ship($ship) is massively overloaded and is damaged heavily.\"" -msgid "massive_overload" -msgstr "\"Die $ship($ship) ist zu stark überladen und wird stark beschädigt.\"" - msgid "curseinfo::shipspeedup" msgstr "\"The winds seem to favor this ship. ($int36($id))\"" -msgid "curseinfo::shipspeedup" -msgstr "\"Die Winde scheinen dieses Schiff besonders zu beguenstigen. ($int36($id))\"" - msgid "error152" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit jumps over board and drowns.\"" -msgid "error152" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit springt über Bord und ertrinkt.\"" - msgid "error108" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No herbs could be found.\"" -msgid "error108" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es sind keine Kräuter zu finden.\"" - msgid "spellfail::contact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit $unit($target) did not contact us.\"" -msgid "spellfail::contact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" - msgid "error214" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit is not a magician.\"" -msgid "error214" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist kein Magier.\"" - msgid "patzer6" msgstr "\"A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'\"" -msgid "patzer6" -msgstr "\"Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'\"" - msgid "lucky_item" msgstr "\"$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount).\"" -msgid "lucky_item" -msgstr "\"$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount).\"" - msgid "error104" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This metal can be excavated only in a mine.\"" -msgid "error104" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Metall kann nur in einem Bergwerk abgebaut werden.\"" - msgid "error100" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here is a skilled ship builder.\"" -msgid "error100" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier ist gelernter Schiffbauer.\"" - msgid "curseinfo::gooddream" msgstr "\"The people in this region have sweet dreams. ($int36($id))\"" -msgid "curseinfo::gooddream" -msgstr "\"Die Leute haben schöne Träume. ($int36($id))\"" - msgid "error2" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot guard off shore.\"" -msgid "error2" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf hoher See kann man nicht bewachen.\"" - msgid "nr_stat_maxentertainment" msgstr "\"entertainment: max. $int($max) silver\"" -msgid "nr_stat_maxentertainment" -msgstr "\"Unterhaltung: max. $int($max) Silber\"" - msgid "blessedstonecircle_effect" msgstr "\"$unit($mage) blesses $building($building).\"" -msgid "blessedstonecircle_effect" -msgstr "\"$unit($mage) weiht $building($building).\"" - msgid "income_tax_reduced" msgstr "\"$unit($unit) collects taxes of$if($eq($wanted,$amount),\"\",\" only\") $int($amount) silver$if($eq($wanted,$amount),\"\",\" instead of $int($wanted) silver\") \") in $region($region).\"" -msgid "income_tax_reduced" -msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber ein.\"" - msgid "curseinfo::holyground" msgstr "\"The undead turn away from this region. ($int36($id))\"" -msgid "curseinfo::holyground" -msgstr "\"Untote schrecken vor dieser Region zurück. ($int36($id))\"" - msgid "changemail" msgstr "\"Address has been changed to '$value'.\"" -msgid "changemail" -msgstr "\"Die Reportadresse wurde auf ${value} geändert.\"" - msgid "song_of_peace_effect_0" msgstr "\"The marvelous singing of $unit($mage) enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" -msgid "song_of_peace_effect_0" -msgstr "\"Die Gesangskunst von $unit($mage) begeistert die Leute. Die friedfertige Stimmung des Lieds überträgt sich auf alle Zuhörer. Einige werfen ihre Waffen weg.\"" - msgid "emptyeog" msgstr "\"There is no more laen left in $region($region).\"" -msgid "emptyeog" -msgstr "\"Die Laenader in $region($region) ist erschöpft.\"" - msgid "entrise" msgstr "\"In $region($region), the Lords of the Trees have risen.\"" -msgid "entrise" -msgstr "\"In $region($region) erschienen die Herren der Bäume.\"" - msgid "victory_murder_cfulfilled" msgstr "\"Attention: $faction($faction) has fulfilled the victory condition and will be declared winner in $if($eq($remain,1),\"one week\",\"$int($remain) weeks\").\"" -msgid "victory_murder_cfulfilled" -msgstr "\"Achtung: $faction($faction) hat die Siegbedingungen erfüllt und wird in $if($eq($remain,1),\"einer Woche\",\"$int($remain) Wochen\") zum Sieger erklärt werden.\"" - msgid "headache_effect_1" msgstr "\"$unit($unit) has a splitting headache and can hardly remember last week. Except that it all started in the tavern...\"" -msgid "headache_effect_1" -msgstr "\"$unit($unit) hat höllische Kopfschmerzen und kann sich an die vergangene Woche nicht mehr erinnern. Nur noch daran, wie alles mit einer fröhlichen Feier in irgendeiner Taverne anfing....\"" - msgid "feedback_no_contact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us.\"" -msgid "feedback_no_contact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen.\"" - msgid "sailforbiddendir" msgstr "\"The crew of the $ship($ship) refuses to travel to the $direction($direction).\"" -msgid "sailforbiddendir" -msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen.\"" - msgid "receive" msgstr "\"$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit).\"" -msgid "receive" -msgstr "\"$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit).\"" - msgid "missing_feedback" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Internal Error: Message '$name' is undefined.\"" -msgid "missing_feedback" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Interner Fehler: Meldung '$name' nicht definiert.\"" - msgid "thiefdiscover" msgstr "\"$unit($target) caught $unit($unit) in attempted theft.\"" -msgid "thiefdiscover" -msgstr "\"$unit($target) ertappte $unit($unit) beim versuchten Diebstahl.\"" - msgid "museumgiveback" msgstr "\"In $region($region), $unit($unit) received $resources($items) from $unit($sender)\"" -msgid "museumgiveback" -msgstr "\"In $region($region) erhielt $unit($unit) von $unit.dative($sender) $resources($items)\"" - msgid "curseinfo::sparkle_17" msgstr "\"A dark and mysterious fairy appears before $unit($unit). She is of bewitching beauty. ($int36($id))\"" -msgid "curseinfo::sparkle_17" -msgstr "\"Eine dunkle Fee erscheint $unit($unit) im Schlaf. Sie ist von schauriger Schönheit. ($int36($id))\"" - msgid "caldera_handle_0" msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" -msgid "caldera_handle_0" -msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" - msgid "researchherb_none" msgstr "\"$unit($unit) could not find any herbs in $region($region).\"" -msgid "researchherb_none" -msgstr "\"$unit($unit) in $region($region) kann keine Kräuter finden.\"" - msgid "moveblockedbyguard" msgstr "\"$unit($unit) was kept in $region($region) by $unit($guard).\"" -msgid "moveblockedbyguard" -msgstr "\"$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten.\"" - msgid "cast_frighten_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were intimidated.\"" -msgid "cast_frighten_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden eingeschüchtert.\"" - msgid "curseinfo::Feuerwand" msgstr "A wall of fire blocks entry and exit. ($int36($id))" -msgid "curseinfo::Feuerwand" -msgstr "Eine Feuerwand blockiert die Ein- und Ausreise. ($int36($id))" - msgid "renamed_building_notseen" msgstr "\"$building($building) in $region($region) received a nickname.\"" -msgid "renamed_building_notseen" -msgstr "\"$building($building) in $region($region) bekommt einen Spitznamen.\"" - msgid "heroes_race" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be heroes.\"" -msgid "heroes_race" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können keine Helden erwählen.\"" - msgid "summon_effect" msgstr "\"$unit($mage) summons $int($amount) $race($race,$amount).\"" -msgid "summon_effect" -msgstr "\"$unit($mage) beschwört $int($amount) $race($race,$amount).\"" - msgid "error28" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasant morale is low.\"" -msgid "error28" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern sind schlecht gelaunt.\"" - msgid "error39" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has not yet learned espionage.\"" -msgid "error39" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Spionage gelernt.\"" - msgid "destroy_magic_noeffect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician could not destroy any curse.\"" -msgid "destroy_magic_noeffect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier konnte keinen Fluch zerstören.\"" - msgid "cast_auraleak_effect" msgstr "\"$unit($mage) in $region($region) caused a tear in the fabric of magic, that sucked all magical energies out of the region.\"" -msgid "cast_auraleak_effect" -msgstr "\"$unit($mage) rief in $region($region) einen Riss in dem Gefüge der Magie hervor, der alle magische Kraft aus der Region riss.\"" - msgid "newbie_info_game" msgstr "Remember to send your orders to $email with the subject ${subject}." -msgid "newbie_info_game" -msgstr "Bitte denke daran, deine Befehle mit dem Betreff $subject an $email zu senden." - msgid "mob_warning" msgstr "\"An angry mob forms and hunts practitioners of the dark arts.\"" -msgid "mob_warning" -msgstr "\"Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier.\"" - msgid "dissolve_units_5" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) disappeared in the night.\"" -msgid "dissolve_units_5" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verschwand\", \"verschwanden\") über Nacht.\"" - msgid "fleescared" msgstr "\"$int($amount) peasants fled in fear of $unit($unit).\"" -msgid "fleescared" -msgstr "\"$int($amount) Bauern flohen aus Furcht vor $unit($unit).\"" - msgid "drought_effect_3" msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds. The drought permanently alters the region.\"" -msgid "drought_effect_3" -msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt. Die Dürre verändert die Region für immer.\"" - msgid "spellfail_pump" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Despite intense questioning, $unit($target) did not have anything to tell about $region($tregion).\"" -msgid "spellfail_pump" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wusste trotz intensivem Verhör nichts über $region($tregion) zu berichten.\"" - msgid "maintenance_nowork" msgstr "\"$building($building) was nonfunctional because upkeep could not be paid at the beginning of the week.\"" -msgid "maintenance_nowork" -msgstr "\"$building($building) hat diese Woche nicht funktioniert, da zu Beginn der Woche der Unterhalt nicht gezahlt werden konnte.\"" - msgid "error_spell_on_flying_ship" msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is far too dangerous to put this spell on the flying ship $ship($ship).\"" -msgid "error_spell_on_flying_ship" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, diesen Zauber auf das fliegende Schiff $ship($ship) zu legen.\"" - msgid "error275" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings cannot be built here.\"" -msgid "error275" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Gebäude errichten.\"" - msgid "error165" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit.\"" -msgid "error165" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht.\"" - msgid "siege_catapults" msgstr "\"$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction.\"" -msgid "siege_catapults" -msgstr "\"$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an.\"" - msgid "curseinfo::magicstreet" msgstr "\"The roads are extremely dry and well-kept. ($int36($id))\"" -msgid "curseinfo::magicstreet" -msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))\"" - msgid "curseinfo::sparkle_13" msgstr "\"A group of vultures circles above $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_13" -msgstr "\"Über $unit($unit) zieht eine Gruppe Geier ihre Kreise. ($int36($id))\"" - msgid "error161" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" -msgid "error161" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit besitzt den Trank nicht.\"" - msgid "error271" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot attack here.\"" -msgid "error271" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden angreifen.\"" - msgid "renamed_faction_notseen" msgstr "\"Your faction received a nickname.\"" -msgid "renamed_faction_notseen" -msgstr "\"Die Partei bekommt einen Spitznamen.\"" - msgid "error227" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A herbalism skill of 7 or higher is required.\"" -msgid "error227" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dafür braucht ein Einheit mindestens Kräuterkunde 7.\"" - msgid "error117" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot produce that.\"" -msgid "error117" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann das nicht herstellen.\"" - msgid "sp_depression_effect" msgstr "\"$unit($mage) causes great sadness among the peasants of $region($region).\"" -msgid "sp_depression_effect" -msgstr "\"$unit($mage) sorgt in $region($region) für Trübsal unter den Bauern.\"" - msgid "sp_mindblast_effect" msgstr "\"$unit($mage) casts $spell($spell). $int($amount) warriors lose their memories, $int($dead) were killed.\"" -msgid "sp_mindblast_effect" -msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren Erinnerungen, $int($dead) wurden getötet.\"" - msgid "error113" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Item to be handed over was not supplied.\"" -msgid "error113" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nichts angegeben, was wir übergeben sollen.\"" - msgid "undeadrise" msgstr "\"The dead rise from their graves in $region($region).\"" -msgid "undeadrise" -msgstr "\"In $region($region) erhoben sich die Toten aus den Gräbern.\"" - msgid "reanimate_effect_0" msgstr "\"$unit($mage) begins a ritual of resurrection. $int($amount) warriors rise from the dead.\"" -msgid "reanimate_effect_0" -msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung. $int($amount) Krieger stehen von den Toten auf.\"" - msgid "error223" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot guard.\"" -msgid "error223" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht bewachen.\"" - msgid "sp_confusion_effect_1" msgstr "\"$unit($mage) begins a mysterious chant. Great confusion sweeps through the ranks of the enemy.\"" -msgid "sp_confusion_effect_1" -msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" - msgid "itemcloak" msgstr "\"$unit($mage) shrouds the equipment of $unit($target) in shadows.\"" -msgid "itemcloak" -msgstr "\"$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($target).\"" - msgid "error5" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" -msgid "error5" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" - msgid "tactics_lost" msgstr "\"$unit($unit) lured the enemy into an ambush.\"" -msgid "tactics_lost" -msgstr "\"$unit($unit) konnte dem Gegner eine Falle stellen.\"" - msgid "error_lowstealth" msgstr "\"$unit($unit) in $region($region): '$order($command)' -The unit cannot hide that well.\"" -msgid "error_lowstealth" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht so gut tarnen.\"" - msgid "chaosgate_effect_1" msgstr "\"$unit($mage) opens a chaos gate.\"" -msgid "chaosgate_effect_1" -msgstr "\"$unit($mage) öffnet ein Chaostor.\"" - msgid "shipsail" msgstr "\"The $ship($ship) sails from $region($from) to $region($to).\"" -msgid "shipsail" -msgstr "\"Die $ship($ship) segelt von $region($from) nach $region($to).\"" - msgid "magicresistance_unit" msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" -msgid "magicresistance_unit" -msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" - msgid "destroy_partial" msgstr "\"$unit($unit) tears down parts of $building($building).\"" -msgid "destroy_partial" -msgstr "\"$unit($unit) reißt einen Teil von $building($building) ein.\"" - msgid "nr_stat_morale" msgstr "\"peasant morale: $int($morale)\"" -msgid "nr_stat_morale" -msgstr "\"Moral der Bauern: $int($morale)\"" - msgid "changemail_invalid" msgstr "\"Address not changed, '$value' is an invalid email.\"" -msgid "changemail_invalid" -msgstr "\"Die Reportadresse wurde nicht geändert, '${value}' ist keine gültige email.\"" - msgid "block_spell" msgstr "\"In $region($region), anti-magic from $unit($self) blocks the spell of $unit($mage).\"" -msgid "block_spell" -msgstr "\"Antimagie von $unit.dative($self) blockiert in $region($region) einen Zauber von $unit.dative($mage).\"" - msgid "enter_overload" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot go aboard, the ship would be overloaded.\"" -msgid "enter_overload" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen, da sie das Schiff überladen würde.\"" - msgid "herbfound" msgstr "\"$unit($unit) in $region($region) finds $int($amount) $resource($herb,$amount).\"" -msgid "herbfound" -msgstr "\"$unit($unit) in $region($region) findet $int($amount) $resource($herb,$amount).\"" - msgid "maintenance" msgstr "\"$unit($unit) pays the maintenance for $building($building).\"" -msgid "maintenance" -msgstr "\"$unit($unit) bezahlt den Unterhalt von $building($building).\"" - msgid "heroes_cost" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit has $int($have) of $int($cost) silver required.\"" -msgid "heroes_cost" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nur $int($have) von $int($cost) benötigtem Silber.\"" - msgid "error36" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this item.\"" -msgid "error36" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand nicht.\"" - msgid "error58" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know how to entertain.\"" -msgid "error58" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nicht, wie man gaukelt.\"" - msgid "magiccreate_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) creates $int($amount) ${object}.\"" -msgid "magiccreate_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) erschafft $int($amount) ${object}.\"" - msgid "error25" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevents this from happening.\"" -msgid "error25" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Fluch verhindert das.\"" - msgid "error47" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our allies.\"" -msgid "error47" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit uns alliiert.\"" - msgid "error69" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region is guarded.\"" -msgid "error69" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird bewacht.\"" - msgid "overrun_by_iceberg" msgstr "\"The $ship($ship) has been damaged by a collision with an iceberg.\"" -msgid "overrun_by_iceberg" -msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg beschädigt.\"" - msgid "song_of_peace_effect_1" msgstr "\"A wondrous song fills the air and enchants the public. The song's peaceful melody makes several listeners drop their weapons.\"" -msgid "song_of_peace_effect_1" -msgstr "\"In der Luft liegt ein wunderschönes Lied, dessen friedfertiger Stimmung sich niemand entziehen kann. Einige Leute werfen sogar ihre Waffen weg.\"" - msgid "error99" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not want to be transported.\"" -msgid "error99" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit will nicht transportiert werden.\"" - msgid "disrupt_astral" msgstr "\"$unit($unit) is sent from the astral plain to $region($region).\"" -msgid "disrupt_astral" -msgstr "\"$unit($unit) wird aus der astralen Ebene nach $region($region) geschleudert.\"" - msgid "curseinfo::badmagicresistancezone" msgstr "\"The magical resistance of some units in this region was weakened. ($int36($id))\"" -msgid "curseinfo::badmagicresistancezone" -msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde geschwächt. ($int36($id))\"" - msgid "error288" msgstr "\"$unit($unit) in $region($region): '$order($command)' - How much shall we tear down?\"" -msgid "error288" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wieviel sollen wir einreißen?\"" - msgid "curseinfo::badlearn" msgstr "\"People in this region suffer from insomnia. ($int36($id))\"" -msgid "curseinfo::badlearn" -msgstr "\"Alle Leute in der Region haben Schlafstörungen. ($int36($id))\"" - msgid "error_nopeasants" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no peasants in this region.\"" -msgid "error_nopeasants" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Bauern.\"" - msgid "spellregionresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The region could not be charmed.\"" -msgid "spellregionresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region konnte nicht verzaubert werden.\"" - msgid "curseinfo::calmmonster" msgstr "This enchantment appears to make the unit well-disposed towards a particular faction. ($int36($id))" -msgid "curseinfo::calmmonster" -msgstr "Dieser Beeinflussungszauber scheint die Einheit einem ganz bestimmten Volk wohlgesonnen zu machen. ($int36($id))" - msgid "error169" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know this spell.\"" -msgid "error169" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Zauber kennt die Einheit nicht.\"" - msgid "error174" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only makes sense in combat.\"" -msgid "error174" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber ist nur im Kampf sinnvoll.\"" - msgid "error284" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Undead can only be affected once by this spell.\"" -msgid "error284" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein.\"" - msgid "growtree_effect" msgstr "$if($isnull($mage),\"An unknown magician\",$unit($mage)) created a holy forest of $int($amount) young trees." -msgid "growtree_effect" -msgstr "$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen." - msgid "error280" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muss erst die Spezialeigenschaft erworben werden.\"" msgid "curseinfo::shipnodrift_0" msgstr "\"A silvery shimmer surrounds the $ship($ship). ($int36($id))\"" -msgid "curseinfo::shipnodrift_0" -msgstr "\"Ein silberner Schimmer umgibt die $ship($ship). ($int36($id))\"" - msgid "error170" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The peasants did not accept this gracious gift.\"" -msgid "error170" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Bauern nehmen dieses großzügige Geschenk nicht an.\"" - msgid "dumbeffect" msgstr "\"$unit($unit) eats a duncebuns and forgets $int($weeks) weeks worth of $skill($skill).\"" -msgid "dumbeffect" -msgstr "\"$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill).\"" - msgid "renamed_ship_seen" msgstr "\"$ship($ship) in $region($region) received a nickname from $unit($renamer).\"" -msgid "renamed_ship_seen" -msgstr "\"Die $ship($ship) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" - msgid "error126" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sell this.\"" -msgid "error126" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht verkaufen.\"" - msgid "error236" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not finished yet.\"" -msgid "error236" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist noch nicht fertig gebaut.\"" - msgid "error_unit_size" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units may not have more than $int($maxsize) members.\"" -msgid "error_unit_size" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten dürfen nicht mehr als $int($maxsize) Personen enthalten.\"" - msgid "error232" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This type of unit cannot enter a building.\"" -msgid "error232" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Gebäude betreten.\"" - msgid "error122" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can only breed horses in a stable.\"" -msgid "error122" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde kann man nur in einer Pferdezucht züchten.\"" - msgid "error307" msgstr "\"$unit($unit) in $region($region): '$order($command)' - We snotlings is too stupid fer dat!\"" -msgid "error307" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Snotlinge sind zu dumm, um auf den Feldern zu arbeiten.\"" - msgid "godcurse_destroy_ship" msgstr "\"Her sailors sick from the poisened ocean, planks, rudder und sails corroded by the waters of the cursed ocean, the $ship($ship) finally succumbs to her destiny and sinks.\"" -msgid "godcurse_destroy_ship" -msgstr "\"Die Mannschaft krank vom vergifteten Wasser, Planken, Ruder und Segel zerfressen von den Wassern des verfluchten Meeres, ergibt sich die $ship($ship) in ihr Schicksal und sinkt.\"" - msgid "too_many_units_in_faction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A faction may not consist of more than $int($allowed) units.\"" -msgid "too_many_units_in_faction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei darf nicht aus mehr als $int($allowed) Einheiten bestehen.\"" - msgid "entermaelstrom" msgstr "\"The $ship($ship) sails into the maelstrom of $region($region) and takes $int($damage) damage$if($sink,\". The ship sinks\",\"\").\"" -msgid "entermaelstrom" -msgstr "\"Die $ship($ship) fährt in den Mahlstrom von $region($region) und nimmt $int($damage) Schaden$if($sink,\" und sinkt\",\"\").\"" - msgid "error303" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No trade is possible in this region.\"" -msgid "error303" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region kann man nichts verkaufen.\"" - msgid "patzer3" msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), a sudden disturbance ripples through the magical realm and a terrible force attempts to drag the magician to another dimension. However, with a final effort of strength, $unit($unit) manages to save himself.\"" -msgid "patzer3" -msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern, scheint plötzlich ein Beben durch die magische Essenz zu laufen und ein furchtbarer Sog versucht $unit($unit) in eine andere Dimension zu ziehen. Mit letzter Kraft gelingt es $unit($unit) sich zu retten.\"" - msgid "heat_effect" msgstr "\"$unit($mage) puts protection from cold on $unit($target).\"" -msgid "heat_effect" -msgstr "\"$unit($mage) belegt $unit($target) mit einem Kälteschutz.\"" - msgid "gbdream_noteach" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is an active spell in this region that prevents this.\"" -msgid "gbdream_noteach" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Zauber in dieser Region verhindert das.\"" - msgid "path_effect" msgstr "\"$unit($mage) creates dry and well-repaired roads in $region($region).\"" -msgid "path_effect" -msgstr "\"$unit($mage) sorgt für trockene Straßen in $region($region).\"" - msgid "summonshadow_effect" msgstr "\"$unit($mage) summons $int($number) demons from the realm of shadows.\"" -msgid "summonshadow_effect" -msgstr "\"$unit($mage) beschwört $int($number) Dämonen aus dem Reich der Schatten.\"" - msgid "error8" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That is useless.\"" -msgid "error8" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist sinnlos.\"" - msgid "eathorse" msgstr "\"$unit($unit) ate $int($amount) horses.\"" -msgid "eathorse" -msgstr "\"$unit($unit) verspeiste $int($amount) Pferde.\"" - msgid "confusion_result" msgstr "\"$unit($mage) summons a fog of confusion.\"" -msgid "confusion_result" -msgstr "\"$unit($mage) beschwört einen Schleier der Verwirrung.\"" - msgid "resource_missing" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires $resource($missing,0).\"" -msgid "resource_missing" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu benötigt man $resource($missing,0).\"" - msgid "give_person_peasants" msgstr "\"$unit($unit) transfers $int($amount) person$if($eq($amount,1),\"\",\"s\") to the local peasants.\"" -msgid "give_person_peasants" -msgstr "\"$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),\"\",\"en\") an die Bauern.\"" - msgid "curseinfo::magicwalls" msgstr "\"These walls appear to have grown straight out of the earth. ($int36($id))\"" -msgid "curseinfo::magicwalls" -msgstr "\"Diese Mauern wirken, als wären sie direkt aus der Erde gewachsen und nicht erbaut. ($int36($id))\"" - msgid "sp_clone_effect" msgstr "\"$unit($mage) creates a clone.\"" -msgid "sp_clone_effect" -msgstr "\"$unit($mage) erschafft einen Klon.\"" - msgid "enemy_discovers_spy_msg" msgstr "\"$unit($unit) was spotted sinking $ship($ship).\"" -msgid "enemy_discovers_spy_msg" -msgstr "\"$unit($unit) wurde beim versenken von $ship($ship) entdeckt.\"" - msgid "curseinfo::nocostbuilding" msgstr "\"Time cannot touch these walls. ($int36($id))\"" -msgid "curseinfo::nocostbuilding" -msgstr "\"Der Zahn der Zeit kann diesen Mauern nichts anhaben. ($int36($id))\"" - msgid "income_fishing" msgstr "\"In $region($region), $unit($unit) catches fish worth $int($amount) silver.\"" -msgid "income_fishing" -msgstr "\"$unit($unit) fängt in $region($region) Fische im Wert von $int($amount) Silber.\"" - msgid "analyse_unit_noage" msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)', which will last for centuries.\"" -msgid "analyse_unit_noage" -msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" - msgid "buildingcrash" msgstr "\"$building($building) in $region($region) collapses.$if($road,\" The collapse ruined half of the road.\",\"\")$if($opfer,\" There are $int($opfer) casualties.\",\"\")\"" -msgid "buildingcrash" -msgstr "\"In $region($region) stürzte $building($building) ein.$if($road,\" Beim Einsturz wurde die halbe Straße vernichtet.\",\"\")$if($opfer,\" $int($opfer) Opfer $if($eq($opfer,1),\"ist\",\"sind\") zu beklagen.\",\"\")\"" - msgid "alliance::kickattempt" msgstr "\"$int($votes) members of $alliance($alliance) tried to kick you out of the alliance.\"" -msgid "alliance::kickattempt" -msgstr "\"$int($votes) Mitglieder von $alliance($alliance) haben versucht, Deine Partei aus der Allianz auszuschliessen.\"" - msgid "becomewyrm" msgstr "\"$unit($mage) turns into a wyrm.\"" -msgid "becomewyrm" -msgstr "\"$unit($mage) verwandelt sich in einen Wyrm.\"" - msgid "casualties" msgstr "\"$unit($unit) lost $int($fallen) people$if($alive,\", $int($alive) survived\",\"\")$if($run,\" and $int($run) fled$if($isnull($runto),\"\",\" to $region($runto)\")\",\"\").\"" -msgid "casualties" -msgstr "\"$unit($unit) verlor $int($fallen) Personen$if($alive,\", $int($alive) überlebten\",\"\")$if($run,\" und $int($run) flohen$if($isnull($runto),\"\",\" nach $region($runto)\")\",\"\").\"" - -msgid "lineup_battle" -msgstr "\"Units before turn $int($turn):\"" - -msgid "lineup_battle" -msgstr "\"Einheiten vor der $int($turn). Runde:\"" - msgid "feedback_give_forbidden" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot give anything to this unit.\"" -msgid "feedback_give_forbidden" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Einheit kann nichts gegeben werden.\"" - msgid "babbler_effect" msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told everyone the story of his entire life.\"" -msgid "babbler_effect" -msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl die ganze Taverne mit seiner Lebensgeschichte unterhalten zu haben.\"" - msgid "babbler_resist" msgstr "\"$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told $unit($mage) the story of his entire life.\"" -msgid "babbler_resist" -msgstr "\"$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl $unit($mage) seine ganze Lebensgeschichte erzählt zu haben.\"" - msgid "tidalwave_kill" msgstr "\"A tidal wave wipes out $region($region) and kills $unit($unit).\"" -msgid "tidalwave_kill" -msgstr "\"Eine gewaltige Flutwelle verschlingt $unit($unit) in $region($region).\"" - msgid "error14" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is off shore.\"" -msgid "error14" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist auf hoher See.\"" - msgid "renamed_notseen" msgstr "\"$unit($renamed) in $region($region) received a nickname.\"" -msgid "renamed_notseen" -msgstr "\"$unit($renamed) in $region($region) bekommt einen Spitznamen.\"" - msgid "curseinfo::goodmagicresistancezone" msgstr "\"The magical resistance of some units in this region was boosted. ($int36($id))\"" -msgid "curseinfo::goodmagicresistancezone" -msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde gestärkt. ($int36($id))\"" - msgid "error66" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction could not be found.\"" -msgid "error66" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei wurde nicht gefunden.\"" - msgid "error88" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is lacking materials for building the ship.\"" -msgid "error88" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genügend Materialien für den Schiffbau.\"" - msgid "error55" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot move.\"" -msgid "error55" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht fortbewegen.\"" - msgid "error77" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The skill could not be recognized.\"" -msgid "error77" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent wurde nicht erkannt.\"" - msgid "error178" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No magic sphere was supplied.\"" -msgid "error178" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Magiegebiet angegeben.\"" - msgid "error297" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Buildings on the ocean may not be entered.\"" -msgid "error297" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude auf dem Ozean können nicht betreten werden.\"" - msgid "generous_effect_1" msgstr "\"A touring minstrel entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" -msgid "generous_effect_1" -msgstr "\"Die Darbietungen eines fahrenden Gauklers begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" - msgid "unit_unarmed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" -msgid "unit_unarmed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" - msgid "error293" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Verbände können nur zwischen Einheiten derselben Partei gebildet werden.\"" msgid "error183" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" -msgid "error183" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" - msgid "error_nograves" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no graves in $region($target).\"" -msgid "error_nograves" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In $region($target) sind keine Gräber.\"" - msgid "error139" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Different types do not mix.\"" -msgid "error139" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unterschiedliche Typen können nicht gemischt werden.\"" - msgid "error249" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot sail into the open seas.\"" -msgid "error249" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann nicht aufs offene Meer hinaus segeln.\"" - msgid "killedbygm" msgstr "\"$unit($unit) in $region($region) was removed by a GM: \\\"$string\\\".\"" -msgid "killedbygm" -msgstr "\"$unit($unit) wurde in $region($region) von einem GM gelöscht: \\\"$string\\\".\"" - msgid "spellfail_distance" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That region is too far away.\"" -msgid "spellfail_distance" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region ist zu weit entfernt.\"" +msgid "para_lineup_battle" +msgstr "\"Units before turn $int($turn):\"" msgid "error245" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already named.\"" -msgid "error245" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat schon einen Namen.\"" - msgid "sp_chaosrow_effect_0" msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub, but order is restored quickly.\"" -msgid "sp_chaosrow_effect_0" -msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" - msgid "error135" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown option.\"" -msgid "error135" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Option.\"" - msgid "error131" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a tunnel before building roads through glaciers.\"" -msgid "error131" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden.\"" - msgid "error241" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction must be at least 81 weeks old to restart with a new race.\"" -msgid "error241" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 81 Wochen alt sein, um einen Neustart mit einer anderen Rasse zu versuchen.\"" - msgid "feedback_unit_not_found" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit could not be found.\"" -msgid "feedback_unit_not_found" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wurde nicht gefunden.\"" - msgid "error206" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is alrady a spell on that building.\"" -msgid "error206" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Gebäude liegt bereits so ein Zauber.\"" - msgid "error316" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Without ingredients an alchemist can not produce anything.\"" -msgid "error316" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne Zutaten kann ein Alchemist nichts herstellen.\"" - msgid "error312" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes may not be mixed with normal people.\"" -msgid "error312" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht mit anderen Personen gemischt werden.\"" - msgid "mallorn_effect" msgstr "\"The power of $unit($mage) flows into the ground and the trees which survived the spell appear much stronger now.\"" -msgid "mallorn_effect" -msgstr "\"$unit($mage) läßt einen Teil seiner selbst in die Erde fliessen. Die Bäume, die Transformation überlebt haben, erscheinen nun viel kräftiger.\"" - msgid "useflamingsword" msgstr "\"$int($amount) fighters of $unit($unit) are using their flaming sword.\"" -msgid "useflamingsword" -msgstr "\"$int($amount) Krieger von $unit($unit) benutzen ihre Flammenschwerter.\"" - msgid "error202" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a valid race.\"" -msgid "error202" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine gültige Rasse.\"" - msgid "curseinfo::magicrunes_building" msgstr "\"The walls of $building($building) are inscribed with strange runes. ($int36($id))\"" -msgid "curseinfo::magicrunes_building" -msgstr "\"Auf den Mauern von $building($building) erkennt man seltsame Runen. ($int36($id))\"" - msgid "analyse_unit_fail" msgstr "\"It appears to $unit($mage) that $unit($unit) is charmed, but no details have been revealed.\"" -msgid "analyse_unit_fail" -msgstr "\"$unit($mage) meint, dass $unit($unit) verzaubert ist, konnte aber über den Zauber nichts herausfinden.\"" - msgid "spellunitresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) resists the spell.\"" -msgid "spellunitresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) widersteht dem Zauber.\"" - msgid "give_peasants" msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants.\"" -msgid "give_peasants" -msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern.\"" - msgid "leftship" msgstr "\"$unit($unit) has just landed and cannot continue moving to $region($region).\"" -msgid "leftship" -msgstr "\"$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen.\"" - msgid "astral_appear" msgstr "\"$unit($unit) appears.\"" -msgid "astral_appear" -msgstr "\"$unit($unit) erscheint plötzlich.\"" - msgid "magicresistance_effect" msgstr "\"$unit($unit) is briefly surrounded by a magical light.\"" -msgid "magicresistance_effect" -msgstr "\"$unit($unit) wird kurz von einem magischen Licht umhüllt.\"" - msgid "siege" msgstr "\"$building($building) is under siege by $unit($unit).\"" -msgid "siege" -msgstr "\"$unit($unit) belagert $building($building).\"" - msgid "missing_force" msgstr "\"$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level).\"" -msgid "missing_force" -msgstr "\"$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern.\"" - msgid "shipdestroy_partial" msgstr "\"$unit($unit) in $region($region) damages the $ship($ship).\"" -msgid "shipdestroy_partial" -msgstr "\"$unit($unit) in $region($region) beschädigt die $ship($ship).\"" - msgid "forget" msgstr "\"$unit($unit) forgets $skill($skill).\"" -msgid "forget" -msgstr "\"$unit($unit) vergisst $skill($skill).\"" - msgid "spell_astral_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell can only be cast on the astral plane.\"" -msgid "spell_astral_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur im Astralraum gezaubert werden.\"" - msgid "sp_movecastle_fail_0" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental is too small to carry the building.\"" -msgid "sp_movecastle_fail_0" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen.\"" - msgid "summonundead_effect_1" msgstr "\"$unit($mage) calls $int($amount) undead from their graves in $region($region).\"" -msgid "summonundead_effect_1" -msgstr "\"$unit($mage) erweckt in $region($region) $int($amount) Untote aus ihren Gräbern.\"" - msgid "drown" msgstr "\"$unit($unit) drowns in $region($region).\"" -msgid "drown" -msgstr "\"$unit($unit) ertrinkt in $region($region).\"" - msgid "travel" msgstr "\"$unit($unit) $if($eq($mode,1),\"rides\", \"walks\") from $region($start) to $region($end)$if($isnull($regions),\"\",\" by way of $trail($regions)\").\"" -msgid "travel" -msgstr "\"$unit($unit) $if($eq($mode,1),\"reitet\", \"wandert\") von $region($start) nach $region($end).$if($isnull($regions),\"\",\" Dabei wurde $trail($regions) durchquert.\")\"" - msgid "curseinfo::skill_1" msgstr "\"$unit($unit) is incredibly skilled at $skill($skill). ($int36($id))\"" -msgid "curseinfo::skill_1" -msgstr "\"$unit($unit) ist ungewöhnlich geschickt in $skill($skill). ($int36($id))\"" - msgid "error11" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is still off shore.\"" -msgid "error11" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff befindet sich auf hoher See.\"" - msgid "error33" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in our castle.\"" -msgid "error33" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht in unserer Burg.\"" - msgid "error22" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown command.\"" -msgid "error22" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl wurde nicht erkannt.\"" - msgid "error44" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is off shore.\"" -msgid "error44" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf hoher See.\"" - msgid "spydetect" msgstr "\"$unit($target) feels watched$if($isnull($spy),\"\",\" by $unit($spy)\").\"" -msgid "spydetect" -msgstr "\"$unit($target) fühlt sich $if($isnull($spy),\"\",\"durch $unit($spy) \")beobachtet.\"" - msgid "income_trade" msgstr "\"$unit($unit) earned $int($amount) silver in $region($region) by selling luxury items.\"" -msgid "income_trade" -msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch den Verkauf von Luxusgütern.\"" - msgid "error74" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot give anybody away.\"" -msgid "error74" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kann niemanden weggeben.\"" - msgid "error96" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody in this unit can be transferred.\"" -msgid "error96" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Einheit gibt es niemanden, den man transferieren könnte.\"" - msgid "error187" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has moved.\"" -msgid "error187" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie sich bewegt hat.\"" - msgid "error85" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No email address was supplied.\"" -msgid "error85" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde keine Emailadresse angegeben.\"" - msgid "starvation" msgstr "\"$unit($unit) loses $int($dead) of $int($add($live,$dead)) people due to starvation in $region($region).\"" -msgid "starvation" -msgstr "\"$unit($unit) verliert in $region($region) $int($dead) von $int($add($live,$dead)) Personen durch Unterernährung.\"" - msgid "error258" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The target unit is invalid.\"" -msgid "error258" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zieleinheit ist ungültig.\"" - msgid "curseinfo::fogtrap" msgstr "\"Heavy fog makes it impossible to leave the region. ($int36($id))\"" -msgid "curseinfo::fogtrap" -msgstr "\"Dichte Nebel bedecken diese Woche die Region. Keine Einheit schafft es, diese Nebel zu durchdringen und die Region zu verlassen. ($int36($id))\"" - msgid "error148" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of a castle.\"" -msgid "error148" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Burgherr.\"" - msgid "poison_damage" msgstr "\"$unit($unit) is taking poison damage in $region($region).\"" -msgid "poison_damage" -msgstr "\"$unit($unit) nimmt Schaden durch den Giftelementar in $region($region).\"" - msgid "error144" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board a ship.\"" -msgid "error144" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf keinem Schiff.\"" - msgid "magicboost_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The Spheres of Chaos return a part of his power to the magician.\"" -msgid "magicboost_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Sphären des Chaos geben dem Magier einen Teil ihrer Kraft.\"" - msgid "error254" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid aura specification or not enough aura.\"" -msgid "error254" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft oder zuwenig Aura.\"" - msgid "error250" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not enough karma.\"" -msgid "error250" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht genug Karma.\"" - msgid "error140" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is neither in a castle nor on board a ship.\"" -msgid "error140" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich weder in einer Burg noch auf einem Schiff.\"" - msgid "error215" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot reach the astral plane from here.\"" -msgid "error215" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Von hier aus kann man die astrale Ebene nicht erreichen.\"" - -msgid "destroy_ship_4" -msgstr "\"$ship($ship) wurde zerstört.\"" - msgid "destroy_ship_4" msgstr "\"$ship($ship) was destroyed.\"" msgid "error211" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already under this spell.\"" -msgid "error211" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff liegt bereits so ein Zauber.\"" - msgid "forestfire_effect" msgstr "\"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall victim to the flames.\"" -msgid "forestfire_effect" -msgstr "\"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer.\"" - msgid "error101" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can construct a building.\"" -msgid "error101" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann ein Gebäude errichten.\"" - msgid "orcgrowth" msgstr "\"$unit($unit) breeds $int($amount) new $race($race,$amount).\"" -msgid "orcgrowth" -msgstr "\"$unit($unit) vermehrt sich um $int($amount) $race($race,$amount).\"" - msgid "sp_wolfhowl_effect" msgstr "\"$unit($mage) calls for the help of $int($amount) $race($race, $amount).\"" -msgid "sp_wolfhowl_effect" -msgstr "\"$unit($mage) ruft $int($amount) $race($race, $amount) zu Hilfe.\"" - msgid "tidalwave" msgstr "\"A tidal wave wipes out $region($region) and all who lived there.\"" -msgid "tidalwave" -msgstr "\"Eine gewaltige Flutwelle verschlingt $region($region) und alle Bewohner.\"" - msgid "cast_hero_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their moral boosted.\"" -msgid "cast_hero_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden moralisch gestärkt.\"" - msgid "detectforbidden" msgstr "\"$unit($unit) refuses to travel to $region($region).\"" -msgid "detectforbidden" -msgstr "\"$unit($unit) weigert sich, nach $region($region) zu reisen.\"" - msgid "parse_error" msgstr "\"$unit($unit): '$command' - Parse error, unknown command.\"" -msgid "parse_error" -msgstr "\"$unit($unit): '$command' - Dieser Befehl ist unbekannt.\"" - msgid "fogblock" msgstr "\"$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense.\"" -msgid "fogblock" -msgstr "\"$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht.\"" - -msgid "curseinfo::antimagiczone" -msgstr "\"Dieser Zauber scheint magische Energien irgendwie abzuleiten und so alle in der Region gezauberten Sprüche in ihrer Wirkung zu schwächen oder ganz zu verhindern. ($int36($id))\"" - msgid "curseinfo::antimagiczone" msgstr "\"A spell is deflecting magical energies and weakening all other spells cast in the region. ($int36($id))\"" msgid "nr_market_sale" msgstr "\"The local market offers $resource($product,0) at a price of $int($price) silver.\"" -msgid "nr_market_sale" -msgstr "\"Auf dem Markt wird für $resource($product,0) $int($price) Silber verlangt.\"" - msgid "stealfail" msgstr "\"$unit($unit) could not sneak close enough to $unit($target).\"" -msgid "stealfail" -msgstr "\"$unit($unit) gelang es nicht, sich nahe genug an $unit($target) heranzuschleichen.\"" - -msgid "section_battle" -msgstr "\"\"" - -msgid "section_battle" -msgstr "\"\"" - msgid "sp_disturbingdreams_effect" msgstr "\"$unit($mage) disturbs everyone's dreams in $region($region).\"" -msgid "sp_disturbingdreams_effect" -msgstr "\"$unit($mage) sorgt für schlechten Schlaf in $region($region).\"" - msgid "spy_discovered_msg" msgstr "\"$unit($unit) caught $unit($saboteur) trying to sink $ship($ship).\"" -msgid "spy_discovered_msg" -msgstr "\"$unit($unit) entdeckte $unit($saboteur) beim Versenken von $ship($ship).\"" - msgid "wrongpasswd" msgstr "\"Your orders had the wrong password (${password}).\"" -msgid "wrongpasswd" -msgstr "\"Deine Befehle hatten ein falsches Passwort (${password}).\"" - msgid "curseinfo::sparkle_9" msgstr "\"A large green snake offers $unit($unit) a fine-looking apple. ($int36($id))\"" -msgid "curseinfo::sparkle_9" -msgstr "\"$unit($unit) bekommt von einer Schlange einen Apfel angeboten. ($int36($id))\"" - -msgid "birthday_firework_noname" -msgstr "\"A large firework, visible all over the sky, has been started in $region($region).\"" - -msgid "birthday_firework_noname" -msgstr "\"In $region($region) wird ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - msgid "skill_needed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This requires the skill $skill($skill).\"" -msgid "skill_needed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu braucht man das Talent $skill($skill).\"" - msgid "renamed_seen" msgstr "\"$unit($renamed) in $region($region) received a nickname from $unit($renamer).\"" -msgid "renamed_seen" -msgstr "\"$unit($renamed) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" - msgid "analyse_unit_nospell" msgstr "\"It appears to $unit($mage) that $unit($target) is not charmed.\"" -msgid "analyse_unit_nospell" -msgstr "\"$unit($mage) meint, dass auf $unit($target) kein Zauber liegt.\"" - msgid "army_report" msgstr "\"Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors.\"" -msgid "army_report" -msgstr "\"Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende.\"" - msgid "receive_person" msgstr "\"$unit($target) receives $int($amount) person$if($eq($amount,1),\"\",\"s\") from $unit($unit).\"" -msgid "receive_person" -msgstr "\"$unit($target) erhält $int($amount) Person$if($eq($amount,1),\"\",\"en\") von $unit($unit).\"" - msgid "donation" msgstr "\"$faction($from) donates $int($amount) silver to $faction($to).\"" -msgid "donation" -msgstr "\"$faction($from) gibt ein Almosen von $int($amount) Silber an $faction($to).\"" - msgid "scunicorn" msgstr "\"$int($amount) $resource($rtype,$amount) $if($eq($amount,1),\"joins\",\"join\") $unit($unit).\"" -msgid "scunicorn" -msgstr "\"$unit($unit) $if($eq($amount,1),\"schließt\",\"schließen\") sich $int($amount) $resource($rtype,$amount) an.\"" - msgid "try_astral" msgstr "\"$unit($unit) tried but failed to send $unit($target) to another world.\"" -msgid "try_astral" -msgstr "\"$unit($unit) versuchte erfolglos, $unit($target) in eine andere Welt zu schleudern.\"" - msgid "error196" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is not a forest region.\"" -msgid "error196" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das ist keine Waldregion.\"" - msgid "objmagic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on ${target}.\"" -msgid "objmagic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) verzaubert ${target}.\"" - msgid "puttorest" msgstr "\"$unit($mage) redeems the tormented souls of the dead.\"" -msgid "puttorest" -msgstr "\"$unit($mage) erlöst die gequälten Seelen der Toten.\"" - msgid "error41" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" -msgid "error41" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" - msgid "error30" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The message does not contain text.\"" -msgid "error30" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Botschaft enthält keinen Text.\"" - msgid "error52" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute more long orders.\"" -msgid "error52" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren langen Befehle ausführen.\"" - msgid "recruit_effect" msgstr "\"$unit($mage) managed to recruit $int($amount) $if($eq($amount,1),\"peasant\",\"peasants\").\"" -msgid "recruit_effect" -msgstr "\"$unit($mage) konnte $int($amount) $if($eq($amount,1),\"Bauer\",\"Bauern\") anwerben.\"" - msgid "spell_failed" msgstr "\"$unit($unit) tries to cast $spell($spell), but the spell fails!\"" -msgid "spell_failed" -msgstr "\"$unit($unit) versucht $spell($spell) zu zaubern, doch der Zauber schlägt fehl!\"" - msgid "error157" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has a different magic sphere.\"" -msgid "error157" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat ein anderes Magiegebiet.\"" - msgid "auratransfer_success" msgstr "\"$unit($unit) transfers $int($aura) aura to $unit($target).\"" -msgid "auratransfer_success" -msgstr "\"$unit($unit) transferiert $int($aura) Aura auf $unit($target).\"" - msgid "error267" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only a single person can use the ticket.\"" -msgid "error267" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur eine Einzelperson kann das Ticket benutzen.\"" - msgid "error263" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This good is not produced here.\"" -msgid "error263" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut wird hier produziert.\"" - msgid "error153" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit joins the local peasants.\"" -msgid "error153" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit schließt sich den Bauern an.\"" - msgid "error_onlandonly" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be on land.\"" -msgid "error_onlandonly" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit muß sich an Land befinden.\"" - msgid "error_herorecruit" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Heroes cannot recruit.\"" -msgid "error_herorecruit" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Helden können nicht rekrutieren.\"" - msgid "error109" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if a castle, a ship, a region, or a unit is supposed to be named.\"" -msgid "error109" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Einheit, eine Region oder eine Partei benannt werden soll.\"" - -msgid "msg_event" -msgstr "\"$string\"" - msgid "msg_event" msgstr "\"$string\"" msgid "error224" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units cannot cast spells.\"" -msgid "error224" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht zaubern.\"" - msgid "piratesawvictim" msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") in $region($region) made $direction($dir) a target.\"" -msgid "piratesawvictim" -msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) entdeckt ein Opfer im $direction($dir).\"" - msgid "spyreport_items" msgstr "\"$unit($target) carries $resources($items)\"" -msgid "spyreport_items" -msgstr "\"Im Gepäck von $unit($target) sind $resources($items).\"" - msgid "curseinfo::shipnodrift_1" msgstr "\"The $ship($ship) is blessed with favourable winds$if($lt($duration,3),\", but the spell is starting to wear thin\",\"\"). ($int36($id))\"" -msgid "curseinfo::shipnodrift_1" -msgstr "\"Die $ship($ship) ist mit gutem Wind gesegnet$if($lt($duration,3),\", doch der Zauber beginnt sich bereits aufzulösen\",\"\"). ($int36($id))\"" - msgid "error105" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Empty units can not be handed over.\"" -msgid "error105" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Leere Einheiten können nicht übergeben werden.\"" - msgid "curseinfo::sparkle_7" msgstr "\"The women of the nearby village cast furtive looks at $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_7" -msgstr "\"Die Frauen des nahegelegenen Dorfes bewundern $unit($unit) verstohlen. ($int36($id))\"" - msgid "error110" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Specify if description is for a castle, a ship, a region, or a unit.\"" -msgid "error110" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Region oder eine Einheit beschrieben werden soll.\"" - msgid "curseinfo::sparkle_18" msgstr "\"The stench of decay is poring from all the orifices of $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_18" -msgstr "\"Fäulnisgeruch dringt $unit($unit) aus allen Körperöffnungen. ($int36($id))\"" - msgid "error_captain_skill_low" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The captain needs a sailing skill of at least $int($value), to command $ship($ship).\"" -msgid "error_captain_skill_low" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Kapitän muß ein Segeltalent von mindestens $int($value) haben, um $ship($ship) zu befehligen.\"" - msgid "error220" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No one could be seen in the astral fog.\"" -msgid "error220" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Im astralen Nebel konnte niemand entdeckt werden.\"" - msgid "arena_enter" msgstr "\"A portal opens in $region($region). A voice calls: 'Welcome to the Plane of Challenge'. $unit($unit) walks through the gate to another world.\"" -msgid "arena_enter" -msgstr "\"In $region($region) öffnet sich ein Portal. Eine Stimme ertönt, und spricht: 'Willkommen in der Ebene der Herausforderung'. $unit($unit) durchschreitet das Tor zu einer anderen Welt.\"" - msgid "stealfatal" msgstr "\"$unit($unit) was caught by $unit($target) in attempted theft.\"" -msgid "stealfatal" -msgstr "\"$unit($unit) wurde von $unit.dative($target) beim versuchten Diebstahl ertappt.\"" - msgid "analyse_unit_age" msgstr "\"$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)' that will last for about $int($months) more weeks.\"" -msgid "analyse_unit_age" -msgstr "\"$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" - msgid "sp_permtransfer_effect" msgstr "\"$unit($mage) sacrifices $int($amount) aura for $unit($target).\"" -msgid "sp_permtransfer_effect" -msgstr "\"$unit($mage) opfert $unit($target) $int($amount) Aura.\"" - msgid "shipfly" msgstr "\"The $ship($ship) flies from $region($from) to $region($to).\"" -msgid "shipfly" -msgstr "\"Die $ship($ship) fliegt von $region($from) nach $region($to).\"" - msgid "curseinfo::unit_unknown" msgstr "\"An unknown spell lies on this unit. ($int36($id))\"" -msgid "curseinfo::unit_unknown" -msgstr "\"Ein unbekannter Zauber liegt auf der Einheit. ($int36($id))\"" - msgid "force_leave_ship" msgstr "$unit($owner) asks $unit($unit) to leave $ship($ship)." -msgid "force_leave_ship" -msgstr "$unit($owner) bittet $unit($unit), $ship($ship) zu verlassen." - msgid "dissolve_units_1" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) returned to the fields.\"" -msgid "dissolve_units_1" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"kehrte auf seine\", \"kehrten auf ihre\") Felder zurück.\"" - msgid "hornofpeace_r_nosuccess" msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing, but nobody here gets into the mood.\"" -msgid "hornofpeace_r_nosuccess" -msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes, doch niemand hier lässt sich von Stimmung anstecken.\"" - msgid "malnourish" msgstr "\"$unit($unit) is weakened due to malnourishment.\"" -msgid "malnourish" -msgstr "\"$unit($unit) in $region($region) wird durch unzureichende Nahrung geschwächt.\"" - msgid "iceberg_land" msgstr "\"The iceberg $region($region) drifts onto a coast.\"" -msgid "iceberg_land" -msgstr "\"Der Eisberg $region($region) treibt an eine Küste.\"" - msgid "produce_lowskill" msgstr "\"$unit($unit) in $region($region) is not proficient enough to produce $resource($resource,0).\"" -msgid "produce_lowskill" -msgstr "\"$unit($unit) in $region($region) hat ein zu niedriges Talent, um $resource($resource,0) abzubauen.\"" - msgid "income_steal_reduced" msgstr "\"$unit($unit) steals only $int($amount) silver instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") in $region($region).\"" -msgid "income_steal_reduced" -msgstr "\"$unit($unit) klaut in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" - msgid "error_cannotmake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot produce this.\"" -msgid "error_cannotmake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht machen.\"" - msgid "meow" msgstr "\"Meeoooooow...\"" -msgid "meow" -msgstr "\"Miiauuuuuu...\"" - msgid "spelltargetnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell could not find a target.\"" -msgid "spelltargetnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Ziel gefunden.\"" - msgid "curseinfo::fumble" msgstr "\"$unit($unit) can hardly focus on anything. ($int36($id))\"" -msgid "curseinfo::fumble" -msgstr "\"$unit($unit) kann sich kaum konzentrieren. ($int36($id))\"" - msgid "curseinfo::sparkle_14" msgstr "\"The head of $unit($unit) has turned into a madly grinning skull. ($int36($id))\"" -msgid "curseinfo::sparkle_14" -msgstr "\"Der Kopf von $unit($unit) hat sich in einen grinsenden Totenschädel verwandelt. ($int36($id))\"" - msgid "reanimate_effect_1" msgstr "\"$unit($mage) begins a ritual of resurrection augmented by a $resource($item,1). $int($amount) warriors rise from the dead.\"" -msgid "reanimate_effect_1" -msgstr "\"$unit($mage) beginnt ein Ritual der Wiederbelebung und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Krieger stehen von den Toten auf.\"" - msgid "analyse_building_nospell" msgstr "\"It appears to $unit($mage) that $building($building) is not charmed.\"" -msgid "analyse_building_nospell" -msgstr "\"$unit($mage) meint, dass auf $building($building) kein Zauber liegt.\"" - msgid "magicresistance_building" msgstr "\"The magical resistance has been strengthened. ($int36($id))\"" -msgid "magicresistance_building" -msgstr "\"Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))\"" - msgid "race_notake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) will not accept anything.\"" -msgid "race_notake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) nehmen nichts an.\"" - msgid "cast_drainlife_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had their life energy drained.\"" -msgid "cast_drainlife_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurde ihre Lebenskraft entzogen.\"" - msgid "headache_effect_0" msgstr "\"$unit($mage) invites $unit($unit) for a few too many drinks and a massive hangover.\"" -msgid "headache_effect_0" -msgstr "\"$unit($mage) verschafft $unit($unit) einige feuchtfröhliche Stunden mit heftigen Nachwirkungen.\"" - msgid "unholypower_limitedeffect" msgstr "\"$unit($mage) transforms $int($amount) from $unit($target) into $race($race,0).\"" -msgid "unholypower_limitedeffect" -msgstr "\"$unit($mage) verwandelt $int($amount) aus $unit($target) in $race($race,0).\"" - msgid "income_work_reduced" msgstr "\"$unit($unit) works in $region($region) for a wage of $int($amount) $if($eq($wanted,$amount),\"\",\" out of $int($wanted)\") silver.\"" -msgid "income_work_reduced" -msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber.\"" - msgid "maintenancespecialfail" msgstr "\"$unit($unit) lacks $resource($item,0) to operate $building($building).\"" -msgid "maintenancespecialfail" -msgstr "\"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building).\"" - msgid "healing_effect_1" msgstr "\"$unit($mage) sees after the wounded and heals $int($amount). A $resource($item,1) improves the spell.\"" -msgid "healing_effect_1" -msgstr "\"$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Verwundete werden geheilt.\"" - msgid "error276" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here.\"" -msgid "error276" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen.\"" - msgid "error166" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle.\"" -msgid "error166" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern.\"" - msgid "chaosgate_effect_2" msgstr "\"A vortex of blinding light appears.\"" -msgid "chaosgate_effect_2" -msgstr "\"Ein Wirbel aus blendendem Licht erscheint.\"" - -msgid "birthday_firework_local" -msgstr "\"A large firework in honor of ${name} is visible all over the sky.\"" - -msgid "birthday_firework_local" -msgstr "\"Zur Feier des Geburtstags von ${name} brennt $unit($unit) ein großes Feuerwerk ab. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - msgid "hornofpeace_u_success" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) regions have been pacified.\"" -msgid "hornofpeace_u_success" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $int($pacified) Regionen wurden befriedet.\"" - msgid "error71" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The given direction was not recognized.\"" -msgid "error71" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung wurde nicht erkannt.\"" - msgid "error93" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a port in this region.\"" -msgid "error93" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es schon einen Hafen.\"" - msgid "no_attack_after_advance" msgstr "\"'$order($command)' - $unit($unit) marched into $region($region) during the last turn and is too exhausted to attack.\"" -msgid "no_attack_after_advance" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist noch zu erschöpft vom Einmarsch um zu attackieren.\"" - msgid "error82" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number.\"" -msgid "error82" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer.\"" - msgid "error60" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is under siege.\"" -msgid "error60" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert.\"" - msgid "error162" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed.\"" -msgid "error162" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt.\"" - msgid "error272" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Horses are not allowed inside.\"" -msgid "error272" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pferde müssen leider draußen bleiben.\"" - msgid "warn_dropout" msgstr "\"Warning: $faction($faction) has not been sending in orders for $int($turns) turns and may be leaving the game soon.\"" -msgid "warn_dropout" -msgstr "\"Achtung: $faction($faction) hat seit $int($turns) Wochen keine Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel ausscheiden.\"" - msgid "arena_leave_fail" msgstr "\"The attempt to use wings of the gryphon failed. $unit($unit) could not leave the Plane of Challenge.\"" -msgid "arena_leave_fail" -msgstr "\"Der Versuch, die Greifenschwingen zu benutzen, schlug fehl. $unit($unit) konnte die Ebene der Herausforderung nicht verlassen.\"" - msgid "battle_critical" msgstr "\"$int36($unit.id($unit))/$int($index) does critical damage.\"" -msgid "battle_critical" -msgstr "\"$int36($unit.id($unit))/$int($index) erzielt einen kritischen Treffer.\"" - msgid "error_spell_on_ship_already" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is already a spell on $ship($ship).\"" -msgid "error_spell_on_ship_already" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf $ship($ship) liegt beeits ein Zauber.\"" - msgid "error228" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only normal characters can collect taxes.\"" -msgid "error228" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur normale Personen können Steuern eintreiben.\"" - -msgid "birthday_firework_noname_local" -msgstr "\"A large firework is visible all over the sky.\"" - -msgid "birthday_firework_noname_local" -msgstr "\"$unit($unit) brennt ein großes Feuerwerk ab und Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - msgid "error118" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot produce that.\"" -msgid "error118" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann die Einheit nicht herstellen.\"" - msgid "curseinfo::sparkle_10" msgstr "\"A unicorn touches $unit($unit) with its horn and vanishes into the forest quickly after. ($int36($id))\"" -msgid "curseinfo::sparkle_10" -msgstr "\"Ein Einhorn berührt $unit($unit) mit seinem Horn und verschwindet kurz darauf im Unterholz. ($int36($id))\"" - msgid "error114" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is not valid.\"" -msgid "error114" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist nicht im gültigen Bereich.\"" - msgid "error233" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Swimmers cannot enter ships.\"" -msgid "error233" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Schiffe betreten.\"" - msgid "iceberg_create" msgstr "\"The glacier in $region($region) breaks up and drifts away.\"" -msgid "iceberg_create" -msgstr "\"Der Gletscher von $region($region) bricht und treibt davon.\"" - msgid "chaos_disease" msgstr "\"$unit($unit) is stricken by a strange disease.\"" -msgid "chaos_disease" -msgstr "\"$unit($unit) scheint von einer seltsamen Krankheit befallen.\"" - msgid "error1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are not enough experienced sailors on board the ship.\"" -msgid "error1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff befinden sich zuwenig erfahrene Seeleute.\"" - msgid "sp_icastle_effect" msgstr "\"Flabbergasted, the peasants of $region($region) behold a new building.\"" -msgid "sp_icastle_effect" -msgstr "\"Verwundert blicken die Bauern von $region($region) auf ein neues Gebäude.\"" - msgid "curseinfo::godcurse" msgstr "\"This region was cursed by the gods. Stinking vapors billow over the dead ground and hideous creatures move about the country. The wells are poisened and the edible plants are covered by a pink fungus. Noone can live here for long. ($int36($id))\"" -msgid "curseinfo::godcurse" -msgstr "\"Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen über die tote Erde und furchtbare Kreaturen ziehen über das Land. Die Brunnen sind vergiftet, und die wenigen essbaren Früchte sind von einem rosa Pilz überzogen. Niemand kann hier lange überleben. ($int36($id))\"" - msgid "recruit_archetype" msgstr "\"$unit($unit) recruits $int($amount) $localize($archetype).\"" -msgid "recruit_archetype" -msgstr "\"$unit($unit) rekrutiert $int($amount) $localize($archetype).\"" - msgid "tactics_won" msgstr "\"$unit($unit) surprises the enemies.\"" -msgid "tactics_won" -msgstr "\"$unit($unit) überrascht den Gegner.\"" - msgid "raindance_effect" msgstr "\"$if($isnull($mage),\"an unseen magician\",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields.\"" -msgid "raindance_effect" -msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen.\"" - -msgid "mistake" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" - msgid "mistake" msgstr "\"$unit($unit) in $region($region): '$order($command)' - ${error}.\"" msgid "income_tax" msgstr "\"$unit($unit) collects taxes of $int($amount) silver in $region($region).\"" -msgid "income_tax" -msgstr "\"$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount) Silber ein.\"" - msgid "give_person_ocean" msgstr "\"$unit($unit) drowns $int($amount).\"" -msgid "give_person_ocean" -msgstr "\"$unit($unit) ertränkt $int($amount) Person$if($eq($amount,1),\"\",\"en\").\"" - msgid "error_no_tax_skill" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not now how to tax.\"" -msgid "error_no_tax_skill" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht geschult im Eintreiben von Steuern.\"" - msgid "sparkle_effect" msgstr "\"$unit($mage) puts a spell on $unit($target).\"" -msgid "sparkle_effect" -msgstr "\"$unit($mage) belegt $unit($target) mit einem Zauber.\"" - msgid "error18" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is too heavily loaded to sail.\"" -msgid "error18" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist zu schwer beladen, um in See zu stechen.\"" - msgid "sp_raisepeasants_effect" msgstr "\"$unit($mage) incites a revolt among $int($amount) peasants of $region($region).\"" -msgid "sp_raisepeasants_effect" -msgstr "\"$unit($mage) wiegelt in $region($region) $int($amount) Bauern zum Aufstand auf.\"" - msgid "pump_effect" msgstr "\"$unit($mage) questions $unit($unit) about $region($tregion).\"" -msgid "pump_effect" -msgstr "\"$unit($mage) horcht $unit($unit) über $region($tregion) aus.\"" - msgid "curseinfo::sparkle_5" msgstr "\"A haunting melody fills the air, and $unit($unit) dances until late into the night. ($int36($id))\"" -msgid "curseinfo::sparkle_5" -msgstr "\"Eine Melodie erklingt, und $unit($unit) tanzt bis spät in die Nacht hinein. ($int36($id))\"" - msgid "dragon_growl" msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"I smell\", \"We smell\") something in $region($target)\\\".\"" -msgid "dragon_growl" -msgstr "\"$unit($dragon): \\\"$localize($growl) $if($eq($number,1), \"Ich rieche\", \"Wir riechen\") etwas in $region($target)\\\".\"" - msgid "produce" msgstr "\"$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") $resource($resource,$amount).\"" -msgid "produce" -msgstr "\"$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),\"\",\" von $int($wanted)\") $resource($resource,$wanted).\"" - msgid "income_work" msgstr "\"In $region($region), $unit($unit) works for a wage of $int($amount) silver.\"" -msgid "income_work" -msgstr "\"$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount) Silber.\"" - msgid "nr_stat_people" msgstr "\"people: $int($max)\"" -msgid "nr_stat_people" -msgstr "\"Personen: $int($max)\"" - msgid "destroy_curse_noeffect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell is not strong enough to destroy the curse ($id) on ${target}.\"" -msgid "destroy_curse_noeffect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber ist nicht stark genug, um den Fluch ($id) auf ${target} zu zerstören.\"" - msgid "detectocean" msgstr "\"$unit($unit) discovered that $region($region) is $localize($terrain).\"" -msgid "detectocean" -msgstr "\"$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist.\"" - msgid "spell_resist" msgstr "\"$unit($unit) manages to cast $spell($spell), but the spell seems to have no effect.\"" -msgid "spell_resist" -msgstr "\"$unit($unit) gelingt es $spell($spell) zu zaubern, doch der Spruch zeigt keine Wirkung.\"" - msgid "shipdestroy" msgstr "\"$unit($unit) sunk $ship($ship) in $region($region).\"" -msgid "shipdestroy" -msgstr "\"$unit($unit) in $region($region) versenkt die $ship($ship).\"" - -msgid "destroy_ship_3" -msgstr "\"Es wurde versucht, $ship($ship) zu zerstören.\"" - msgid "destroy_ship_3" msgstr "\"Somebody attempted to destroy $ship($ship).\"" msgid "error289" msgstr "\"$unit($unit) in $region($region): '$order($command)' - What should we disguise as?\"" -msgid "error289" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wie sollen wir uns tarnen?\"" - msgid "spellbuildingnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be located.\"" -msgid "spellbuildingnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) wurde nicht gefunden.\"" - msgid "error179" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this magic sphere.\"" -msgid "error179" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Magiegebiet kann die Einheit nicht lernen.\"" - msgid "sp_migranten" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) has become one of our kind.\"" -msgid "sp_migranten" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) wird von uns aufgenommen.\"" - msgid "error175" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell while standing on a moving ship.\"" -msgid "error175" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht auf einem sich bewegenden Schiff stehend zaubern.\"" - msgid "error285" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit knows no recipes for potions.\"" -msgid "error285" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kennt keine Trankrezepte.\"" - msgid "dissolve_units_4" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned to dust.\"" -msgid "dissolve_units_4" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"zerfiel\", \"zerfielen\") zu Staub.\"" - msgid "error281" msgstr "\"$unit($unit) in $region($region): '$order($command)' - What race did you want the jihad to be against?\"" -msgid "error281" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen welche Rasse soll der Jihad ausgerufen werden?\"" - msgid "error171" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This combat spell does not exist.\"" -msgid "error171" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Kampfzauber gibt es nicht.\"" - msgid "astral_disappear" msgstr "\"$unit($unit) disappears.\"" -msgid "astral_disappear" -msgstr "\"$unit($unit) wird durchscheinend und verschwindet.\"" - msgid "error127" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction cannot hire so many strangers.\"" -msgid "error127" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann Deine Partei nicht aufnehmen.\"" - msgid "drought_effect_2" msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds.\"" -msgid "drought_effect_2" -msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt.\"" - msgid "usepotion" msgstr "\"$unit($unit) uses $resource($potion,1).\"" -msgid "usepotion" -msgstr "\"$unit($unit) benutzt $resource($potion,1).\"" - msgid "error237" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are riots in this region.\"" -msgid "error237" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region befindet sich in Aufruhr.\"" - msgid "error90" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have travel with us.\"" -msgid "error90" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit fährt nicht mit uns.\"" - msgid "orcified" msgstr "\"People in $region($region) flee because of too many orcs.\"" -msgid "orcified" -msgstr "\"Vor den vielen Orks in $region($region) fliehen die anderen Einwohner.\"" - msgid "plant_skills" msgstr "\"$unit($unit) in $region($region): '$order($command)' - At least $skill($skill) $int($minskill) is needed for planting $resource($product,0).\"" -msgid "plant_skills" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu pflanzen.\"" - msgid "renamed_ship_notseen" msgstr "\"$ship($ship) in $region($region) received a nickname.\"" -msgid "renamed_ship_notseen" -msgstr "\"Die $ship($ship) in $region($region) bekommt einen Spitznamen.\"" - msgid "error123" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have such a thing.\"" -msgid "error123" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas hat die Einheit nicht.\"" - msgid "error308" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This skill cannot be raised any higher.\"" -msgid "error308" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann nicht höher gelernt werden.\"" - msgid "spyreport_faction" msgstr "\"$unit($target) belongs to $faction($faction).\"" -msgid "spyreport_faction" -msgstr "\"$unit($target) gehört der Partei $faction($faction) an.\"" - msgid "ship_drift" msgstr "\"The ship $ship($ship) drifts to the $direction($dir).\"" -msgid "ship_drift" -msgstr "\"Die $ship($ship) treibt nach $direction($dir).\"" - msgid "error_max_magicians" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more than $int($amount) magicians in your faction.\"" -msgid "error_max_magicians" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Magier pro Partei geben.\"" - msgid "error304" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units of a faction that can't be attacked may not guard.\"" -msgid "error304" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen.\"" - msgid "error300" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid synonym.\"" -msgid "error300" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Synonym.\"" - msgid "error4" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already completed.\"" -msgid "error4" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist bereits fertig.\"" - msgid "curseinfo::magicstreetwarn" msgstr "\"The roads are extremely dry and well-kept, but some areas show the first signs of potholes reappearing. ($int36($id))\"" -msgid "curseinfo::magicstreetwarn" -msgstr "\"Die Straßen sind erstaunlich trocken und gut begehbar, doch an manchen Stellen bilden sich wieder die erste Schlammlöcher. ($int36($id))\"" - msgid "moveblocked" msgstr "\"$unit($unit) discovers that there is no route going $direction($direction).\"" -msgid "moveblocked" -msgstr "\"$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt.\"" - msgid "nr_market_info_p" msgstr "\"The local market offers $resource($p1,0) and $resource($p2,0).\"" -msgid "nr_market_info_p" -msgstr "\"Auf dem Markt werden $resource($p1,0) und $resource($p2,0) feilgeboten.\"" - msgid "stealeffect" msgstr "\"In $region($region), thieves stole $int($amount) silver from $unit($unit).\"" -msgid "stealeffect" -msgstr "\"$unit($unit) wurden in $region($region) $int($amount) Silberstücke geklaut.\"" - msgid "curseinfo::calm_1" msgstr "\"$unit($unit) likes $faction($faction). ($int36($id))\"" -msgid "curseinfo::calm_1" -msgstr "\"$unit($unit) scheint $faction($faction) zu mögen. ($int36($id))\"" - msgid "plant" msgstr "\"$unit($unit) plants $int($amount) $resource($herb,$amount) in $region($region).\"" -msgid "plant" -msgstr "\"$unit($unit) pflanzt in $region($region) $int($amount) $resource($herb,$amount).\"" - msgid "nr_region_owner" msgstr "\"The region is owned by $faction($faction).\"" -msgid "nr_region_owner" -msgstr "\"Die Region ist im Besitz von $faction($faction).\"" - msgid "analyse_region_nospell" msgstr "\"It appears to $unit($mage) that $region($region) is not charmed.\"" -msgid "analyse_region_nospell" -msgstr "\"$unit($mage) meint, dass auf $region($region) kein Zauber liegt.\"" - msgid "one_circle_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has already chosen a magical school.\"" -msgid "one_circle_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits ein Magiegebiet.\"" - msgid "race_nosteal" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot steal anything.\"" -msgid "race_nosteal" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts stehelen.\"" - msgid "error26" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items to buy is missing.\"" -msgid "error26" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu kaufender Produkte fehlt.\"" - msgid "error48" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" -msgid "error48" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig.\"" - msgid "sailfail" msgstr "\"The $ship($ship) could not leave $region($region).\"" -msgid "sailfail" -msgstr "\"Die $ship($ship) konnte $region($region) nicht verlassen.\"" - msgid "error15" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has not yet been completed.\"" -msgid "error15" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist noch nicht fertig gebaut.\"" - msgid "error37" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion.\"" -msgid "error37" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Trank nicht.\"" - msgid "error59" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not know anything about herbalism.\"" -msgid "error59" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nichts über Botanik.\"" - msgid "ent_effect" msgstr "\"$unit($mage) animates $int($amount) trees.\"" -msgid "ent_effect" -msgstr "\"$unit($mage) belebt $int($amount) Bäume.\"" - msgid "error89" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Money offer is missing.\"" -msgid "error89" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Geldgebot fehlt.\"" - msgid "nr_header_date" msgstr "\"Report for $game, $date\"" -msgid "nr_header_date" -msgstr "\"Report für $game, $date\"" - msgid "error188" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a swamp.\"" -msgid "error188" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht im Sumpf gezaubert werden.\"" - msgid "error298" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician already has a clone.\"" -msgid "error298" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Klon.\"" - msgid "fail_tooheavy" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is too heavy.\"" -msgid "fail_tooheavy" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist zu schwer.\"" - msgid "familiar_farcast" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions.\"" -msgid "familiar_farcast" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten.\"" - msgid "error184" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not move.\"" -msgid "error184" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit bewegt sich nicht.\"" - msgid "income_entertainment" msgstr "\"$unit($unit) earns $int($amount) in $region($region) with entertainment.\"" -msgid "income_entertainment" -msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Unterhaltung.\"" - msgid "error180" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell fails.\"" -msgid "error180" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber schlägt fehl.\"" - msgid "sp_shapeshift_fail" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) cannot take the form of $race($race,1).\"" -msgid "sp_shapeshift_fail" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) kann nicht $race($race,1) werden.\"" - msgid "error290" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Einheit kann nur in einem Verband Mitglied sein.\"" msgid "cast_rally_effect" msgstr "\"$unit($mage) quells the uprising in $region($region).\"" -msgid "cast_rally_effect" -msgstr "\"$unit($mage) besänftigt den Bauernaufstand in $region($region).\"" - msgid "error246" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is already named.\"" -msgid "error246" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude hat schon einen Namen.\"" - msgid "stealaura_fail" msgstr "\"$unit($unit) could not draw aura from $unit($target).\"" -msgid "stealaura_fail" -msgstr "\"$unit($unit) konnte $unit($target) keine Aura entziehen.\"" - msgid "nmr_warning" msgstr "No orders were received for your faction!" -msgid "nmr_warning" -msgstr "Deine Partei hat letzte Runde keinen Zug abgegeben!" - msgid "destroy" msgstr "\"$unit($unit) destroys $building($building).\"" -msgid "destroy" -msgstr "\"$unit($unit) zerstört $building($building).\"" - msgid "volcanooutbreaknn" msgstr "\"The volcano in $region($region) erupts.\"" -msgid "volcanooutbreaknn" -msgstr "\"Der Vulkan in $region($region) bricht aus.\"" - msgid "error132" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a dam before building roads through swamps.\"" -msgid "error132" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Sümpfen Straßen bauen zu können, muß zuerst ein Damm errichtet werden.\"" - msgid "error251" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot improve this power.\"" -msgid "error251" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen.\"" - msgid "error207" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer aura to this unit.\"" -msgid "error207" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu dieser Einheit kann keine Aura übertragen werden.\"" - msgid "error317" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object is indestructible.\"" -msgid "error317" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Objekt ist unzerstörbar.\"" - msgid "error_different_magic" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) does not understand our kind of magic.\"" -msgid "error_different_magic" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) versteht unsere Art von Magie nicht.\"" - msgid "curseinfo::sparkle_3" msgstr "\"$unit($unit) is surrounded by a shower of glittering sparkles. ($int36($id))\"" -msgid "curseinfo::sparkle_3" -msgstr "\"$unit($unit) wird von einem glitzernden Funkenregen umgeben. ($int36($id))\"" - msgid "error313" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Lycantropes don't work.\"" -msgid "error313" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht arbeiten.\"" - msgid "mail_result" msgstr "\"A message from $unit($unit): '$message'\"" -msgid "mail_result" -msgstr "\"Eine Botschaft von $unit($unit): '$message'\"" - msgid "error203" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No target has been supplied.\"" -msgid "error203" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Ziel wurde vergessen.\"" - msgid "cast_storm_effect" msgstr "\"$unit($mage) casts $spell($spell): Strong stormwinds are blowing and the archers are having a hard time aiming.\"" -msgid "cast_storm_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): Ein Sturm kommt auf und die Schützen können kaum noch zielen.\"" - msgid "patzer4" msgstr "\"When $unit($unit) in $region($region) tries to cast $spell($spell), strong winds suddenly rise. Bizarre ghostlike creatures circle around the magician and seem to be leeching magical energy. However, with a final effort of strength, $unit($unit) manages to complete the spell.\"" -msgid "patzer4" -msgstr "\"Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern erhebt sich plötzlich ein dunkler Wind. Bizarre geisterhafte Gestalten kreisen um den Magier und scheinen sich von den magischen Energien des Zaubers zu ernähren. Mit letzter Kraft gelingt es $unit($unit) dennoch den Spruch zu zaubern.\"" - msgid "curseinfo::magicrunes_ship" msgstr "\"The plank of $ship($ship) are inscribed with strange runes. ($int36($id))\"" -msgid "curseinfo::magicrunes_ship" -msgstr "\"Auf den Planken von $ship($ship) erkennt man seltsame Runen. ($int36($id))\"" - msgid "santa_f" msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." -msgid "santa_f" -msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei eine $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." - msgid "cast_spell_effect" msgstr "\"$unit($mage) casts $spell($spell).\"" -msgid "cast_spell_effect" -msgstr "\"$unit($mage) zaubert $spell($spell).\"" - msgid "curseinfo::disorientationzone" msgstr "\"A veil of confusion lies over the region. ($int36($id))\"" -msgid "curseinfo::disorientationzone" -msgstr "\"Ein Schleier der Verwirrung liegt über der Region. ($int36($id))\"" - msgid "calm_effect" msgstr "\"$unit($mage) calms $unit($unit).\"" -msgid "calm_effect" -msgstr "\"$unit($mage) besänftigt $unit($unit).\"" - msgid "error7" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This is no longer possible.\"" -msgid "error7" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das geht nicht mehr.\"" - msgid "summonundead_effect_2" msgstr "\"$unit($mage) communicates with the dead in $region($region).\"" -msgid "summonundead_effect_2" -msgstr "\"$unit($mage) stört in $region($region) die Ruhe der Toten.\"" - msgid "generous_effect_0" msgstr "\"$unit($mage) entertains the locals. The joyous and generous disposition of his songs prove infectious.\"" -msgid "generous_effect_0" -msgstr "\"Die Darbietungen von $unit($mage) begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer.\"" - msgid "curseinfo::generous" msgstr "\"Everyone in this region seems to be having a very good time. ($int36($id))\"" -msgid "curseinfo::generous" -msgstr "\"Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))\"" - msgid "buildroad" msgstr "\"$unit($unit) extends the road network in $region($region) by $int($size).\"" -msgid "buildroad" -msgstr "\"$unit($unit) erweitert in $region($region) das Straßennetz um $int($size).\"" - msgid "nr_borderlist_postfix" msgstr "\"$if($transparent,\" there is\",\" sight is blocked by \") ${object}.\"" -msgid "nr_borderlist_postfix" -msgstr "\"$if($transparent,\" befindet sich\",\" versperrt\") ${object}$if($transparent,\"\",\" die Sicht\").\"" - msgid "effectstrength" msgstr "\"$unit($mage) increases the strength of $unit($target) dramatically.\"" -msgid "effectstrength" -msgstr "\"$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich.\"" - msgid "wormhole_appear" msgstr "\"A wormhole appears in $region($region).\"" -msgid "wormhole_appear" -msgstr "\"In $region($region) erscheint ein Wurmloch.\"" - msgid "givecommand" msgstr "\"$unit($unit) gave control to $unit($recipient).\"" -msgid "givecommand" -msgstr "\"$unit($unit) gibt das Kommando an $unit($recipient).\"" - msgid "sink_msg" msgstr "\"$ship($ship) disappears in the depths of $region($region).\"" -msgid "sink_msg" -msgstr "\"$ship($ship) versinkt in den Fluten von $region($region).\"" - msgid "force_leave_building" msgstr "$unit($owner) asks $unit($unit) to leave $building($building)." -msgid "force_leave_building" -msgstr "$unit($owner) bittet $unit($unit), $building($building) zu verlassen." - msgid "hero_promotion" msgstr "\"$unit($unit) uses $int($cost) silber for a promotion.\"" -msgid "hero_promotion" -msgstr "\"$unit($unit) wird mit $int($cost) Silber zum Helden ernannt.\"" - msgid "renumber_inuse" msgstr "\"NUMBER FACTION $int36($id): This number is being used by another faction.\"" -msgid "renumber_inuse" -msgstr "\"NUMMER PARTEI $int36($id): Diese Nummer wird von einer anderen Partei benutzt.\"" - msgid "firewall_death" msgstr "\"$unit($unit) dies trying to cross the wall of fire into $region($region).\"" -msgid "firewall_death" -msgstr "\"$unit($unit) stirbt beim Versuch, die Feuerwand nach $region($region) zu durchqueren.\"" - msgid "skillpotion_use" msgstr "\"$unit($unit) uses a potion of skills and feels his knowledge grow.\"" -msgid "skillpotion_use" -msgstr "\"$unit($unit) benutzt einen Talenttrunk und fühlt, wie sein Wissen zunimmt.\"" - msgid "drown_on_ship" msgstr "\"$unit($unit) drowns when $ship($ship) in $region($region) sinks.\"" -msgid "drown_on_ship" -msgstr "\"$unit($unit) ertrinkt beim Untergang der $ship($ship) in $region($region).\"" - msgid "curseinfo::riotzone" msgstr "\"A fog of negative energy enshrouds the region. ($int36($id))\"" -msgid "curseinfo::riotzone" -msgstr "\"Eine Wolke negativer Energie liegt über der Region. ($int36($id))\"" - msgid "send_astral" msgstr "\"$unit($unit) sends $unit($target) to another world.\"" -msgid "send_astral" -msgstr "\"$unit($target) wird von $unit($unit) in eine andere Welt geschleudert.\"" - msgid "earthquake_effect" msgstr "\"$unit($mage) makes the earth shake in $region($region).\"" -msgid "earthquake_effect" -msgstr "\"$unit($mage) läßt die Erde in $region($region) erzittern.\"" - msgid "error56" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot tame that many horses.\"" -msgid "error56" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann soviele Pferde nicht bändigen.\"" - msgid "error78" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A curse prevented the transfer from happening.\"" -msgid "error78" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Fluch verhindert die Übergabe.\"" - msgid "questportal_lock" msgstr "\"$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" -msgid "questportal_lock" -msgstr "\"$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" - msgid "error45" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is one of our own.\"" -msgid "error45" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist eine der unsrigen.\"" - msgid "error67" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The horses would drown.\"" -msgid "error67" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Pferde würden ertrinken.\"" - msgid "detectforbiddendir" msgstr "\"$unit($unit) refuses to travel to the $direction($direction).\"" -msgid "detectforbiddendir" -msgstr "\"$unit($unit) weigert sich, nach $direction($direction) zu reisen.\"" - msgid "error197" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician has to be in a castle to create a homestone.\"" -msgid "error197" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um einen Heimstein zu erschaffen, muß der Zauberer in einer Burg sein.\"" - msgid "sp_flee_effect_1" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were consumed by fear.\"" -msgid "sp_flee_effect_1" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden von Furcht gepackt.\"" - msgid "overrun_by_iceberg_des" msgstr "\"The $ship($ship) has been destroyed by a collision with an iceberg.\"" -msgid "overrun_by_iceberg_des" -msgstr "\"Die $ship($ship) wird bei einer Kollision mit einem Eisberg zerstört.\"" - msgid "curseinfo::region_unknown" msgstr "\"An unknown spell lies on this region. ($int36($id))\"" -msgid "curseinfo::region_unknown" -msgstr "\"Ein unbekannter Zauber liegt auf der Region. ($int36($id))\"" - msgid "nr_market_price" msgstr "\"$resource($product,0) for $int($price) silver\"" -msgid "nr_market_price" -msgstr "\"$resource($product,0) $int($price) Silber\"" - msgid "error259" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That order only applies to units in the same building or ship.\"" -msgid "error259" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Befehl ist nur auf Einheiten innerhalb des selben Gebäudes oder Schiffes anwendbar.\"" - msgid "building_needed" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit must be in a $localize($building) to produce this.\"" -msgid "building_needed" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit steht nicht im benötigten Gebäude, $localize($building).\"" - msgid "error149" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Who is supposed to get this message?\"" -msgid "error149" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wohin soll die Botschaft gehen?\"" - msgid "curseinfo::building_unknown" msgstr "\"An unknown spell lies on this building. ($int36($id))\"" -msgid "curseinfo::building_unknown" -msgstr "\"Ein unbekannter Zauber liegt auf dem Gebäude. ($int36($id))\"" - msgid "error145" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a castle.\"" -msgid "error145" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Burg.\"" - msgid "piratenovictim" msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"The $ship($ship)\") could not capture other ships in $region($region).\"" -msgid "piratenovictim" -msgstr "\"$if($isnull($ship),\"$unit($unit)\",\"Die $ship($ship)\") in $region($region) kann keine Schiffe aufbringen.\"" - msgid "questportal_unlock" msgstr "\"$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),\"the Agate Key\",\"the Sapphire Key\").\"" -msgid "questportal_unlock" -msgstr "\"$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),\"dem Achatenen Schlüssel\",\"dem Saphirnen Schlüssel\").\"" - msgid "error255" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this.\"" -msgid "error255" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern.\"" - msgid "entrance_besieged" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege.\"" -msgid "entrance_besieged" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert.\"" - msgid "error260" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted.\"" -msgid "error260" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden.\"" - msgid "nr_market_info_s" msgstr "\"The local market offers $resource($p1,0).\"" -msgid "nr_market_info_s" -msgstr "\"Auf dem Markt wird $resource($p1,0) feilgeboten.\"" - msgid "error141" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough crystals left for this many people.\"" -msgid "error141" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht mehr genug Kristalle für so viele Personen.\"" - msgid "error106" msgstr "\"$unit($unit) in $region($region): '$order($command)' - When studying, magicians need to be alone.\"" -msgid "error106" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier müssen zum studieren allein sein.\"" - msgid "race_no_attack" msgstr "\"'$order($command)' - $race($race,0) are peace-loving and will not attack anyone.\"" -msgid "race_no_attack" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) sind friedliebend und attackieren niemand.\"" - msgid "error216" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" -msgid "error216" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Verbindung zur astralen Welt.\"" - msgid "error771" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this skill.\"" -msgid "error771" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann die Einheit nicht lernen.\"" - msgid "error212" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship.\"" -msgid "error212" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff.\"" - msgid "stormwinds_effect" msgstr "\"$unit($unit) calls up a magical storm that whips the ship over the waters.\"" -msgid "stormwinds_effect" -msgstr "\"$unit($unit) beschwört einen magischen Wind, der die Schiffe über das Wasser treibt.\"" - msgid "error102" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade any more goods.\"" -msgid "error102" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren Güter handeln.\"" - msgid "sp_drought_effect" msgstr "\"$unit($mage) puts a curse on the lands of $region($region) and a drought sets in.\"" -msgid "sp_drought_effect" -msgstr "\"$unit($mage) verflucht das Land in $region($region), und eine Dürreperiode beginnt.\"" - msgid "error_giveeye" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A higher power prevents $unit($unit) from giving the object away. 'IT IS YOURS MY CHILD. ONLY YOURS.'.\"" -msgid "error_giveeye" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine höhere Macht hindert $unit($unit) daran, das Objekt zu übergeben. 'ES IST DEINS, MEIN KIND. DEINS GANZ ALLEIN'.\"" - msgid "curseinfo::buildingunknown" msgstr "\"A magical shimmer lies on these walls. ($int36($id))\"" -msgid "curseinfo::buildingunknown" -msgstr "\"Ein magischer Schimmer liegt auf diesen Mauern. ($int36($id))\"" - msgid "changebanner" msgstr "\"Banner has been changed to '$value'.\"" -msgid "changebanner" -msgstr "\"Das Banner wurde auf '$value' geändert.\"" - msgid "curseinfo::skill_2" msgstr "\"$unit($unit) has some troubles with $skill($skill). ($int36($id))\"" -msgid "curseinfo::skill_2" -msgstr "\"$unit($unit) ist ungewöhnlich ungeschickt in $skill($skill). ($int36($id))\"" - msgid "spellfail::noway" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no route leading there.\"" -msgid "spellfail::noway" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg.\"" - msgid "spellbuildingresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be charmed.\"" -msgid "spellbuildingresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) konnte nicht verzaubert werden.\"" - -msgid "after_battle" -msgstr "\"Units after the battle:\"" - -msgid "after_battle" -msgstr "\"Einheiten nach dem Kampf:\"" - msgid "nr_claims" msgstr "\"Units can claim the following items: $resources($items)\"" -msgid "nr_claims" -msgstr "\"Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)\"" - -msgid "destroy_ship_2" -msgstr "\"$unit($unit) wurde beim Versuch $ship($ship) zu zerstören entdeckt.\"" - msgid "destroy_ship_2" msgstr "\"$unit($unit) was detected while trying to destroy $ship($ship).\"" msgid "destroy_magic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys $int($succ) spells on ${target}.\"" -msgid "destroy_magic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört $int($succ) Flüche auf ${target}.\"" - msgid "battle_row" msgstr "\"... in combat rank $int($row):\"" -msgid "battle_row" -msgstr "\"... in der $int($row). Kampflinie:\"" - msgid "renamed_faction_seen" msgstr "\"Your faction received a nickname from $unit($unit) in $region($region).\"" -msgid "renamed_faction_seen" -msgstr "\"Die Partei bekommt von $unit.dative($unit) in $region($region) einen Spitznamen.\"" - msgid "error_not_on_undead" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast upon undead.\"" -msgid "error_not_on_undead" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" - msgid "iceberg_melt" msgstr "\"The iceberg $region($region) melts.\"" -msgid "iceberg_melt" -msgstr "\"Der Eisberg $region($region) schmilzt.\"" - msgid "cast_berserk_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters went into a mindless rage.\"" -msgid "cast_berserk_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in einen Blutrausch versetzt.\"" - msgid "curseinfo::sparkle_1" msgstr "\"In a dream, a fairy appears to $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_1" -msgstr "\"$unit($unit) ist im Traum eine Fee erschienen. ($int36($id))\"" - msgid "rust_effect_0" msgstr "\"$unit($mage) calls forth a terrible torment over the enemy side, but there was nobody who could be affected by it.\"" -msgid "rust_effect_0" -msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte.\"" - msgid "error1222" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" -msgid "error1222" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" - msgid "header_battle" msgstr "\"There is a battle in $region($region).\"" -msgid "header_battle" -msgstr "\"In $region($region) findet ein Kampf statt.\"" - msgid "wormhole_dissolve" msgstr "\"The wormhole in $region($region) disappears.\"" -msgid "wormhole_dissolve" -msgstr "\"Das Wurmloch in $region($region) schließt sich.\"" - msgid "error23" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege.\"" -msgid "error23" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich.\"" - msgid "error12" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is not ours.\"" -msgid "error12" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht.\"" - msgid "error34" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit has no permission to come on board.\"" -msgid "error34" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen.\"" - msgid "income_steal" msgstr "\"$unit($unit) steals $int($amount) silver in $region($region).\"" -msgid "income_steal" -msgstr "\"$unit($unit) klaut in $region($region) $int($amount) Silber.\"" - msgid "itemcrumble" msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) turn to dust.\"" -msgid "itemcrumble" -msgstr "\"$unit($unit) in $region($region): $int($amount) $resource($item,$amount) zerfallen zu Staub.\"" - msgid "error86" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong password.\"" -msgid "error86" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Falsches Passwort.\"" - msgid "luxury_notsold" msgstr "\"$unit($unit) in $region($region): '$order($command)' - These goods are not on sale here.\"" -msgid "luxury_notsold" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Luxusgut wird hier nicht verkauft.\"" - msgid "error75" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit does not accept anybody.\"" -msgid "error75" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit nimmt niemanden an.\"" - msgid "error97" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insects cannot be recruited in glacier regions.\"" -msgid "error97" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In Gletschern können keine Insekten rekrutiert werden.\"" - msgid "regionmagic_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on the region.\"" -msgid "regionmagic_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es die Region zu verzaubern.\"" - msgid "error158" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magicians always work alone!\"" -msgid "error158" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magier arbeiten grundsätzlich nur alleine!\"" - msgid "spyreport_mage" msgstr "\"$unit($target) is a ${type}-magician\"" -msgid "spyreport_mage" -msgstr "\"$unit($target) ist ein ${type}-Magier.\"" - msgid "error268" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot transfer items here.\"" -msgid "error268" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nichts übergeben.\"" - msgid "error264" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this good.\"" -msgid "error264" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieses Gut hat die Einheit nicht.\"" - -msgid "battle_army" -msgstr "\"Army $int($index): $name\"" - -msgid "battle_army" -msgstr "\"Heer $int($index): $name\"" - msgid "error154" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Highly qualified people refuse to work for other parties.\"" -msgid "error154" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hochqualifizierte Personen weigern sich, für andere Parteien zu arbeiten.\"" - msgid "error_notstonecircle" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) is not a stone circle.\"" -msgid "error_notstonecircle" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) ist kein Steinkreis.\"" - msgid "error150" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building.\"" -msgid "error150" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen.\"" - msgid "error229" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A familiar is summoned, but it disappears again when it cannot get in contact with its natural element.\"" -msgid "error229" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Vertrauter wird beschworen, verschwindet jedoch wieder, als er keine Verbindung zu seinem Element herstellen kann.\"" - msgid "error_migrants_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migrants cannot study this.\"" -msgid "error_migrants_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Migranten können keine kostenpflichtigen Talente lernen.\"" - msgid "error225" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Starving units do not fight.\"" -msgid "error225" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungernde Soldaten kämpfen nicht.\"" - msgid "error115" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number is already in use.\"" -msgid "error115" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer ist schon belegt.\"" - msgid "spell_out_of_range" msgstr "\"$unit($mage) casts $spell($spell), but nobody was in range.\"" -msgid "spell_out_of_range" -msgstr "\"$unit($mage) zaubert $spell($spell), aber niemand war in Reichweite.\"" - msgid "error111" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Message has been cut (too long).\"" -msgid "error111" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nachricht zu lang - gekürzt.\"" - msgid "error221" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build this here.\"" -msgid "error221" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man hier nicht bauen.\"" - msgid "error_race_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot study.\"" -msgid "error_race_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts lernen.\"" - msgid "buy" msgstr "\"$unit($unit) pays $int($money) silver for luxury items.\"" -msgid "buy" -msgstr "\"$unit($unit) bezahlt $int($money) Silber für den Kauf von Luxusgütern.\"" - msgid "curseinfo::sparkle_15" msgstr "\"Rats follow $unit($unit)'s every step. ($int36($id))\"" -msgid "curseinfo::sparkle_15" -msgstr "\"Ratten folgen $unit($unit) auf Schritt und Tritt. ($int36($id))\"" - msgid "arena_enter_fail" msgstr "\"$region($region) reverberates from the voice of the gate keeper: 'Only those who forgo material riches and who are willing to learn my enter the Plane of Challenge. And don't forget about my tip!'. $unit($unit) was not admitted.\"" -msgid "arena_enter_fail" -msgstr "\"In $region($region) erklingt die Stimme des Torwächters: 'Nur wer ohne materielle Güter und noch lernbegierig ist, der darf die Ebene der Herausforderung betreten. Und vergiß nicht mein Trinkgeld.'. $unit($unit) erhielt keinen Einlaß.\"" - -msgid "aurapotion50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated.\"" - -msgid "aurapotion50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt.\"" - msgid "curseinfo::deathcloud" msgstr "\"A poison elemental is spreading pestilence and death. ($int36($id))\"" -msgid "curseinfo::deathcloud" -msgstr "\"In der Region treibt ein Giftelementar sein Unwesen. ($int36($id))\"" - msgid "income" msgstr "\"$unit($unit) earns $int($amount)$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") in $region($region) $if($eq($mode,1),\" by entertainment\",$if($eq($mode,2),\" by taxes\",$if($eq($mode,3),\" by trade\",$if($eq($mode,5),\" by stealing\",$if($eq($mode,6),\" by magic\",$if($eq($mode,7),\" by pillaging\",\"\")))))).\"" -msgid "income" -msgstr "\"$unit($unit) verdient$if($eq($mode,4),\" am Handel\",\"\") in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber$if($eq($mode,1),\" durch Unterhaltung\",$if($eq($mode,2),\" durch Steuern\",$if($eq($mode,3),\" durch Handel\",$if($eq($mode,5),\" durch Diebstahl\",$if($eq($mode,6),\" durch Zauberei\",$if($eq($mode,7),\" durch Plündern\",\"\")))))).\"" - msgid "researchherb" msgstr "\"$unit($unit) discovers that $localize($amount) $resource($herb,0) grow in $region($region).\"" -msgid "researchherb" -msgstr "\"$unit($unit) in $region($region) stellt fest, dass es hier $localize($amount) $resource($herb,0) gibt.\"" - msgid "poison_death" msgstr "\"$unit($unit) dies from poison damage taken in $region($region).\"" -msgid "poison_death" -msgstr "\"$unit($unit) stirbt am Schaden durch den Giftelementar in $region($region).\"" - msgid "error_notcomplete" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) has to be complete before it can be blessed.\"" -msgid "error_notcomplete" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $building($building) muss vor der Weihe fertiggestellt sein.\"" - msgid "regenaura" msgstr "\"$unit($unit) regenerates $int($amount) aura in $region($region).\"" -msgid "regenaura" -msgstr "\"$unit($unit) in $region($region) regeneriert $int($amount) Aura.\"" - msgid "regionmagic_patzer" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) manages to put a spell on the region, but something went wrong nonetheless.\"" -msgid "regionmagic_patzer" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es zwar die Region zu verzaubern, aber irgendwas ging schief.\"" - msgid "curseinfo::sparkle_11" msgstr "\"Bird songs follow $unit($unit) on all his travels. ($int36($id))\"" -msgid "curseinfo::sparkle_11" -msgstr "\"Vogelzwitschern begleitet $unit($unit) auf all seinen Wegen. ($int36($id))\"" - msgid "wdw_pyramidspell_notfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away.\"" -msgid "wdw_pyramidspell_notfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Region können keine Pyramiden gebaut werden. Die nächste Pyramidenregion ist zwischen $int($mindist) und $int($maxdist) Regionen entfernt.\"" - msgid "sailforbidden" msgstr "\"The crew of the $ship($ship) refuses to travel to $region($region).\"" -msgid "sailforbidden" -msgstr "\"Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen.\"" - msgid "sp_raisepeasantmob_effect" msgstr "\"$unit($mage) incites a revolt among the peasants of $region($region).\"" -msgid "sp_raisepeasantmob_effect" -msgstr "\"$unit($mage) wiegelt in $region($region) die Bauern zum Aufstand auf.\"" - msgid "error31" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The castle could not be found.\"" -msgid "error31" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Burg wurde nicht gefunden.\"" - msgid "error53" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot make potions.\"" -msgid "error53" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine Tränke herstellen.\"" - msgid "error20" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship could not be found.\"" -msgid "error20" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff wurde nicht gefunden.\"" - msgid "error42" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough coachmen or has too much freights to lad the wagons.\"" -msgid "error42" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Wagenlenker oder zuviel andere Fracht, um die Wagen aufzuladen.\"" - msgid "error64" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) is not sufficiently stealthy.\"" -msgid "error64" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ist nicht ausreichend getarnt.\"" - msgid "curseinfo::itemcloak" msgstr "\"$unit($unit)'s equipment is invisible. ($int36($id))\"" -msgid "curseinfo::itemcloak" -msgstr "\"Die Ausrüstung von $unit($unit) scheint unsichtbar. ($int36($id))\"" - msgid "error277" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot do this.\"" -msgid "error277" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann die Einheit nicht.\"" - msgid "error94" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot build a road here.\"" -msgid "error94" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Straße bauen.\"" - msgid "error167" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not go to the peasants.\"" -msgid "error167" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit geht nicht zu den Bauern.\"" - msgid "use_realworld_only" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This object can only be used in the real world.\"" -msgid "use_realworld_only" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand kann nur in der realen Welt benutzt werden.\"" - msgid "error163" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This potion can only be used by insects.\"" -msgid "error163" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Nestwärme kann nur von Insektenvölkern benutzt werden.\"" - msgid "error273" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot teach here.\"" -msgid "error273" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht unterrichten.\"" - msgid "error238" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You can recruit only orcs here.\"" -msgid "error238" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier können nur Orks rekrutiert werden.\"" - msgid "spellfail::nocontact" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $region($target) could not be contacted.\"" -msgid "spellfail::nocontact" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zu $region($target) kann kein Kontakt hergestellt werden.\"" - msgid "error119" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no marketplace without at least a tradepost.\"" -msgid "error119" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ohne einen Handelsposten gibt es keinen Markt.\"" - msgid "error124" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot buy that on a market place.\"" -msgid "error124" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht auf dem Markt kaufen.\"" - msgid "santa_m" msgstr "'Ho ho ho!' A fat little gnome Gnom on a sled pulled by 8 young dragons flies through the stary night and presents your faction with a $resource($item,1)." -msgid "santa_m" -msgstr "'Ho ho ho!' Ein dicker Gnom fliegt auf einem von 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner Partei einen $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)')." - msgid "error234" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is busy disembarking.\"" -msgid "error234" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit Ausschiffen beschäftigt..\"" - msgid "spellfail::nolevel" msgstr "\"$unit($mage) in $region($region): '$order($command)' - This spell cannot be cast with variable level.\"" -msgid "spellfail::nolevel" -msgstr "\"$unit($mage) in $region($region): '$order($command)' - Dieser Zauber kann nicht mit Stufenangabe gezaubert werden.\"" - msgid "nr_score" msgstr "\"Your faction has a score of ${score}. The average score for similar factions is ${average}.\"" -msgid "nr_score" -msgstr "\"Deine Partei hat ${score} Punkte. Der Durchschnitt für Parteien ähnlichen Alters ist ${average} Punkte.\"" - msgid "curseinfo::ship_unknown" msgstr "\"An unknown spell lies on this ship. ($int36($id))\"" -msgid "curseinfo::ship_unknown" -msgstr "\"Ein unbekannter Zauber liegt auf dem Schiff. ($int36($id))\"" - msgid "alliance::kickedout" msgstr "\"$faction($member) was kicked from $alliance($alliance) by $int($votes) of the alliance's members.\"" -msgid "alliance::kickedout" -msgstr "\"$faction($member) ist mit $int($votes) Stimmen aus $alliance($alliance) ausgeschlossen worden.\"" - msgid "error230" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot transport us to this place.\"" -msgid "error230" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin kann die Einheit uns nicht transportieren.\"" - msgid "error120" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Characters can be given only to human parties.\"" -msgid "error120" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Personen können nur an Menschen übergeben werden.\"" - msgid "error_max_alchemists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There may not be more tha $int($amount) alchemists in your faction.\"" -msgid "error_max_alchemists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Alchemisten pro Partei geben.\"" - msgid "error305" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Options ZIP and BZIP2 can only be switched, not turned off.\"" -msgid "error305" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Optionen ZIP und BZIP2 können nur um-, nicht ausgeschaltet werden.\"" - msgid "error301" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym missing.\"" -msgid "error301" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Kein Synonym angegeben.\"" - msgid "iceberg_drift" msgstr "\"The iceberg $region($region) drifts $direction($dir).\"" -msgid "iceberg_drift" -msgstr "\"Der Eisberg $region($region) treibt nach $direction($dir).\"" - msgid "hornofpeace_r_success" msgstr "\"$unit($unit) in $region($region) blows the Horn of Dancing. Peaceful harmony spreads over the region.\"" -msgid "hornofpeace_r_success" -msgstr "\"$unit($unit) in $region($region) bläst das Horn des Tanzes. In der ganzen Region breitet sich eine friedliche Feststimmmung aus.\"" - msgid "nr_vicinitystart" msgstr "\"To the $direction($dir) lies $trailto($region)\"" -msgid "nr_vicinitystart" -msgstr "\"Im $direction($dir) der Region liegt $trailto($region)\"" - msgid "giverestriction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction must be at least $int($turns) weeks old to give something to another faction.\"" -msgid "giverestriction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Deine Partei muss mindestens $int($turns) alt sein, um etwas an andere Parteien übergeben zu können.\"" - msgid "curseinfo::depression" msgstr "\"The peasants are upset. ($int36($id))\"" -msgid "curseinfo::depression" -msgstr "\"Die Bauern sind unzufrieden. ($int36($id))\"" - msgid "patzer" msgstr "\"$unit($unit) fumbles while casting $spell($spell) in $region($region).\"" -msgid "patzer" -msgstr "\"$unit($unit) unterläuft in $region($region) beim Zaubern von $spell($spell) ein Patzer.\"" - msgid "potionsave" msgstr "\"A fighter of $unit($unit) was saved by a healing potion.\"" -msgid "potionsave" -msgstr "\"Eine Person von $unit($unit) konnte durch einen Heiltrank überleben.\"" - msgid "storm" msgstr "\"The $ship($ship) in $region($region) gets off course in heavy storm$if($sink,\" and sinks\",\"\").\"" -msgid "storm" -msgstr "\"Die $ship($ship) wird in $region($region) von Stürmen abgetrieben$if($sink,\" und sinkt\",\"\").\"" - msgid "nr_insectwinter" msgstr "It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions." -msgid "nr_insectwinter" -msgstr "Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren." - msgid "spellfail_nomonsters" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on monsters.\"" -msgid "spellfail_nomonsters" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Monster gezaubert werden.\"" - msgid "bagpipeoffear_region" msgstr "\"$unit($unit) plays the bagpipe. Stricken with fear the peasants give $int($money) silver.\"" -msgid "bagpipeoffear_region" -msgstr "\"$unit($unit) spielt einen Dudelsack. Ausser sich vor Furcht geben die Bauern $int($money) Silber.\"" - msgid "sp_chaosrow_effect_1" msgstr "\"$unit($mage) mumbles arcane words. There is a sudden hubbub and the battle order is disturbed.\"" -msgid "sp_chaosrow_effect_1" -msgstr "\"$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander.\"" - msgid "use_item" msgstr "\"$unit($unit) uses $int($amount) $resource($item,$amount).\"" -msgid "use_item" -msgstr "\"$unit($unit) benutzt $int($amount) $resource($item,$amount).\"" - msgid "sp_movecastle_effect" msgstr "\"An tremor shakes $building($building). Many little pseudopods lift up the building and carry it to $direction($direction).\"" -msgid "sp_movecastle_effect" -msgstr "\"Ein Beben erschüttert $building($building). Viele kleine Pseudopodien erheben das Gebäude und tragen es in Richtung $direction($direction).\"" - msgid "feedback_no_contact_resist" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, and resists the spell.\"" -msgid "feedback_no_contact_resist" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen und widersteht dem Zauber.\"" - msgid "error176" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell on a distant target.\"" -msgid "error176" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht in die Ferne richten.\"" - msgid "error286" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not transporting us.\"" -msgid "error286" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit transportiert uns nicht.\"" - msgid "error83" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No peasant could be caught.\"" -msgid "error83" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnte kein Bauer gefangen werden.\"" - msgid "error50" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not experienced enough to do this.\"" -msgid "error50" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht erfahren genug dafür.\"" - msgid "error282" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot start a jihad against this race.\"" -msgid "error282" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Gegen diese Rasse kann kein Jihad ausgerufen werden.\"" - msgid "nmr_warning_final" msgstr "\"Please send in orders for the next turn if you want to continue playing.\"" -msgid "nmr_warning_final" -msgstr "\"Bitte sende die Befehle nächste Runde ein, wenn du weiterspielen möchtest.\"" - msgid "error172" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There was no spell supplied.\"" -msgid "error172" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Zauber angegeben.\"" - msgid "entrance_denied" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Entrance to $building($building) was denied.\"" -msgid "entrance_denied" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Eintritt in $building($building) wurde verwehrt.\"" - msgid "maelstrom_effect" msgstr "\"$unit($mage) summons the power of the seas and a giant maelstrom forms.\"" -msgid "maelstrom_effect" -msgstr "\"$unit($mage) beschwört die Mächte des Wassers und ein gigantischer Strudel bildet sich.\"" - msgid "displayitem" msgstr "\"$resource($item,1) (weight: $weight($weight)): $description\"" -msgid "displayitem" -msgstr "\"$resource($item,1) (Gewicht: $weight($weight)): $description\"" - msgid "error128" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many strangers.\"" -msgid "error128" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann die Partei nicht aufnehmen.\"" - msgid "error247" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction is already named.\"" -msgid "error247" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei hat schon einen Namen.\"" - msgid "spellfail_generous" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mood in this region is so bad that nobody reacts to the spell.\"" -msgid "spellfail_generous" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Stimmung in der Region ist so schlecht, dass niemand auf den Zauber reagiert.\"" - msgid "healing_effect_0" msgstr "\"$unit($mage) sees after the wounded and heals $int($amount).\"" -msgid "healing_effect_0" -msgstr "\"$unit($mage) kümmert sich um die Verletzten und heilt $int($amount) Verwundete.\"" - msgid "use_questkey_wrongregion" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No fitting lock can be found here.\"" -msgid "use_questkey_wrongregion" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier ist kein passendes Schloss.\"" - msgid "error243" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You did not specify a valid race.\"" -msgid "error243" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keine gültige Rasse angegeben.\"" - msgid "error133" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You must build a caravansary before building roads through deserts.\"" -msgid "error133" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um in Wüsten Straßen bauen zu können, muß zuerst eine Karawanserei errichtet werden.\"" - msgid "changepasswd" msgstr "\"The password of this faction is '$value'.\"" -msgid "changepasswd" -msgstr "\"Das Passwort für diese Partei lautet ${value}.\"" - msgid "cast_combatspell" msgstr "\"$unit($mage) casts $spell($spell): $int($dead) $if($eq($dead,1),\"enemy was\", \"enemies were\") killed.\"" -msgid "cast_combatspell" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($dead) $if($eq($dead,1),\"Krieger wurde\", \"Krieger wurden\") getötet.\"" - msgid "cast_petrify_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were petrified.\"" -msgid "cast_petrify_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurden versteinert.\"" - msgid "error309" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit already assumed lycantropic form.\"" -msgid "error309" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist schon ein Werwesen.\"" - msgid "nr_stat_salary_new" msgstr "\"peasant wages: $int($max) silver\"" -msgid "nr_stat_salary_new" -msgstr "\"Bauerneinnahmen: $int($max) Silber\"" - msgid "income_magic_reduced" msgstr "\"$unit($unit) in $region($region) earns $int($amount)$if($eq($wanted,$amount),\"\",\" instead of $int($wanted)\") silver through magic.\"" -msgid "income_magic_reduced" -msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Zauberei.\"" - -msgid "destroy_ship_1" -msgstr "\"$unit($unit) konnte $ship($ship) nicht zerstören.\"" - msgid "destroy_ship_1" msgstr "\"$unit($unit) could not destroy $ship($ship).\"" msgid "error314" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Restart can only be used once.\"" -msgid "error314" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Partei kann nur einmal neu starten.\"" - msgid "error310" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit is not in lycantropic form.\"" -msgid "error310" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist kein Werwesen.\"" - msgid "error_pflnorecruit" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot recruit in this plane.\"" -msgid "error_pflnorecruit" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Ebene der Herausforderung kann niemand rekrutiert werden.\"" - msgid "sp_mindblast_temp_effect" msgstr "\"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories.\"" -msgid "sp_mindblast_temp_effect" -msgstr "\"$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren kurzzeitig ihr Gedächtnis.\"" - msgid "buildbuilding" msgstr "\"$unit($unit) builds $int($size) more on $building($building).\"" -msgid "buildbuilding" -msgstr "\"$unit($unit) baut für $int($size) an $building($building) weiter.\"" - msgid "spellfail_astralblock" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The paths to the spirit world seem to be blocked.\"" -msgid "spellfail_astralblock" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege zwischen Geisterwelt und Realität scheinen blockiert zu sein.\"" - msgid "familiar_toofar" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot raise enough energy to channel the spell through $unit($unit).\"" -msgid "familiar_toofar" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann nicht genug Energie aufbringen, um diesen Spruch durch $unit($unit) zu wirken.\"" - msgid "wdw_pyramidspell_found" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Pyramids may be build in this region.\"" -msgid "wdw_pyramidspell_found" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Regione können Pyramiden gebaut werden.\"" - msgid "deorcified" msgstr "\"Little by little, people return to $region($region).\"" -msgid "deorcified" -msgstr "\"Langsam kehren andere Völker nach $region($region) zurück.\"" - msgid "sp_movecastle_fail_1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction).\"" -msgid "sp_movecastle_fail_1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen.\"" - msgid "curseinfo::strength" msgstr "\"Testosterone levels are at an all-time high. ($int36($id))\"" -msgid "curseinfo::strength" -msgstr "\"Die Leute strotzen nur so vor Kraft. ($int36($id))\"" - msgid "magic_fumble" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician is caught in their own spell.\"" -msgid "magic_fumble" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier verfängt sich im eigenen Zauber.\"" - msgid "teach_nolearn" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) is not learning.\"" -msgid "teach_nolearn" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($student) lernt nicht.\"" - msgid "regionowned" msgstr "\"$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance.\"" -msgid "regionowned" -msgstr "\"$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte.\"" - msgid "income_tradetax" msgstr "\"$unit($unit) collected $int($amount) silver trade tax in $region($region).\"" -msgid "income_tradetax" -msgstr "\"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber.\"" - msgid "error19" msgstr "\"$unit($unit) in $region($region): '$order($command)' - First you have to leave the ship.\"" -msgid "error19" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff muß erst verlassen werden.\"" - msgid "buyamount" msgstr "\"$unit($unit) buys $int($amount) $resource($resource,$amount).\"" -msgid "buyamount" -msgstr "\"$unit($unit) kauft $int($amount) $resource($resource,$amount).\"" - msgid "fumblecurse" msgstr "\"$unit($unit) in $region($region) was cursed by an unknown magician.\"" -msgid "fumblecurse" -msgstr "\"$unit($unit) in $region($region) wird von einem Unbekannten verflucht.\"" - msgid "regionmessage" msgstr "\"A message by $unit($sender) from $region($region): '$string'\"" -msgid "regionmessage" -msgstr "\"Eine Botschaft von $unit.dative($sender) aus $region($region): '$string'\"" - msgid "spellfail_noundead" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on undead.\"" -msgid "spellfail_noundead" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden.\"" - msgid "studycost" msgstr "\"$unit($unit) spends $int($cost) silver in $region($region) to study $skill($skill).\"" -msgid "studycost" -msgstr "\"$unit($unit) in $region($region) verbraucht $int($cost) Silber für das Studium von $skill($skill).\"" - msgid "flying_ship_result" msgstr "\"$unit($mage) summons a wind spirit that lifts the $ship($ship) into the clouds.\"" -msgid "flying_ship_result" -msgstr "\"$unit($mage) beschwört einen Luftgeist, der die $ship($ship) in die Wolken hebt.\"" - msgid "forestfire_spread" msgstr "\"The fire in $region($region) spread to $region($next) and $int($trees) were burned.\"" -msgid "forestfire_spread" -msgstr "\"Der Waldbrand in $region($region) griff auch auf $region($next) über, und $int($trees) verbrannten.\"" - msgid "maintenancefail" msgstr "\"$unit($unit) cannot pay the maintenance for $building($building).\"" -msgid "maintenancefail" -msgstr "\"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen.\"" - msgid "bagpipeoffear_faction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Stricken with fear the peasants give the bard $int($money) silver.\"" -msgid "bagpipeoffear_faction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ausser sich vor Furcht geben die Bauern dem Barden $int($money) Silber.\"" - msgid "unitmessage" msgstr "\"In $region($region), $unit($unit) received a message by $unit($sender): '$string'\"" -msgid "unitmessage" -msgstr "\"In $region($region) erhielt $unit($unit) eine Botschaft von $unit.dative($sender): '$string'\"" +msgid "para_after_battle" +msgstr "\"Units after the battle:\"" msgid "error189" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even the gods cannot dry out an entire ocean.\"" -msgid "error189" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst der mächtigste Magier der Welt könnte keinen Ozean austrocknen lassen.\"" - msgid "teach_student" msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill).\"" -msgid "teach_student" -msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill).\"" - msgid "curseinfo::astralblock" msgstr "\"Powerful magic disrupts our contact with reality. ($int36($id))\"" -msgid "curseinfo::astralblock" -msgstr "\"Mächtige Magie verhindert den Kontakt zur Realität. ($int36($id))\"" - msgid "error299" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid prefix.\"" -msgid "error299" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Prefix.\"" - msgid "curseinfo::baddream" msgstr "\"Nightmares plague the population. ($int36($id))\"" -msgid "curseinfo::baddream" -msgstr "\"Albträume plagen die Leute. ($int36($id))\"" - msgid "error295" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Only mages may use an astralcrystal.\"" -msgid "error295" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nur ein Magier kann einen Astralkristall benutzen.\"" - msgid "error185" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell seems exceptionally weak. Something has interfred with the magical energies.\"" -msgid "error185" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber scheint ungewöhnlich schwach zu sein. Irgendetwas hat die magischen Energien abgeleitet.\"" - msgid "error181" msgstr "\"$unit($unit) in $region($region): '$order($command)' - To do this, the magician has to be in a castle or on board a ship.\"" -msgid "error181" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu muß sich der Magier in der Burg oder an Bord des Schiffes befinden.\"" - msgid "error291" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keinem Verband.\"" msgid "curseinfo::calm_0" msgstr "\"$unit($unit) seems to like $race($race, 0). ($int36($id))\"" -msgid "curseinfo::calm_0" -msgstr "\"$unit($unit) scheint $race($race, 0) zu mögen. ($int36($id))\"" - msgid "error256" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot pray for this.\"" -msgid "error256" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Um so etwas kann man nicht beten.\"" - msgid "desertion" msgstr "\"$unit($unit) in $region($region) abandons your cause.\"" -msgid "desertion" -msgstr "\"$unit($unit) in $region($region) desertiert.\"" - msgid "error91" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are no mallorn trees here.\"" -msgid "error91" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Mallornbäume.\"" - msgid "error137" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown help mode.\"" -msgid "error137" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Hilfe-Modus.\"" - msgid "error80" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight.\"" -msgid "error80" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit ist nicht bewaffnet und kampffähig.\"" - msgid "error142" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver for recruiting.\"" -msgid "error142" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat zuwenig Silber, um zu rekrutieren.\"" - msgid "rust_fail" msgstr "\"$unit($mage) puts a spell of rust on $unit($target) but it found nothing to consume.\"" -msgid "rust_fail" -msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target), doch der Rosthauch fand keine Nahrung.\"" - msgid "error252" msgstr "\"$unit($unit) in $region($region): '$order($command)' - What and how much should be sacrificed?\"" -msgid "error252" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Was und wieviel soll geopfert werden?\"" - msgid "dissolve_units_3" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) whithered and died.\"" -msgid "dissolve_units_3" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"verfaulte\", \"verfaulten\").\"" - msgid "trappedairelemental_success" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster.\"" -msgid "trappedairelemental_success" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die $ship($ship) wird jetzt schneller ihr Ziel erreichen.\"" - msgid "error208" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Wrong aura values.\"" -msgid "error208" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft.\"" - msgid "error318" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building can be expanded only once per turn.\"" -msgid "error318" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude kann nur einmal pro Runde erweitert werden.\"" - msgid "teach_asgood" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) needs to be at least 2 levels better than $unit($student).\"" -msgid "teach_asgood" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) muß mindestens 2 Stufen besser sein als $unit($student).\"" - msgid "drought_effect_1" msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). Ice melts and turns the lands into swamps. Powerful rivers wash away the fertile soil and drown people and animals alike. What buildings have not succumbed to the floods sink into the mire. The torrid sun changes the region forever.\"" -msgid "drought_effect_1" -msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Eis schmilzt und verwandelt sich in Morast. Reißende Ströme spülen die mageren Felder weg und ersäufen Mensch und Tier. Was an Bauten nicht den Fluten zum Opfer fiel, verschlingt der Morast. Die sengende Hitze verändert die Region für immer.\"" - msgid "error204" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a region without trees.\"" -msgid "error204" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In einer Region ohne Bäume kann man diesen Zauber nicht wirken.\"" - msgid "patzer5" msgstr "\"$unit($unit) feels far more exhausted than he should after casting $spell($spell) and assumes that any following spells will cost far more energy than usual.\"" -msgid "patzer5" -msgstr "\"$unit($unit) fühlt sich nach dem Zaubern von $spell($spell) viel erschöpfter als sonst und hat das Gefühl, dass alle weiteren Zauber deutlich mehr Kraft als normalerweise kosten werden.\"" - msgid "analyse_region_age" msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for about $int($months) more weeks.\"" -msgid "analyse_region_age" -msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt.\"" - msgid "plague_spell" msgstr "\"$unit($mage) sends the plague on $region($region).\"" -msgid "plague_spell" -msgstr "\"$unit($mage) ruft in $region($region) eine Pest hervor.\"" - msgid "error200" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Magician's maximum aura is not high enough for this spell.\"" -msgid "error200" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die maximale Aura reicht nicht für diesen Zauber.\"" - msgid "shipnoshore" msgstr "\"The $ship($ship) discovers that $region($region) is dry land.\"" -msgid "shipnoshore" -msgstr "\"Die $ship($ship) entdeckt, dass $region($region) Festland ist.\"" - msgid "sp_sweetdreams_effect" msgstr "\"$unit($mage) causes $unit($unit) to have a wonderful night in $region($region).\"" -msgid "sp_sweetdreams_effect" -msgstr "\"$unit($mage) verschafft $unit($unit) ein schönes Nachtleben in $region($region).\"" - msgid "error3" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Description has been cut (too long).\"" -msgid "error3" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Beschreibung zu lang - gekürzt.\"" - msgid "charming_effect" msgstr "\"$unit($mage) chamrs $unit($unit). $unit($unit) will obey our orders for approximatley $int($duration) more weeks.\"" -msgid "charming_effect" -msgstr "\"$unit($mage) gelingt es $unit($unit) zu verzaubern. $unit($unit) wird für etwa $int($duration) Wochen unseren Befehlen gehorchen.\"" - msgid "target_region_invalid" msgstr "\"$unit($unit) in $region($region): '$order($command)' - invalid target region.\"" -msgid "target_region_invalid" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültige Zielregion.\"" - msgid "nr_heroes" msgstr "\"Your faction has promoted $int($units) heroes out of a possible total of $int($maxunits).\"" -msgid "nr_heroes" -msgstr "\"Deine Partei hat $int($units) Helden und kann maximal $int($maxunits) Helden ernennen.\"" - msgid "cast_tired_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters had trouble staying awake.\"" -msgid "cast_tired_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger schleppten sich müde in den Kampf.\"" - msgid "caldera_handle_1" msgstr "\"$unit($unit) jumps into the eternal flame of the caldera.\"" -msgid "caldera_handle_1" -msgstr "\"$unit($unit) springt in die ewigen Feuer des Kraters.\"" - msgid "weakmagic" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The spell of $unit($unit) was way to weak and its magic dissolves immediately.\"" -msgid "weakmagic" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber von $unit.dative($unit) war viel zu schwach und löst sich gleich wieder auf.\"" - msgid "analyse_building_fail" msgstr "\"It appears to $unit($mage) that $building($building) is charmed, but no details have been revealed.\"" -msgid "analyse_building_fail" -msgstr "\"$unit($mage) meint, dass auf $building($building) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" - msgid "spellfail_toomanytargets" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This many people exceed the powers of the magician.\"" -msgid "spellfail_toomanytargets" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Persoenen übersteigen die Kräfte des Magiers.\"" - msgid "harvest_effect" msgstr "\"$if($isnull($mage),\"An unseen magician\",$unit($mage)) blesses the fields in a short ritual.\"" -msgid "harvest_effect" -msgstr "\"$if($isnull($mage),\"Ein unentdeckter Magier\",$unit($mage)) segnet in einem kurzen Ritual die Felder.\"" - msgid "buildship" msgstr "\"$unit($unit) builds $int($size) more on $ship($ship).\"" -msgid "buildship" -msgstr "\"$unit($unit) baut für $int($size) an $ship($ship) weiter.\"" - msgid "spellshipnotfound" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ship $int36($id) could not be located.\"" -msgid "spellshipnotfound" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Schiff $int36($id) wurde nicht gefunden.\"" - msgid "unveileog" msgstr "\"$unit($unit) discovers laen in $region($region).\"" -msgid "unveileog" -msgstr "\"$unit($unit) in $region($region) entdeckt eine Laenader.\"" - msgid "error_roads_finished" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete.\"" -msgid "error_roads_finished" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen.\"" - msgid "item_create_spell" msgstr "\"$unit($mage) creates $int($number) $resource($item,$number).\"" -msgid "item_create_spell" -msgstr "\"$unit($mage) erschafft $int($number) $resource($item,$number).\"" - msgid "curseinfo::slavery" msgstr "This powerful curse appears to rob the unit of its free will. As long as the curse is active, it will only obey the orders of its new lord. ($int36($id))" -msgid "curseinfo::slavery" -msgstr "Dieser mächtige Bann scheint die Einheit ihres freien Willens zu berauben. Solange der Zauber wirkt, wird sie nur den Befehlen ihres neuen Herrn gehorchen. ($int36($id))" - msgid "start_battle" msgstr "\"The battle was initiated by ${factions}.\"" -msgid "start_battle" -msgstr "\"Der Kampf wurde ausgelöst von ${factions}.\"" - msgid "stealaura_fail_detect" msgstr "\"$unit($unit) fühlt strangely weakened.\"" -msgid "stealaura_fail_detect" -msgstr "\"$unit($unit) fühlt sich einen Moment seltsam geschwächt.\"" - -msgid "battle_msg" -msgstr "\"$string\"" - msgid "battle_msg" msgstr "\"$string\"" msgid "error16" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship is already completed.\"" -msgid "error16" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff ist schon fertig.\"" - msgid "error38" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have any herbs.\"" -msgid "error38" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Kräuter.\"" - msgid "volcano_dead" msgstr "\"$int($dead) people in $unit($unit) perish when the volcano in $region($region) erupts.\"" -msgid "volcano_dead" -msgstr "\"Beim Vulkanausbruch in $region($region) sterben $int($dead) Personen in $unit($unit).\"" - msgid "curseinfo::warmth_1" msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") protected from the cold. ($int36($id))\"" -msgid "curseinfo::warmth_1" -msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"fühlt\", \"fühlen\") sich vor Kälte geschützt. ($int36($id))\"" - msgid "maintenance_noowner" msgstr "\"The upkeep for $building($building) was not paid, the building was not operational this week.\"" -msgid "maintenance_noowner" -msgstr "\"Der Unterhalt von $building($building) konnte nicht gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig.\"" - msgid "error27" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The amount of items for sale is missing.\"" -msgid "error27" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu verkaufender Produkte fehlt.\"" - msgid "error49" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not the owner.\"" -msgid "error49" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Eigentümer.\"" - msgid "missing_components" msgstr "\"$unit($unit) has insufficient components to cast $spell($spell) on level $int($level).\"" -msgid "missing_components" -msgstr "\"$unit($unit) hat nicht genügend Komponenten um $spell($spell) auf Stufe $int($level) zu zaubern.\"" - msgid "seduce_effect_1" msgstr "\"$unit($unit) gambles for high stakes and loses almost everything.\"" -msgid "seduce_effect_1" -msgstr "\"$unit($unit) verfiel dem Glücksspiel und hat fast sein ganzes Hab und gut verspielt.\"" - msgid "xmastree_effect" msgstr "\"At night, colourful lights can be seen in this region, bells are a-ringing and the laughter of happy children seems to be everywhere in the forests.\"" -msgid "xmastree_effect" -msgstr "\"In der Region erstrahlen des Nachts bunte Lichter, Gloeckchen klingeln und frohes Kindergelaechter klingt durch den Wald.\"" - msgid "cast_sleep_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters have fallen asleep.\"" -msgid "cast_sleep_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in Schlaf versetzt.\"" - msgid "nr_alliance" msgstr "\"Member of '$name ($int36($id))' for $int($age) weeks, led by $faction($leader).\"" -msgid "nr_alliance" -msgstr "\"Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', angeführt von $faction($leader).\"" - msgid "deathcloud_effect" msgstr "\"$unit($mage) summons a poison elemental in $region($region).\"" -msgid "deathcloud_effect" -msgstr "\"$unit($mage) beschwört einen Giftelementar in $region($region).\"" - msgid "nr_building_besieged" msgstr "\", besieged by $int($soldiers) soldiers$if($lt($diff,0),\"\",\" (cut off)\")\"" -msgid "nr_building_besieged" -msgstr "\", belagert von $int($soldiers) Personen$if($lt($diff,0),\"\",\" (abgeschnitten)\")\"" - msgid "nr_population" msgstr "\"Your faction has $int($population) people in $int($units) of $int($limit) possible units.\"" -msgid "nr_population" -msgstr "\"Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten.\"" - msgid "curseinfo::shipdisorientation" msgstr "This ship has lost its path. ($int36($id))" -msgid "curseinfo::shipdisorientation" -msgstr "Dieses Schiff hat sich verfahren. ($int36($id))" - msgid "error198" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The flames find no kindling. The fire dies quickly, causing no damage whatsoever.\"" -msgid "error198" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Flammen finden keine Nahrung. Das Feuer erlischt, ohne Schaden anzurichten.\"" - msgid "error194" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Target region was supplied incorrectly.\"" -msgid "error194" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Zielregion wurde nicht korrekt angegeben.\"" - msgid "illusionantimagic" msgstr "\"$unit($unit) walks into an antimagical zone and dissolves.\"" -msgid "illusionantimagic" -msgstr "\"$unit($unit) marschiert in eine Antimagiezone und löst sich auf.\"" - msgid "curseinfo::sparkle_8" msgstr "\"A group of passing miners makes passes at $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_8" -msgstr "\"Eine Gruppe vorbeiziehender Bergarbeiter rufen $unit($unit) eindeutig Zweideutiges nach. ($int36($id))\"" - msgid "too_many_units_in_alliance" msgstr "\"$unit($unit) in $region($region): '$order($command)' - An alliance may not consist of more than $int($allowed) units.\"" -msgid "too_many_units_in_alliance" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine Allianz darf aus nicht mehr als $int($allowed) Einheiten bestehen.\"" - msgid "error190" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in the material world.\"" -msgid "error190" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der materiellen Welt.\"" - msgid "sp_flee_effect_0" msgstr "\"$unit($mage) casts $spell($spell), but nobody is affected.\"" -msgid "sp_flee_effect_0" -msgstr "\"$unit($mage) zaubert $spell($spell), aber es gab niemanden, der beeinflusst werden konnte.\"" - msgid "error146" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not captain of a ship.\"" -msgid "error146" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Kapitän des Schiffes.\"" - msgid "error265" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item only works in the normal world.\"" -msgid "error265" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der normalen Welt.\"" - msgid "error261" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot sort before the owner of a ship or a building.\"" -msgid "error261" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Vor den Besitzer eines Schiffes oder Gebäudes kann nicht sortiert werden.\"" - msgid "icastle_dissolve" msgstr "\"$building($building) suddenly dissolves into small pink clouds.\"" -msgid "icastle_dissolve" -msgstr "\"Plötzlich löst sich $building($building) in kleine Traumwolken auf.\"" - msgid "error151" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need stones to build a road.\"" -msgid "error151" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zum Straßenbau braucht man Steine.\"" - msgid "slave_active" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit will not fight.\"" -msgid "slave_active" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht.\"" - msgid "error107" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least two horses to breed more.\"" -msgid "error107" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man braucht mindestens zwei Pferde, um sie zu züchten.\"" - msgid "error213" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Incorrect parameter.\"" -msgid "error213" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Parameter nicht korrekt angegeben.\"" - msgid "error103" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nobody here can build roads.\"" -msgid "error103" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Keiner hier kann Straßen bauen.\"" - msgid "curseinfo::slave_1" msgstr "\"$unit($unit) will be under our influence for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" -msgid "curseinfo::slave_1" -msgstr "\"$unit($unit) wird noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") unter unserem Bann stehen. ($int36($id))\"" - msgid "alliance::lost" msgstr "\"$alliance($alliance) has to leave the game after all their temples were lost.\"" -msgid "alliance::lost" -msgstr "\"$alliance($alliance) scheidet aus dem Spiel aus, nachdem alle Tempel verloren gingen.\"" - msgid "nr_stat_salary" msgstr "\"worker salary: $int($max) silver\"" -msgid "nr_stat_salary" -msgstr "\"Lohn für Arbeit: $int($max) Silber\"" - msgid "nr_stat_luxuries" msgstr "\"luxury goods at this price: $int($max)\"" -msgid "nr_stat_luxuries" -msgstr "\"Luxusgüter zum angegebenen Preis: $int($max)\"" - msgid "curseinfo::flyingship" msgstr "\"Powerful storms have lifted this ship high into the air. ($int36($id))\"" -msgid "curseinfo::flyingship" -msgstr "\"Kräftige Stürme haben dieses Schiff in die Luft gehoben. ($int36($id))\"" - msgid "curseinfo::blessedharvest" msgstr "\"The grain in this region is especially healthy. ($int36($id))\"" -msgid "curseinfo::blessedharvest" -msgstr "\"In dieser Gegend steht das Korn besonders gut im Feld. ($int36($id))\"" - msgid "killed_battle" msgstr "\"$unit($unit) killed $int($dead) opponents.\"" -msgid "killed_battle" -msgstr "\"$unit($unit) tötete $int($dead) Krieger.\"" - msgid "error6" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Building could not be found.\"" -msgid "error6" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude wurde nicht gefunden.\"" - msgid "sailnolandingstorm" msgstr "\"At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region).\"" -msgid "sailnolandingstorm" -msgstr "\"Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft.\"" - msgid "teachdumb" msgstr "\"Due to the effect of duncebuns, $unit($teacher) can only teach $int($amount) students.\"" -msgid "teachdumb" -msgstr "\"$unit($teacher) kann durch Dumpfbackenbrot nur $int($amount) Schüler lehren.\"" - msgid "teleport_success" msgstr "\"$unit($unit) was teleported from $region($source) to $unit($target).\"" -msgid "teleport_success" -msgstr "\"$unit($unit) wurde von $region($source) nach $unit($target) teleportiert.\"" - msgid "becomewere" msgstr "\"$unit($unit) in $region($region) becomes a lycantrope.\"" -msgid "becomewere" -msgstr "\"$unit($unit) in $region($region) verwandelt sich in ein Werwesen.\"" - msgid "spellshipresists" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) resists the spell.\"" -msgid "spellshipresists" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) widersteht dem Zauber.\"" - msgid "nr_potion_effect" msgstr "\"There $if($eq($left,1),\"is\",\"are\") $int($left) $if($eq($left,1),\"use\",\"uses\") of $resource($potion,1) left.\"" -msgid "nr_potion_effect" -msgstr "\"Auf der Einheit $if($eq($left,1),\"liegt\",\"liegen\") $int($left) Wirkung$if($eq($left,1),\"\",\"en\") $resource($potion,1).\"" - msgid "curseinfo::peacezone" msgstr "\"Everyone in this region seems to be in a peacful mood. ($int36($id))\"" -msgid "curseinfo::peacezone" -msgstr "\"Die ganze Region ist von einer friedlichen Stimmung erfasst. ($int36($id))\"" - msgid "rust_effect_1" msgstr "\"$unit($mage) causes a terrible storm over the enemy, but the magic rain does not do any harm.\"" -msgid "rust_effect_1" -msgstr "\"$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt.\"" - msgid "find_manual" msgstr "\"$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous.\"" -msgid "find_manual" -msgstr "\"$unit($unit) stolpert bei der Erforschung der Region über $localize($location). Nähere Durchsuchung fördert ein zerfleddertes altes Buch mit dem Titel '$localize($book)' zu Tage. Der Wissensschub ist enorm.\"" - msgid "curseinfo::healingzone" msgstr "Healing in this region is affected by magic. ($int36($id))" -msgid "curseinfo::healingzone" -msgstr "Heilung ist in dieser Region magisch beeinflusst. ($int36($id))" - msgid "income_entertainment_reduced" msgstr "\"In $region($region), $unit($unit) earns only $int($amount) instead of$if($eq($wanted,$amount),\"\",\" of$if($eq($wanted,$amount),\"\",\" of $int($wanted)\") \") with entertainment.\"" -msgid "income_entertainment_reduced" -msgstr "\"$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),\"\",\" statt $int($wanted)\") Silber durch Unterhaltung.\"" - msgid "errusingpotion" msgstr "\"$unit($unit): '$order($command)' - The unit already uses $resource($using,0).\"" -msgid "errusingpotion" -msgstr "\"$unit($unit): '$order($command)' - Die Einheit benutzt bereits $resource($using,0).\"" - msgid "missing_components_list" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Casting this spell requires an additional $resources($list).\"" -msgid "missing_components_list" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für diesen Zauber fehlen noch $resources($list).\"" - msgid "volcanostopsmoke" msgstr "\"The volcano of $region($region) stops releasing smoke.\"" -msgid "volcanostopsmoke" -msgstr "\"Aus dem Vulkankrater von $region($region) steigt kein Rauch mehr.\"" - msgid "summondragon" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) calls dragons to $region($target).\"" -msgid "summondragon" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) ruft Drachen nach $region($target).\"" - msgid "use_antimagiccrystal" msgstr "\"$unit($unit) uses an antimagic crystal.\"" -msgid "use_antimagiccrystal" -msgstr "\"$unit($unit) benutzt einen Antimagiekristall.\"" - msgid "cast_stun_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were momentarily stunned.\"" -msgid "cast_stun_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger sind für einen Moment benommen.\"" - msgid "error46" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in a tavern.\"" -msgid "error46" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Taverne.\"" - msgid "error35" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have these herbs.\"" -msgid "error35" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diese Kräuter nicht.\"" - msgid "error57" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is too heavily loaded to move.\"" -msgid "error57" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit trägt zuviel Gewicht, um sich bewegen zu können.\"" - msgid "feedback_no_contact_no_resist" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, but cannot resist the spell.\"" -msgid "feedback_no_contact_no_resist" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen, aber widersteht dem Zauber nicht.\"" - msgid "error79" msgstr "\"$unit($unit) in $region($region): '$order($command)' - A ship or a castle must be supplied.\"" -msgid "error79" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ein Schiff oder eine Burg muß angegeben werden.\"" - msgid "drought_effect_4" msgstr "\"$unit($mage) calls the torching power of the sun upon $region($region). The ice melts and and the region is consumed by a tidal wave.\"" -msgid "drought_effect_4" -msgstr "\"$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Das Eis zerbricht und eine gewaltige Flutwelle verschlingt die Region.\"" - -msgid "destroy_ship_0" -msgstr "\"$ship($ship) wurde von $unit($unit) zerstört.\"" - msgid "destroy_ship_0" msgstr "\"$ship($ship) was destroyed by $unit($unit).\"" msgid "curseinfo::sparkle_16" msgstr "\"The body of $unit($unit) is disfigured by hideous boils. ($int36($id))\"" -msgid "curseinfo::sparkle_16" -msgstr "\"Pestbeulen befallen den Körper von $unit($unit). ($int36($id))\"" - msgid "missing_direction" msgstr "\"$unit($unit) in $region($region): '$order($command)' - no direction was specified.\"" -msgid "missing_direction" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - keine Richtung angegeben.\"" - msgid "error159" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No person could be handed over.\"" -msgid "error159" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Personen übergeben werden.\"" - msgid "shock" msgstr "\"$unit($mage) receives a shock when his familiar dies.\"" -msgid "shock" -msgstr "\"$unit($mage) erleidet durch den Tod seines Vertrauten einen Schock.\"" - msgid "error269" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot cast spells here.\"" -msgid "error269" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht zaubern.\"" - msgid "sink_saved_msg" msgstr "\"$unit($unit) survives unscathed and makes it to $region($region).\"" -msgid "sink_saved_msg" -msgstr "\"$unit($unit) überlebt unbeschadet und rettet sich nach $region($region).\"" - msgid "race_noregroup" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be regrouped.\"" -msgid "race_noregroup" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht neu gruppiert werden.\"" - msgid "curseinfo::worse" msgstr "\"$unit($unit) is chased by a nightmare. ($int36($id))\"" -msgid "curseinfo::worse" -msgstr "\"$unit($unit) wird von einem Alp geritten. ($int36($id))\"" - msgid "error274" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot teach.\"" -msgid "error274" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichten.\"" - msgid "region_guarded" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This region is guarded by $unit($guard), a non-allied unit.\"" -msgid "region_guarded" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Region wird von $unit($guard), einer nichtalliierten Einheit, bewacht.\"" - msgid "error155" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Too many magicians in the faction.\"" -msgid "error155" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zuviele Magier in der Partei.\"" - msgid "curseinfo::speed_1" msgstr "\"$int($number) $if($eq($number,1), \"member\", \"members\") of $unit($unit) $if($eq($number,1), \"is\", \"are\") accelerated for $int($duration) more $if($eq($duration,1), \"week\", \"weeks\"). ($int36($id))\"" -msgid "curseinfo::speed_1" -msgstr "\"$int($number) $if($eq($number,1), \"Person\", \"Personen\") von $unit($unit) $if($eq($number,1), \"ist\", \"sind\") noch $int($duration) $if($eq($duration,1), \"Woche\", \"Wochen\") beschleunigt. ($int36($id))\"" - msgid "error160" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be bought.\"" -msgid "error160" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter gekauft werden.\"" - msgid "error270" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden bestehlen.\"" msgid "error226" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Units from the backmost rows cannot attack.\"" -msgid "error226" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheiten in den hinteren Reihen können nicht angreifen.\"" - msgid "sailnolanding" msgstr "\"The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel.\"" -msgid "sailnolanding" -msgstr "\"Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff.\"" - msgid "error116" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Number can not be assigned.\"" -msgid "error116" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nummer kann nicht vergeben werden.\"" - msgid "error112" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Names may not contain parenthesis.\"" -msgid "error112" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Namen dürfen keine Klammern enthalten.\"" - msgid "error222" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Show all what?\"" -msgid "error222" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Zeige alle was?\"" - msgid "teach_teacher" msgstr "\"$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level).\"" -msgid "teach_teacher" -msgstr "\"$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level).\"" - msgid "patzer2" msgstr "\"$unit($unit) in $region($region) is hit by a massive headache and cannot concentrate on the spell. Some part of this ritual has gone very wrong indeed.\"" -msgid "patzer2" -msgstr "\"$unit($unit) in $region($region) hat rasende Kopfschmerzen und kann sich nicht mehr richtig konzentrieren. Irgendwas bei diesem Zauber ist fürchterlich schiefgelaufen.\"" - msgid "curseinfo::magicboost" msgstr "The magician possesses the gift of Chaos. ($int36($id))" -msgid "curseinfo::magicboost" -msgstr "Der Magier besitzt die Gabe des Chaos. ($int36($id))" - msgid "illegal_password" msgstr "\"Your password was changed because it contained illegal characters. Legal passwords may only contain numbers and letters from A to Z. Your new Password is '${newpass}'.\"" -msgid "illegal_password" -msgstr "\"Dein Passwort enthält Zeichen, die bei der Nachsendung von Reports Probleme bereiten können. Bitte beachte, dass Passwortenur aus Buchstaben von A bis Z und Zahlen bestehen dürfen. Dein neues Passwort ist '${newpass}'.\"" - msgid "curseinfo::sparkle_12" msgstr "\"Brightly coloured flowers pop up all around $unit($unit)'s camp. ($int36($id))\"" -msgid "curseinfo::sparkle_12" -msgstr "\"Leuchtende Blumen erblühen rund um das Lager von $unit($unit). ($int36($id))\"" - msgid "familiar_name" msgstr "\"Familiar of $unit($unit)\"" -msgid "familiar_name" -msgstr "\"Vertrauter von $unit($unit)\"" - msgid "error9" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That cannot be sabotaged.\"" -msgid "error9" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das kann man nicht sabotieren.\"" - msgid "curseinfo::sparkle_6" msgstr "\"$unit($unit) finds a small flute that plays a beautiful melody. ($int36($id))\"" -msgid "curseinfo::sparkle_6" -msgstr "\"$unit($unit) findet eine kleine Flöte, die eine wundersame Melodie spielt. ($int36($id))\"" - msgid "renamed_building_seen" msgstr "\"$building($building) in $region($region) received a nickname from $unit($renamer).\"" -msgid "renamed_building_seen" -msgstr "\"$building($building) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen.\"" - msgid "sp_shadowknights_effect" msgstr "\"$unit($mage) summons a mirage.\"" -msgid "sp_shadowknights_effect" -msgstr "\"$unit($mage) beschwört Trugbilder herauf.\"" - msgid "give" msgstr "\"$unit($unit) gives $int($amount) $resource($resource,$amount) to $unit($target).\"" -msgid "give" -msgstr "\"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target).\"" - msgid "sellamount" msgstr "\"$unit($unit) sells $int($amount) $resource($resource,$amount).\"" -msgid "sellamount" -msgstr "\"$unit($unit) verkauft $int($amount) $resource($resource,$amount).\"" - msgid "sp_migranten_fail1" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) is one of our kind, we should not waste aura on this.\"" -msgid "sp_migranten_fail1" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) ist von unserer Art, das Ritual wäre verschwendete Aura.\"" - msgid "victory_murder_complete" msgstr "\"VICTORY! $if($eq($n,1), \"The faction $winners has\", \"The factions $winners have\") fulfilled the victory condition for the necessary time. The game is over.\"" -msgid "victory_murder_complete" -msgstr "\"SIEG! $if($eq($n,1), \"Die Partei $winners hat\", \"Die Parteien $winners haben\") die Siegbedingung für die erforderliche Zeit erfüllt. Das Spiel ist damit beendet.\"" - msgid "shipsink" msgstr "\"The $ship($ship) has suffered too much damage and sinks.\"" -msgid "shipsink" -msgstr "\"Die $ship($ship) ist zu stark beschädigt und sinkt.\"" - msgid "sp_bloodsacrifice_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) receives $int($amount) aura.\"" -msgid "sp_bloodsacrifice_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($unit) gewinnt durch das Ritual $int($amount) Aura.\"" - msgid "sp_confusion_effect_0" msgstr "\"$unit($mage) intones a mysterious chant. There is a sudden hubbub, but order is restored quickly.\"" -msgid "sp_confusion_effect_0" -msgstr "\"$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt.\"" - msgid "pest" msgstr "\"The region is visited by the plague and $int($dead) peasants died.\"" -msgid "pest" -msgstr "\"Hier wütete die Pest, und $int($dead) Bauern starben.\"" - msgid "wormhole_exit" msgstr "\"$unit($unit) travels through a wormhole to $region($region).\"" -msgid "wormhole_exit" -msgstr "\"$unit($unit) reist durch ein Wurmloch nach $region($region).\"" - msgid "spellfail_astralonly" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell will only work in the realm of spirits.\"" -msgid "spellfail_astralonly" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der Geisterwelt.\"" - msgid "analyse_ship_noage" msgstr "\"$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for centuries.\"" -msgid "analyse_ship_noage" -msgstr "\"$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" - msgid "destroy_road" msgstr "\"$unit($unit) demolishes the road between $region($from) and $region($to).\"" -msgid "destroy_road" -msgstr "\"$unit($unit) reißt die Straße zwischen $region($from) und $region($to) ein.\"" - msgid "error13" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship has moved already.\"" -msgid "error13" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff hat sich bereits bewegt.\"" - msgid "aborted_battle" msgstr "\"The battle was aborted because all enemies escaped.\"" -msgid "aborted_battle" -msgstr "\"Der Kampf wurde abgebrochen, da alle Verteidiger flohen.\"" - msgid "error24" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege.\"" -msgid "error24" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich.\"" - msgid "usecatapult" msgstr "\"$int($amount) fighters of $unit($unit) launch their catapults.\"" -msgid "usecatapult" -msgstr "\"$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab.\"" - msgid "error76" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This item cannot be used.\"" -msgid "error76" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann man nicht benutzen.\"" - msgid "error98" msgstr "\"$unit($unit) in $region($region): '$order($command)' - In winter, insects can be recruited only in deserts.\"" -msgid "error98" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Insekten können im Winter nur in Wüsten rekrutiert werden.\"" - msgid "spyreport" msgstr "\"$unit($spy) managed to gather information about $unit($target): combat status ${status}.\"" -msgid "spyreport" -msgstr "\"$unit($spy) gelang es, Informationen über $unit($target) herauszubekommen: Kampfstatus ${status}.\"" - msgid "newbie_password" msgstr "\"Your password is ${password}.\"" -msgid "newbie_password" -msgstr "\"Dein Passwort lautet ${password}.\"" - msgid "error65" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Tuition was too high to be paid.\"" -msgid "error65" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Lernkosten können nicht bezahlt werden.\"" - msgid "error87" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dragon blood is required for this elixir.\"" -msgid "error87" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Elixier benötigt man Drachenblut.\"" - msgid "spellfail_block" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The connections from to this regions are blocked.\"" -msgid "spellfail_block" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Wege aus dieser Region sind blockiert.\"" - msgid "error278" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You cannot change the name and description of this building.\"" -msgid "error278" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Name und Beschreibung des Gebäudes können nicht geändert werden.\"" - msgid "error168" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No luxury items could be sold.\"" -msgid "error168" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter verkauft werden.\"" - msgid "stormwinds_reduced" msgstr "\"$unit($unit) could only enchant $int($ships) of $int($maxships) ships.\"" -msgid "stormwinds_reduced" -msgstr "\"$unit($unit) konnte nur $int($ships) von $int($maxships) Schiffen verzaubern.\"" - msgid "error283" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your password may only contain alphanumeric symbols.\"" -msgid "error283" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Passwort darf nur Buchstaben und Ziffern enthalten.\"" - msgid "rust_effect" msgstr "\"$unit($mage) puts a spell of rust on $unit($target). $int($amount) weapons are eaten by rust.\"" -msgid "rust_effect" -msgstr "\"$unit($mage) legt einen Rosthauch auf $unit($target). $int($amount) Waffen wurden vom Rost zerfressen.\"" - msgid "nr_migrants" msgstr "\"Your faction has $int($units) migrants out of a possible total of $int($maxunits).\"" -msgid "nr_migrants" -msgstr "\"Deine Partei hat $int($units) Migranten und kann maximal $int($maxunits) Migranten aufnehmen.\"" - msgid "error239" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to get a new number?\"" -msgid "error239" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff eine neue Nummer bekommen?\"" +msgid "aurapotion50_effect" +msgstr "\"$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated.\"" msgid "error129" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many people.\"" -msgid "error129" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So viele Leute kann die Partei nicht aufnehmen.\"" - msgid "spyreport_skills" msgstr "\"$unit($target) knows ${skills}.\"" -msgid "spyreport_skills" -msgstr "\"$unit($target) beherrscht ${skills}.\"" - msgid "sighting" msgstr "\"$if($isnull($region),\"\",\"In $region($region), \")$int($number) $race($race,$number) were discovered.\"" -msgid "sighting" -msgstr "\"$if($isnull($region),\"Es\",\"In $region($region)\") wurde$if($eq($number,1),\"\",\"n\") $int($number) $race($race,$number) gesichtet.\"" - msgid "nr_stat_recruits" msgstr "\"recruits: $int($max) peasants\"" -msgid "nr_stat_recruits" -msgstr "\"Rekruten: max. $int($max) Bauern\"" - msgid "error235" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Maintenance has not been paid yet.\"" -msgid "error235" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Für das Gebäude wurde noch kein Unterhalt bezahlt.\"" - msgid "error231" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit or its animals would not survive there.\"" -msgid "error231" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit oder ihre Tiere würden dort nicht überleben.\"" - msgid "error121" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That resource does not exist in this region.\"" -msgid "error121" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - So etwas gibt es hier nicht.\"" - msgid "error306" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Your faction is not old enough to start over.\"" -msgid "error306" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 9 Wochen alt sein, um einen Neustart zu versuchen.\"" - msgid "manacrystal_use" msgstr "\"$unit($unit) uses an astral crystal and gains $int($aura) aura.\"" -msgid "manacrystal_use" -msgstr "\"$unit($unit) benutzt einen Astralkristall und gewinnt $int($aura) Aura hinzu.\"" - msgid "error302" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Synonym already set.\"" -msgid "error302" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Bereits ein Synonym gesetzt.\"" - msgid "analyse_region_noage" msgstr "\"$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for centuries.\"" -msgid "analyse_region_noage" -msgstr "\"$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" - msgid "icastle_create" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building.\"" -msgid "icastle_create" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude.\"" - msgid "spyfail" msgstr "\"$unit($spy) could not find out anything about $unit($target).\"" -msgid "spyfail" -msgstr "\"$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden.\"" - msgid "firewall_damage" msgstr "\"$unit($unit) steps through the wall of fire into $region($region) and receives severe burn damage.\"" -msgid "firewall_damage" -msgstr "\"$unit($unit) erleidet beim Durchqueren der Feuerwand nach $region($region) schwere Verbrennungen.\"" - msgid "cast_speed_effect" msgstr "\"$unit($mage) casts $spell($spell): $int($amount) fighters were magically accelerated.\"" -msgid "cast_speed_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden magisch beschleunigt.\"" - msgid "firewall_effect" msgstr "\"$unit($mage) creates a wall of fire in $region($region).\"" -msgid "firewall_effect" -msgstr "\"$unit($mage) erschafft in $region($region) eine Wand aus Feuer.\"" - msgid "phunger" msgstr "\"$if($eq($dead,1),\"One peasant starves\",\"$int($dead) peasants starve\").\"" -msgid "phunger" -msgstr "\"$if($eq($dead,1),\"Ein Bauer verhungert\",\"$int($dead) Bauern verhungern\").\"" - msgid "transport" msgstr "\"$unit($unit) transported $unit($target) from $region($start) to $region($end).\"" -msgid "transport" -msgstr "\"$unit($unit) transportiert $unit($target) von $region($start) nach $region($end).\"" - msgid "sp_holyground_effect" msgstr "\"$unit($mage) summons natural spirits into the ground of $region($region).\"" -msgid "sp_holyground_effect" -msgstr "\"$unit($mage) beschwört Naturgeister in den Boden von $region($region).\"" - msgid "curseinfo::maelstrom" msgstr "The maelstrom in this area will heavily damage all ships coming into its wake. ($int36($id))" -msgid "curseinfo::maelstrom" -msgstr "Der Mahlstrom in dieser Region wird alle Schiffe, die in seinen Sog geraten, schwer beschädigen. ($int36($id))" - msgid "leavefail" msgstr "\"$unit($unit) could not leave $region($region).\"" -msgid "leavefail" -msgstr "\"$unit($unit) konnte aus $region($region) nicht ausreisen.\"" - msgid "reduced_production" msgstr "The region is ravaged, the ground infertile." -msgid "reduced_production" -msgstr "Die Region ist verwüstet, der Boden karg." - msgid "feedback_no_astralregion" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here.\"" -msgid "feedback_no_astralregion" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es kann hier kein Kontakt zur Astralwelt aufgenommen werden.\"" - msgid "peace_active" msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is so quiet and peaceful, nobody wants to attack anybody right now.\"" -msgid "peace_active" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen.\"" - msgid "peasantluck_success" msgstr "\"The stork paid an unexpected visit to $if($eq($births,1),\"a peasant\",\"$int($births) peasants\").\"" -msgid "peasantluck_success" -msgstr "\"$if($eq($births,1),\"Einen Bauern\",\"$int($births) Bauern\") besucht unverhofft der Storch.\"" - msgid "astralshield_activate" msgstr "\"$unit($unit) reactivates the astral protection shield in $region($region).\"" -msgid "astralshield_activate" -msgstr "\"$unit($unit) reaktiviert den astralen Schutzschild in $region($region).\"" - msgid "destroy_curse_effect" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The magician destroys the spell ($id) on ${target}.\"" -msgid "destroy_curse_effect" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört den Fluch ($id) auf ${target}.\"" - msgid "analyse_region_fail" msgstr "\"It appears to $unit($mage) that $region($region) is charmed, but no details have been revealed.\"" -msgid "analyse_region_fail" -msgstr "\"$unit($mage) meint, dass auf $region($region) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" - msgid "viewreality_effect" msgstr "\"$unit($unit) manages to catch a glimpse of reality through the fog.\"" -msgid "viewreality_effect" -msgstr "\"$unit($unit) gelingt es, durch die Nebel auf die Realität zu blicken.\"" - msgid "use_speedsail" msgstr "\"$unit($unit) sets a solar sail. The ship's speed is increased by $int($speed).\"" -msgid "use_speedsail" -msgstr "\"$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht um $int($speed).\"" - msgid "error21" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There is no information available for the request.\"" -msgid "error21" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dazu gibt es keine Informationen.\"" - msgid "error43" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have this.\"" -msgid "error43" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat so etwas nicht.\"" - msgid "unknown_status" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown combat status.\"" -msgid "unknown_status" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannter Kampfstatus.\"" - msgid "error10" msgstr "\"$unit($unit) in $region($region): '$order($command)' - That does not make much sense.\"" -msgid "error10" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das macht wenig Sinn.\"" - msgid "error32" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not on board our ship.\"" -msgid "error32" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht an Bord unseres Schiffes.\"" - msgid "error54" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot trade.\"" -msgid "error54" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht handeln.\"" - msgid "manufacture_skills" msgstr "\"$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0).\"" -msgid "manufacture_skills" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren.\"" - msgid "error177" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The familiar cannot cast this spell.\"" -msgid "error177" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann der Vertraute nicht zaubern.\"" - msgid "curseinfo::godcurseocean" msgstr "\"This region was cursed by the gods. The sea is a foul cesspool, noxious gases rise from the deep, undead seamonsters attack all ships. Noone can live here for long. ($int36($id))\"" -msgid "curseinfo::godcurseocean" -msgstr "\"Diese Region wurde von den Göttern verflucht. Das Meer ist eine ekelige Brühe, braunschwarze, stinkende Gase steigen aus den unergründlichen Tiefen hervor, und untote Seeungeheuer, Schiffe zerfressend und giftige grüne Galle geifernd, sind der Schrecken aller Seeleute, die diese Gewässer durchqueren. Niemand kann hier lange überleben. ($int36($id))\"" - msgid "curseinfo::sparkle_4" msgstr "\"A circle of shimmering lights surrounds $unit($unit). ($int36($id))\"" -msgid "curseinfo::sparkle_4" -msgstr "\"Ein schimmernder Lichterkranz umgibt $unit($unit). ($int36($id))\"" - msgid "error84" msgstr "\"$unit($unit) in $region($region): '$order($command)' - No name was supplied.\"" -msgid "error84" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es wurde kein Name angegeben.\"" - msgid "spellfail_noexpensives" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) have unbreakable commitments to their faction.\"" -msgid "spellfail_noexpensives" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $unit($target) hat unaufkündbare Bindungen an seine alte Partei.\"" - msgid "error287" msgstr "\"$unit($unit) in $region($region): '$order($command)' - We cannot transport this unit there.\"" -msgid "error287" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dorthin können wir die Einheit nicht transportieren.\"" - msgid "error292" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit cannot be taught.\"" -msgid "error292" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichtet werden.\"" - msgid "error95" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusions cannot guard a region.\"" -msgid "error95" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Illusionen können eine Region nicht bewachen.\"" - msgid "nr_stat_header" msgstr "\"Statistics for $region($region):\"" -msgid "nr_stat_header" -msgstr "\"Statistik für $region($region):\"" - msgid "sp_strongwalls_effect" msgstr "\"$unit($mage) causes the walls of $building($building) to glow in an eerie magic light.\"" -msgid "sp_strongwalls_effect" -msgstr "\"$unit($mage) läßt die Mauern von $building($building) in einem unheimlichen magischen Licht erglühen.\"" - msgid "curseinfo::orcish" msgstr "\"$unit($unit) goes from one amourous adventure to another. ($int36($id))\"" -msgid "curseinfo::orcish" -msgstr "\"$unit($unit) stürzt sich von einem amourösen Abenteuer ins nächste. ($int36($id))\"" - msgid "target_region_not_empty" msgstr "\"$unit($unit) in $region($region): '$order($command)' - There are units in the target region.\"" -msgid "target_region_not_empty" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - In der Zielregion befinden sich noch Einheiten.\"" - msgid "error173" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Even in the Xontormia Library, this spell could not be found.\"" -msgid "error173" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Selbst in der Bibliothek von Xontormia konnte dieser Spruch nicht gefunden werden.\"" - msgid "error138" msgstr "\"$unit($unit) in $region($region): '$order($command)' - We do not have anything that could be demolished.\"" -msgid "error138" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Uns gehört nichts, was man abreißen oder versenken könnte.\"" - msgid "killsandhits" msgstr "\"$unit($unit) hit $int($hits) times and killed $int($kills) enemies.\"" -msgid "killsandhits" -msgstr "\"$unit($unit) erzielte $int($hits) Treffer und tötete $int($kills) Gegner.\"" - msgid "shapeshift_effect" msgstr "\"$unit($mage) makes $unit($target) appear as $race($race,$unit.size($target)).\"" -msgid "shapeshift_effect" -msgstr "\"$unit($mage) läßt $unit($target) als $race($race,$unit.size($target)) erscheinen.\"" - msgid "error248" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The faction has to be 10 turns old.\"" -msgid "error248" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 10 Runden alt sein.\"" - msgid "followfail" msgstr "\"$unit($follower) could not follow $unit($unit).\"" -msgid "followfail" -msgstr "\"$unit($follower) konnte $unit($unit) nicht folgen.\"" - msgid "followdetect" msgstr "\"$unit($follower) followed $unit($unit).\"" -msgid "followdetect" -msgstr "\"$unit($follower) ist $unit($unit) gefolgt.\"" - msgid "unitnotfound_id" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unit $id could not be located.\"" -msgid "unitnotfound_id" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Einheit $id wurde nicht gefunden.\"" - msgid "error244" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is already named.\"" -msgid "error244" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat schon einen Namen.\"" - msgid "use_tacticcrystal" msgstr "\"$unit($unit) uses a dreameye in $region($region).\"" -msgid "use_tacticcrystal" -msgstr "\"$unit($unit) benutzt in $region($region) ein Traumauge.\"" - msgid "error134" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unknown report option.\"" -msgid "error134" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Unbekannte Meldungs-Option.\"" - msgid "error319" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has been in combat.\"" -msgid "error319" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie an einem Kampf teilgenommen hat.\"" - msgid "analyse_building_noage" msgstr "\"$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for centuries.\"" -msgid "analyse_building_noage" -msgstr "\"$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben.\"" - msgid "sink_lost_msg" msgstr "\"$int($amount) people of $unit($unit) drown.$if($isnull($region),\"\",\" The unit makes it to $region($region).\")\"" -msgid "sink_lost_msg" -msgstr "\"$int($amount) Personen von $unit($unit) ertrinken.$if($isnull($region),\"\",\" Die Einheit rettet sich nach $region($region).\")\"" - msgid "error130" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIC SPHERE [1-5].\"" -msgid "error130" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIEGEBIET [1-5].\"" - msgid "error240" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to be followed?\"" -msgid "error240" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff verfolgt werden?\"" - -msgid "travelthru_trail" -msgstr "$trailto($region)" - msgid "travelthru_trail" msgstr "$trailto($region)" msgid "error315" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Not all ingredients present.\"" -msgid "error315" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Nicht alle Zutaten vorhanden.\"" - msgid "volcanooutbreak" msgstr "\"The volcano in $region($regionv) erupts. The lava devastates $region($regionn).\"" -msgid "volcanooutbreak" -msgstr "\"Der Vulkan in $region($regionv) bricht aus. Die Lavamassen verwüsten $region($regionn).\"" - msgid "seduce_effect_0" msgstr "\"$unit($unit) gives $unit($mage) $resources($items).\"" -msgid "seduce_effect_0" -msgstr "\"$unit($unit) schenkt $unit($mage) $resources($items).\"" - msgid "error311" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This unit can not change shape.\"" -msgid "error311" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht verwandeln.\"" - msgid "error201" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Race and target unit have not been supplied.\"" -msgid "error201" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Rasse und Zieleinheit wurden vergessen.\"" - msgid "newbieimmunity" msgstr "\"Your faction is immune against assaults for $int($turns) more weeks.\"" -msgid "newbieimmunity" -msgstr "\"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe.\"" - msgid "curseinfo::auraboost_0" msgstr "\"Powerful magical energies are pulsing through $unit($unit). ($int36($id))\"" -msgid "curseinfo::auraboost_0" -msgstr "\"$unit($unit) fühlt sich von starken magischen Energien durchströmt. ($int36($id))\"" - msgid "curseinfo::drought" msgstr "\"This region was hit by a drought. ($int36($id))\"" -msgid "curseinfo::drought" -msgstr "\"In dieser Gegend herrscht eine Dürre. ($int36($id))\"" - msgid "race_cantwork" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot work.\"" -msgid "race_cantwork" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht arbeiten.\"" - msgid "stealdetect" msgstr "\"$unit($unit) feels watched.\"" -msgid "stealdetect" -msgstr "\"$unit($unit) fühlt sich beobachtet.\"" - msgid "stealaura_detect" msgstr "\"$unit($unit) feels the powers of magic fade and loses $int($aura) aura.\"" -msgid "stealaura_detect" -msgstr "\"$unit($unit) fühlt seine magischen Kräfte schwinden und verliert $int($aura) Aura.\"" - msgid "missing_message" msgstr "\"Internal Error: Message '$name' is undefined.\"" -msgid "missing_message" -msgstr "\"Interner Fehler: Meldung '$name' nicht definiert.\"" - msgid "analyse_ship_fail" msgstr "\"It appears to $unit($mage) that $ship($ship) is charmed, but no details have been revealed.\"" -msgid "analyse_ship_fail" -msgstr "\"$unit($mage) meint, dass auf $ship($ship) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden.\"" - msgid "income_magic" msgstr "\"$unit($unit) earns $int($amount) silver through simple magical services in $region($region).\"" -msgid "income_magic" -msgstr "\"$unit($unit) verdient in $region($region) $int($amount) Silber durch Zauberei.\"" - msgid "stealaura_success" msgstr "\"$unit($mage) draws $int($aura) aura from $unit($target).\"" -msgid "stealaura_success" -msgstr "\"$unit($mage) entzieht $unit($target) $int($aura) Aura.\"" - msgid "error_flying_ship_too_big" msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) is too bulky to fly.\"" -msgid "error_flying_ship_too_big" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - $ship($ship) ist zu groß, um fliegen zu können.\"" - msgid "familiar_describe" msgstr "\"$unit($mage) summons a familiar. $race($race, 0) can learn ${skills}.\"" -msgid "familiar_describe" -msgstr "\"$unit($mage) ruft einen Vertrauten. $race($race, 0) können $skills lernen.\"" - msgid "wind_effect" msgstr "\"$unit($mage) asks the gods of wind and water on behalf of the $ship($ship).\"" -msgid "wind_effect" -msgstr "\"$unit($mage) erfleht den Segen der Götter des Windes und des Wassers für $ship($ship).\"" +msgid "para_army_index" +msgstr "\"Army $int($index): $name\"" msgid "wormhole_requirements" msgstr "\"$unit($unit) cannot travel through the wormhole in $region($region) because the unit is either too big or has restricted skills.\"" -msgid "wormhole_requirements" -msgstr "\"$unit($unit) kann in $region($region) nicht durch das Wurmloch reisen, da die Einheit entweder zu gross ist oder teure Talente besitzt.\"" - msgid "cast_escape_effect" msgstr "\"$unit($mage) casts $spell($spell): The noise of the battle dies down and the mage is able to slip away unharmed.\"" -msgid "cast_escape_effect" -msgstr "\"$unit($mage) zaubert $spell($spell): Das Kampfgetümmel erstirbt und er kann unbehelligt seines Weges ziehen.\"" - msgid "volcanostartsmoke" msgstr "\"Columns of smoke are released by the volcano of $region($region).\"" -msgid "volcanostartsmoke" -msgstr "\"Aus dem Vulkankrater von $region($region) steigt plötzlich Rauch.\"" - msgid "nr_insectfall" msgstr "It is the last week before winter in which insects can still recruit." -msgid "nr_insectfall" -msgstr "Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können." - msgid "error296" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Trees won't grow here.\"" -msgid "error296" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hier werden niemals Bäume wachsen.\"" - msgid "error186" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell only works on dry land.\"" -msgid "error186" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur auf Land gelegt werden.\"" - msgid "error51" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver.\"" -msgid "error51" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber.\"" - msgid "error73" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Hungry units cannot give anybody away.\"" -msgid "error73" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Eine hungernde Einheit kann niemanden weggeben.\"" - msgid "error40" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit did not contact us.\"" -msgid "error40" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keinen Kontakt mit uns aufgenommen.\"" - msgid "error182" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The ship cannot leave in this direction.\"" -msgid "error182" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Schiff kann in diese Richtung nicht ablegen.\"" - msgid "analyse_ship_nospell" msgstr "\"It appears to $unit($mage) that $ship($ship) is not charmed.\"" -msgid "analyse_ship_nospell" -msgstr "\"$unit($mage) meint, dass auf $ship($ship) kein Zauber liegt.\"" - -msgid "birthday_firework" -msgstr "\"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region).\"" - -msgid "birthday_firework" -msgstr "\"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel.\"" - msgid "error257" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Invalid locale.\"" -msgid "error257" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Ungültiges Locale.\"" - msgid "error147" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is not in command of the largest castle in the region.\"" -msgid "error147" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht Burgherr der größten Burg in der Region.\"" - msgid "unknowndirection" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Direction '$dirname' was not recognized.\"" -msgid "unknowndirection" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Richtung '$dirname' wurde nicht erkannt.\"" - msgid "error143" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit is on board a ship.\"" -msgid "error143" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf einem Schiff.\"" - msgid "spellfail_onocean" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast while you are on the ocean.\"" -msgid "spellfail_onocean" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf hoher See gezaubert werden.\"" - msgid "error253" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This magician is not strong enough to be sacrificed to the gods.\"" -msgid "error253" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Der Magier ist nicht stark genug, sich den Göttern zu opfern.\"" - msgid "battle_loot" msgstr "\"$unit($unit) collects $int($amount) $resource($item,$amount).\"" -msgid "battle_loot" -msgstr "\"$unit($unit) erbeutet $int($amount) $resource($item,$amount).\"" - -msgid "error209" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" - msgid "error209" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Syntax Error.\"" msgid "summonundead_effect_0" msgstr "\"$unit($mage) cannot summon any undead in $region($region).\"" -msgid "summonundead_effect_0" -msgstr "\"$unit($mage) kann in $region($region) keine Untoten rufen.\"" - msgid "givedumb" msgstr "\"$unit($unit) administers $int($amount) duncebuns to $unit($recipient).\"" -msgid "givedumb" -msgstr "\"$unit($unit) gibt $int($amount) Dumpfbackenbrot an $unit($recipient).\"" - msgid "error205" msgstr "\"$unit($unit) in $region($region): '$order($command)' - This spell works only in an ocean region.\"" -msgid "error205" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber gelingt nur in einer Ozeanregion.\"" - msgid "error210" msgstr "\"$unit($unit) in $region($region): '$order($command)' - It is too dangerous to fly the ship in the storm.\"" -msgid "error210" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen.\"" - msgid "eatpeasants" msgstr "\"$unit($unit) ate $int($amount) peasants.\"" -msgid "eatpeasants" -msgstr "\"$unit($unit) verspeiste $int($amount) Bauern.\"" - msgid "error320" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The unit cannot guard the region because it is trying to flee.\"" -msgid "error320" -msgstr "\"$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht bewachen, da sie versucht zu fliehen.\"" - msgid "dissolve_units_2" msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),\"a tree\", \"trees\").\"" -msgid "dissolve_units_2" -msgstr "\"$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),\"wurde zum Baum\", \"wurden zu Bäumen\").\"" - msgid "sp_eternizewall_effect" msgstr "\"$unit($mage) performs a ritual that binds the magical forces of $region($region) into the walls of $building($building).\"" -msgid "sp_eternizewall_effect" -msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde von $region($region) in die Mauern von $building($building).\"" - diff --git a/src/battle.c b/src/battle.c index fa7d70ca5..77d2fd5db 100644 --- a/src/battle.c +++ b/src/battle.c @@ -2886,7 +2886,7 @@ static void print_stats(battle * b) message *msg; char buf[1024]; - msg = msg_message("battle_army_index", "index name", army_index(s), sname); + msg = msg_message("para_army_index", "index name", army_index(s), sname); battle_message_faction(b, f, msg); msg_release(msg); @@ -3497,9 +3497,9 @@ static int battle_report(battle * b) sbs_init(&sbs, buf, sizeof(buf)); if (cont) - m = msg_message("lineup_battle", "turn", b->turn); + m = msg_message("para_lineup_battle", "turn", b->turn); else - m = msg_message("after_battle", ""); + m = msg_message("para_after_battle", ""); battle_message_faction(b, fac, m); msg_release(m); diff --git a/src/bindings.c b/src/bindings.c index 11a049c5d..cb84d684e 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -918,10 +918,10 @@ static void export_locale(const struct locale *lang, const char *name) { char fname[64]; FILE * F; - sprintf(fname, "strings.%2s.po", name); + sprintf(fname, "messages.%2s.po", name); F = fopen(fname, "wt"); if (F) { - export_strings(lang, F); + export_messages(lang, F, NULL); fclose(F); } } diff --git a/src/report.c b/src/report.c index d894f1566..9edc8aca2 100644 --- a/src/report.c +++ b/src/report.c @@ -743,6 +743,10 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden k = 1; } nr_render(m->msg, viewer->locale, lbuf, sizeof(lbuf), viewer); + /* Hack: some messages should start a new paragraph with a newline: */ + if (strncmp("para_", m->msg->type->name, 5) == 0) { + newline(out); + } paragraph(out, lbuf, indent, 2, 0); } m = m->next; diff --git a/src/util/language.c b/src/util/language.c index c0e8fe55d..77a7d2a4e 100644 --- a/src/util/language.c +++ b/src/util/language.c @@ -258,29 +258,6 @@ void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt) { fputs("\"\n\n", F); } -void export_strings(const struct locale * lang, FILE *F) { - int i; - - for (i = 0; i != SMAXHASH; ++i) { - const struct locale_str *find = lang->strings[i]; - while (find) { - const char *dcolon = strstr(find->key, "::"); - if (dcolon) { - size_t len = dcolon - find->key; - char ctxname[16]; - assert(sizeof(ctxname) > len); - memcpy(ctxname, find->key, len); - ctxname[len] = '\0'; - po_write_msg(F, dcolon + 2, find->str, ctxname); - } - else { - po_write_msg(F, find->key, find->str, NULL); - } - find = find->nexthash; - } - } -} - const char *locale_name(const locale * lang) { return lang ? lang->name : "(null)"; diff --git a/src/util/language.h b/src/util/language.h index 155fea9c8..f269a5f06 100644 --- a/src/util/language.h +++ b/src/util/language.h @@ -58,7 +58,6 @@ extern "C" { void make_locales(const char *str); void locale_foreach(void(*callback)(const struct locale *lang, const char *name)); - void export_strings(const struct locale * lang, FILE *F); void po_write_msg(FILE *F, const char *id, const char *str, const char *ctxt); #define LOC(lang, s) (lang?locale_string(lang, s, true):s) diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index f35734f37..5adbde86f 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -32,7 +32,12 @@ static nrmessage_type *nrtypes[NRT_MAXHASH]; const char *nrt_string(const struct nrmessage_type *nrt, const struct locale *lang) { - return locale_getstring(lang, nrt->mtype->name); + const char * str = locale_getstring(lang, nrt->mtype->name); + if (!str) { + str = locale_getstring(default_locale, nrt->mtype->name); + } + assert(str); + return str; } nrmessage_type *nrt_find(const struct message_type * mtype) @@ -169,3 +174,14 @@ void free_nrmesssages(void) { } } } + +void export_messages(const struct locale * lang, FILE *F, const char *msgctxt) { + int i; + for (i = 0; i != NRT_MAXHASH; ++i) { + nrmessage_type *nrt = nrtypes[i]; + while (nrt) { + po_write_msg(F, nrt->mtype->name, nrt_string(nrt, lang), msgctxt); + nrt = nrt->next; + } + } +} diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index abb47551c..e6c9f3ebc 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -43,6 +43,8 @@ extern "C" { char *buffer, size_t size, const void *userdata); const char *nr_section(const struct message *msg); + void export_messages(const struct locale * lang, FILE *F, const char *msgctxt); + #ifdef __cplusplus } #endif From 4d09f00f03022d076aacfaac768ed806df4cef1a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 22:58:01 +0200 Subject: [PATCH 194/231] remove string parsing from XML. E3 tests failing! --- conf/e2/locales.json | 11 ++--- src/xmlreader.c | 99 ++------------------------------------------ 2 files changed, 7 insertions(+), 103 deletions(-) diff --git a/conf/e2/locales.json b/conf/e2/locales.json index 0c17a7700..21e91755f 100644 --- a/conf/e2/locales.json +++ b/conf/e2/locales.json @@ -2,13 +2,8 @@ "include": [ "config://res/translations/strings.de.po", "config://res/translations/strings.en.po", - "config://res/core/messages.xml", - "config://res/eressea/strings.xml", - "config://res/eressea/spellinfo.xml", - "config://res/names-undead.xml", - "config://res/names-skeletons.xml", - "config://res/names-zombies.xml", - "config://res/names-ghouls.xml", - "config://res/names-dragons.xml" + "config://res/translations/messages.de.po", + "config://res/translations/messages.en.po", + "config://res/core/messages.xml" ] } diff --git a/src/xmlreader.c b/src/xmlreader.c index e9b30d060..1535cb208 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1365,32 +1365,14 @@ static int parse_messages(xmlDocPtr doc) } propSection = xmlGetProp(node, BAD_CAST "section"); - if (propSection == NULL) + if (propSection == NULL) { propSection = BAD_CAST default_section; - + } nrt_register(mtype, (const char *)propSection); - /* strings */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "text", xpath); - assert(result->nodesetval->nodeNr>0); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - struct locale *lang; - xmlChar *propText; - - xml_readtext(node, &lang, &propText); - if (lang) { - xml_cleanup_string(propText); - locale_setstring(lang, mtype->name, (const char *)propText); - } - xmlFree(propText); - - } - xmlXPathFreeObject(result); - - if (propSection != BAD_CAST default_section) + if (propSection != BAD_CAST default_section) { xmlFree(propSection); + } } xmlXPathFreeObject(messages); @@ -1399,78 +1381,6 @@ static int parse_messages(xmlDocPtr doc) return results; } -static void -xml_readstrings(xmlXPathContextPtr xpath, xmlNodePtr * nodeTab, int nodeNr, -bool names) -{ - int i; - - for (i = 0; i != nodeNr; ++i) { - xmlNodePtr stringNode = nodeTab[i]; - xmlChar *propName = xmlGetProp(stringNode, BAD_CAST "name"); - xmlChar *propNamespace = NULL; - xmlXPathObjectPtr result; - int k; - char zName[128]; - - assert(propName != NULL); - if (names) - propNamespace = xmlGetProp(stringNode->parent, BAD_CAST "name"); - mkname_buf((const char *)propNamespace, (const char *)propName, zName); - if (propNamespace != NULL) - xmlFree(propNamespace); - xmlFree(propName); - - /* strings */ - xpath->node = stringNode; - result = xmlXPathEvalExpression(BAD_CAST "text", xpath); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr textNode = result->nodesetval->nodeTab[k]; - struct locale *lang; - xmlChar *propText; - - xml_readtext(textNode, &lang, &propText); - if (propText != NULL) { - assert(strcmp(zName, - (const char *)xml_cleanup_string(BAD_CAST zName)) == 0); - if (lang) { - xml_cleanup_string(propText); - locale_setstring(lang, zName, (const char *)propText); - } - xmlFree(propText); - } - else { - log_warning("string %s has no text in locale %s\n", zName, locale_name(lang)); - } - } - xmlXPathFreeObject(result); - } -} - -static int parse_strings(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr strings; - int results = 0; - - /* reading eressea/strings/string */ - strings = xmlXPathEvalExpression(BAD_CAST "/eressea/strings/string", xpath); - xml_readstrings(xpath, strings->nodesetval->nodeTab, - strings->nodesetval->nodeNr, false); - results += strings->nodesetval->nodeNr; - xmlXPathFreeObject(strings); - - strings = - xmlXPathEvalExpression(BAD_CAST "/eressea/strings/namespace/string", xpath); - xml_readstrings(xpath, strings->nodesetval->nodeTab, - strings->nodesetval->nodeNr, true); - results += strings->nodesetval->nodeNr; - xmlXPathFreeObject(strings); - - xmlXPathFreeContext(xpath); - return results; -} - void register_xmlreader(void) { xml_register_callback(parse_races); @@ -1482,6 +1392,5 @@ void register_xmlreader(void) xml_register_callback(parse_spellbooks); /* requires spells */ xml_register_callback(parse_spells); /* requires resources */ - xml_register_callback(parse_strings); xml_register_callback(parse_messages); } From 6f6f2c1c2e3e3bb0d5bc28b9d9c47e267f373e34 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:05:03 +0200 Subject: [PATCH 195/231] Additional strings used by E3 only. --- res/translations/strings-e3.de.po | 542 ++++++++++++++++++++++++++++++ res/translations/strings-e3.en.po | 542 ++++++++++++++++++++++++++++++ 2 files changed, 1084 insertions(+) create mode 100644 res/translations/strings-e3.de.po create mode 100644 res/translations/strings-e3.en.po diff --git a/res/translations/strings-e3.de.po b/res/translations/strings-e3.de.po new file mode 100644 index 000000000..ced5b2d9d --- /dev/null +++ b/res/translations/strings-e3.de.po @@ -0,0 +1,542 @@ +msgid "catamaran_a" +msgstr "ein Katamaran" + +msgid "rpg_item_1" +msgstr "Pandoras Urkunde für Halbling ehrenhalber, weiblich" + +msgid "rpg_item_2" +msgstr "Heilige Nußhälfte" + +msgid "rpg_item_3" +msgstr "Flaschengeist Zhardamon" + +msgctxt "keyword" +msgid "entertain" +msgstr "UNTERHALTE" + +msgctxt "keyword" +msgid "default" +msgstr "DEFAULT" + +msgctxt "keyword" +msgid "reserve" +msgstr "RESERVIERE" + +msgctxt "spell" +msgid "create_potion_p0" +msgstr "Braue Siebenmeilentee" + +msgctxt "spell" +msgid "create_potion_p2" +msgstr "Braue Wasser des Lebens" + +msgctxt "spell" +msgid "create_potion_p3" +msgstr "Braue Schaffenstrunk" + +msgctxt "spellinfo" +msgid "concealing_aura" +msgstr "Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Zeit vor den Blicken anderer verschleiern. Der Zauber schützt nicht vor Dieben und Spionen." + +msgctxt "spell" +msgid "create_potion_p9" +msgstr "Braue Pferdeglück" + +msgctxt "morale" +msgid "10" +msgstr "unterwürfige" + +msgctxt "spellinfo" +msgid "create_potion_peasantblood" +msgstr "Zu dem gefährlichsten und geheimsten Wissen der Magier zählt das Wissen über die Macht des Todes. Auch wenn die meisten es nicht zugeben, so fasziniert dieses Thema jeden Magier. Früher oder später beschäftigen sich alle mit diesem teilweise verbotenen Gebiet. Sodann werden sie feststellen, dass es noch eine weitere Ebene der Existenz gibt, in der die Dämonen beheimatet sind. Nur Blut allein vermag den Hunger dieser Wesen zu befriedigen, wenn sie ihre Ebene verlassen und unsere betreten. Erfahrene Magier werden jedoch feststellen, dass man den Blutwein, den die Dämonen zu sich nehmen, strecken kann, so dass davon 100 anstatt nur 10 Dämonen satt werden. Da die Dämonen davon jedoch nichts wissen dürfen, muss der Magier selbst klammheimlich einen seiner urplötzlich verfügbar gewordenen Untergebenen opfern. " + +msgctxt "keyword" +msgid "forget" +msgstr "VERGISS" + +msgid "scaffolding" +msgstr "Gerüst" + +msgctxt "keyword" +msgid "origin" +msgstr "URSPRUNG" + +msgctxt "keyword" +msgid "pay" +msgstr "BEZAHLE" + +msgctxt "keyword" +msgid "buy" +msgstr "KAUFE" + +msgctxt "spellinfo" +msgid "raindance" +msgstr "Durch dieses uralte Tanzritual ruft der Zauberkundige die Kräfte des Lebens und der Fruchtbarkeit an. Die darauf folgenden Regenfälle begünstigen das Wachstum und erhöhen die Ernteerträge einiger Bauern der Region bis der Regen wieder nachlässt." + +msgid "adamantium" +msgstr "Adamantium" + +msgid "adamantiumplate" +msgstr "Adamantiumrüstung" + +msgid "rpg_item_3_p" +msgstr "Flaschengeister" + +msgid "barge_a" +msgstr "eine Barke" + +msgctxt "spell" +msgid "create_potion_ointment" +msgstr "Braue Wundsalbe" + +msgctxt "keyword" +msgid "email" +msgstr "EMAIL" + +msgctxt "spell" +msgid "create_potion_healing" +msgstr "Braue Heiltrank" + +msgid "frigate_a" +msgstr "eine Fregatte" + +msgctxt "keyword" +msgid "message" +msgstr "BOTSCHAFT" + +msgctxt "keyword" +msgid "claim" +msgstr "BEANSPRUCHE" + +msgid "trireme" +msgstr "Trireme" + +msgctxt "keyword" +msgid "alliance" +msgstr "ALLIANZ" + +msgctxt "spellinfo" +msgid "create_potion_healing" +msgstr "Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt." + +msgid "frigate" +msgstr "Fregatte" + +msgctxt "spellinfo" +msgid "create_potion_p13" +msgstr "Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde." + +msgctxt "keyword" +msgid "follow" +msgstr "FOLGE" + +msgctxt "spellinfo" +msgid "earn_silver#gwyrrd" +msgstr "Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 25 Silber verdienen." + +msgctxt "keyword" +msgid "study" +msgstr "LERNE" + +msgctxt "describe" +msgid "lifepotion" +msgstr "Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen." + +msgid "charger" +msgstr "Streitross" + +msgid "cog" +msgstr "Kogge" + +msgid "adamantiumplate_p" +msgstr "Adamantiumrüstungen" + +msgid "cutter" +msgstr "Kutter" + +msgctxt "keyword" +msgid "hide" +msgstr "TARNE" + +msgctxt "keyword" +msgid "move" +msgstr "NACH" + +msgid "caravel_a" +msgstr "eine Karavelle" + +msgctxt "keyword" +msgid "describe" +msgstr "BESCHREIBE" + +msgctxt "spellinfo" +msgid "blessedharvest" +msgstr "Für dieses Ernteritual sendet der Druide seine arkane Energie entlang der astralen Kraftlinien der gesamten Umgebung, um selbst weit entfernte Naturgeister zu erreichen. Die Beschwörung dieser Naturgeister ist eine hohe Kunst, die höchste Konzentration und vor allem viel Erfahrung erfordert. Die Bauern werden nach und nach von den besseren Ernten profitieren und ihre Ersparnisse steigern können." + +msgid "adamantiumaxe" +msgstr "Adamantiumaxt" + +msgid "charger_p" +msgstr "Streitrösser" + +msgctxt "keyword" +msgid "password" +msgstr "PASSWORT" + +msgid "raft" +msgstr "Floß" + +msgid "guardhouse" +msgstr "Wachstube" + +msgctxt "keyword" +msgid "attack" +msgstr "ATTACKIERE" + +msgid "caravel" +msgstr "Karavelle" + +msgid "canoe" +msgstr "Einbaum" + +msgctxt "keyword" +msgid "leave" +msgstr "VERLASSE" + +msgctxt "keyword" +msgid "option" +msgstr "OPTION" + +msgctxt "keyword" +msgid "spy" +msgstr "SPIONIERE" + +msgctxt "keyword" +msgid "loot" +msgstr "PLÜNDERE" + +msgctxt "keyword" +msgid "guard" +msgstr "BEWACHE" + +msgctxt "morale" +msgid "0" +msgstr "aufständische" + +msgctxt "morale" +msgid "1" +msgstr "wütende" + +msgctxt "morale" +msgid "2" +msgstr "zornige" + +msgctxt "morale" +msgid "3" +msgstr "unruhige" + +msgctxt "morale" +msgid "4" +msgstr "gleichgültige" + +msgctxt "morale" +msgid "5" +msgstr "entspannte" + +msgctxt "morale" +msgid "6" +msgstr "zufriedene" + +msgctxt "morale" +msgid "7" +msgstr "glückliche" + +msgctxt "morale" +msgid "8" +msgstr "treue" + +msgctxt "morale" +msgid "9" +msgstr "ergebene" + +msgid "rep_crossbow" +msgstr "Repetierarmbrust" + +msgid "packice" +msgstr "Packeis" + +msgctxt "keyword" +msgid "besiege" +msgstr "BELAGERE" + +msgctxt "spellinfo" +msgid "commonfamiliar" +msgstr "Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird." + +msgid "trireme_a" +msgstr "eine Trireme" + +msgid "royalbarge_a" +msgstr "eine Königsbarke" + +msgctxt "keyword" +msgid "recruit" +msgstr "REKRUTIERE" + +msgctxt "keyword" +msgid "steal" +msgstr "BEKLAUE" + +msgid "adamantiumaxe_p" +msgstr "Adamantiumäxte" + +msgid "rpg_item_2_p" +msgstr "Nußhälften" + +msgctxt "keyword" +msgid "name" +msgstr "BENENNE" + +msgid "watch" +msgstr "Wache" + +msgctxt "spellinfo" +msgid "earn_silver#draig" +msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll: niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 25 Silber pro Stufe ein." + +msgctxt "keyword" +msgid "//" +msgstr "//" + +msgctxt "keyword" +msgid "enter" +msgstr "BETRETE" + +msgctxt "keyword" +msgid "work" +msgstr "ARBEITE" + +msgid "catamaran" +msgstr "Katamaran" + +msgctxt "keyword" +msgid "cast" +msgstr "ZAUBERE" + +msgctxt "keyword" +msgid "destroy" +msgstr "ZERSTÖRE" + +msgctxt "spell" +msgid "create_potion_p13" +msgstr "Braue Elixier der Macht" + +msgctxt "keyword" +msgid "ride" +msgstr "FAHRE" + +msgctxt "keyword" +msgid "sort" +msgstr "SORTIERE" + +msgctxt "spellinfo" +msgid "create_potion_ointment" +msgstr "Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkeit bietet der Magier ebenso wie der Heiler. Im Gegensatz zum Heiler ist der Magier jedoch in der Lage, seine Behandlung bereits vor dem Kampf durchzuführen, indem er seine Heilkräfte in eine magische Salbe bindet, welche gelagert werden kann und nach dem Kampf nur aufgetragen werden muss." + +msgid "packice_trail" +msgstr "%s" + +msgctxt "keyword" +msgid "number" +msgstr "NUMMER" + +msgid "cog_a" +msgstr "eine Kogge" + +msgctxt "keyword" +msgid "group" +msgstr "GRUPPE" + +msgid "canoe_a" +msgstr "ein Einbaum" + +msgctxt "keyword" +msgid "carry" +msgstr "TRANSPORTIERE" + +msgid "galleon_a" +msgstr "eine Galeone" + +msgid "towershield_p" +msgstr "Turmschilde" + +msgid "cutter_a" +msgstr "ein Kutter" + +msgctxt "keyword" +msgid "make" +msgstr "MACHE" + +msgctxt "keyword" +msgid "route" +msgstr "ROUTE" + +msgctxt "keyword" +msgid "ready" +msgstr "KAMPFZAUBER" + +msgctxt "keyword" +msgid "help" +msgstr "HELFE" + +msgid "royalbarge" +msgstr "Königsbarke" + +msgctxt "spell" +msgid "commonfamiliar" +msgstr "Vertrauten binden" + +msgid "barge" +msgstr "Barke" + +msgctxt "keyword" +msgid "grow" +msgstr "ZÜCHTE" + +msgctxt "spell" +msgid "create_potion_peasantblood" +msgstr "Braue Bauernblut" + +msgctxt "keyword" +msgid "banner" +msgstr "BANNER" + +msgctxt "keyword" +msgid "use" +msgstr "BENUTZE" + +msgctxt "spellinfo" +msgid "earn_silver#cerddor" +msgstr "Cerddormagier sind _die_ Gaukler unter den Magiern; sie lieben es, das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 25 Silber pro Stufe verdient haben." + +msgctxt "keyword" +msgid "tax" +msgstr "TREIBE" + +msgctxt "keyword" +msgid "promote" +msgstr "BEFÖRDERE" + +msgctxt "spellinfo" +msgid "earn_silver#illaun" +msgstr "Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 25 Silber pro Stufe." + +msgctxt "keyword" +msgid "sell" +msgstr "VERKAUFE" + +msgid "rpg_item_1_p" +msgstr "Urkunden" + +msgctxt "keyword" +msgid "contact" +msgstr "KONTAKT" + +msgid "guardtower" +msgstr "Wachturm" + +msgctxt "keyword" +msgid "plant" +msgstr "PFLANZE" + +msgid "raft_a" +msgstr "ein Floß" + +msgctxt "keyword" +msgid "give" +msgstr "GIB" + +msgctxt "keyword" +msgid "prefix" +msgstr "PRÄFIX" + +msgctxt "keyword" +msgid "show" +msgstr "ZEIGE" + +msgid "dragonship" +msgstr "Drachenschiff" + +msgctxt "keyword" +msgid "piracy" +msgstr "PIRATERIE" + +msgid "galleon" +msgstr "Galeone" + +msgid "towershield" +msgstr "Turmschild" + +msgid "rm_adamantium" +msgstr "Adamantium" + +msgctxt "keyword" +msgid "research" +msgstr "FORSCHE" + +msgid "adamantium_p" +msgstr "Adamantium" + +msgctxt "spellinfo" +msgid "create_potion_p0" +msgstr "Die Zeit ist eines der ersten Geheimnisse, die jeder Magier zu erkunden versucht. Gelingt ihm dies, kann er alle seine Energie auf das Studium der Magie verwenden; die Wege zwischen Dormitorium, Bibliothek und Magierturm schafft er nun viel schneller. Um sein Herz im Takt zu halten, verwendet er einen speziellen selbstgemachten Tee. Manche Magier teilen diesen Tee mit bis zu 10 Personen. " + +msgctxt "spellinfo" +msgid "create_potion_p2" +msgstr "In einem der seltsamsten Zauber kann der Magier seiner Umgebung ein klein wenig der Lebensenergie entziehen um das sogenannte Wasser des Lebens herstellen. Als Basis dient ihm hierbei der Saft aus einigen ausgesuchten Kräutern, welcher die Lebensenergie speichern kann. Da der Magier aufgrund seiner magischen Fähigkeiten immun ist, ist er der einzige, der den Saft berühren kann, ohne Schaden zu nehmen. Sodann muss er diesen eine Woche lang von Ort zu Ort tragen, damit er sich mit Lebensenergie vollsaugt, ohne einem einzelnen Ort soviel zu entfernen, dass er Schaden nimmt. " + +msgctxt "spellinfo" +msgid "create_potion_p3" +msgstr "Ein weiteres Anwendungsgebiet des Wissens über die Zeit, welches ein Magier ansammelt, stellt der Schaffenstrunk dar. Auch wenn körperliche Arbeiten eher selten von Magiern ausgeführt werden, so haben diese doch ein Interesse daran, die Effizienz ihrer Untergebenen bei solchen Arbeiten zu steigern. Mornac der Weise war der erste, der entdeckte, dass man einen Trunk herstellen kann, durch den 10 Untergebene die Arbeit von 20 erledigen, wodurch der Rest für andere Experimente eingesetzt werden kann. " + +msgid "dragonship_a" +msgstr "ein Drachenschiff" + +msgctxt "spellinfo" +msgid "create_potion_p9" +msgstr "Obwohl für Magier das Gebiet der Liebe tabu ist und sie im strengen Zölibat leben, haben sie ein großes Wissen darüber, wie man gewisse Bedürfnisse weckt, weshalb sie immer wieder von Dorfbewohnerinnen und Dorfbewohnern nach entsprechenden Zaubern gefragt werden. Da die Verzauberung eines Bewohners jedoch streng verboten ist, bieten sie ihre Dienste nur für die Züchter an. In einem aufwendigen Ritual, welches jedoch nur dazu dient zu verschleiern, wie einfach dies eigentlich ist, vermischt der Magier vor den Augen des Züchters einige Pflanzensäfte. Dabei ruft er die Geister an, die dem Pferdezüchter das Glück bescheren sollen, um klarzumachen, das diese nur mit ihm sprechen und jeglicher Versuch des Züchters, selbst die Kräuter zu mischen, nur eine unbrauchbare Pampe produzieren würde. Anschließend überreicht der Magier dem Züchter eine Phiole, die dieser in die Tränke seiner Pferde entleeren muss." + +msgctxt "spellinfo" +msgid "earn_silver#tybied" +msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat -- nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 25 Silber pro Stufe lassen sich so in einer Woche verdienen." + +msgctxt "keyword" +msgid "teach" +msgstr "LEHRE" + +msgctxt "keyword" +msgid "combat" +msgstr "KÄMPFE" + +msgctxt "keyword" +msgid "sabotage" +msgstr "SABOTIERE" + +msgctxt "keyword" +msgid "maketemp" +msgstr "MACHE TEMP" + +msgid "market" +msgstr "Marktplatz" + +msgid "rep_crossbow_p" +msgstr "Repetierarmbrüste" + +msgctxt "keyword" +msgid "quit" +msgstr "STIRB" + +msgctxt "keyword" +msgid "end" +msgstr "ENDE" + diff --git a/res/translations/strings-e3.en.po b/res/translations/strings-e3.en.po new file mode 100644 index 000000000..cee603f65 --- /dev/null +++ b/res/translations/strings-e3.en.po @@ -0,0 +1,542 @@ +msgid "catamaran_a" +msgstr "a catamaran" + +msgid "rpg_item_1" +msgstr "Pandora's Certificate" + +msgid "rpg_item_2" +msgstr "piece of a holy nut" + +msgid "rpg_item_3" +msgstr "bottle demon Zhardamon" + +msgctxt "keyword" +msgid "entertain" +msgstr "UNTERHALTE" + +msgctxt "keyword" +msgid "default" +msgstr "DEFAULT" + +msgctxt "keyword" +msgid "reserve" +msgstr "RESERVIERE" + +msgctxt "spell" +msgid "create_potion_p0" +msgstr "brew seven mile tea" + +msgctxt "spell" +msgid "create_potion_p2" +msgstr "brew water of life" + +msgctxt "spell" +msgid "create_potion_p3" +msgstr "brew busy beer" + +msgctxt "spellinfo" +msgid "concealing_aura" +msgstr "This spell will hide the whole equipment of a target unit from the looks of others. It will not protect against thieves or spies." + +msgctxt "spell" +msgid "create_potion_p9" +msgstr "brew horsepower potion" + +msgctxt "morale" +msgid "10" +msgstr "subservient" + +msgctxt "spellinfo" +msgid "create_potion_peasantblood" +msgstr "One of the most dangerous and best guarded secrets of all mages is the knowledge about the power of death. Even though most of them would not openly admit it, and it is at least partially forbidden in most countries, each of them studies death sooner or later. When they do, they quickly find out that there is another plane of existance: the home of the demons. Only blood can quelch the thirst of those, when they switch from their home to our world. But experienced mages will find out that the demons bloodwine can be deluted when appropiate herbs are included, making it enough for 100 instead of 10 demons. As the demons may not know about that, the magician has to secretly sacrifice one of his freed minions." + +msgctxt "keyword" +msgid "forget" +msgstr "VERGISS" + +msgid "scaffolding" +msgstr "scaffolding" + +msgctxt "keyword" +msgid "origin" +msgstr "URSPRUNG" + +msgctxt "keyword" +msgid "pay" +msgstr "BEZAHLE" + +msgctxt "keyword" +msgid "buy" +msgstr "KAUFE" + +msgctxt "spellinfo" +msgid "raindance" +msgstr "This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasants' harvest will be extraordinary good." + +msgid "adamantium" +msgstr "adamantium" + +msgid "adamantiumplate" +msgstr "adamantium plate" + +msgid "rpg_item_3_p" +msgstr "bottle demons" + +msgid "barge_a" +msgstr "a barge" + +msgctxt "spell" +msgid "create_potion_ointment" +msgstr "brew ointment" + +msgctxt "keyword" +msgid "email" +msgstr "EMAIL" + +msgctxt "spell" +msgid "create_potion_healing" +msgstr "brew healing potion" + +msgid "frigate_a" +msgstr "a frigate" + +msgctxt "keyword" +msgid "message" +msgstr "BOTSCHAFT" + +msgctxt "keyword" +msgid "claim" +msgstr "BEANSPRUCHE" + +msgid "trireme" +msgstr "trireme" + +msgctxt "keyword" +msgid "alliance" +msgstr "ALLIANZ" + +msgctxt "spellinfo" +msgid "create_potion_healing" +msgstr "Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom." + +msgid "frigate" +msgstr "frigate" + +msgctxt "spellinfo" +msgid "create_potion_p13" +msgstr "Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. " + +msgctxt "keyword" +msgid "follow" +msgstr "FOLGE" + +msgctxt "spellinfo" +msgid "earn_silver#gwyrrd" +msgstr "The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 25 silver pieces per level in this way." + +msgctxt "keyword" +msgid "study" +msgstr "LERNE" + +msgctxt "describe" +msgid "lifepotion" +msgstr "The \"Water of Life\" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs." + +msgid "charger" +msgstr "charger" + +msgid "cog" +msgstr "cog" + +msgid "adamantiumplate_p" +msgstr "adamantium plates" + +msgid "cutter" +msgstr "cutter" + +msgctxt "keyword" +msgid "hide" +msgstr "TARNE" + +msgctxt "keyword" +msgid "move" +msgstr "NACH" + +msgctxt "keyword" +msgid "describe" +msgstr "BESCHREIBE" + +msgid "caravel_a" +msgstr "a caravel" + +msgctxt "spellinfo" +msgid "blessedharvest" +msgstr "This ritual not only increases the output of the local farms. Activating the astral ley lines, the druid is capable of activating even the nature spirits far away. Peasants' harvest in the affected regions will be extraordinarily good for a few weeks. " + +msgid "adamantiumaxe" +msgstr "adamantium axe" + +msgid "charger_p" +msgstr "chargers" + +msgctxt "keyword" +msgid "password" +msgstr "PASSWORT" + +msgid "raft" +msgstr "raft" + +msgid "guardhouse" +msgstr "guard house" + +msgctxt "keyword" +msgid "attack" +msgstr "ATTACKIERE" + +msgid "caravel" +msgstr "caravel" + +msgid "canoe" +msgstr "canoe" + +msgctxt "keyword" +msgid "leave" +msgstr "VERLASSE" + +msgctxt "keyword" +msgid "option" +msgstr "OPTION" + +msgctxt "keyword" +msgid "spy" +msgstr "SPIONIERE" + +msgctxt "keyword" +msgid "loot" +msgstr "PLÜNDERE" + +msgctxt "keyword" +msgid "guard" +msgstr "BEWACHE" + +msgctxt "morale" +msgid "0" +msgstr "rebellious" + +msgctxt "morale" +msgid "1" +msgstr "mad" + +msgctxt "morale" +msgid "2" +msgstr "angry" + +msgctxt "morale" +msgid "3" +msgstr "agitated" + +msgctxt "morale" +msgid "4" +msgstr "indifferent" + +msgctxt "morale" +msgid "5" +msgstr "relaxed" + +msgctxt "morale" +msgid "6" +msgstr "content" + +msgctxt "morale" +msgid "7" +msgstr "happy" + +msgctxt "morale" +msgid "8" +msgstr "loyal" + +msgctxt "morale" +msgid "9" +msgstr "devoted" + +msgid "rep_crossbow" +msgstr "repeating crossbow" + +msgid "packice" +msgstr "fast ice" + +msgctxt "keyword" +msgid "besiege" +msgstr "BELAGERE" + +msgctxt "spellinfo" +msgid "commonfamiliar" +msgstr "During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them." + +msgid "trireme_a" +msgstr "a trireme" + +msgid "royalbarge_a" +msgstr "a royal barge" + +msgctxt "keyword" +msgid "recruit" +msgstr "REKRUTIERE" + +msgctxt "keyword" +msgid "steal" +msgstr "BEKLAUE" + +msgid "adamantiumaxe_p" +msgstr "adamantium axes" + +msgid "rpg_item_2_p" +msgstr "nut halves" + +msgctxt "keyword" +msgid "name" +msgstr "BENENNE" + +msgid "watch" +msgstr "watch" + +msgctxt "spellinfo" +msgid "earn_silver#draig" +msgstr "In the dark alleys you can find those who sell curses and hexes on demand -- but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 25 silver pieces per level." + +msgctxt "keyword" +msgid "//" +msgstr "//" + +msgctxt "keyword" +msgid "enter" +msgstr "BETRETE" + +msgctxt "keyword" +msgid "work" +msgstr "ARBEITE" + +msgid "catamaran" +msgstr "catamaran" + +msgctxt "keyword" +msgid "cast" +msgstr "ZAUBERE" + +msgctxt "keyword" +msgid "destroy" +msgstr "ZERSTÖRE" + +msgctxt "spell" +msgid "create_potion_p13" +msgstr "brew elixir of power" + +msgctxt "keyword" +msgid "ride" +msgstr "FAHRE" + +msgctxt "keyword" +msgid "sort" +msgstr "SORTIERE" + +msgctxt "spellinfo" +msgid "create_potion_ointment" +msgstr "In the aftermath of battle it is vital to heal your own troops. This can be done by a healer as well as by a magician. In contrast to a healer, the magician can fullfill this treatment already before the battle by binding magical powers into a potent salve. This salve can be stored and only needs to be applied to the wounds after the battle. " + +msgid "packice_trail" +msgstr "%s" + +msgctxt "keyword" +msgid "number" +msgstr "NUMMER" + +msgid "cog_a" +msgstr "a cog" + +msgctxt "keyword" +msgid "group" +msgstr "GRUPPE" + +msgid "canoe_a" +msgstr "a canoe" + +msgctxt "keyword" +msgid "carry" +msgstr "TRANSPORTIERE" + +msgid "galleon_a" +msgstr "a galleon" + +msgid "towershield_p" +msgstr "tower shields" + +msgid "cutter_a" +msgstr "a cutter" + +msgctxt "keyword" +msgid "make" +msgstr "MACHE" + +msgctxt "keyword" +msgid "route" +msgstr "ROUTE" + +msgctxt "keyword" +msgid "ready" +msgstr "KAMPFZAUBER" + +msgctxt "keyword" +msgid "help" +msgstr "HELFE" + +msgid "royalbarge" +msgstr "royal barge" + +msgctxt "spell" +msgid "commonfamiliar" +msgstr "Bind Familiar" + +msgid "barge" +msgstr "barge" + +msgctxt "keyword" +msgid "grow" +msgstr "GROW" + +msgctxt "spell" +msgid "create_potion_peasantblood" +msgstr "brew peasant blood" + +msgctxt "keyword" +msgid "banner" +msgstr "BANNER" + +msgctxt "keyword" +msgid "use" +msgstr "BENUTZE" + +msgctxt "spellinfo" +msgid "earn_silver#cerddor" +msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 25 silver per level. " + +msgctxt "keyword" +msgid "tax" +msgstr "TREIBE" + +msgctxt "keyword" +msgid "promote" +msgstr "PROMOTE" + +msgctxt "spellinfo" +msgid "earn_silver#illaun" +msgstr "No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 25 silver pieces per level and week for offering these services to peasants." + +msgctxt "keyword" +msgid "sell" +msgstr "VERKAUFE" + +msgid "rpg_item_1_p" +msgstr "Certificates" + +msgctxt "keyword" +msgid "contact" +msgstr "KONTAKT" + +msgid "guardtower" +msgstr "guard tower" + +msgctxt "keyword" +msgid "plant" +msgstr "PLANT" + +msgid "raft_a" +msgstr "a raft" + +msgctxt "keyword" +msgid "give" +msgstr "GIB" + +msgctxt "keyword" +msgid "prefix" +msgstr "PRÄFIX" + +msgctxt "keyword" +msgid "show" +msgstr "ZEIGE" + +msgid "dragonship" +msgstr "dragonship" + +msgctxt "keyword" +msgid "piracy" +msgstr "PIRATERIE" + +msgid "galleon" +msgstr "galleon" + +msgid "towershield" +msgstr "tower shield" + +msgid "rm_adamantium" +msgstr "adamantium" + +msgctxt "keyword" +msgid "research" +msgstr "FORSCHE" + +msgid "adamantium_p" +msgstr "adamantium" + +msgctxt "spellinfo" +msgid "create_potion_p0" +msgstr "Time is one of the first mysteries every magician tries to solve. If they succeed, they can focus all their energies on their magical studies as the ways between dormatory, library and magician tower now pass much faster. To keep their heart in tune the magicians use a special self-made tea. Some mages even share it with up to 10 people" + +msgctxt "spellinfo" +msgid "create_potion_p2" +msgstr "One of the most strange spells enables the magician to withdraw a little life energy from their surroundings to produce the so called water of life. The juice of some selected herbs is used to conserve the energies of life. As the magician is protected by his magical abilities, he is the only one who can touch the juice without taking damage. This is necessary because the juice must be carried around from place to place to avoid damaging one region by taking too much energy at once." + +msgctxt "spellinfo" +msgid "create_potion_p3" +msgstr "Busybeer is another application for the knowledge about time a magician accumulates. Even though manual labour is only seldom done by mages, they still show interest in increasing the efficiency of their minions that do this work for them. Mornac the Wise was the first to discover how to produce a potion that would enable 10 minions to do the work of 20, thus freeing the other 10 for different experiments." + +msgid "dragonship_a" +msgstr "a dragonship" + +msgctxt "spellinfo" +msgid "create_potion_p9" +msgstr "Even though mages live in strict celibacy, they know a lot about creating certain longings. Peasants keep asking them for this love potion or that. But the penality for bewitching a peasant is death, so the mages offer their services only to farmers for their breeding stock. In an elaborate ritual, which only serves to hide the simplicity of the procedure, the magician draws the fluids from certains plants. While doing so he calls upon the spirits of fertility, which of course only listen when he talkes to them. Now the farmer knows that any attempt to draw the fluids himself will only result in a useless waste of resources. Finally, the magician hands the vial with the fluids to the farmer, who pours it into his horses' drinking water." + +msgctxt "keyword" +msgid "teach" +msgstr "LEHRE" + +msgctxt "spellinfo" +msgid "earn_silver#tybied" +msgstr "If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - Well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 25 silver per level that way." + +msgctxt "keyword" +msgid "combat" +msgstr "COMBAT" + +msgctxt "keyword" +msgid "sabotage" +msgstr "SABOTIERE" + +msgctxt "keyword" +msgid "maketemp" +msgstr "MACHE TEMP" + +msgid "market" +msgstr "marketplace" + +msgid "rep_crossbow_p" +msgstr "repeating crossbows" + +msgctxt "keyword" +msgid "quit" +msgstr "STIRB" + +msgctxt "keyword" +msgid "end" +msgstr "ENDE" + From 04a15ba1fd4bd04abb7f54d4aa43e8ba333aa989 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:08:35 +0200 Subject: [PATCH 196/231] read E3 strings from po file only --- conf/e3/locales.json | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/conf/e3/locales.json b/conf/e3/locales.json index af43ccaed..27e6f93d8 100644 --- a/conf/e3/locales.json +++ b/conf/e3/locales.json @@ -1,14 +1,11 @@ { "include": [ - "config://res/core/messages.xml", - "config://res/core/de/strings.xml", - "config://res/core/en/strings.xml", - "config://res/e3a/strings.xml", - "config://res/e3a/shipnames.xml", - "config://res/names-undead.xml", - "config://res/names-skeletons.xml", - "config://res/names-zombies.xml", - "config://res/names-ghouls.xml", - "config://res/names-dragons.xml" + "config://res/translations/strings.de.po", + "config://res/translations/strings-e3.de.po", + "config://res/translations/messages.de.po", + "config://res/translations/strings.en.po", + "config://res/translations/strings-e3.en.po", + "config://res/translations/messages.en.po", + "config://res/core/messages.xml" ] } From bad58eeef47fe67a34cf5ced2b9de1949ad6702e Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:19:54 +0200 Subject: [PATCH 197/231] remove superfluous keywords from e3 strings. --- res/translations/strings-e3.de.po | 240 ------------------------------ res/translations/strings-e3.en.po | 240 ------------------------------ 2 files changed, 480 deletions(-) diff --git a/res/translations/strings-e3.de.po b/res/translations/strings-e3.de.po index ced5b2d9d..2652d9436 100644 --- a/res/translations/strings-e3.de.po +++ b/res/translations/strings-e3.de.po @@ -10,18 +10,6 @@ msgstr "Heilige Nußhälfte" msgid "rpg_item_3" msgstr "Flaschengeist Zhardamon" -msgctxt "keyword" -msgid "entertain" -msgstr "UNTERHALTE" - -msgctxt "keyword" -msgid "default" -msgstr "DEFAULT" - -msgctxt "keyword" -msgid "reserve" -msgstr "RESERVIERE" - msgctxt "spell" msgid "create_potion_p0" msgstr "Braue Siebenmeilentee" @@ -50,25 +38,9 @@ msgctxt "spellinfo" msgid "create_potion_peasantblood" msgstr "Zu dem gefährlichsten und geheimsten Wissen der Magier zählt das Wissen über die Macht des Todes. Auch wenn die meisten es nicht zugeben, so fasziniert dieses Thema jeden Magier. Früher oder später beschäftigen sich alle mit diesem teilweise verbotenen Gebiet. Sodann werden sie feststellen, dass es noch eine weitere Ebene der Existenz gibt, in der die Dämonen beheimatet sind. Nur Blut allein vermag den Hunger dieser Wesen zu befriedigen, wenn sie ihre Ebene verlassen und unsere betreten. Erfahrene Magier werden jedoch feststellen, dass man den Blutwein, den die Dämonen zu sich nehmen, strecken kann, so dass davon 100 anstatt nur 10 Dämonen satt werden. Da die Dämonen davon jedoch nichts wissen dürfen, muss der Magier selbst klammheimlich einen seiner urplötzlich verfügbar gewordenen Untergebenen opfern. " -msgctxt "keyword" -msgid "forget" -msgstr "VERGISS" - msgid "scaffolding" msgstr "Gerüst" -msgctxt "keyword" -msgid "origin" -msgstr "URSPRUNG" - -msgctxt "keyword" -msgid "pay" -msgstr "BEZAHLE" - -msgctxt "keyword" -msgid "buy" -msgstr "KAUFE" - msgctxt "spellinfo" msgid "raindance" msgstr "Durch dieses uralte Tanzritual ruft der Zauberkundige die Kräfte des Lebens und der Fruchtbarkeit an. Die darauf folgenden Regenfälle begünstigen das Wachstum und erhöhen die Ernteerträge einiger Bauern der Region bis der Regen wieder nachlässt." @@ -89,10 +61,6 @@ msgctxt "spell" msgid "create_potion_ointment" msgstr "Braue Wundsalbe" -msgctxt "keyword" -msgid "email" -msgstr "EMAIL" - msgctxt "spell" msgid "create_potion_healing" msgstr "Braue Heiltrank" @@ -100,21 +68,9 @@ msgstr "Braue Heiltrank" msgid "frigate_a" msgstr "eine Fregatte" -msgctxt "keyword" -msgid "message" -msgstr "BOTSCHAFT" - -msgctxt "keyword" -msgid "claim" -msgstr "BEANSPRUCHE" - msgid "trireme" msgstr "Trireme" -msgctxt "keyword" -msgid "alliance" -msgstr "ALLIANZ" - msgctxt "spellinfo" msgid "create_potion_healing" msgstr "Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt." @@ -126,18 +82,10 @@ msgctxt "spellinfo" msgid "create_potion_p13" msgstr "Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde." -msgctxt "keyword" -msgid "follow" -msgstr "FOLGE" - msgctxt "spellinfo" msgid "earn_silver#gwyrrd" msgstr "Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 25 Silber verdienen." -msgctxt "keyword" -msgid "study" -msgstr "LERNE" - msgctxt "describe" msgid "lifepotion" msgstr "Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen." @@ -154,21 +102,9 @@ msgstr "Adamantiumrüstungen" msgid "cutter" msgstr "Kutter" -msgctxt "keyword" -msgid "hide" -msgstr "TARNE" - -msgctxt "keyword" -msgid "move" -msgstr "NACH" - msgid "caravel_a" msgstr "eine Karavelle" -msgctxt "keyword" -msgid "describe" -msgstr "BESCHREIBE" - msgctxt "spellinfo" msgid "blessedharvest" msgstr "Für dieses Ernteritual sendet der Druide seine arkane Energie entlang der astralen Kraftlinien der gesamten Umgebung, um selbst weit entfernte Naturgeister zu erreichen. Die Beschwörung dieser Naturgeister ist eine hohe Kunst, die höchste Konzentration und vor allem viel Erfahrung erfordert. Die Bauern werden nach und nach von den besseren Ernten profitieren und ihre Ersparnisse steigern können." @@ -179,46 +115,18 @@ msgstr "Adamantiumaxt" msgid "charger_p" msgstr "Streitrösser" -msgctxt "keyword" -msgid "password" -msgstr "PASSWORT" - msgid "raft" msgstr "Floß" msgid "guardhouse" msgstr "Wachstube" -msgctxt "keyword" -msgid "attack" -msgstr "ATTACKIERE" - msgid "caravel" msgstr "Karavelle" msgid "canoe" msgstr "Einbaum" -msgctxt "keyword" -msgid "leave" -msgstr "VERLASSE" - -msgctxt "keyword" -msgid "option" -msgstr "OPTION" - -msgctxt "keyword" -msgid "spy" -msgstr "SPIONIERE" - -msgctxt "keyword" -msgid "loot" -msgstr "PLÜNDERE" - -msgctxt "keyword" -msgid "guard" -msgstr "BEWACHE" - msgctxt "morale" msgid "0" msgstr "aufständische" @@ -265,10 +173,6 @@ msgstr "Repetierarmbrust" msgid "packice" msgstr "Packeis" -msgctxt "keyword" -msgid "besiege" -msgstr "BELAGERE" - msgctxt "spellinfo" msgid "commonfamiliar" msgstr "Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird." @@ -279,24 +183,12 @@ msgstr "eine Trireme" msgid "royalbarge_a" msgstr "eine Königsbarke" -msgctxt "keyword" -msgid "recruit" -msgstr "REKRUTIERE" - -msgctxt "keyword" -msgid "steal" -msgstr "BEKLAUE" - msgid "adamantiumaxe_p" msgstr "Adamantiumäxte" msgid "rpg_item_2_p" msgstr "Nußhälften" -msgctxt "keyword" -msgid "name" -msgstr "BENENNE" - msgid "watch" msgstr "Wache" @@ -304,41 +196,13 @@ msgctxt "spellinfo" msgid "earn_silver#draig" msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll: niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 25 Silber pro Stufe ein." -msgctxt "keyword" -msgid "//" -msgstr "//" - -msgctxt "keyword" -msgid "enter" -msgstr "BETRETE" - -msgctxt "keyword" -msgid "work" -msgstr "ARBEITE" - msgid "catamaran" msgstr "Katamaran" -msgctxt "keyword" -msgid "cast" -msgstr "ZAUBERE" - -msgctxt "keyword" -msgid "destroy" -msgstr "ZERSTÖRE" - msgctxt "spell" msgid "create_potion_p13" msgstr "Braue Elixier der Macht" -msgctxt "keyword" -msgid "ride" -msgstr "FAHRE" - -msgctxt "keyword" -msgid "sort" -msgstr "SORTIERE" - msgctxt "spellinfo" msgid "create_potion_ointment" msgstr "Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkeit bietet der Magier ebenso wie der Heiler. Im Gegensatz zum Heiler ist der Magier jedoch in der Lage, seine Behandlung bereits vor dem Kampf durchzuführen, indem er seine Heilkräfte in eine magische Salbe bindet, welche gelagert werden kann und nach dem Kampf nur aufgetragen werden muss." @@ -346,24 +210,12 @@ msgstr "Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkei msgid "packice_trail" msgstr "%s" -msgctxt "keyword" -msgid "number" -msgstr "NUMMER" - msgid "cog_a" msgstr "eine Kogge" -msgctxt "keyword" -msgid "group" -msgstr "GRUPPE" - msgid "canoe_a" msgstr "ein Einbaum" -msgctxt "keyword" -msgid "carry" -msgstr "TRANSPORTIERE" - msgid "galleon_a" msgstr "eine Galeone" @@ -373,22 +225,6 @@ msgstr "Turmschilde" msgid "cutter_a" msgstr "ein Kutter" -msgctxt "keyword" -msgid "make" -msgstr "MACHE" - -msgctxt "keyword" -msgid "route" -msgstr "ROUTE" - -msgctxt "keyword" -msgid "ready" -msgstr "KAMPFZAUBER" - -msgctxt "keyword" -msgid "help" -msgstr "HELFE" - msgid "royalbarge" msgstr "Königsbarke" @@ -399,78 +235,30 @@ msgstr "Vertrauten binden" msgid "barge" msgstr "Barke" -msgctxt "keyword" -msgid "grow" -msgstr "ZÜCHTE" - msgctxt "spell" msgid "create_potion_peasantblood" msgstr "Braue Bauernblut" -msgctxt "keyword" -msgid "banner" -msgstr "BANNER" - -msgctxt "keyword" -msgid "use" -msgstr "BENUTZE" - msgctxt "spellinfo" msgid "earn_silver#cerddor" msgstr "Cerddormagier sind _die_ Gaukler unter den Magiern; sie lieben es, das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 25 Silber pro Stufe verdient haben." -msgctxt "keyword" -msgid "tax" -msgstr "TREIBE" - -msgctxt "keyword" -msgid "promote" -msgstr "BEFÖRDERE" - msgctxt "spellinfo" msgid "earn_silver#illaun" msgstr "Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 25 Silber pro Stufe." -msgctxt "keyword" -msgid "sell" -msgstr "VERKAUFE" - msgid "rpg_item_1_p" msgstr "Urkunden" -msgctxt "keyword" -msgid "contact" -msgstr "KONTAKT" - msgid "guardtower" msgstr "Wachturm" -msgctxt "keyword" -msgid "plant" -msgstr "PFLANZE" - msgid "raft_a" msgstr "ein Floß" -msgctxt "keyword" -msgid "give" -msgstr "GIB" - -msgctxt "keyword" -msgid "prefix" -msgstr "PRÄFIX" - -msgctxt "keyword" -msgid "show" -msgstr "ZEIGE" - msgid "dragonship" msgstr "Drachenschiff" -msgctxt "keyword" -msgid "piracy" -msgstr "PIRATERIE" - msgid "galleon" msgstr "Galeone" @@ -480,10 +268,6 @@ msgstr "Turmschild" msgid "rm_adamantium" msgstr "Adamantium" -msgctxt "keyword" -msgid "research" -msgstr "FORSCHE" - msgid "adamantium_p" msgstr "Adamantium" @@ -510,33 +294,9 @@ msgctxt "spellinfo" msgid "earn_silver#tybied" msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat -- nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 25 Silber pro Stufe lassen sich so in einer Woche verdienen." -msgctxt "keyword" -msgid "teach" -msgstr "LEHRE" - -msgctxt "keyword" -msgid "combat" -msgstr "KÄMPFE" - -msgctxt "keyword" -msgid "sabotage" -msgstr "SABOTIERE" - -msgctxt "keyword" -msgid "maketemp" -msgstr "MACHE TEMP" - msgid "market" msgstr "Marktplatz" msgid "rep_crossbow_p" msgstr "Repetierarmbrüste" -msgctxt "keyword" -msgid "quit" -msgstr "STIRB" - -msgctxt "keyword" -msgid "end" -msgstr "ENDE" - diff --git a/res/translations/strings-e3.en.po b/res/translations/strings-e3.en.po index cee603f65..169a80a68 100644 --- a/res/translations/strings-e3.en.po +++ b/res/translations/strings-e3.en.po @@ -10,18 +10,6 @@ msgstr "piece of a holy nut" msgid "rpg_item_3" msgstr "bottle demon Zhardamon" -msgctxt "keyword" -msgid "entertain" -msgstr "UNTERHALTE" - -msgctxt "keyword" -msgid "default" -msgstr "DEFAULT" - -msgctxt "keyword" -msgid "reserve" -msgstr "RESERVIERE" - msgctxt "spell" msgid "create_potion_p0" msgstr "brew seven mile tea" @@ -50,25 +38,9 @@ msgctxt "spellinfo" msgid "create_potion_peasantblood" msgstr "One of the most dangerous and best guarded secrets of all mages is the knowledge about the power of death. Even though most of them would not openly admit it, and it is at least partially forbidden in most countries, each of them studies death sooner or later. When they do, they quickly find out that there is another plane of existance: the home of the demons. Only blood can quelch the thirst of those, when they switch from their home to our world. But experienced mages will find out that the demons bloodwine can be deluted when appropiate herbs are included, making it enough for 100 instead of 10 demons. As the demons may not know about that, the magician has to secretly sacrifice one of his freed minions." -msgctxt "keyword" -msgid "forget" -msgstr "VERGISS" - msgid "scaffolding" msgstr "scaffolding" -msgctxt "keyword" -msgid "origin" -msgstr "URSPRUNG" - -msgctxt "keyword" -msgid "pay" -msgstr "BEZAHLE" - -msgctxt "keyword" -msgid "buy" -msgstr "KAUFE" - msgctxt "spellinfo" msgid "raindance" msgstr "This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasants' harvest will be extraordinary good." @@ -89,10 +61,6 @@ msgctxt "spell" msgid "create_potion_ointment" msgstr "brew ointment" -msgctxt "keyword" -msgid "email" -msgstr "EMAIL" - msgctxt "spell" msgid "create_potion_healing" msgstr "brew healing potion" @@ -100,21 +68,9 @@ msgstr "brew healing potion" msgid "frigate_a" msgstr "a frigate" -msgctxt "keyword" -msgid "message" -msgstr "BOTSCHAFT" - -msgctxt "keyword" -msgid "claim" -msgstr "BEANSPRUCHE" - msgid "trireme" msgstr "trireme" -msgctxt "keyword" -msgid "alliance" -msgstr "ALLIANZ" - msgctxt "spellinfo" msgid "create_potion_healing" msgstr "Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom." @@ -126,18 +82,10 @@ msgctxt "spellinfo" msgid "create_potion_p13" msgstr "Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. " -msgctxt "keyword" -msgid "follow" -msgstr "FOLGE" - msgctxt "spellinfo" msgid "earn_silver#gwyrrd" msgstr "The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 25 silver pieces per level in this way." -msgctxt "keyword" -msgid "study" -msgstr "LERNE" - msgctxt "describe" msgid "lifepotion" msgstr "The \"Water of Life\" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs." @@ -154,18 +102,6 @@ msgstr "adamantium plates" msgid "cutter" msgstr "cutter" -msgctxt "keyword" -msgid "hide" -msgstr "TARNE" - -msgctxt "keyword" -msgid "move" -msgstr "NACH" - -msgctxt "keyword" -msgid "describe" -msgstr "BESCHREIBE" - msgid "caravel_a" msgstr "a caravel" @@ -179,46 +115,18 @@ msgstr "adamantium axe" msgid "charger_p" msgstr "chargers" -msgctxt "keyword" -msgid "password" -msgstr "PASSWORT" - msgid "raft" msgstr "raft" msgid "guardhouse" msgstr "guard house" -msgctxt "keyword" -msgid "attack" -msgstr "ATTACKIERE" - msgid "caravel" msgstr "caravel" msgid "canoe" msgstr "canoe" -msgctxt "keyword" -msgid "leave" -msgstr "VERLASSE" - -msgctxt "keyword" -msgid "option" -msgstr "OPTION" - -msgctxt "keyword" -msgid "spy" -msgstr "SPIONIERE" - -msgctxt "keyword" -msgid "loot" -msgstr "PLÜNDERE" - -msgctxt "keyword" -msgid "guard" -msgstr "BEWACHE" - msgctxt "morale" msgid "0" msgstr "rebellious" @@ -265,10 +173,6 @@ msgstr "repeating crossbow" msgid "packice" msgstr "fast ice" -msgctxt "keyword" -msgid "besiege" -msgstr "BELAGERE" - msgctxt "spellinfo" msgid "commonfamiliar" msgstr "During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them." @@ -279,24 +183,12 @@ msgstr "a trireme" msgid "royalbarge_a" msgstr "a royal barge" -msgctxt "keyword" -msgid "recruit" -msgstr "REKRUTIERE" - -msgctxt "keyword" -msgid "steal" -msgstr "BEKLAUE" - msgid "adamantiumaxe_p" msgstr "adamantium axes" msgid "rpg_item_2_p" msgstr "nut halves" -msgctxt "keyword" -msgid "name" -msgstr "BENENNE" - msgid "watch" msgstr "watch" @@ -304,41 +196,13 @@ msgctxt "spellinfo" msgid "earn_silver#draig" msgstr "In the dark alleys you can find those who sell curses and hexes on demand -- but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 25 silver pieces per level." -msgctxt "keyword" -msgid "//" -msgstr "//" - -msgctxt "keyword" -msgid "enter" -msgstr "BETRETE" - -msgctxt "keyword" -msgid "work" -msgstr "ARBEITE" - msgid "catamaran" msgstr "catamaran" -msgctxt "keyword" -msgid "cast" -msgstr "ZAUBERE" - -msgctxt "keyword" -msgid "destroy" -msgstr "ZERSTÖRE" - msgctxt "spell" msgid "create_potion_p13" msgstr "brew elixir of power" -msgctxt "keyword" -msgid "ride" -msgstr "FAHRE" - -msgctxt "keyword" -msgid "sort" -msgstr "SORTIERE" - msgctxt "spellinfo" msgid "create_potion_ointment" msgstr "In the aftermath of battle it is vital to heal your own troops. This can be done by a healer as well as by a magician. In contrast to a healer, the magician can fullfill this treatment already before the battle by binding magical powers into a potent salve. This salve can be stored and only needs to be applied to the wounds after the battle. " @@ -346,24 +210,12 @@ msgstr "In the aftermath of battle it is vital to heal your own troops. This can msgid "packice_trail" msgstr "%s" -msgctxt "keyword" -msgid "number" -msgstr "NUMMER" - msgid "cog_a" msgstr "a cog" -msgctxt "keyword" -msgid "group" -msgstr "GRUPPE" - msgid "canoe_a" msgstr "a canoe" -msgctxt "keyword" -msgid "carry" -msgstr "TRANSPORTIERE" - msgid "galleon_a" msgstr "a galleon" @@ -373,22 +225,6 @@ msgstr "tower shields" msgid "cutter_a" msgstr "a cutter" -msgctxt "keyword" -msgid "make" -msgstr "MACHE" - -msgctxt "keyword" -msgid "route" -msgstr "ROUTE" - -msgctxt "keyword" -msgid "ready" -msgstr "KAMPFZAUBER" - -msgctxt "keyword" -msgid "help" -msgstr "HELFE" - msgid "royalbarge" msgstr "royal barge" @@ -399,78 +235,30 @@ msgstr "Bind Familiar" msgid "barge" msgstr "barge" -msgctxt "keyword" -msgid "grow" -msgstr "GROW" - msgctxt "spell" msgid "create_potion_peasantblood" msgstr "brew peasant blood" -msgctxt "keyword" -msgid "banner" -msgstr "BANNER" - -msgctxt "keyword" -msgid "use" -msgstr "BENUTZE" - msgctxt "spellinfo" msgid "earn_silver#cerddor" msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 25 silver per level. " -msgctxt "keyword" -msgid "tax" -msgstr "TREIBE" - -msgctxt "keyword" -msgid "promote" -msgstr "PROMOTE" - msgctxt "spellinfo" msgid "earn_silver#illaun" msgstr "No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 25 silver pieces per level and week for offering these services to peasants." -msgctxt "keyword" -msgid "sell" -msgstr "VERKAUFE" - msgid "rpg_item_1_p" msgstr "Certificates" -msgctxt "keyword" -msgid "contact" -msgstr "KONTAKT" - msgid "guardtower" msgstr "guard tower" -msgctxt "keyword" -msgid "plant" -msgstr "PLANT" - msgid "raft_a" msgstr "a raft" -msgctxt "keyword" -msgid "give" -msgstr "GIB" - -msgctxt "keyword" -msgid "prefix" -msgstr "PRÄFIX" - -msgctxt "keyword" -msgid "show" -msgstr "ZEIGE" - msgid "dragonship" msgstr "dragonship" -msgctxt "keyword" -msgid "piracy" -msgstr "PIRATERIE" - msgid "galleon" msgstr "galleon" @@ -480,10 +268,6 @@ msgstr "tower shield" msgid "rm_adamantium" msgstr "adamantium" -msgctxt "keyword" -msgid "research" -msgstr "FORSCHE" - msgid "adamantium_p" msgstr "adamantium" @@ -506,37 +290,13 @@ msgctxt "spellinfo" msgid "create_potion_p9" msgstr "Even though mages live in strict celibacy, they know a lot about creating certain longings. Peasants keep asking them for this love potion or that. But the penality for bewitching a peasant is death, so the mages offer their services only to farmers for their breeding stock. In an elaborate ritual, which only serves to hide the simplicity of the procedure, the magician draws the fluids from certains plants. While doing so he calls upon the spirits of fertility, which of course only listen when he talkes to them. Now the farmer knows that any attempt to draw the fluids himself will only result in a useless waste of resources. Finally, the magician hands the vial with the fluids to the farmer, who pours it into his horses' drinking water." -msgctxt "keyword" -msgid "teach" -msgstr "LEHRE" - msgctxt "spellinfo" msgid "earn_silver#tybied" msgstr "If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - Well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 25 silver per level that way." -msgctxt "keyword" -msgid "combat" -msgstr "COMBAT" - -msgctxt "keyword" -msgid "sabotage" -msgstr "SABOTIERE" - -msgctxt "keyword" -msgid "maketemp" -msgstr "MACHE TEMP" - msgid "market" msgstr "marketplace" msgid "rep_crossbow_p" msgstr "repeating crossbows" -msgctxt "keyword" -msgid "quit" -msgstr "STIRB" - -msgctxt "keyword" -msgid "end" -msgstr "ENDE" - From 87914a7b5b6403de9d4b24f78249d9bc2205f107 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:27:21 +0200 Subject: [PATCH 198/231] delete XML Strings. --- res/core/de/strings.xml | 7371 ------------------------------------- res/core/en/strings.xml | 1659 --------- res/core/fr/strings.xml | 2036 ---------- res/e3a/shipnames.xml | 110 - res/e3a/strings.xml | 294 -- res/eressea/spellinfo.xml | 121 - res/eressea/strings.xml | 413 --- res/names-dragons.xml | 95 - res/names-ghouls.xml | 116 - res/names-skeletons.xml | 121 - res/names-undead.xml | 158 - res/names-zombies.xml | 110 - src/bindings.c | 8 + 13 files changed, 8 insertions(+), 12604 deletions(-) delete mode 100644 res/core/de/strings.xml delete mode 100644 res/core/en/strings.xml delete mode 100644 res/core/fr/strings.xml delete mode 100644 res/e3a/shipnames.xml delete mode 100644 res/e3a/strings.xml delete mode 100644 res/eressea/spellinfo.xml delete mode 100644 res/eressea/strings.xml delete mode 100644 res/names-dragons.xml delete mode 100644 res/names-ghouls.xml delete mode 100644 res/names-skeletons.xml delete mode 100644 res/names-undead.xml delete mode 100644 res/names-zombies.xml diff --git a/res/core/de/strings.xml b/res/core/de/strings.xml deleted file mode 100644 index 82174da28..000000000 --- a/res/core/de/strings.xml +++ /dev/null @@ -1,7371 +0,0 @@ - - - - - - BEFEHLE - ORDERS - - - Wirbel - vortex - remous - - - Ein Wirbel aus reinem Chaos zieht über die Region - A vortex of pure chaos energy pulls over the region - - - 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. - Wobbling green vapours drift through the mists to form an eldritch creature that seems to be entirely made up of huge jaws and a long tail. - - - - Keine Informationen über diesen Schiffstyp verfügbar. - No Information available for this type of ship. - - - - - Keine Informationen über diese Rasse verfügbar. - No information available for this race. - - - Singdrachen sind von der Größe eines ausgewachsenden Tigers. Ihre Färbung reicht von schillerndem Rot, über dunkles Grün bis hin zu tiefem Schwarz. Alle bekannten Drachen dieser Art weisen eine hohe Intelligenz und ein hohes Maß an magischen Fähigkeiten auf. Wie Ihre großen Verwandten verfügen sie über einen Feuerodem. Sie lieben den Gesang und das üppige Mahl. Von Zeit zu Zeit gehen sie eine engen magisches Bund zu einem Magier ein. Wenn dies geschieht, so steht dem Magier ein äußerst loyaler und lohnender Vertrauter zur Seite. - - Song Dragons are roughly the size of a fully grown tiger. Their coloring ranges from bright red, through a dark green shade to a deep black. All known dragons of this species display a high level of intelligence and highly developed magical skills. Like their larger cousins, Song Dragons posess a firegland. They love singing and a good meal. From time to time one of these magnificent creatures will bond with a mage. When this happens, the mage is assured of a most loyal and useful familiar at his side. - - - Dieses mystische Wesen lebt bevorzugt in den tiefsten Wäldern und - vermag sich hervorragend vor den Augen anderer zu verbergen. Nur - selten schließt sich ein Einhorn einem Magier an, jedoch wenn das - geschieht ist es ein mächtiger Verbündeter, der auch über eigene Magie - verfügt. - - - Der Adler ist ein ausgezeichneter Späher, fliegend überquert er sogar - kurze Meerengen, doch ist er hoch oben am Himmel auch sehr exponiert, - was ihn beim Rasten zu einem leichten Ziel macht. - - - Der Luchs ist bekannt für seine Geschicklichkeit im Verbergen und - Beobachten. Mit ein wenig Geduld kann er zu einem hervorragenden - Späher ausgebildet werden. Im Kampf verteidigt er sich mit seinen - scharfen Krallen und weiß seine Gewandheit zu nutzen. - - - Diese großen Wölfe sind nicht alle so wild und böse wie in den - Legenden berichtet, und einige von ihnen schließen sich auch guten - Magiern bereitwillig an und sind ihnen dann treue Gefährten. - - - Diese aus den Tiefen Eresseas stammende gigantische Geschöpf ist dem - Leben im Untergrund hervorragend angepasst. Blind, taub und nicht - besonders intelligent, aber mit seinen gewaltigen Kräften kann es - ganze Berge versetzen oder Wälder roden. - - - - - Keine Informationen. - No Information available. - - - Das Horn eines Trolles. Kein Troll würde sich lebend davon trennen. - The horn of an adult troll. No troll would ever part with this while he's alive. - - - Beim Barte des Proheten! Ach nein, Zwergen. Irgendetwas riecht hier ranzig. - Sniff... Bleah. Don't they ever wash these? - - - Diese Amulett ist ein hervorragender Fokus für alle Heilzauber. Ein - mit diesem Fokus gewirkter Heilzauber wird mit größerer - Warscheinlichkeit Erfolgreich sein und doppelt so viele Leute heilen - können. - - - Der Kopf eines toten Drachens oder Wyrms. Man sagt, es ruhen magische Kräfte darin. - The head of a dead dragon or wyrm. They say that it has magical powers. - - - Munition für Katapulte. - Ammunition for catapults. - - - Ein Elfenpferd wird sich nur den wenigsten jemals anschließen. Hat es - jedoch seine Scheu überwunden ist es ein sehr wertvoller Gefährte. Ein - Elfenpferd ist schneller als ein Pferd. Zudem hilft es seinem Reiter - im Kampf und unterstützt ihn mit seiner Magie. Es sind schwarze - Elfenpferde bekannt, die sich sogar Orks angeschlossen haben. - - - Die rötlich glühende Klinge dieser furchterregenden magischen Waffe - ist mit dunklen Runen bedeckt. Nur die erfahrendsten Schwertkämpfer - vermögen ihre Kraft zu zähmen, doch in ihrer Hand vermag dem - Runenschwert nichts zu widerstehen - selbst magische Rüstungen - durchdringt es ohne Schwierigkeiten - und den Geist des Kämpfers füllt - es mit unterschütterlicher Zuversicht. - - - This enchanted dragon-eye has to be eaten by the leader of your forces - on the eve before battle. During the night he gains insight into the - dreams of the enemy leaders and may potentially glean a decisive - advantage. - Dieses verzauberte Drachenauge muß vor dem Abend einer Schlacht vom - Heerführer verzehrt werden. Während der Nacht wird er dann Einblick in - die Träume der feindlichen Heerführer erhalten und so möglicherweise - einen entscheidenden Vorteil im kommenden Gefecht erlangen. - - - This artifact grants its wearer the strength of a cavetroll. He will - be able to carry fifty times as much as normal and also in combat his - enhanced strength and tough troll skin will serve him well. - Dieses magische Artefakt verleiht seinem Träger die Stärke eines - ausgewachsenen Höhlentrolls. Seine Tragkraft erhöht sich auf das - 50fache und auch im Kampf werden sich die erhöhte Kraft und die - trollisch zähe Haut positiv auswirken. - - - It may look like just another quartz, but your magician will tell you - tha great power emenates from these crystals. Using it at the begining - of a week will release a strong negative energy that reduce the - power of all spells cast in the region during that week. - Für den ungeübten Betrachter mag der Antimagiekristall wie ein - gewöhnlicher Quarzkristall ausschauen, doch ein Magier spürt, das ihm - ganz besondere Kräfte innewohnen. Durch spezielle Rituale antimagisch - aufgeladen wird der Kristall, wenn er zu feinem Staub zermahlen und - verteilt wird, die beim Zaubern freigesetzten magischen Energien - aufsaugen und die Kraft aller Zauber reduzieren, welche in der betreffenden - Woche in der Region gezaubert werden. - - - A ring of power increases a magician's power. The level of all the - spells - he casts will be increased by one without increasing their costs. - Ein Ring der Macht verstärkt die Kraft des Magiers. Jeder Zauber wird, - ohne das sich die Kosten erhöhen, so gezaubert als hätte der Magier - eine Stufe mehr. - - - Herbs stored in this bag will be much better preserved. - Kräuter, die in diesem Beutelchen aufbewahrt werden, sind erheblich - besser konserviert. - - - This bag encloses a dimensional fold, which can store up to 200 - stones of weight without any extra burden on the bearer. Large items - such as horses or carts cannot be placed inside. - Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis - zu 200 Gewichtseinheiten transportiert werden können, ohne dass - sie auf das Traggewicht angerechnet werden. Pferde und andere - Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können - nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, - einen Zauberbeutel in einem anderen zu transportieren. Der Beutel - selber wiegt 1 GE. - - - These leather boots are embroidere with unicorn hair and allow - their wearer to walk at twice his normal speed. - Diese aus Leder gefertigten und mit Einhornfell verzierten Stiefel - ermöglichen es ihrem Träger, sich mit der doppelten Geschwindigkeit - fortzubewegen, wenn er zu Fuß reist. - - - The flaming sword gives its bearer an attack of 3d6+10 plus - an additional fireball causing 2d6 damage to 1-10 victims. - Using a flaming sword requires a minimum skill of 7. It grants an - additional +1 to your skill and your resistance to magic will be - increased. - Ein Flammenschwert gibt dem Träger, der kein Magier sein muß, - zusätzlich zu seinem normalen Angriff (3d6+10) einen kleinen - Feuerballangriff, der bei 1-10 Opfern 2d6 magischen Schaden - verursacht. Um ein Flammenschwert führen zu können, muss man - mindestens Hiebwaffen 7 haben, dann verleiht es einem auch - einen zusätzlichen Kampfbonus von +1. Ein Flammenschwert - erhöht die Magieresistenz seines Trägers wie ein Laenschwert. - - - The magic in this ring makes the fingers ten times more nimble. a - craftsman can produce ten times his normal quota, and other abilities - might also be improved. - Der Zauber in diesem Ring bewirkt eine um das zehnfache verbesserte - Geschicklichkeit und Gewandheit der Finger. Handwerker können somit - das zehnfache produzieren, und bei einigen anderen Tätigkeiten könnte - dies ebenfalls von Nutzen sein. - - - This magical artifact has been used since ancient times by Elves to - conceal themselves from their enemies. Other races have also learned - the value of these rings after encountering Elves - after all the ring - makes its wearer invisible to normal eyes, and only magical methods - enable the wearer to be discovered. - Dieses magische Artefakt wurde seit Urzeiten von den Elfen benutzt, - auf der Jagd oder um sich vor Feinden zu verbergen. Doch auch andere - Rassen haben nach der Begegnung mit den Elfenvölkern den Wert des Rings - schnell schätzen gelernt - schließlich macht er den Träger für jedes - noch so scharfe Auge unsichtbar - nur mit magischen Mitteln ist der - Verborgene noch zu entdecken. - - - Das Amulett erlaubt es dem Träger, alle Einheiten, die durch einen - Ring der Unsichtbarkeit geschützt sind, zu sehen. Einheiten allerdings, - die sich mit ihrem Tarnungs-Talent verstecken, bleiben weiterhin - unentdeckt. Die Herstellung des Amulettes kostet 3000 Silber. - - - Dieser Tiegel enthält die seltenste alchemistische Substanz - Eresseas, den Krötenschleim. Angeblich soll der Krötenschleim eine - aussergewöhnlich hohe magische Absorbtionskraft besitzen und deswegen - in obskuren magischen Ritualen Verwendung finden. - - - Die Kröte ist eine der seltensten Rassen Eresseas. Man munkelt, - sie würde nur auf magische Weise entstehen. In einer uralten - Abhandlung über Magie aus der Bibliothek der Akademie von Xontormia - wird die Theorie aufgestellt, das die Kröte die ins morphische Feld - des Magiers übertragene Manifestation eines implodierten - Zauberfeldes sein könnte. Vieleicht deswegen ist die Kröte auch - gegen Zauber weitaus widerstandsfähiger als die normalen Rassen - Eresseas, leider aber auch weitaus unmagischer als diese. Die - Kröte kann schon aufgrund ihrer Größe und der fehlenden Hände - nur unter Schwierigkeiten normale Tätigkeiten ausüben. Der - einzige Vorteil ihrer geringen Größe ist, dass sie sich leichter - verstecken kann. - - - Setzt eine Einheit dieses Segel auf einem Schiff, so erhöht - sich dessen Reichweite permanent um 1 Region. - A unit setting this sail on a ship temporarily will permanently - increase the ship's range by 1. - - - Im Mistelzweig ruht eine magische - Kraft der besonderer Art. Der Anwender wird von seinen - Feinden in Frieden gelassen, eine Woche lang läßt jeder - Kämpfer ihn unbeschadet seines Weges ziehen. - The magical misteltoe has a wonderous - property: It's use will make one person able to escape - unharmed from every conflict, no enemy will lay hand on - the bearer for one week. - - - - Die Herstellung dieses Trunkes ist ein wohlgehütetes Geheimnis. Manche - behaupten gar, von Sterblichen könne er gar nicht gebraut werden. - Tatsache ist, dass er dem Trinkenden tiefere Einsicht in seine erlernten - Talente gewährt, was ihn in der Meisterung dieser Talente voranbringt. - - - The recipe of this potion is a well kept secret. Some even say it - couldn't be brewed by mere mortals. One thing is certain though, the - drinker receives further insight into any learned skills, which furthers - their progress towards the mastery of those skills. - - - - - Eine Kugel aus Kristallglas von circa drei Zoll Durchmesser, welche auf - einem Sockel aus Granit ruht. - Im Inneren tanzen unzählige winzige Schneeflocken munter umher. Auf der - Unterseite des Sockels ist eine goldene Windrose mit den sechs - Himmelsrichtungen abgebildet. Eigentlich ein sehr schöner Anblick, doch - strahlt sie eine namenlose Kälte aus. - Unter Magiern und anderen der arkanen Künste kundigen ist die Funktion - und Wirkungsweise des Artefaktes heftig umstritten. Einig scheint man - sich darüber zu sein, dass in dieser kleinen Kugel so viel Kälte - gefangen ist, dass es dauerhafte Folgen für eine weiträumige Umgebung - hätte wenn man sie zerstört. Größte Brände ließen sich damit wohl - löschen, Vulkane besänftigen und Unmengen von Wasser zum gefrieren - bringen. Doch auch in weniger extremen Umgebungen würden sich bestimmt - dauerhafte Veränderungen ereignen. - Es wäre sicherlich nicht zu empfehlen das Kleinod einfach fallen zu - lassen. Man sollte es anstelle dessen so weit wie möglich von sich - schleudern und dafür sorge tragen, dass sich am Einschlagsort kein - Lebewesen aufhält. So man denn eine Benutzung tatsächlich riskieren - will. - (BENUTZE Schneekugel <HIMMELSRICHTUNG>) - - - A sphere with a diameter of three inches made of crystal glass, sitting - on a granite base. - On the inside countless tiny snowflakes dance around lively. On the - bottom of the base a golden compass rose is engraved. A beautiful sight - to behold, but it emanates a nameless cold. - Among mages and others knowledgeable in the arcane arts the function and - effect of the artefact are disputed intensely. Although there is - agreement about something: upon release the intensity of the contained - cold would have permanent repercussions for a large area. Gigantic fires - would be extinguished, volcanos quelled and large bodies of water frozen - solid. In less extreme environments permanent changes were also probable. - Therefore it isn't recommended to drop the cold treasure. It should be - thrown far off instead, while making sure there is no living being - within the impact zone, if one is willing to risk the usage. - (USE "snow globe" <DIRECTION>) - - - - - - - Kein Magiegebiet - no magic school - - - Illaun - Illaun - - - Tybied - Tybied - - - Cerddor - Cerddor - - - Gwyrrd - Gwyrrd - - - Draig - Draig - - - - - wenige - few - - - - viele - many - - - - relativ viele - rather many - - - - sehr wenige - very few - - - - sehr viele - a great many - beaucoup de - - - - (trauernd) - (in mourning) - - - Beschreibung: - Description: - - - Art: - Type: - - - Komponenten: - Components: - - - Modifikationen: - Modifications: - - - Stufe: - Level: - - - Rang: - Rank: - - - Syntax: - Syntax: - - - - Geboten wird für - Traders can sell - - - und für - and - - - . - . - - - , für - , - - - - , im - , to the - - - und im - and to the - - - Schemen der Regionen - Schemes of - - - sind erkennbar. - can be discerned. - - - Im - To the - - - und im - , and to the - - - , im - , to the - - - Die Region wird von - The region is guarded by - - - unbekannten Einheiten - unknown units - - - bewacht. - . - - - (im Bau) - (under construction) - - - - Einheit - Unit - - - Partei - Faction - - - hier_passwort_eintragen - insert_your_password_here - - - - Baum - tree - - - - Bäume - trees - - - - Mallorn - mallorn - - - - Mallorn - mallorn - - - - - - Nordwestküste - - - Nordostküste - - - Ostküste - - - Südostküste - - - Südwestküste - - - Westküste - - - - - AUSWERTUNG - - - COMPUTER - - - ZUGVORLAGE - - - SILBERPOOL - - - STATISTIK - - - DEBUG - - - ZIPPED - - - ZEITUNG - - - MATERIALPOOL - - - ADRESSEN - - - BZIP2 - - - PUNKTE - - - TALENTVERSCHIEBUNGEN - - - - - ein fliegender Teppich - - - ein Ballon - - - eine Karavelle - - - ein Boot - - - ein Langboot - - - ein Drachenschiff - - - eine Trireme - - - - fliegender Teppich - flying carpet - - - Ballon - - - Karavelle - - - Boot - - - Langboot - - - Drachenschiff - - - Trireme - - - - - Mahlstrom - - - Ozean - - - Ebene - - - Wald - - - Sumpf - - - Wüste - - - Hochland - - - Berge - - - Gletscher - - - Gletscher - - - Feuerwand - - - Vulkan - - - Nebel - - - Eisberg - - - Dichter Nebel - - - Ebene aus Feuer und Dunkelheit - - - Aktiver Vulkan - - - Halle - - - Gang - - - Wand - - - Magischer Sturm - - - - ein %s - - - %s - - - die Ebene von %s - - - der Wald von %s - - - der Sumpf von %s - - - die Wüste von %s - - - das Hochland von %s - - - das Bergland von %s - - - der Gletscher von %s - - - eine %s - - - der Vulkan von %s - - - ein %s - - - der Eisberg von %s - the glacier of %s - - - der Gletscher von %s - the glacier of %s - - - %s - - - eine %s - - - der Vulkan von %s - - - die %s - - - die %s - - - eine mächtige Mauer - - - ein %s - - - - Krater - - - Pforte - - - Kohlenstück - - - Kohlenstücke - - - - - Westen - - - Nordwesten - - - Nordosten - - - Osten - - - Südwesten - - - Südosten - - - - NW - - - NO - - - Ost - - - SO - - - SW - - - West - - - - - ein unbekanntes Gebäude - an unknown building - - - ein unbekannter Zauber - an unknown spell - - - ein unbekanntes Schiff - an unknown ship - - - eine unbekannte Einheit - an unknown unit - - - einer unbekannten Einheit - an unknown unit - - - ein unbekannter Zauber - an unknown curse - - - Fehler: Unbekannter Schlüssel - Fehler: Unbekannter Schlüssel - - - - - Ereignisse - - - Hinweise - Notifications - - - Botschaften - - - Warnungen und Fehler - - - Wirtschaft und Handel - - - Rohstoffe und Produktion - - - Magie und Artefakte - - - Reisen und Bewegung - - - Lehren und Lernen - - - Kämpfe - - - Verschiedenes - - - Neue Zauber - - - Neue Tränke - New Potions - - - - - Burg - - - Leuchtturm - - - Wurmloch - wormhole - - - Bergwerk - - - Steinbruch - - - Hafen - - - Akademie - - - Magierturm - - - Schmiede - - - Sägewerk - - - Pferdezucht - - - Monument - - - Damm - - - Karawanserei - - - Tunnel - - - Taverne - - - Steinkreis - - - Gesegneter Steinkreis - - - Traumschlößchen - - - Struktur - - - - - Zauberstab - - - Zauberstäbe - - - - - Grundmauern - - - Handelsposten - - - Befestigung - - - Turm - - - Burg - - - Festung - - - Zitadelle - - - - - Pyramide - pyramid - - - Pyramide - pyramid - - - - - Sphäre der Unsichtbarkeit - sphere of invisibility - - - Sphären der Unsichtbarkeit - spheres of invisibility - - - Kraut - - - Kräuterbeutel - - - Kräuterbeutel - - - Phiole - - - Phiolen - - - Katapultmunition - ammunition - - - Katapultmunition - ammunition - - - Sonnensegel - solar sail - - - Sonnensegel - solar sails - - - Weihnachtsbaum - christmas tree - - - Weihnachtsbäume - christmas trees - - - Sternenstaub - stardust - - - Sternenstaub - stardust - - - Papyrus - papyrus - - - Papyri - papyri - - - Elfenohr - elven ear - - - Elfenohren - elven ears - - - Dämonenblut - demon blood - - - Dämonenblut - demon blood - - - Goblinkopf - goblin head - - - Goblinköpfe - goblinheads - - - Zwergenbart - dwarven beard - - - Zwergenbärte - dwarven beards - - - Halblingfuß - halfling foot - - - Halblingfüße - halfling feet - - - Menschenskalp - human scalp - - - Menschenskalpe - human scalps - - - Meermenschschuppe - aquarian scale - - - Meermenschschuppen - aquarian scales - - - Insektenfühler - insect antenna - - - Insektenfühler - insect antenna - - - Katzenschwanz - cat tail - - - Katzenschwänze - cat tails - - - Orkhauer - orc tusk - - - Orkhauer - orc tusks - - - Trollhorn - troll horn - - - Trollhörner - troll horns - - - - - Silber - - - Silber - - - Trefferpunkt - - - Trefferpunkte - - - Aura - - - Aura - - - permanente Aura - - - permanente Aura - - - Bauer - - - Bauern - - - Einheit - - - Einheiten - - - Person - - - Personen - - - - - Runenschwert - - - Runenschwerter - - - Eisen - - - Eisen - - - Holz - - - Holz - - - Stein - - - Steine - - - Wagen - - - Wagen - - - Katapult - - - Katapulte - - - Schwert - - - Schwerter - - - Speer - - - Speere - - - Mallornspeer - - - Mallornspeere - - - Armbrust - - - Armbrüste - - - Mallornarmbrust - - - Mallornarmbrüste - - - Bogen - - - Bögen - - - Mallornbogen - - - Mallornbögen - - - - Kettenhemd - - - Kettenhemden - - - Schuppenpanzer - - - Schuppenpanzer - - - Plattenpanzer - - - Plattenpanzer - - - Balsam - - - Balsam - - - Gewürz - - - Gewürze - - - Juwel - - - Juwelen - - - Myrrhe - - - Myrrhe - - - Öl - - - Öl - - - Seide - - - Seide - - - Weihrauch - - - Weihrauch - - - Flammenschwert - - - Flammenschwerter - - - Bihänder - - - Bihänder - - - Kriegsaxt - axe - - - Kriegsäxte - axes - - - Elfenbogen - - - Elfenbögen - - - Laenschwert - - - Laenschwerter - - - Laenschild - - - Laenschilde - - - Laenkettenhemd - - - Laenkettenhemden - - - Laen - - - Laen - - - Schild - - - Schilde - - - Hellebarde - - - Hellebarden - - - Lanze - - - Lanzen - - - Mallornlanze - - - Mallornlanzen - - - Mallorn - - - Mallorn - - - Keks - - - Kekse - - - Apfel - - - Äpfel - - - Nuß - - - Nüsse - - - Mandelkern - - - Mandelkerne - - - Drachenblut - - - Drachenblut - - - Feenstiefel - - - Feenstiefel - - - Heiltrank - - - Heiltränke - - - Antimagiekristall - - - Antimagiekristalle - - - Tiegel mit Krötenschleim - - - Tiegel mit Krötenschleim - - - Amulett - - - Amulette - - - Amulett der Keuschheit - - - Amulette der Keuschheit - - - Amulett der Heilung - - - Amulette der Heilung - - - Amulett des Treffens - - - Amulette des Treffens - - - Amulett des wahren Sehens - - - Amulette des wahren Sehens - - - Ring der Unsichtbarkeit - - - Ringe der Unsichtbarkeit - - - Ring der Macht - - - Ringe der Macht - - - Ring der flinken Finger - - - Ringe der flinken Finger - - - Pferd - - - Pferde - - - Magischer Kräuterbeutel - - - Magische Kräuterbeutel - - - Silberbeutel - - - Silberkassette - - - Drachenhort - - - Drachenkopf - - - Drachenköpfe - - - Auge des Drachen - - - Augen des Drachen - - - Schartiges Schwert - - - Schartige Schwerter - - - Rostiger Schild - - - Rostige Schilde - - - Rostige Hellebarde - rusty halberd - - - Rostige Hellebarden - rusty halberds - - - Rostige Kriegsaxt - rusty axe - - - Rostige Kriegsäxte - rusty axes - - - Rostiger Zweihänder - rusty claymore - - - Rostige Zweihänder - rusty claymores - - - Rostiges Kettenhemd - - - Rostige Kettenhemden - - - Beutel des negativen Gewichts - - - Beutel des negativen Gewichts - - - Ring der Regeneration - - - Ringe der Regeneration - - - Amulett der Dunkelheit - - - Amulette der Dunkelheit - - - Zauberbeutel - - - Zauberbeutel - - - Traumauge - - - Traumaugen - - - Seeschlangenkopf - - - Seeschlangenköpfe - - - Aurafocus - - - Aurafocuse - - - Akkredition des Xontormia-Expreß - - - Akkreditionen des Xontormia-Expreß - - - Schneeball - snowball - - - Schneebälle - snowball - - - Schneemann - snowman - - - Schneekugel - snow globe - - - Schneekugeln - snow globes - - - Schneemänner - snowmen - - - Gürtel der Trollstärke - - - Gürtel der Trollstärke - - - Elfenpferd - - - Elfenpferde - - - Pegasus - - - Pegasi - - - Delphin - - - Delphine - - - Eintrittskarte des Großen Museum - - - Eintrittskarten des Großen Museum - - - Rückkehrticket des Großen Museum - - - Rückkehrtickets des Großen Museum - - - Astralkristall - - - Astralkristalle - - - Talenttrunk - - - Talenttrünke - - - Same - - - Samen - - - Mallornsame - - - Mallornsamen - - - Lebkuchenherz mit der Aufschrift 'Erz und - Stein, das ist fein' - - - Lebkuchenherzen mit der Aufschrift 'Erz und - Stein, das ist fein' - - - Schlüssel - key - - - Schlüssel - keys - - - Achatener Schlüssel - agate key - - - Achatene Schlüssel - agate keys - - - Saphirner Schlüssel - sapphire key - - - Saphirne Schlüssel - sapphire keys - - - - - Flachwurz - - - Würziger Wagemut - - - Eulenauge - - - Grüner Spinnerich - - - Blauer Baumringel - - - Elfenlieb - - - Gurgelkraut - - - Knotiger Saugwurz - - - Blasenmorchel - - - Wasserfinder - - - Kakteenschwitz - - - Sandfäule - - - Windbeutel - - - Fjordwuchs - - - Alraune - - - Steinbeißer - - - Spaltwachs - - - Höhlenglimm - - - Eisblume - - - Weißer Wüterich - - - Schneekristall - - - - - Flachwurz - - - Würzige Wagemut - - - Eulenaugen - - - Grüne Spinneriche - - - Blaue Baumringel - - - Elfenlieb - - - Gurgelkräuter - - - Knotige Saugwurze - - - Blasenmorcheln - - - Wasserfinder - - - Kakteenschwitze - - - Sandfäulen - - - Windbeutel - - - Fjordwuchse - - - Alraunen - - - Steinbeißer - - - Spaltwachse - - - Höhlenglimme - - - Eisblumen - - - Weiße Wüteriche - - - Schneekristalle - - - - Siebenmeilentee - - - Goliathwasser - - - Wasser des Lebens - - - Schaffenstrunk - - - Wundsalbe - - - Bauernblut - - - Gehirnschmalz - - - Dumpfbackenbrot - - - Nestwärme - - - Pferdeglück - - - Berserkerblut - - - Bauernlieb - - - Trank der Wahrheit - - - Elixier der Macht - - - Heiltrank - - - - Siebenmeilentees - - - Goliathwasser - - - Wasser des Lebens - - - Schaffenstrünke - - - Wundsalben - - - Bauernblut - - - Gehirnschmalz - - - Dumpfbackenbrote - - - Nestwärme - - - Pferdeglück - - - Berserkerblut - - - Bauernlieb - - - Tränke der Wahrheit - - - Elixiere der Macht - - - Heiltränke - - - - - Gürtel der Heldentaten - - - Gürtel der Heldentaten - - - - - AGGRESSIV - - - JEDEM - - - ALLES - - - ANZAHL - - - AURA - - - BÄUME - - - ALLIANZ - - - BAUERN - - - BEWACHEN - - - BURG - - - DEFENSIV - - - EINHEIT - - - GRUPPE - - - LOCALE - - - ERESSEA - - - FLIEHE - - - FREMDES - - - GEBÄUDE - - - GEGENSTÄNDE - - - GIB - - - HELFE - - - HINTEN - - - HINTER - - - KOMMANDO - - - KRÄUTER - - - DURCHREISE - TRAVEL - - - KÄMPFE - - - NICHT - - - NÄCHSTER - - - PARTEI - - - PARTEITARNUNG - - - PAUSE - - - PERSONEN - - - PRIVAT - - - REGION - - - SCHIFF - - - SILBER - - - STRAßEN - - - STUFE - - - TEMP - - - TRÄNKE - - - UM - - - VOR - - - VORNE - - - ZAUBER - - - - XETRANK - XEPOTION - - - XEBALLON - XEBALLOON - - - XELAEN - XELAEN - - - - - Alchemie - - - Armbrustschießen - - - Ausdauer - - - Bergbau - - - Bogenschießen - - - Burgenbau - - - Handeln - - - Hiebwaffen - - - Holzfällen - - - Katapultbedienung - - - Kräuterkunde - - - Magie - - - Pferdedressur - - - Reiten - - - Rüstungsbau - - - Schiffbau - - - Segeln - - - Spionage - - - Stangenwaffen - - - Steinbau - - - Steuereintreiben - - - Straßenbau - - - Taktik - - - Tarnung - - - Unterhaltung - - - Waffenbau - - - Waffenloser Kampf - - - Wagenbau - - - Wahrnehmung - - - - - - Optionen - - - Stufe - - - Aktueller Status - - - Benötigte Kräuter - - - im Bau - - - beschädigt - - - Unglücklicherweise wurde deine Partei - ausgelöscht. Du kannst gerne an einer anderen Stelle wieder - einsteigen. Melde Dich einfach wieder an. - - - Talente - - - hat - - - Größe - - - Zauber - - - Kampfzauber - - - keiner - - - Liste aller Adressen - - - anonym - - - Angriff - - - Verteidigung - - - Rüstung - - - Schaden - - - - - Schneemann - snowman - - - Schneemänner - snowmen - - - Klon - clone - - - Klone - clones - - - Klonen - clones - - - Klonen - clone - - - - Schablone - template - - - Schablonen - templates - - - Schablonen - templates - - - Schablonen - template - - - - Gnom - gnome - - - Gnome - gnomes - - - Gnomen - gnomes - - - Gnomen - gnome - - - - Museumsgeist - museumghost - - - Museumsgeister - museumghosts - - - Museumsgeistern - museumghosts - - - Museumsgeister - museumghost - - - - Ghast - ghast - - - Ghaste - ghasts - - - Ghasten - ghasts - - - Ghast - ghast - - - - Ghoul - ghoul - - - Ghoule - ghouls - - - Ghoulen - ghouls - - - Ghoul - ghoul - - - - Juju-Zombie - juju-zombie - - - Juju-Zombies - juju-zombies - - - Juju-Zombies - juju-zombies - - - Juju-Zombie - juju-zombie - - - - Zombie - zombie - - - Zombies - zombies - - - Zombies - zombies - - - Zombie - zombie - - - - Skelettherr - skeleton lord - - - Skelettherren - skeleton lords - - - Skelettherren - skeleton lords - - - Skelettherren - skeleton lord - - - - Skelett - skeleton - - - Skelette - skeletons - - - Skeletten - skeletons - - - Skelett - skeleton - - - - Schattenritter - shadow knight - - - Schattenritter - shadow knight - - - Schattenrittern - shadow knights - - - Schattenritter - shadow knight - - - - Seeschlange - sea serpent - - - Seeschlangen - sea serpents - - - Seeschlangen - sea serpents - - - Seeschlangen - sea serpent - - - - Krake - kraken - - - Kraken - krakens - - - Kraken - krakens - - - Kraken - kraken - - - - Riesenschildkröte - giant turtle - - - Riesenschildkröten - giant turtles - - - Riesenschildkröten - giant turtles - - - Riesenschildkröten - giant turtle - - - - Delphin - dolphin - - - Delphine - dolphins - - - Delphinen - dolphins - - - Delphin - dolphin - - - - Tiger - tiger - - - Tiger - tiger - - - Tigern - tigers - - - Tiger - tiger - - - - Höllenkatze - hellcat - - - Höllenkatzen - hellcats - - - Höllenkatzen - hellcats - - - Höllenkatzen - hellcat - - - - Eule - owl - - - Eulen - owls - - - Eulen - owls - - - Eulen - owl - - - - Fee - fairy - - - Feen - fairies - - - Feen - fairies - - - Feen - fairy - - - - Traumkatze - dreamcat - - - Traumkatzen - dreamcats - - - Traumkatzen - dreamcats - - - Traumkatzen - dreamcat - - - - Teufelchen - imp - - - Teufelchen - imps - - - Teufelchen - imps - - - Teufelchen- - imp - - - - Geist - ghost - - - Geister - ghosts - - - Geistern - ghosts - - - Geister - ghost - - - - Warg - direwolf - - - Warge - direwolves - - - Wargen - direwolves - - - Warg - direwolf - - - - Einhorn - unicorn - - - Einhörner - unicorns - - - Einhörnern - unicorns - - - Einhorn - unicorn - - - - Nymphe - nymph - - - Nymphen - nymphs - - - Nymphen - nymphs - - - Nymphen - nymph - - - - Singdrache - song dragon - - - Singdrachen - song dragons - - - Singdrachen - song dragons - - - Singdrachen - song dragon - - - - Ratte - rat - - - Ratten - rats - - - Ratten - rats - - - Ratten - rat - - - - Adler - eagle - - - Adler - eagles - - - Adlern - eagles - - - Adler - eagle - - - - Tunnelwurm - tunnelworm - - - Tunnelwürmer - tunnelworms - - - Tunnelwürmern - tunnelworms - - - Tunnelwurm - tunnelworm - - - - Luchs - lynx - - - Luchse - lynx - - - Luchsen - lynx - - - Luchs - lynx - - - - Wolf - wolf - - - Wölfe - wolves - - - Wölfen - wolves - - - Wolfs - wolf - - - - Bauer - peasant - - - Bauern - peasants - - - Bauern - peasants - - - Bauern - peasant - - - - Hirntöter - braineater - - - Hirntöter - braineaters - - - Hirntöter - braineaters - - - Hirntöter - braineater - - - - Schlumpf - smurf - - - Schlümpfe - smurfs - - - Schlumpf - smurf - - - Schlümpfen - smurfs - - - - Kröte - toad - - - Kröten - toads - - - Kröten - toads - - - Kröten - toad - - - - Bergwächter - mountainguard - - - Bergwächter - mountainguard - - - Bergwächtern - mountainguards - - - Bergwächter - mountainguard - - - - Schattenmeister - shadowmaster - - - Schattenmeister - shadowmaster - - - Schattenmeistern - shadowmasters - - - Schattenmeister - shadowmaster - - - - Schattendämon - shadowdemon - - - Schattendämonen - shadowdemons - - - Schattendämonen - shadowdemons - - - Schattendämon - shadowdemon - - - - Steingolem - stone golem - - - Steingolems - stone golems - - - Steingolems - stone golems - - - Steingolem - stone golem - - - - Eisengolem - irongolem - - - Eisengolems - irongolems - - - Eisengolems - irongolems - - - Eisengolem - irongolem - - - - Zauber - spell - - - Zauber - spell - - - Zauber - spell - - - Zauber - spell - - - - Spezial - special - - - Spezial - special - - - Spezial - special - - - Spezial - special - - - - Dracoid - dracoid - - - Dracoide - dracoids - - - Dracoiden - dracoids - - - Dracoiden - dracoid - - - - Katzendrache - catdragon - - - Katzendrachen - catdragons - - - Katzendrachen - catdragons - - - Katzendrachen - catdragon - - - - Ent - ent - - - Ents - ents - - - Ents - ents - - - Ent - ent - - - - Schattendrache - shadow dragon - - - Schattendrachen - shadow dragons - - - Schattendrachen - shadow dragons - - - Schattendrachen - shadow dragon - - - - Todesflatter - darkbat - - - Todesflattern - darkbats - - - Todesflattern - darkbats - - - Todesflatter - darkbat - - - - Alptraum - nightmare - - - Alpträume - nightmares - - - Alpträumen - nightmares - - - Alptraum - nightmare - - - - Nachteinhorn - vampiric unicorn - - - Nachteinhörner - vampiric unicorns - - - Nachteinhörnern - vampiric unicorns - - - Nachteinhorn - vampiric unicorn - - - - Wyrm - wyrm - - - Wyrme - wyrms - - - Wyrmen - wyrms - - - Wyrm - wyrm - - - - Drache - dragon - - - Drachen - dragons - - - Drachen - dragons - - - Drachen - dragon - - - - Jungdrache - young dragon - - - Jungdrachen - young dragons - - - Jungdrachen - young dragons - - - Jungdrachen - young dragon - - - - Illusion - illusion - - - Illusionen - illusions - - - Illusions - illusions - - - Illusions - illusion - - - - Spinx - sphinx - - - Spinxen - sphinxs - - - Spinxen - sphinx - - - Spinx - sphinx - - - - kleiner Scarabäus - little scarab - - - kleine Scarabäen - little scarab - - - kleinen Scarabäen - little scarab - - - kleine Scarabäen - little scarab - - - - grüner Scarabäus - green scarab - - - grüne Scarabäen - green scarab - - - grünen Scarabäen - green scarab - - - grünen Scarabäen - green scarab - - - - blauer Scarabäus - blue scarab - - - blaue Scarabäen - blue scarabs - - - blauen Scarabäen - blue scarab - - - blaue Scarabäen - blue scarab - - - - roter Scarabäus - red scarab - - - rote Scarabäen - red scarabs - - - roten Scarabäen - red scarab - - - rote Scarabäen - red scarab - - - - Untoter Pharao - undead Pharaoh - - - Untoter Pharaonen - undead Pharaohs - - - Untoten Pharao - undead Pharaoh - - - Untote Pharaonen - undead Pharaoh - - - - Mumie - mummy - - - Mumien - mummys - - - Mumien - mummy - - - Mumien - mummy - - - - Untoter - undead - - - Untote - undead - - - Untoten - undead - - - Untoten - undead - - - - Apepschlange - apepsnake - - - Apepschlangen - apepsnakes - - - Apepschlangen - apepsnakes - - - Apepschlange - apepsnake - - - - Apophis - apophis - - - Apophis - apophis - - - Apophis - apophis - - - Apophis - apophis - - - - Meermensch - aquarian - - - Meermenschen - aquarians - - - Meermenschen - aquarians - - - Meermenschen - aquarian - - - - Katze - cat - - - Katzen - cats - - - Katzen - cats - - - Katzen - cats - - - - Halbling - halfling - - - Halblinge - halflings - - - Halblingen - halflings - - - Halblings - halfling - - - - Insekt - insect - - - Insekten - insects - - - Insekten - insects - - - Insekten - insect - - - - Dämon - demon - - - Dämonen - demons - - - Dämonen - demons - - - Dämonen - demon - - - - Troll - troll - - - Trolle - trolls - - - Trollen - trolls - - - Troll - troll - - - - Mensch - human - - - Menschen - humans - - - Menschen - humans - - - Menschen - human - - - - Goblin - goblin - - - Goblins - goblins - - - Goblins - goblins - - - Goblin - goblin - - - - Ork - orc - - - Orks - orcs - - - Orks - orcs - - - Ork - orc - - - - Snotling - snotling - - - Snotlinge - snotlings - - - Snotlingen - snotlings - - - Snotling - snotling - - - - Snotling - snotling - - - Snotlinge - snotlings - - - Snotlingen - snotlings - - - Snotling - snotling - - - - Elf - elf - - - Elfen - elves - - - Elfen - elves - - - Elfen - elves - - - - Zwerg - dwarf - - - Zwerge - dwarves - - - Zwergen - dwarves - - - Zwergen - dwarf - - - - - - sehr stark - super strong - - - stark - strong - - - schwer verwundet - badly wounded - - - verwundet - wounded - - - erschöpft - exhausted - - - - - For Seven Mile Tea, boil up a Cobalt Fungus and pour the resulting brew into a Windbag. Catch and filter the liquid that drips out and administer it. This tea allows up to ten men to move as fast as a horse. - Für den Siebenmeilentee koche man einen Blauen Baumringel auf und gieße dieses Gebräu in einen Windbeutel. Das heraustropfende Wasser fange man auf, filtere es und verabreiche es alsdann. Durch diesen Tee können bis zu zehn Menschen schnell wie ein Pferd laufen. - - - 'First roast the Gurgelkraut quickly and add some Fjordwuchs to spice it up. Let it all boil slowly until almost all liquid has evaporated. Leave the mash overnight and finally squeeze it the next morning until a thick fluid drips out.' The liquid thus produced, 'Goliath Water' as we call it, is enough for 10 men and gives each man the carrying capacity of a horse for one week. - Zuerst brate man das Gurgelkraut leicht an und würze das Zeug mit ein wenig Fjordwuchs. Man lasse alles so lange kochen, bis fast alle Flüssigkeit verdampft ist. Diesen Brei stelle man über Nacht raus. Am nächsten Morgen presse man den Brei aus. Die so gewonnene Flüssigkeit, Goliathwasser genannt, verleiht bis zu zehn Männern die Tragkraft eines Pferdes. - - - Allow a Tangy Temerity to simmer for three hours in a litre of water, then add a grated Mandrake, and sprinkle in a Gapgrowth harvested at full moon. The whole brew should then be allowed to stew for three days in a warm place. This potion increases the strength and endurance of ten men so that they can achieve twice as much in a week. - Man lasse einen Würzigen Wagemut drei Stunden lang in einem Liter Wasser köcheln. Dann gebe man eine geriebene Alraune dazu und bestreue das ganze mit bei Vollmond geerntetem Spaltwachs. Nun lasse man den Sud drei Tage an einem dunklen und warmen Ort ziehen und seie dann die Flüssigkeit ab. Dieser Schaffenstrunk erhöht die Kraft und Ausdauer von zehn Männern, so dass sie doppelt soviel schaffen können wie sonst. - - - When one is severely wounded after a hard battle it is advisable to have some Ointment to hand. Applied to wounds, this magical paste closes them in the blink of an eye. For the preparation the alchemist requires a cobalt fungus, tangy temerity, and white hemlock. A dose of the potion heals up to 400 hitpoints. - Ist man nach einem einem harten Kampf schwer verwundet, ist es ratsam, etwas Wundsalbe parat zu haben. Streicht man diese magische Paste auf die Wunden, schließen sich diese augenblicklich. Für die Herstellung benötigt der Alchemist nebst einem Blauen Baumringel einen Würzigen Wagemut und einen Weißen Wüterich. Eine solche Portion heilt bis zu 400 Lebenspunkte. - - - Knowledge of this potion is amongst the most dangerous and secret wisdom of the alchemist. Snatched from the darkest hells, the knowledge of this formula enables the production of an elixer which serves Demons as nourishment. If used by normal beings it leads to a swift death and eternal undeath. The creation requires Fjord Fungus together with some Cave Lichen and Cobalt Fungus, and an unfortunate peasant from the region, who is killed in the bloody days-long ritual. One vial of the potion satisfies the hunger of 100 Demons for a week. - Zu den gefährlichsten und geheimsten Wissen der Alchemisten zählt die Kenntnis um diesen Trank. Den finstersten Höllen entrissen, ermöglicht die Kenntnis dieser Formel die Herstellung eines Elixiers, welches Dämonen als Nahrung dient. Von normalen Lebewesen eingenommen, führt es zu schnellem Tod und ewigen Nichtleben. Die Herstellung benötigt nebst Fjordwuchs, etwas Höhlenglimm und einem Blauen Baumringel auch einen Bauern aus der Region, welcher in einem tagelangen blutigen Ritual getötet wird. Ein Fläschchen des Tranks kann den Hunger von 100 Dämonen für eine Woche stillen. - - - To create the brain wax potion, mix the juice of a waterfinder with quite a bit of grated windbag and a pinch of bugleweed. Let this steep for just a minute. When the liquid is only lukewarm, add some rock weed. Using a large spoon, stirr exactly seven times clockwise and then seven times counterclockwise. Fill the vial when the liquid has gone still. The juice gives ten people a 33% chance of an additional attempt at learning a skill. - Für das Gehirnschmalz verrühre man den Saft eines Wasserfinders mit recht viel geriebenem Windbeutel und ein wenig Gurgelkraut. Dies lasse man kurz aufwallen. Wenn die Flüssigkeit nur noch handwarm ist, gebe man etwas Steinbeißer dazu. Das ganze muß genau siebenmal rechtsherum und siebenmal linksherum mit einem großen Löffel gerührt werden. Wenn keine Bewegung mehr zu erkennen ist, fülle man den Saft ab. Der Saft gibt mit einer Chance von 1/3 bis zu zehn Personen einen zusätzlichen Lernversuch. - - - A duncebun is a nasty piece of work, negating any attempt at learning a skill, or even causing the subject to forget things! For ten servings knead a rasped fjord fungus, an abraded owlsgaze and a finely sliced spider ivy to a smooth dough. Bake for an hour at moderate heat and brush the result with some cave lichen. Who eats this bread will not learn what he's attempting to learn, and, in case there is no attempt to learn anything, will forget a week's worth of study in his best skill. - Das Dumpfbackenbrot ist eine sehr gemeine Sache, macht es doch jeden Lernerfolg zunichte oder läßt einen gar Dinge vergessen! Für zehn Portionen verknete man einen geriebenen Fjordwuchs, einen zerstoßenes Eulenauge und einen kleingeschnittenen Grünen Spinnerich zu einem geschmeidigen Teig. Diesen backe man eine Stunde lang bei guter Hitze und bestreiche das Ergebnis mit etwas Höhlenglimm. Wer dieses Brot gegessen hat, kann eine Woche lang nichts lernen, und so er nichts zu lernen versucht, wird er gar eine Woche seiner besten Fähigkeit vergessen. - - - A potion of nest warmth allows an insect to recruit outside of a desert region in winter. The learned alchemist prepares this by taking a peyote, mixing it with a portion of gapgrowth which has been gathered during a clear, starry night. To dispell winter, add some blossoms of the ice begonia in the mix, and stirr everything together with a spider ivy until it turns a nice shade of violet. One vial supplies an entire region for a whole week. - Nestwärme erlaubt es einem Insekt, im Winter außerhalb von Wüsten neue Rekruten anzuwerben. Zur Zubereitung nimmt der geübte Alchemist einen Kakteenschwitz, vermischt ihn mit einer Portion Spaltwachs, die in einer sternklaren Nacht gesammelt wurde, gibt zur Vertreibung des Winters einige Blütenblätter der Eisblume in den Sud, und rührt alles mit einem grünen Spinnerich bis es eine violette Farbe annimmt. Ein Trank reicht eine Woche lang für eine ganze Region. - - - To make a horsepower potion, chop a peyote, a cobalt fungus and some knotroot, and boil it in a bucketful of water. Then add some sand reeker and let the mixture steep for three days. Finally one gives this to the horses to drink, to double their procreation. - Für das Pferdeglück zerhacke man einen Kakteenschwitz, einen blauen Baumringel und etwas knotigen Saugwurz und koche das ganze mit einem Eimer Wasser auf. Dann füge man etwas Sandfäule dazu und lasse diesen Sud drei Tage lang ziehen. Letztlich gebe man es den Pferden zu trinken, auf dass sie sich doppelt so schnell vermehren. - - - The use of the berserkers blood potion is advised to increase one's warriors abilities to new heights. To create this, one needs a white hemlock, some flatroot, sand reeker and a mandrake. All ingredients have to be sliced as finely as possible, after which it is boiled for two hours. The cooled brew is strained through a cloth. The resulting juice is enough to improve up to ten warriors. - Will man seine Krieger zu Höchstleistungen antreiben, sei das Berserkerblut empfohlen. Um es herzustellen, braucht man einen Weißen Wüterich, etwas Flachwurz, Sandfäule und eine Alraune. Alle Zutaten müssen möglichst klein geschnitten und anschließend zwei Stunden lang gekocht werden. Den abgekühlten Brei gebe man in ein Tuch und presse ihn aus. Der so gewonnene Saft reicht aus, um zehn Kämpfer besser angreifen zu lassen. - - - The peasant love potion enamors both Man and Woman to the same degree and results in a strong wish for children. For a big portion scoop out a mandrake, fill it with finely chopped bubblemorel, elvendear and snowcrystal petal, sprinkle grated rock weed on top and let it simmer on low heat for twenty hours. The potion can grant up to 1000 peasants the happiness of twins. - Das Bauernlieb betört Mann und Frau gleichwohl und läßt in ihnen den Wunsch nach Kindern anwachsen. Für eine große Portion höhle man eine Alraune aus, gebe kleingehackten Blasenmorchel, Elfenlieb und Schneekristall dazu, streue ein wenig geriebenen Steinbeißer darüber und lasse dieses zwanzig Stunden lang auf kleiner Flamme kochen. Bis zu 1000 Bauern vermag der Trank das Glück von Zwillinge zu bescheren. - - - This simple but very potent brew sharpens the senses of anyone that drinks of it and makes him able to see through even the most complex illusions for one week. - Dieses wirkungsvolle einfache Gebräu schärft die Sinne des Trinkenden derart, dass er in der Lage ist, eine Woche lang auch die komplexesten Illusionen zu durchschauen. - - - One of the most rare and prized of all alchemist elixers, this potion grants the user a dragon's power for a few weeks. The potion increases the life-energy of a maximum of ten people fivefold. The effect is strongest right after drinking and slowly decreases over time. To brew this potion the alchemist needs an elvendear, a windbag, a piece of waterfinder and a spider ivy. Finally he dusts it with some minced bubblemorel and stirrs the powder into some dragon's blood. - Eines der seltensten und wertvollsten alchemistischen Elixiere, verleiht dieser Trank dem Anwender für einige Wochen die Kraft eines Drachen. Der Trank erhöht die Lebensenergie von maximal zehn Personen auf das fünffache. Die Wirkung ist direkt nach der Einnahme am stärksten und klingt danach langsam ab. Zur Herstellung benötigt der Alchemist ein Elfenlieb, einen Windbeutel, ein Stück Wasserfinder und einen Grünen Spinnerich. Über dieses Mischung streue er schließlich einen zerriebenen Blasenmorchel und rühre dieses Pulver unter etwas Drachenblut. - - - For a healing potion one takes the peel of a windbag and some bugleweed, stirr in some chopped elvendear and sprinkle it with the blossoms of an ice begonia. This has to cook through for four days, while a gapgrowth has to be added on the second day. Then one carefully scoops off the top layer of liquid. One such potion gives four men (or one man four times) a 50% chance to survive otherwise lethal wounds. The potion is automatically used in case of injury. - Für einen Heiltrank nehme man die Schale eines Windbeutels und etwas Gurgelkraut, rühre eine kleingehacktes Elfenlieb dazu und bestreue alles mit den Blüten einer Eisblume. Dies muß vier Tage lang gären, wobei man am zweiten Tag einen Spaltwachs dazutun muß. Dann ziehe man vorsichtig den oben schwimmenden Saft ab. Ein solcher Trank gibt vier Männern (oder einem Mann vier mal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt. - - - - - Erschaffe einen Ring der Macht - Create A Ring of Power - - - Schild des Fisches - Shield of the Fish - - - Runen des Schutzes - Protective Runes - - - Ruf der Realität - Call of Reality - - - Astraler Ruf - Astral Call - - - Magiefresser - Destroy Magic - - - Mauern der Ewigkeit - Eternal Walls - - - Stehle Aura - Steal Aura - - - Schutzzauber - Resist Magic - - - Astraler Blick - Astral Gaze - - - Auratransfer - Transfer Aura - - - Monster friedlich stimmen - Calm Monster - - - Luftschiff - Airship - - - Lied der Verführung - Song of Seduction - - - Aushorchen - Sound out - - - Kriegsgesang - Song of War - - - Gesang der Angst - Song of Fear - - - Lied des Ortes analysieren - Analysis - - - Schockwelle - Shockwave - - - Fluch brechen - Negate Curse - - - Erschaffe ein Amulett der Keuschheit - Create An Amulet of Chastity - - - Beschleunigung - Acceleration - - - Großer Drachenodem - Powerful Dragonbreath - - - Opfere Kraft - Sacrifice Strength - - - Belebtes Gestein - Living Rock - - - Gesang der Melancholie - Song of Melancholy - - - Gesang des wachen Geistes - Song of the Youthful Spirit - - - Gesang des schwachen Geistes - Song of the Aging Spirit - - - Gesang der Friedfertigkeit - Song of Peace - - - Gesang der Versklavung - Song of Slavery - - - Hohe Kunst der Überzeugung - High art of persuasion - - - Zeitdehnung - Double Time - - - Rüstschild - Shield Shine - - - Wyrmtransformation - Wyrmtransformation - - - Schattenodem - Shadowbreath - - - Feuersturm - Firestorm - - - Feuerwalze - Immolation - - - Eisnebel - Coldfront - - - Säurenebel - Acid Rain - - - Furchteinflößende Aura - Panic - - - Meteorregen - Meteor Shower - - - Erschaffe einen Ring der Regeneration - Create A Ring of Regeneration - - - Mob aufwiegeln - Mob Rule - - - Aufruhr beschwichtigen - Calm Riot - - - Aufruhr verursachen - Riot - - - Blick in die Realität - Gaze Upon Reality - - - Störe Astrale Integrität - Astral Disruption - - - Eisiger Drachenodem - Icy Dragonbreath - - - Feuriger Drachenodem - Fiery Dragonbreath - - - Erschaffe ein Runenschwert - Create A Runesword - - - Erschaffe einen Beutel des Negativen Gewichts - Create A Bag of Holding - - - Erschaffe einen Aurafocus - Create An Aurafocus - - - Erschaffe Antimagiekristall - Create An Antimagic Crystal - - - Astrale Schwächezone - Antimagic - - - Astraler Ausgang - Astral Exit - - - Astraler Weg - Astral Path - - - Beute Bewahren - Save Spoils - - - Schutz vor Magie - Protection from Magic - - - Wunderdoktor - Miracle Doctor - - - Schleieraura - Concealing Aura - - - Magie analysieren - Analyze Magic - - - Gesang des Werbens - Song of Courting - - - Lied der Heilung - Blessed Harvest - - - Gesang der Furcht - Song of Terror - - - Segen der Erde - Blessed Harvest - - - Heldengesang - Epic Heroes - - - Gesang des Lebens analysieren - Analyze Song of Life - - - Bannlied - Countersong - - - Gesang des Auratransfers - Hymn of Aura Sharing - - - Gesang der Verwirrung - Song of Confusion - - - Plappermaul - Blabbermouth - - - Regentanz - Rain Dance - - - Gaukeleien - Jugglery - - - Friedenslied - Appeasing Song - - - Viehheilung - Cattle Healing - - - Erschaffe Steingolems - Create Stone Golems - - - Erschaffe Eisengolems - Create Iron Golems - - - Hainzauber - Grove of Oak Trees - - - Rostregen - Rain of Rust - - - Firuns Fell - Firun's Coat - - - Hagel - Hail - - - Seelenkopie - Doppelganger - - - Schlechte Träume - Bad Dreams - - - Bergwächter - Mountain Guardian - - - Magischer Pfad - Magic Path - - - Tor in die Ebene der Hitze - Great Drought - - - Wurzeln der Magie - Roots of Magic - - - Mahlstrom - Maelstrom - - - Windschild - Air Shield - - - Segne Mallornstecken - Bless Mallorn Logs - - - Beschwörung eines - Wasserelementares - Summon Water Elemental - - - Heilung - Heal - - - Wirbelwind - Whirlwind - - - Astralschutzgeister - Astral Guardian Spirits - - - Meditation - Meditate - - - Beschwöre einen Erdelementar - Summon Earth Elemental - - - Beschwöre einen Sturmelementar - Summon Storm Elemental - - - Erschaffe ein Amulett des wahren - Sehens - Create An Amulet of True Sight - - - Erschaffe einen Ring der - Unsichtbarkeit - Create A Ring of Invisibility - - - Miriams flinke Finger - Quick Fingers - - - Heimstein - Homestone - - - Wolfsgeheul - Timber Wolves - - - Blick des Basilisken - Gaze of the Basilisk - - - Starkes Tor und feste Mauer - Strong Wall And Sturdy Gate - - - Geister bannen - Banish Spirits - - - Lebenslied festigen - Silence Dissonance - - - Ritual der Aufnahme - Rit of Acceptance - - - Weg der Bäume - Path of Trees - - - Sog des Lebens - Ties of Life - - - Heiliger Boden - Sacred Ground - - - Erschaffe einen magischen - Kräuterbeutel - Create A Magical Herb Pouch - - - Erwecke Ents - Awakening of the Ents - - - Segne Steinkreis - Bless Stone Circle - - - Rindenhaut - Barkskin - - - Verwünschung - Hex - - - Kleine Flüche - Minor Curses - - - Feuerball - Fireball - - - Gabe des Chaos - Chaos Gift - - - Kleines Blutopfer - Lesser Sacrifice - - - Blutrausch - Blood Frenzy - - - Chaosfluch - Chaos Curse - - - Mächte des Todes - Animate Dead - - - Rosthauch - Winds of Rust - - - Machtübertragung - Transfer Power - - - Feuerwand - Wall of Fire - - - Fluch der Pestilenz - Curse of Pestilence - - - Wahnsinn des Krieges - Madness of War - - - Beschwöre Schattendämonen - Summon Shadowdemons - - - Beschwörung eines Hitzeelementar - Summon Fire Elemental - - - Untote Helden - Undead Heroes - - - Erschaffe einen Gürtel der - Trollstärke - Create A Belt of Troll - Strength - - - Astraler Riss - Astral Leak - - - Astrales Chaos - Astral Chaos - - - Feuerteufel - Fire Fiend - - - Pentagramm - Pentagram - - - Unheilige Kraft - Unholy Strength - - - Todeswolke - Death Cloud - - - Drachenruf - Call Dragons - - - Beschwöre Schattenmeister - Summon Shadowmasters - - - Erschaffe ein Flammenschwert - Create A Flamesword - - - Vertrauten rufen - Summon Familiar - - - Chaossog - Chaos Gate - - - Traumsenden - Dream - - - Wahrsagen - Divination - - - Schattenritter - Shadow Knights - - - Grauen der Schlacht - Unspeakable Horrors - - - Seelenfrieden - Eternal Rest - - - Traumschlößchen - Castle of Illusion - - - Traum der Magie - Dream of Magic - - - Gestaltwandlung - Shapeshift - - - Traumlesen - Read Dreams - - - Schwere Glieder - Tiredness - - - Wiederbelebung - Resurrection - - - Schlechter Schlaf - Insomnia - - - Schlaf - Sleep - - - Traumdeuten - Mind Probe - - - Erschaffe ein Traumauge - Create a Visioneye - - - Erschaffe eine Sphäre der Unsichtbarkeit - Create a Sphere of Invisbility - - - Schöne Träume - Pleasant Dreams - - - Traumbilder entwirren - Remove Dreams - - - Tod des Geistes - Mental Death - - - Süße Träume - Sweet Dreams - - - Traum von den Göttern - Dream of the gods - - - Göttliches Netz - Web of the Gods - - - Kraft der Natur - force of nature - - - Gesang der Götter - Song of the Gods - - - Göttliche Macht - Power of the Gods - - - Runen des Schutzes - Protective Runes - - - Störe Astrale Integrität - Astral Disruption - - - Gabe des Chaos - Chaos Gift - - - Schlechter Schlaf - Insomnia - - - Gesang des schwachen Geistes - Song of the Aging Spirit - - - Monster friedlich stimmen - Calm Monster - - - Gesang der Melancholie - Song of Melancholy - - - Beschwörung eines Hitzeelementar - Summon Fire Elemental - - - ein unbekannter Zauber - an unknown spell - - - Luftschiff - Airship - - - ein unbekannter Zauber - an unknown spell - - - Chaosfluch - Chaos Curse - - - Schöne Träume oder Schlechte Träume - Good Dreams or Bad Dreams - - - Hohes Lied der Gaukelei - Song of Generosity - - - Fluch der Götter - Curse of the Gods - - - Gesang des wachen Geistes - Song of the Youthful Spirit - - - Firuns Fell - Firun's Coat - - - Schleieraura - Concealing Aura - - - Magieresistenz - Magic Resistance - - - Heimstein - Homestone - - - Mauern der Ewigkeit - Eternal Walls - - - Wasserelementar - Water Elemental - - - Unbekannter Effekt - Unknown Effect - - - Unbekannter Effekt - Unknown Effect - - - Gesang der Friedfertigkeit - Song of Peace - - - Aufruhr - Riot - - - Unbekannter Effekt - Unknown Effect - - - Gesang der Versklavung - Song of Slavery - - - Unbekannter Effekt - Unknown Effect - - - Zeitdehnung - Double Time - - - Sturmelementar - Storm Elemental - - - Unbekannter Effekt - Unknown Effect - - - Alp - Nightmare - - - Feuerwand - Firewall - - - Zone der Heilung - Zone of Healing - - - Beschleunigung - Acceleration - - - - - Erzeugt einen Ring der Regeneration. - Creates a ring of regeneration. - - - Erzeugt einen Aurafokus. - Creates an aurafocus crystal. - - - Tötet die Feinde mit Säure. - Kills enemies with acid. - - - Tötet die Feinde mit Kälte. - Kills enemies with cold. - - - Tötet die Feinde mit Feuer. - Kills enemies with fire. - - - Verletzt alle Gegner. - Injures all enemies. - - - Panik. - Panic. - - - Entzieht Talentstufen und macht Schaden wie Großer Odem. - - - - Dieser Zauber bewirkt eine schwere Störung des Astralraums. Innerhalb - eines astralen Radius von Stufe/5 Regionen werden alle Astralwesen, - die dem Zauber nicht wiederstehen können, aus der astralen Ebene - geschleudert. Der astrale Kontakt mit allen betroffenen Regionen ist - für Stufe/3 Wochen gestört. - - - This spell causes a severe disturbance of the atral plane. Within an - astral radius of level/5 regions all astral creatures not able to - resist the spell will be thrown from the astral plane. The astral - contact with all affected regions will be disrupted for level/3 - weeks. - - - - - Diese vor dem Kampf zu zaubernde Ritual gibt den eigenen Truppen - einen zusätzlichen Bonus auf ihre Rüstung. Jeder Treffer - reduziert die Kraft des Zaubers, so dass der Schild sich irgendwann - im Kampf auflösen wird. - - - This ritual, to be performed before battle, gives the own troops an - added bonus to their armor. Every hit reduces the strength of the - spell until it dissipates during battle. - - - - - Dieser Zauber beschleunigt einige Kämpfer auf der eigenen Seite - so, dass sie während des gesamten Kampfes in einer Kampfrunde zweimal - angreifen können. - - - This spell accelerates some fighters of the own side, which empowers - them to attack twice every round throughout the battle. - - - - - Dieser Zauber vermag dem Gegner ein geringfügig versetztes Bild der - eigenen Truppen vorzuspiegeln, so wie der Fisch im Wasser auch nicht - dort ist wo er zu sein scheint. Von jedem Treffer kann so die Hälfte - des Schadens unschädlich abgeleitet werden. Doch hält der Schild nur - einige Hundert Schwerthiebe aus, danach wird er sich auflösen. - Je stärker der Magier, desto mehr Schaden hält der Schild aus. - - - This spell can project a slightly distorted image of the own troops, - like the surface of the lake distorts the position of a fish. Half - the damage of each hit can be deflected harmlessly through those - means. The shield will only last a few hundred hits before it - dissipates. The stronger the mage, the more damage the shield can take. - - - - - Zeichnet man diese Runen auf die Wände eines Gebäudes oder auf die - Planken eines Schiffes, so wird es schwerer durch Zauber zu - beeinflussen sein. Jedes Ritual erhöht die Widerstandskraft des - Gebäudes oder Schiffes gegen Verzauberung um 20%. - Werden mehrere Schutzzauber übereinander gelegt, so addiert - sich ihre Wirkung, doch ein hundertprozentiger Schutz läßt sich so - nicht erreichen. Der Zauber hält mindestens drei Wochen an, je nach - Talent des Magiers aber auch viel länger. - - - Drawn on the walls of a building or on the planks of a ship these - runes will protect it from magic influence. Every ritual increases - the resistance of the building or ship against enchantments by 20%. - The effect can be increased by performing the ritual multiple times, - but perfect protection is unlikely. The runes last at least three - weeks, depending on the mage's skill maybe much longer. - - - - - Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis - 2:1 auf einen anderen Magier des gleichen Magiegebietes oder im - Verhältnis 3:1 auf einen Magier eines anderen Magiegebietes - übertragen. - - - With this spell the mage can transfer aura of his own to a mage of - the same school with a rate of 2:1 or to a mage of a different school - with a rate of 3:1. - - - - - Der Magier kann kurzzeitig in die Astralebene blicken und erfährt - so alle Einheiten innerhalb eines astralen Radius von Stufe/5 Regionen. - - - The mage kann glance in the astral plane for a short time and - perceives all units within an astral radius of level/5 regions. - - - - - Mit Hilfe dieses magischen Gesangs kann der Magier eine Region in - Aufruhr wieder beruhigen. Die Bauernhorden werden sich verlaufen - und wieder auf ihre Felder zurückkehren. - - - By means of this magical chant the mage can calm a rioting region. - The peasant mobs will disperse and return to their fields. - - - - - Aus 'Wanderungen' von Firudin dem Weisen: - 'In Weilersweide, nahe dem Wytharhafen, liegt ein kleiner Gasthof, der - nur wenig besucht ist. Niemanden bekannt ist, das dieser Hof - bis vor einigen Jahren die Bleibe des verbannten Wanderpredigers Grauwolf - war. Nachdem er bei einer seiner berüchtigten flammenden Reden fast die - gesammte Bauernschaft angeworben hatte, wurde er wegen Aufruhr verurteilt - und verbannt. Nur zögerlich war er bereit mir das Geheimnis seiner - Überzeugungskraft zu lehren.' - - - From 'Journeys' by Firudin the Wise: - 'There's a small, scarcely visited inn in Weilersweide, near - Wytharhafen. It is a little known fact, that it was home to the - banished itinerant preacher Grauwolf until a few years ago. After he - recruited almost the whole peasantry with one of his notorious - speeches, he was convicted and banished for inciting unrest. Only - hesitantly did he disclose the secret to his powers of persuasion - to me.' - - - - - Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft - sie den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig - von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig - fühlen. - - - This powerful spell robs the victim of their own free will and enslaves - them to the commands of the bard. For some time the victim will turn - their back on their own people and join the faction of the bard. - - - - - Dieser mächtige Bann verhindert jegliche Attacken. Niemand in der - ganzen Region ist fähig seine Waffe gegen irgendjemanden zu erheben. - Die Wirkung kann etliche Wochen andauern. - - - This powerful spell prevents any attacks. Noone in the entire region - will be able to raise his weapon against another. The effect can last - for weeks. - - - - - Dieses Lied, das in die magische Essenz der Region gewoben wird, - schwächt die natürliche Widerstandskraft gegen eine - Verzauberung einmalig um 15%. Nur die Verbündeten des Barden - (HELFE BEWACHE) sind gegen die Wirkung des Gesangs gefeit. - - - This song, which is woven into the magical essence of the region, - weakens the natural resistance against a singular enchantment by 15%. - Only the allies of the bard (HELP GUARD) are immune to the effect of - the chant. - - - - - Mit diesem Gesang verbreitet der Barde eine melancholische, traurige - Stimmung unter den Bauern. Einige Wochen lang werden sie sich in ihre - Hütten zurückziehen und kein Silber in den Theatern und Tavernen lassen. - - - With this chant the bard spreads a melancholic, sad mood among the - peasants. For a few weeks they will retreat to their huts and not - spend any silver in the theatres and taverns. - - - - - Dieses magische Lied wird, einmal mit Inbrunst gesungen, sich in der - Region fortpflanzen, von Mund zu Mund springen und eine Zeitlang - überall zu vernehmen sein. Nach wie vielen Wochen der Gesang aus dem - Gedächtnis der Region entschwunden ist, ist von dem Geschick des Barden - abhängig. Bis das Lied ganz verklungen ist, wird seine Magie allen - Verbündeten des Barden (HELFE BEWACHE), und natürlich auch seinen - eigenem Volk, einen einmaligen Bonus von 15% - auf die natürliche Widerstandskraft gegen eine Verzauberung - verleihen. - - - This magical song, once performed with vigor, will propagate in the - region by wandering from mouth to mouth. It will be heard everywhere. - How long the song will last in the public perception depends on the - bard's skill. Until it is gone it will give him and all his allies - (HELP GUARD) a bonus of 15% to their natural resistance to magic. - - - - - Mit Hilfe dieses magischen Gesangs überzeugt der Magier die Bauern - der Region, sich ihm anzuschließen. Die Bauern werden ihre Heimat jedoch - nicht verlassen, und keine ihrer Besitztümer fortgeben. Jede Woche - werden zudem einige der Bauern den Bann abwerfen und auf ihre Felder - zurückkehren. Wie viele Bauern sich dem Magier anschließen hängt von der - Kraft seines Gesangs ab. - - - Employing this magic chant the mage convinces the peasants of the region - to join him. The peasants won't leave their home region and won't give up - their possessions, though. Additionally each week some peasants will - shake off the spell and return to their fields. How many peasants join - the mage depends on the power of his chant. - - - - - Dieses Ritual ermöglicht es, eine Einheit, egal welcher Art, in die - eigene Partei aufzunehmen. Der um Aufnahme Bittende muss dazu willig - und bereit sein, seiner alten Partei abzuschwören. Dies bezeugt er - durch KONTAKTIEREn des Magiers. Auch wird er die Woche über - ausschliesslich mit Vorbereitungen auf das Ritual beschäftigt sein. - Das Ritual wird fehlschlagen, wenn er zu stark an seine alte Partei - gebunden ist, dieser etwa Dienst für seine teuere Ausbildung - schuldet. Der das Ritual leitende Magier muss für die permanente - Bindung des Aufnahmewilligen an seine Partei naturgemäß auch - permanente Aura aufwenden. Pro Stufe und pro 1 permanente Aura kann - er eine Person aufnehmen. - - - This ritual facilitates the migration of an unit to the own faction. - The candidate has to be able and willing to leave his previous faction. - He attests to that by CONTACTing the mage and will otherwise be - occupied with preparations for the ritual. The ritual will fail, if - the candidate owes the previous faction fealty for an expensive - training. The mage performing the ritual has to invest permanent aura - to bind the candidate to the faction. Per level and per point of - permanent aura the mage can bind one person. - - - - - Jede Verzauberung beeinflußt das Lebenslied, schwächt und verzerrt es. - Der kundige Barde kann versuchen, das Lebenslied aufzufangen und zu - verstärken und die Veränderungen aus dem Lied zu tilgen. - - - Every enchantment influences the life song, weakens and distorts it. - The skillful bard can try to catch the life song, to strengthen it and - cleanse the alteration from the song. - - - - - Wie Lebewesen, so haben auch Schiffe und Gebäude und sogar Regionen - ihr eigenes Lied, wenn auch viel schwächer und schwerer zu hören. - Und so, wie aus dem Lebenslied einer Person erkannt werden kann, - ob diese unter einem Zauber steht, so ist dies auch bei Burgen, - Schiffen oder Regionen möglich. - - - Like creatures ships, buildings and even regions also have their own - song, even though it's faint and harder to hear. Like it can be - discerned from the life song of a person, if the person is affected - by a spell, it can also be done for ships, buildings and regions. - - - - - Dieser Kriegsgesang sät Panik in der Front der Gegner und schwächt - so ihre Kampfkraft erheblich. Angst wird ihren Schwertarm schwächen - und Furcht ihren Schildarm lähmen. - - - This warsong sows panic among the enemy front line and weakens their - fighting strength significantly. Fear will weaken their sword arm and - dread will freeze their shield arm. - - - - - Wie viele magischen Gesänge, so entstammt auch dieser den altem - Wissen der Katzen, die schon immer um die machtvolle Wirkung der - Stimme wussten. Mit diesem Lied wird die Stimmung der Krieger - aufgepeitscht, sie gar in wilde Raserrei und Blutrausch versetzt. - Ungeachtet eigener Schmerzen werden sie kämpfen bis zum - Tode und niemals fliehen. Während ihre Attacke verstärkt ist - achten sie kaum auf sich selbst. - - - Like many magic chants this one also originates from the ancient - knowledge of the cats who always were aware of the powerful effect - of the voice. This song inflames the temper of the warriors, enrages - them even, into a murderous frenzy. Ignoring their own pain, they fight - until death and will never flee from battle. They fight with little - regard for themselves. - - - - - Erliegt die Einheit dem Zauber, so wird sie dem Magier alles erzählen, - was sie über die gefragte Region weiß. Ist in der Region niemand - ihrer Partei, so weiß sie nichts zu berichten. Auch kann sie nur das - erzählen, was sie selber sehen könnte. - - - Should the unit succumb to the spell, they will tell the mage everything - they know about the region is question. Is no unit of their faction in - that region, they'll have nothing to report. Also, they can only report, - what they themselves could see. - - - - - Mit diesem Lied kann eine Einheit derartig betört werden, so dass - sie dem Barden den größten Teil ihres Bargelds und ihres Besitzes - schenkt. Sie behält jedoch immer soviel, wie sie zum Überleben - braucht. - - - With this song a unit can be bewitched in a manner, which compels - them to bequeath a large portion of their possessions to the bard. - They will keep enough for their own survival, though. - - - - - Dieser einschmeichelnde Gesang kann fast jedes intelligente Monster - zähmen. Es wird von Angriffen auf den Magier absehen und auch seine - Begleiter nicht anrühren. Doch sollte man sich nicht täuschen, es - wird dennoch ein unberechenbares Wesen bleiben. - - - This disarming chant can tame almost any intelligent monster. It will - refrain from attacks on the mage and his companions. But one should not - deceive oneself about the persisting unpredictable nature of the creature. - - - - - Dieser Zauber ermöglicht es dem Träumer, den Schlaf aller nichtaliierten - Einheiten (HELFE BEWACHE) in der Region so stark zu stören, das sie - vorübergehend einen Teil ihrer Erinnerungen verlieren. - - - This spell enables the dreamer to disturb the sleep of all non-allied - units (HELP GUARD) in the region so severely they lose parts of their memories. - - - - - Dieser mächtige Zauber kann einen Magier vor dem sicheren Tod - bewahren. Der Magier erschafft anhand einer kleinen Blutprobe einen - Klon von sich, und legt diesen in ein Bad aus Drachenblut und verdünntem - Wasser des Lebens. - Anschließend transferiert er in einem aufwändigen Ritual einen Teil - seiner Seele in den Klon. Stirbt der Magier, reist seine Seele in den - Klon und der erschaffene Körper dient nun dem Magier als neues Gefäß. - Es besteht allerdings eine geringe Wahrscheinlichkeit, dass die Seele - nach dem Tod zu schwach ist, das neue Gefäß zu erreichen. - - - This powerful spell can keep the mage from certain death. The mage - creates a clone of himself from a small blood sample and puts it into - a bath of dragon's blood and thinned water of life. - Subsequently he transfers a fragment of his soul into the clone in a - complex ritual. If the mage dies afterwards, his soul takes possession - of the clone which will serve as his new vessel. There is however a - small chance the soul is to weak to reach the vessel in the wake of the - mage's death. - - - - - Dieses mächtige Ritual öffnet ein Tor in die Elementarebene der - Hitze. Eine grosse Dürre kommt über das Land. Bauern, Tiere und - Pflanzen der Region kämpfen um das nackte Überleben, aber eine - solche Dürre überlebt wohl nur die Hälfte aller Lebewesen. - Der Landstrich kann über Jahre hinaus von den Folgen einer - solchen Dürre betroffen sein. - - - This powerful ritual opens a gate to the elemental plane of - fire. A great drought comes over the land. Farmers, animals and - plants of the region are fighting for survival, but only half of - all living things will be able to survive a drought like this. - The region will suffer the consequences of such a drought for years to come. - - - - - Mit Hilfe dieses aufwändigen Rituals läßt der Druide einen Teil seiner Kraft - dauerhaft in den Boden und die Wälder der Region fliessen. Dadurch wird - das Gleichgewicht der Natur in der Region für immer verändert, und in - Zukunft werden nur noch die anspruchsvollen, aber kräftigen - Mallorngewächse in der Region gedeihen. - - - Through a elaborate ritual a druid permanently channels a fragment of his - power into the soil and the forests of the region. This forever changes - the equilibrium of nature in the region. From this point on only the - fierce but strong mallorn trees will grow there. - - - - - Dieses Ritual beschört einen großen Wasserelementar aus den - Tiefen des Ozeans. Der Elementar erzeugt einen gewaltigen - Strudel, einen Mahlstrom, welcher alle Schiffe, die ihn passieren, - schwer beschädigen kann. - - - This ritual summons a mighty water elemental from the depths of the ocean. - The elemental creates an enormous maelstrom which damages any passing ships. - - - - - Mit Hilfe dieses Zaubers kann sich der Magier permanent in einen - mächtigen Wyrm verwandeln. Der Magier behält seine Talente und - Möglichkeiten, bekommt jedoch die Kampf- und Bewegungseigenschaften - eines Wyrms. Der Odem des Wyrms wird sich mit steigendem Magie-Talent - verbessern. Der Zauber ist sehr kraftraubend und der Wyrm wird einige - Zeit brauchen, um sich zu erholen. - - - - - Mit Hilfe dieses magischen Gesangs versetzt der Magier eine ganze - Region in Aufruhr. Rebellierende Bauernhorden machen jedes Besteuern - unmöglich, kaum jemand wird mehr für Gaukeleien Geld spenden und - es können keine neuen Leute angeworben werden. Nach einigen Wochen - beruhigt sich der Mob wieder. - - - By means of this magical chant the mage incites riots in a region. - Rebelling peasant mobs prevent taxation and recruiting and almost - noone will pay money for entertainment. After a few weeks the mob - will calm down again. - - - - - Der Magier kann mit Hilfe dieses Zaubers aus der Astral- in die - materielle Ebene blicken und die Regionen und Einheiten genau - erkennen. - - - With this spell the mage can glance from the astral to the material - plane and recognize regions and units. - - - - - Dieses kräftezehrende Ritual beschwört mit Hilfe einer Kugel aus - konzentriertem Laen einen gewaltigen Erdelementar und bannt ihn - in ein Gebäude. Dem Elementar kann dann befohlen werden, das - Gebäude mitsamt aller Bewohner in eine Nachbarregion zu tragen. - Die Stärke des beschworenen Elementars hängt vom Talent des - Magiers ab: Der Elementar kann maximal [Stufe-12]*250 Größeneinheiten - große Gebäude versetzen. Das Gebäude wird diese Prozedur nicht - unbeschädigt überstehen. - - - This draining ritual summons a gigantic earth elemental from a sphere - of laen and binds it to a building. The elemental can then be commanded - to move the building with all its occupants to a neighbouring region. - The strength of the elemental depends of the mage's skill: it can move - up to [level-12]*250 size units of building. The building won't remain - undamaged by the process. - - - - Dieses Amulett in Gestalt einer orkischen Matrone - unterdrückt den Fortpflanzungstrieb eines einzelnen Orks sehr - zuverlässig. - Ein Ork mit Amulett der Keuschheit wird sich nicht mehr vermehren. - - - Dieser Zauber ermöglicht dem Magier, gezielt eine - bestimmte Verzauberung einer Einheit, eines Schiffes, Gebäudes oder auch - der Region aufzulösen. - This spell allows a magician to remove a specific - enchantment from a unit, ship, bulding or region. - - - Ein Schauer von Meteoren regnet über das Schlachtfeld. - A meteor shower rains down on the battlefield. - - - Mit Hilfe dieses Zaubers kann der Magier einen Teil - seiner magischen Kraft permanent auf einen anderen Magier übertragen. - Auf einen Magier des selben Magiegebietes kann er die Hälfte der - eingesetzten Kraft übertragen, auf andere Magier ein Drittel. - This spell allows the magician to transfer part of - his magical powers to another magician. Magicians of the seam school - will receive half the power invested, magicians of other schoolsreceive - receive one third. - - - Mit dieser Formel bindet der Magier auf ewig die - Kräfte - der Erde in die Mauern des Gebäudes. Ein solchermaßen verzaubertes - Gebäude - ist gegen den Zahn der Zeit geschützt und benötigt keinen Unterhalt - mehr. - With this spell, the magician binds the power of the - earth into the walls of a building for all eternity. Such a building is - immune to the sands of time and needs no maintenance cost. - - - Ein Magier, der sich in der astralen Ebene befindet, - kann mit Hilfe dieses Zaubers andere Einheiten zu sich holen. Der Magier - kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist - der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu - zaubern, kann er andere Einheiten auch gegen ihren Willen auf die - andere - Ebene zwingen. - A magician in the astral plane can summon units from - the - material world. The magician can bring (level-3)*15 GE through the - temporary portal. If he is experienced enough to cast the spell at at - least level 13, he can even summon units against their will. - - - Ein Magier, welcher sich in der materiellen Welt - befindet, kann er mit Hilfe dieses Zaubers Einheiten aus der - angrenzenden - Astralwelt herbeiholen. Ist der Magier erfahren genug, den Zauber auf - Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen - ihren Willen in die materielle Welt zwingen. - A magician in the material world can summon units from - the adjacent part of the astral plane. If he is experienced enough to - cast - the spell at at least level 13, he can even summon units against their - will. - - - Mit Hilfe dieses Zaubers kann der Magier einem anderen - Magier seine Aura gegen dessen Willen entziehen und sich selber - zuführen. - Aided by this spell, a magician can steal another - magician's aura against his will. - - - Diese magischen Runen bringen ein Boot bis zu einer - Kapazität von 50 Gewichtseinheiten für eine Woche zum Fliegen. Dies - ermöglicht dem Boot die Überquerung von Land. Für die Farbe der Runen - muss eine spezielle Tinte aus einem Windbeutel und einem Schneekristall - angerührt werden. - These magic runes allow a boat with a capacity of up - to 50 weight units to fly for a week and allow the boat to cross land. - The enchanted ink's components include a windbag and a snowcrystal petal. - - - - Diese praktische Anwendung des theoretischen Wissens um - Raum und Zeit ermöglicht es, den Zeitfluß für einige Personen zu - verändern. Auf diese Weise veränderte Personen bekommen für einige - Wochen doppelt soviele Bewegungspunkte und doppelt soviele Angriffe - pro Runde. - Abstract theories of space and time at last find - practical application in this spell which warps the very fabric of - time around a person. Such a person has twice as many movement points - and doubles their attacks per round for a few weeks. - - - Dieser Zauber läßt eine Welle aus purer Kraft über die - gegnerischen Reihen hinwegfegen. Viele Kämpfer wird der Schock so - benommen machen, dass sie für einen kurzen Moment nicht angreifen - können. - A wave of pure force spreads out from the magician, - crashing into the enemy ranks. Many warriors are thrown off balance and - are briefly unable to attack. - - - Mit diesem Zauber kann der Magier eine Zone der - astralen - Schwächung erzeugen, ein lokales Ungleichgewicht im Astralen Feld. - Dieses - Zone wird bestrebt sein, wieder in den Gleichgewichtszustand zu - gelangen. - Dazu wird sie jedem in dieser Region gesprochenen Zauber einen Teil - seiner Stärke entziehen, die schwächeren gar ganz absorbieren. - This spell allows a magician to create a local - instability in the astral field. This zone needs to return to its - equilibrium, soaking up part of the power of all spells cast in the - region - - or even all of some of the weaker ones. - - - Dieser Zauber ermöglicht dem Magier, Verzauberungen - einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen. - This spell lets a magician destroy spells on a ship, - building or region. - - - Dieser Zauber verstärkt die natürliche - Widerstandskraft - gegen Magie. Eine so geschützte Einheit ist auch gegen Kampfmagie - weniger - empfindlich. Pro Stufe reicht die Kraft des Magiers aus, um 5 Personen - zu - schützen. - This spell enhances natural magic resistence. - Protected - units are less vulnerable to battle magic. The spell protects 5 people - per - level. - - - Alte arkane Formeln ermöglichen es dem Magier, sich - und - andere in die astrale Ebene zu schicken. Der Magier kann (Stufe-3)*15 GE - durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren - genug, den Zauber auf Stufen von 11 oder mehr zu zaubern, kann er andere - Einheiten auch gegen ihren Willen auf die andere Ebene zwingen. - Ancient arcane formulae permit the magician to - transport - himself or other units into the astral plane. The magician can transport - (level-3) * 15 GE through the transient portal. If the magician is - experienced enough to cast level 11 spells, he can also transport units - against their will. - - - Der Magier konzentriert sich auf die Struktur der - Realität und kann so die astrale Ebene verlassen. Er kann insgesamt - (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der - Magier erfahren genug, den Zauber auf Stufen von 11 oder mehr zu - zaubern, - kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene - zwingen. - By concentrating on the structure of reality, the - magician can breach it and thus briefly make a gateway to leave the - astral - plane. He can transport up to (level-3)*15 GE through the portal. If the - magician is able to cast at at least level 11, he can even transport - other - units against their will. - - - Mit diesem Spruch kann der Magier versuchen, die - Verzauberungen - eines einzelnen angegebenen Objekts zu erkennen. Von - allen Sprüchen, - die seine eigenen Fähigkeiten nicht überschreiten, wird - er einen - Eindruck ihres Wirkens erhalten können. Bei stärkeren - Sprüchen - benötigt er ein wenig Glück für eine gelungene Analyse. - With this spell the magician can try to identify the - enchantments of - a single object. He will get an impression of the - operation of all - spells that don't exceed his own capabilities. For more - powerful - spells he will need some luck for a successful analysis. - - - Dieser Zauber legt ein antimagisches Feld um die Magier der Feinde - und behindert ihre Zauber erheblich. Nur wenige werden die Kraft - besitzen, das Feld zu durchdringen und ihren Truppen in der Schlacht - zu helfen. - This spell creates an antimagic field around the mages of the enemies - and considerably hinders their spells. Only few will have the power to - break through the field and be able to help their troops in battle. - - - Dieser Zauber verhindert, dass ein Teil der sonst im Kampf zerstörten - Gegenstände beschädigt wird. Die Verluste reduzieren sich um 5% pro - Stufe des Zaubers bis zu einem Minimum von 25%. - This spell prevents damage to a portion of the items that would - otherwise be lost in battle. The loss of items is reduced by 5% for - every level of the spell, up to a minimum of 25%. - - - - Dieses Lied zähmt selbst den wildesten - Ork und macht ihn friedfertig und sanftmütig. Jeder - Gedanke, dem Sänger zu schaden, wird ihm entfallen. - Unbehelligt kann der Magier in eine Nachbarregion - ziehen. - This little melody calms even the - wildest orc to a gentle and serene creature who will not - even think about putting the singer to harm. The magician - may travel to a neighboring region without being - harassed by annoying troublemakers. - - - Nicht nur der Feldscher kann den - Verwundeten einer Schlacht helfen. Die Barden kennen - verschiedene Lieder, die die Selbstheilungskräfte des - Körpers unterstützen. Dieses Lied vermag Wunden zu - schließen, gebrochene Knochen zu richten und selbst - abgetrennte Glieder wieder zu regenerieren. - The field medic isn't the only one - capable of tending the wounds of battle. The bards know - a number of magic melodies to enhance the natural - healing process of the body. This song is able to close - wounds, mend fractured bones and even regenerate lost - lims. - - - Ein gar machtvoller Gesang aus den - Überlieferungen der Katzen, der tief in die Herzen der - Feinde dringt und ihnen Mut und Hoffnung raubt. Furcht - wird sie zittern lassen und Panik ihre Gedanken - beherrschen. Voller Angst werden sie versuchen, den - gräßlichen Gesängen zu entrinnen und fliehen. - This antique, powerful song, passed - down by the cats, will penetrate the hearts of the enemy - and bereave them of courage and hope. Both their minds - and bodies will be ruled by panic. Shivering with fear, - they will flee from the dreadful chants and try to make - their escape. - - - Aus den uralten Gesängen der Katzen - entstammt dieses magisches Lied, welches vor einem - Kampfe eingesetzt, einem entscheidende strategische - Vorteile bringen kann. Wer unter den Einfluss dieses - Gesangs gelangt, der wird seiner Umgebung nicht achtend - der Melodie folgen, sein Geist wird verwirrt und - sprunghaft plötzlichen Eingebungen nachgeben. So sollen - schon einst wohlgeordnete Heere plötzlich ihre Schützen - weit vorne und ihre Kavallerie bei den Lagerwachen - kartenspielend wiedergefunden haben (oder ihren Anführer - schlafend im lange verlassenen Lager, wie es in den - Großen Kriegen der Alten Welt wirklich geschehen sein - soll). - If is used before battle, this chant, - taken from the ancient tunes of the cats, might give you - the critical tactical advantage. Those under the spell's - influence will act uncoordinated and inconsequent due to - the nonsensical ideas planted into their minds through - the melody. So it is supposed to have come to pass that - well-organized armies found their archers up at the - front (while the cavalry was back at the camp playing - cards) or that even a famous general overslept a battle - in his tent, as tale-tellers claim it really happened - during the Great Wars in the Old World. - - - Dieser alte Schlachtengesang hebt die - Moral der eigenen Truppen und und hilft ihnen auch der - angsteinflößenden Aura dämonischer und untoter Wesen zu - widerstehen. Ein derartig gefestigter Krieger wird auch - in schwierigen Situationen nicht die Flucht ergreifen - und sein überlegtes Verhalten wird ihm manch Vorteil in - der Verteidigung geben. - This ancient battle chant lifts the - spirit of your troops and helps them withstand even the - fear-inspiring aura of demonic and undead beings. A - fighter thus fortified against evil will not flee even - in the face of terror, and his defenses will be strengthened. - - - Mit Hilfe dieses Zaubers kann der - Magier eigene Aura im Verhältnis 2:1 auf einen anderen - Magier des gleichen Magiegebietes übertragen. - This spell enables the wizard to - transfer aura at a rate of 2:1 to another sorcerer of - the same school of magic. - - - Alle lebenden Wesen haben ein eigenes - individuelles Lebenslied. Nicht zwei Lieder gleichen - sich, auch wenn sich alle Lieder einer Art ähneln. Jeder - Zauber verändert dieses Lied auf die eine oder andere - Art und gibt sich damit zu erkennen. Dieser Gesang - hilft, jene Veränderungen im Lebenslied einer Person zu - erlauschen, welche magischer Natur sind. Alle - Verzauberungen, die nicht stärker maskiert sind als Eure - Fähigkeit, werdet Ihr so entschlüsseln und demaskieren - können. - Each and every living being has its - own, individual 'life-song'. No two of these songs are - alike, even though songs of creatures of the same - species are similar. Every spell alters this song of - life in one way or the other and this can be identified. - By casting this spell, the bard can detect all those - magic variations in a person's 'life-song'. You will be - able to decipher all enchantments or spells, which - aren't disguised beyond your capability. - - - Dieser schrille Gesang hallt über das - ganze Schlachtfeld. Die besonderen Dissonanzen in den - Melodien machen es Magiern fast unmöglich, sich auf ihre - Zauber zu konzentrieren. - The screeching sounds of this melody - can be heard across the whole battlefield. Wizards - exposed to these special dissonances find it nearly - impossible to concentrate on their spells. - - - Die verzauberte Einheit beginnt - hemmungslos zu plappern und erzählt welche Talente sie - kann, was für Gegenstände sie mit sich führt und sollte - sie magisch begabt sein, sogar welche Zauber sie - beherrscht. Leider beeinflußt dieser Zauber nicht das - Gedächtnis, und so wird sie sich im nachhinein wohl - bewußt werden, dass sie zuviel erzählt hat. - The persons of the bewitched unit - starts to babble without control about what it is said, - speaking about their talents, the objects they carry or - wear and if the unit is a magician, he or she will even list - the spells they know. Unfortunately, this spell does not - influence the memory of the subjects and afterwards, the - enchanted will realize that they probably talked too - much. - - - Man befeuchte einen kluftfreien Block - aus feinkristallinen Gestein mit einer Phiole des - Lebenswassers bis dieses vollständig vom Gestein - aufgesogen wurde. Sodann richte man seine Kraft auf die - sich bildende feine Aura des Lebens und forme der - ungebundenen Kraft ein Gehäuse. Je mehr Kraft der Magier - investiert, desto mehr Golems können geschaffen werden, - bevor die Aura sich verflüchtigt. Jeder Golem hat jede - Runde eine Chance von 10 Prozent zu Staub zu zerfallen. - Gibt man den Golems die Befehle MACHE BURG oder MACHE - STRASSE, so werden pro Golem 4 Steine verbaut und der - Golem löst sich auf. - 'Take a flawless block of crystaline - stone and humidify it with a vial of Water of Life until - the potion has been soaked up completely. Then focus - your power on the forming aura of life and shape a - container for the unbound forces'. The more power a magician - invests, the more golems can be created before the aura - dissipates. Every week, there is a 10 percent chance - that the golem will crumble to dust. If you command a - golem to 'MAKE CASTLE' or 'MAKE ROAD', it will turn - itself into 4 stones that it uses in construction, and - disintegrate afterwards. - - - Je mehr Kraft der Magier investiert, - desto mehr Golems können geschaffen werden. Jeder Golem - hat jede Runde eine Chance von 15 Prozent zu Staub zu - zerfallen. Gibt man den Golems den Befehl MACHE - SCHWERT/BIHÄNDER oder MACHE - SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 4 - Eisenbarren verbaut und der Golem löst sich auf. - The more power a magician invests, the - more golems can be created before the aura dissipates. - Each golem has a 15% chance per week to turn to dust. If - you command a golem to 'MAKE SWORD/MAKE CLAYMORE' or - 'MAKE SHIELD/CHAINMAIL/PLATEMAIL',it will work 5 iron - ingots and disintegrate afterwards. - - - Wo sonst aus einem - Stecken nur ein Baum sprießen konnte, so treibt nun jeder - Ast Wurzeln. - Every branch becomes a sturdy - oak where before only one could be grown from a log. - - - Mit diesem Ritual wird eine dunkle - Gewitterfront beschworen, die sich - unheilverkündend über der Region auftürmt. Der - magische Regen wird alles Erz rosten lassen. - Eisenwaffen und Rüstungen werden schartig und rostig. - Die Zerstörungskraft des - Regens ist von der investierten Kraft des - Magiers abhängig. Für jede Stufe können bis zu - 10 Eisenwaffen betroffen werden. Ein Ring der - Macht verstärkt die Wirkung wie eine zusätzliche - Stufe. - This ritual conjurs up a dark - thunderstorm that affects a whole region. The - magic rain will let rust any ore. Iron weapons and - armor will get rusty. The exact number of - items affected by the rain depends on the - ammount of power invested by the magician. Up to ten - weapons can be destroyed per level - a Ring of - Power increases the effect like an additional - level. - - - Dieser Zauber ermöglicht es dem Magier - Insekten auf magische Weise vor der lähmenden - Kälte der Gletscher zu bewahren. Sie können - Gletscher betreten und dort normal agieren. Der - Spruch wirkt auf Stufe*10 Insekten. Ein Ring der - Macht erhöht die Menge der verzauberbaren - Insekten zusätzlich um 10. - This spell enables the druid to - magically protect insects from the paralysing - cold of a glacier. Under the effect of this - spell, insects are able to enter glaciers and - act normally there. Ten insects per level can be - protected in this way. A Ring of Power increases - the number by additional ten. - - - Im Kampf ruft der Magier die - Elementargeister der Kälte an und bindet sie an - sich. Sodann kann er ihnen befehlen, den Gegner - mit Hagelkörnern und Eisbrocken zuzusetzen. - During a battle the druid calls the - Elemental Spirits of Cold and binds them to - himself. Then he commands them to attack his - foes with hail and ice missiles. - - - Erschafft einen Wächtergeist, der - in Gletschern und Bergen Eisen- und Laenabbau durch - nichtalliierte Parteien (HELFE BEWACHE) verhindert, - solange er die Region bewacht. Der Bergwächter ist - an den Ort der Beschwörung gebunden. - Creates a guardian spirit on a - mountain or glacier that keeps all factions that - are not allied (HELP GUARD) from mining iron or - laen as long as it guards the region. The - Mountain Guardian is bound to the location where - it has been summoned. - - - Durch Ausführung dieser Rituale ist - der Magier in der Lage einen mächtigen - Erdelementar zu beschwören. Solange dieser in - den Boden gebannt ist, wird kein Regen die Wege - aufweichen und kein Fluß Brücken zerstören - können. Alle Reisende erhalten damit die - gleichen Vorteile, die sonst nur ein ausgebautes - gepflastertes Straßennetz bietet. Selbst Sümpfe - und Gletscher können so verzaubert werden. Je - mehr Kraft der Magier in den Bann legt, desto - länger bleibt die Straße bestehen. - By performing these rituals the druid - is able to summon a powerful earth elemental. As - long as this elemental remains bound to a - region, no rain can turn a path into mud and no - river can destroy a bridge. All travelers in - this region gain the same advantages as if they - were travelling on a road. Even swamps and - glaciers can be enchanted in this way. The more - power the druid invests, the longer the roads - remain intact. - - - Die Anrufung der Elementargeister des - Windes beschwört plötzliche Windböen, kleine - Windhosen und Luftlöcher herauf, die die - gegnerischen Schützen behindern werden. - Calling the Elemental Spirits of Wind - conjurs up sudden breezes, small whirlwinds and - minor turbulences that will hinder enemy - archers. - - - Diese Ritual verstärkt die Wirkung des - magischen Trankes um ein vielfaches. Wo sonst aus einem - Stecken nur ein Baum sprießen konnte, so treibt nun jeder - Ast Wurzeln. - This ritual greatly increases the - effect of the potion. Now every branch becomes a mallorn - tree where before only one could be grown from a log. - - - Der Magier zwingt mit diesem Ritual - die Elementargeister des Wassers in seinen - Dienst und bringt sie dazu, das angegebene - Schiff schneller durch das Wasser zu tragen. - Zudem wird das Schiff nicht durch ungünstige - Winde oder Strömungen beeinträchtigt. - While being aboard a ship, the druid - uses this ritual to force the Elemental Spirits - of Water to serve him and commands them to carry - the ship across the water at a higher speed. In - addition, the ship will not be affected by - unfavourable winds or currents. - - - Nicht nur der Feldscher kann den - Verwundeten einer Schlacht helfen. Druiden - vermögen mittels einer Beschwörung der - Elementargeister des Lebens Wunden zu schließen, - gebrochene Knochen zu richten und selbst - abgetrennte Glieder wieder zu regenerieren. - Combat medics are not the only ones - who can help those who got injured during a - battle. Druids are, with the help of a summons - of - the Elemental Spirits of Life, able to heal - wounds, mend broken bones or even regenerate - separated limbs as well. - - - Diese Beschwörung öffnet ein Tor in - die Ebene der Elementargeister des Windes. - Sofort erheben sich in der Umgebung des Tors - starke Winde oder gar Stürme und behindern alle - Schützen einer Schlacht. - This summons opens a gate to the plane - of Elemental Spirits of Wind. Immediately, - strong winds or even storms will rise near the - gate and hinder all archers during a battle. - - - Dieses Ritual beschwört einige - Elementargeister der Magie und schickt sie in - die Reihen der feindlichen Magier. Diesen wird - das Zaubern für die Dauer des Kampfes deutlich - schwerer fallen. - This ritual summons some Elemental - Spirits of Magic and sends them into the ranks - of the enemy mages. Casting spells will be much - harder for them during the battle. - - - Mit Hilfe dieses Zaubers kann der - Magier eigene Aura im Verhältnis 2:1 auf einen - anderen Magier des gleichen Magiegebietes - übertragen. - The caster can transfer aura at a - ratio of 2:1 to another member of the same - school of magic with the help of this spell. - - - Der Druide beschwört mit diesem Ritual - einen Elementargeist der Erde und bringt ihn - dazu, die Erde erbeben zu lassen. Dieses - Erdbeben wird alle Gebäude in der Region - beschädigen. - With this ritual the druid summons an - Elemental Spirit of Earth that brings the ground - to shake. This earthquake damages all buildings - in the target region. - - - Die Beschwörung von Elementargeistern - der Stürme ist ein uraltes Ritual. Der Druide - bannt die Elementare in die Segel der Schiffe, - wo sie helfen, das Schiff mit hoher - Geschwindigkeit über die Wellen zu tragen. Je - mehr Kraft der Druide in den Zauber investiert, - desto größer ist die Zahl der Elementargeister, - die sich bannen lassen. Für jedes Schiff wird - ein Elementargeist benötigt. - Calling the Elemental Spirits of Storm - is an ancient ritual. The druid binds the - elementals to a ship's sails where they can help - to carry the vessel across the waves at an - amazing speed. The more power the druid invests, - the greater is the number of spirits bound. Each - ship needs an own spirit. - - - Mit diesem Spruch erzeugt man ein Runenschwert. Die - Klinge des schwarzen Schwertes ist mit alten, magischen Runen verziert, - und ein seltsames Eigenleben erfüllt die warme Klinge. Um es zu - benutzen, - muss man ein Schwertkämpfer von beachtlichem Talent (7) sein. Der - Träger - des Runenschwertes erhält einen Talentbonus von +4 im Kampf und wird so - gut wie immun gegen alle Formen von Magie. - This spell creates a magical sword. It requires a - skill - of at least 7, but adds +4 to the combat skill of its' owner as well as - making them almost immune against magical attacks. - - - Dieser Beutel umschließt eine kleine Dimensionsfalte, - in - der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass - sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen - sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem - Beutel transportiert werden. Auch ist es nicht möglich, einen - Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt - 1 - GE. - This bag encloses a dimensional rift in which up to - 200 - units of weight can be carries. Horses and other large objects cannot be - put into the bag. The bag itself has a weight of 1. - - - Dieses mächtige Ritual erschafft einen Ring der Macht. - Ein Ring der Macht erhöht die Stärke jedes Zaubers, den sein Träger - zaubert, als wäre der Magier eine Stufe besser. - A ring of power adds +1 to the power of each spell - cast - by its' wearer. - - - Der Spruch ermöglicht es einem Magier, - ein Amulett des Wahren Sehens zu erschaffen. Das - Amulett erlaubt es dem Träger, alle Einheiten, - die durch einen Ring der Unsichtbarkeit - geschützt sind, zu sehen. Einheiten allerdings, - die sich mit ihrem Tarnungs-Talent verstecken, - bleiben weiterhin unentdeckt. - This spell enables the caster to - create an Amulet of True Sight. Wearing such an - amulet, a person can discover anyone wearing a - Ring of Invisibility. Anyway, units concealed by - the use of their stealth skill will remain - undiscovered. - - - Mit Hilfe dieses Zauber entzieht der Magier einem - Quarzkristall all seine magischen Energien. Der Kristall wird dann, wenn - er zu feinem Staub zermahlen und verteilt wird, die beim Zaubern - freigesetzten magischen Energien aufsaugen und die Kraft aller Zauber - reduzieren, welche in der betreffenden Woche in der Region gezaubert - werden. - This spell creates a portable crystal of antimagic - which can be used by anybody to reduce or even eliminate the power of - all spells cast in the region during the same week. - - - Die berühmte Bardin Miriam bhean'Meddaf war bekannt - für ihr außergewöhnliches Geschick mit der Harfe. Ihre Finger sollen - sich so schnell über die Saiten bewegt haben, das sie nicht mehr - erkennbar waren. Dieser Zauber, der recht einfach in einen Silberring - zu bannen ist, bewirkt eine um das zehnfache verbesserte - Geschicklichkeit und Gewandheit der Finger. (Das soll sie auch an - anderer Stelle ausgenutzt haben, ihr Ruf als Falschspielerin war - berüchtigt). Handwerker können somit das zehnfache produzieren, - und bei einigen anderen Tätigkeiten könnte dies ebenfalls von Nutzen - sein. - The famous bard Mirim was known for exceptionally - limber - play of the harp. Her spell, which is easy to ban into a little silver - ring, increases the wearer's dexterity by a factor of ten, which is siad - to be useful to both craftsmen and shady natures. - - - Mit diesem Spruch kann der Zauberer - einen Ring der Unsichtbarkeit erschaffen. Der - Träger des Ringes wird für alle Einheiten - anderer Parteien unsichtbar, egal wie gut ihre - Wahrnehmung auch sein mag. In einer unsichtbaren - Einheit muss jede Person einen Ring tragen. - With this spell the caster can create - a Ring of Invisibility. The wearer of this ring - will be invisible to all units of other - factions, no matter how good their perception - skill may be. In an invisible unit, each person - must wear a Ring of Invisibility. - - - Mit dieser Formel bindet der Magier - auf ewig die Kräfte der Erde in die Mauern der - Burg, in der er sich gerade befindet. Weder - magisch noch mit schwerem Geschütz können - derartig gestärkte Mauern zerstört werden, und - auch das Alter setzt ihnen weniger zu. Das - Gebäude bietet sodann auch einen besseren Schutz - gegen Angriffe mit dem Schwert wie mit Magie. - With this spell the druid eternally - binds the powers of earth to the walls of the - castle in which he currently is. No magic and no - ballistic attacks will ever be able to destroy a - wall that has been fortified in this way and the - castle will also be less affected by aging. In - addition, the building will provide a better - protection against attacks by sword or by magic. - - - Nicht wenige Druiden freunden sich im - Laufe ihres Lebens in der Natur mit den ältesten - Freunden der großen Völker an. Sie erlernen, mit - einem einzigen heulenden Ruf viele ihrer Freunde - herbeizurufen, um ihnen im Kampf beizustehen. - During their life in the wilderness, - many druids make friends with the wolves who are - the oldest friends of the great races. They - learn to call many of them with a single howl to - aid them in combat. - - - Dieser schwierige, aber effektive - Kampfzauber benutzt die Elementargeister des - Steins, um eine Reihe von Gegnern für die Dauer - des Kampfes in Stein zu verwandeln. Die - betroffenen Personen werden nicht mehr kämpfen, - können jedoch auch nicht verwundet werden. - This complicated but effective spell - uses the Elemental Spirits of Stone to turn a - number of enemies to stone for the duration of - combat. The affected persons won't be able to - fight any more, but they can't be wounded - either. - - - Mit dieser Formel bindet der Magier zu - Beginn eines Kampfes einige Elementargeister des - Fels in die Mauern des Gebäudes, in dem er sich - gerade befindet. Das Gebäude bietet sodann einen - besseren Schutz gegen Angriffe mit dem Schwert - wie mit Magie. - At the beginning of a battle, the - magician binds some Elemental Spirits of Rock to - the walls of the builing in which he currently - is. The structure will then provide a better - protection against attacks by sword or by magic. - - - Wie die alten Lehren der Druiden - berichten, besteht das, was die normalen Wesen - Magie nennen, aus Elementargeistern. Der Magier - beschwört und bannt diese in eine Form, um den - gewünschten Effekt zu erzielen. Dieses Ritual - nun vermag es, in diese Welt gerufene - Elementargeister zu vertreiben, um so ein Objekt - von Magie zu befreien. - Old legends of the druids say that - what normal people call 'magic' consists of - elemental spirits. A magician summons these - spirits and binds them to various forms to - achieve the desired effects. This ritual is able - to expel any elemental spirits that have been - summoned to this world and thereby dispels any - magic on the target. - - - Große Macht liegt in Orten, an denen - das Leben pulsiert. Der Druide kann diese Kraft - sammeln und so ein Tor in die Welt der - Geistwesen erschaffen. Der Druide kann dann - Stufe*5 Gewichtseinheiten durch das Tor - entsenden. - A great power lies within those places - that are pulsing with life. A druid can focus - this power and thereby create a gate into the - World of Spirits. He can then send level*5 - weight units of living or dead matter through - the gate. - - - Ein Druide, den es in die Welt der - Geister verschlagen hat, kann mit Hilfe dieses - Zaubers Stufe*5 Gewichtseinheiten in einen Wald - auf der materiellen Welt zurückschicken. - A druid who has traveled to the World - of Spirits can use this spell to send level*5 - weight units of living or dead matter back to a - forest in the material world. - - - Dieses Ritual beschwört verschiedene - Naturgeister in den Boden der Region, welche - diese fortan bewachen. In einer so gesegneten - Region werden niemals wieder die Toten ihre - Gräber verlassen, und anderswo entstandene - Untote werden sie wann immer möglich meiden. - This ritual binds various rural - spirits to a specific territory to guard the - land. In a region blessed in this way the dead - won't ever rise from their graves again. - Existing undead also shun the sacred grounds and - will avoid entering the protected area whenever - possible. - - - Der Druide nehme etwas präpariertes - Leder, welches er in einem großen Ritual der - Reinigung von allen unreinen Geistern befreie, - und binde dann einige kleine Geister der Luft - und des Wassers in das Material. Aus dem so - vorbereiteten Leder fertige er nun ein kleines - Beutelchen, welches in ihm aufbewahrte Kräuter - besser zu konservieren vermag. - The druid takes some specially - prepared leather and performes a great ritual - during which the leather is cleansed of all - impure spirits. Then he binds some minor spirits - of air and water to the material. After - completing this process, the druid works the - enchanted leather into a small pouch which is - suitable to contain herbs, for it is able to - preserve them for a long time and prevents rot. - - - Mit Hilfe dieses Zaubers weckt der - Druide die in den Wälder der Region - schlummernden Ents aus ihrem äonenlangen Schlaf. - Die wilden Baumwesen werden sich ihm anschließen - und ihm beistehen, jedoch nach einiger Zeit - wieder in Schlummer verfallen. - With the help of this spell the druid - awakens the ents who are slumbering in the - forests of a region from aeons of sleep. These - strange tree-creatures will join him and aid his - cause, but after a while they will sink back - into their slumber. - - - Dieses Ritual segnet einen Steinkreis, - der zuvor aus Steinen und etwas Holz gebaut - werden muss. Die Segnung des Druiden macht aus - dem Kreis eine mächtige Stätte magischen - Wirkens, die Schutz vor Magie und erhöhte Aura- - Regeneration bewirkt. Man sagt, Jungfrauen seien - in der Umgebung von Steinkreisen seltsame Wesen - begegnet. - This ritual blesses a circle of stones - that has to be constructed from stones and some - wood before. The druid's blessing turns the - circle into a place of great magic that is - suitable for rituals of all kinds. It protects - from hostile magic and improves aura - regeneration. Virgins are said to have been - visited by strange creatures in the vicinity of - these places. - - - Das Ziel des Zauberers wird von einer - harmlosen Verwünschung heimgesucht. - The target of this spell becomes - subject to a harmless curse. - - - Dieses vor dem Kampf zu zaubernde Ritual gibt den - eigenen Truppen einen zusätzlichen Bonus auf ihre Rüstung. Jeder - Treffer reduziert die Kraft des Zaubers, so dass der Schild sich - irgendwann im Kampf auflösen wird. - Performing this ritual before going into battle gives - your troups an additional bonus to their armor. Every hit reduces the - energy of the spell, dissolving it at some point during battle. - - - Der Zauberer schleudert fokussiertes - Chaos in die Reihen der Gegner. Das ballförmige - Chaos wird jeden verwunden, den es trifft. - The sorcerer hurls a ball of - concentrated chaos into the ranks of his - enemies. It will seriously hurt anyone who gets - hit. - - - Der Magier öffnet seinen Geist den - Sphären des Chaos und wird so für einige Zeit - über mehr magische Kraft verfügen. Doch die - Hilfe der Herren der Sphären hat seinen Preis, - und so wird die Phase der Macht abgelöst von - einer Phase der Schwäche. - The sorcerer opens his mind to the - Spheres of Chaos so that he can access a greater - ammount of magical power for a while. But the - help of the Chaos Lords has its price - and so - the period of power will be followed by a period - of weakness. - - - Mit diesem Ritual kann der Magier - einen Teil seiner Lebensenergie opfern, um dafür - an magischer Kraft zu gewinnen. Erfahrene - Ritualmagier berichten, das sich das Ritual, - einmal initiiert, nur schlecht steuern ließe und - die Menge der so gewonnenen Kraft stark - schwankt. So steht im 'Buch des Blutes' - geschrieben: 'So richte Er aus das Zeichen der - vier Elemente im Kreis des Werdens und Vergehens - und Weihe ein jedes mit einem Tropfen Blut. - Sodann begebe Er in der Mitten der Ewigen Vierer - sich und lasse Leben verrinnen, auf das Kraft - geboren werde.' - With this ritual the sorcerer can - sacrifice part of his life force in order to - gain raw astral power. Experienced mages report - that this ritual, once started, is hard to - control and that the ammount of power gained in - this way varies. - - - In diesem blutigen Ritual opfert der - Magier vor der Schlacht ein Neugeborenes vor den - Augen seiner Armee. Die so gerufenen Blutgeister - werden von den Soldaten Besitz ergreifen und sie - in einen Blutrausch versetzen. - During this bloody ritual the sorcerer - sacrifices a newborn child before a battle right - in front of his army. In this way he attracts - spirits of blood that will take control of the - soldiers who are present and force them into a - blood frenzy. - - - Dieser heimtückische Fluch - beeinträchtigt die magischen Fähigkeiten des - Opfers erheblich. Eine chaosmagische Zone um das - Opfer vermindert seine Konzentrationsfähigkeit - und macht es ihm sehr schwer Zauber zu wirken. - This wicked curse affects the magical - abilities of the target. A field of raw chaos - magic around the target lessens its - concentration and makes it very hard to cast any - spells. - - - Nächtelang muss der Schwarzmagier - durch die Friedhöfe und Gräberfelder der Region - ziehen um dann die ausgegrabenen Leichen beleben - zu können. Die Untoten werden ihm zu Diensten - sein, doch sei der Unkundige gewarnt, dass die - Beschwörung der Mächte des Todes ein - zweischneidiges Schwert sein kann. - For many nights the sorcerer has to - roam the graveyards and former battlefields of a - region in order to find corpses to animate. The - Undead will serve his will, but beware! Dealing - with the mysteries of unlife can be a dangerous - thing. - - - Mit diesem Ritual wird eine dunkle - Gewitterfront beschworen, die sich - unheilverkündend über der Region auftürmt. Der - magische Regen wird alles Erz rosten lassen und - so viele Waffen des Gegners zerstören. - This ritual conjurs up a dark - thunderstorm that affects a whole region. The - magic rain will let rust any ore and thus - destroy many weapons of the enemy. - - - Mit Hilfe dieses Zaubers kann der - Magier eigene Aura im Verhältnis 2:1 auf einen - anderen Magier des gleichen Magiegebietes - übertragen. - With the help of this spell, the - caster can transfer aura at a ratio of 2:1 to - another member of the same school of magic. - - - Der Zauberer erschafft eine Wand aus - Feuer in der angegebenen Richtung. Sie verletzt - jeden, der sie durchschreitet. - The spell creates an opaque wall of - fire in the gives direction that will harm - anyone passing through it. - - - In einem aufwendigen Ritual opfert der - Schwarzmagier einige Bauern und verteilt dann - die Leichen auf magische Weise in den Brunnen - der Region. - In a complicated ritual the sorcerer - sacrifices the lives of ten peasants and - magically spreads their corpses within the wells - of a region. - - - Vor den Augen der feindlichen Soldaten - opfert der Schwarzmagier die zehn Bauern in - einem blutigen, grausamen Ritual und beschwört - auf diese Weise Geister des Wahnsinns über die - feindlichen Truppen. Diese werden im Kampf - verwirrt reagieren und nicht in der Lage sein, - den Anweisungen ihrer Offiziere zu folgen. - Before the eyes of the enemy soldiers - the sorcerer sacrifices ten peasants in a bloody - ritual and thereby summons spirits of madness - upon the enemy troops. The enemy soldiers will - be in confusion during battle and no more be - able to follow the commands of their leaders. - - - Mit Hilfe dunkler Rituale beschwört - der Zauberer Dämonen aus der Sphäre der - Schatten. Diese gefürchteten Wesen können sich - fast unsichtbar unter den Lebenden bewegen, ihre - finstere Aura ist jedoch für jeden spürbar. Im - Kampf sind Schattendämonen gefürchtete Gegner. - Sie sind schwer zu treffen und entziehen ihrem - Gegner Kraft. - With the help of dark rituals the - sorcerer summons demons from the Sphere of - Shadows. These fearsome creatures can walk - almost unseen among the living, but their dark - aura can be sensed by everyone. Shadow demons - are feared in combat for they are hard to hit - and have the ability to drain strength from - their victims. - - - Dieses Ritual beschwört wütende Elementargeister der - Hitze. Eine Dürre sucht das Land heim. Bäume verdorren, Tiere - verenden, und die Ernte fällt aus. Für Tagelöhner gibt es kaum noch - Arbeit in der Landwirtschaft zu finden. - This Ritual summons an angry elemental spirit that - puts a drought on the entire region. Trees wither, animals die of - thirst and the harvest is destroyed. Workers find little to no work - in farming. - - - Dieses Ritual bindet die bereits - entfliehenden Seelen einiger Kampfopfer an ihren - toten Körper, wodurch sie zu untoten Leben - wiedererweckt werden. Ob sie ehemals auf der - Seite des Feindes oder der eigenen kämpften, ist - für das Ritual ohne belang. - This ritual binds the escaping souls - of some casualties back to their dead bodies and - thus condemns them to an undead existance under - the control of the sorcerer. The ritual affects - the corpses of allies and foes alike - no matter - on which side of the battle the soldiers fought - before their death. - - - Dieses magische Artefakt verleiht dem - Träger die Stärke eines ausgewachsenen - Höhlentrolls. Seine Tragkraft erhöht sich auf - das 50fache und auch im Kampf werden sich die - erhöhte Kraft und die trollisch zähe Haut - positiv auswirken. - This artifact gives the wearer - the strength of a cavetroll. He will be able to - carry fifty times his normal load, as well as - gain strength and tough troll skin in combat. - - - Der Schwarzmagier kann mit diesem - dunklen Ritual einen Riss in das Gefüge der - Magie bewirken, der alle magische Kraft aus der - Region reißen wird. Alle magisch begabten in der - Region werden einen Großteil ihrer Aura - verlieren. - With this dark ritual the - chaos sorcerer causes a deep rift to appear in - the astral balance that will tear all magical - power from a region. All spellcasters in that - region will lose most of their aura. - - - Dieses Ritual, ausgeführt vor einem - Kampf, verwirbelt die astralen Energien auf dem - Schlachtfeld und macht es so feindlichen Magier - schwieriger, ihre Zauber zu wirken. - This ritual, performed before a - battle, causes the astral energies on the - battlefield to whirl and churn and thereby makes - spellcasting more difficult for the enemy mages. - - - Diese Elementarbeschwörung ruft einen - Feuerteufel herbei, ein Wesen aus den tiefsten - Niederungen der Flammenhöllen. Der Feuerteufel - wird sich begierig auf die Wälder der Region - stürzen und sie in Flammen setzen. - This elemental summoning calls a fire - fiend, a creature from the deepest hell. The - demon will eagerly rush into the forests of a - region and set them ablaze. - - - Genau um Mitternacht, wenn die Kräfte - der Finsternis am größten sind, kann auch ein - Schwarzmagier seine Kräfte nutzen um - Verzauberungen aufzuheben. Dazu zeichnet er ein - Pentagramm in das verzauberte Objekt und beginnt - mit einer Anrufung der Herren der Finsternis. - Die Herren werden ihm beistehen, doch ob es ihm - gelingt, den Zauber zu lösen, hängt allein von - seiner eigenen Kraft ab. - At midnight, when the Powers of - Darkness are at their peak, the sorcerer can use - his powers to destroy enchantments. In order to - do so, he draws a pentagram on a surface of the - enchanted object and begins calling the Lords of - Darkness. The Lords will aid him, but whether he - is able to undo the target spell or not depends - upon his own power. - - - Nur geflüstert wird dieses Ritual an - den dunklen Akademien an die Adepten - weitergegeben, gehört es doch zu den - finstersten, die je niedergeschrieben wurden. - Durch die Anrufung unheiliger Dämonen wird die - Kraft der lebenden Toten verstärkt und sie - verwandeln sich in untote Monster großer Kraft. - Only whispered the knowledge of - performing this ritual is passed to the adepts - of the dark academies, for it is one of the - darkest that has ever been written down. By - calling unholy demons the strength of the living - dead is greatly increased and they are turned - into undead monsters of immense power. - - - Mit einem düsteren Ritual und unter - Opferung seines eigenen Blutes beschwört der - Schwarzmagier einen großen Geist von der - Elementarebene der Gifte. Der Geist manifestiert - sich als giftgrüner Schwaden über der Region und - wird allen, die mit ihm in Kontakt kommen, - Schaden zufügen. - By performing a gruesome ritual and - sacrificing his own blood the Sorcerer conjurs - up a spirit from the Elemental Plane of Poison. - It will take the form of a green cloud of toxic - gases that envelops a whole region and that will - harm anyone within. - - - Mit diesem dunklen Ritual erzeugt der - Magier einen Köder, der für Drachen einfach - unwiderstehlich riecht. Ob die Drachen aus der - Umgebung oder aus der Sphäre des Chaos stammen, - konnte noch nicht erforscht werden. Es soll - beides bereits vorgekommen sein. Der Köder hält - etwa 6 Wochen, muss aber in einem - drachengenehmen Terrain platziert werden. - Performing this dark ritual, the - sorcerer creates a bait that exhales an - irresistable scent to dragons. It is not known - whether the dragons come from surrounding - regions or if they have their origin in the - Sphere of Chaos. The bait will exist for about - six weeks, but it must be placed in a tarrain - that is suitable for dragons. - - - Mit Hilfe dunkler Rituale beschwört - der Zauberer Dämonen aus der Sphäre der - Schatten. Diese gefürchteten Wesen können sich - fast unsichtbar unter den Lebenden bewegen, ihre - finstere Aura ist jedoch für jeden spürbar. Im - Kampf sind Schattenmeister gefürchtete Gegner. - Sie sind schwer zu treffen und entziehen ihrem - Gegner Kraft und Leben. - With the help of dark rituals the - sorcerer summons demons from the Sphere of - Shadows. These fearsome creatures can walk - almost unseen among the living, but their dark - aura can be sensed by everyone. Shadowmasters - are feared in combat for they are hard to hit - and have the ability to drain strength and life - force from their victims. - - - 'Und so reibe das Blut eines wilden - Kämpfers in den Stahl der Klinge und beginne die - Anrufung der Sphären des Chaos. Und hast du - alles zu ihrem Wohlgefallen getan, so werden sie - einen niederen der ihren senden, das Schwert mit - seiner Macht zu beseelen...' - 'So take the blood of a fierce warrior - and apply it to the steel of the blade. Then - start calling the Spheres of Chaos. If you did - everything to their pleasure, they will send a - minor one of their kind to fulfill the sword - with his power.' - - - Einem erfahrenen Magier wird - irgendwann auf seinen Wanderungen ein - ungewöhnliches Exemplar einer Gattung begegnen, - welches sich dem Magier anschließen wird. - During their travel, seasoned - magicians will occasionally befriend an extraordinary - creature of an unusual species that will join them. - - - Durch das Opfern von 200 Bauern kann - der Chaosmagier ein Tor zur astralen Welt - öffnen. Das Tor kann in der Folgewoche verwendet - werden, es löst sich am Ende der Folgewoche auf. - By sacrificing the lives of 200 - peasants, the chaossorcerer is able to open a - planar gate. This gate can be used during the - following week to transfer units to the astral - plane. It dissipates at the end of the following - week. - - - Der Zauberer sendet dem Ziel des - Spruches einen Traum. - The mentalist sends a dream to the - target of the spell. - Le mentaliste envoie un rêve à la - cible du sort. - - - Dieser Zauber vermag dem Gegner ein - geringfügig versetztes Bild der eigenen Truppen - vorzuspiegeln. Die Schattenritter haben keinen - effektiven Angriff und Verwundungen im Kampf - zerstören sie sofort. - This spell creates illusionary - duplicates of allied troops. The shadow knights - can't do real damage and are instantly destroyed - if wounded. - Ce sort crée des copies illusoires de - troupes alliées. Les guerriers illusoires ne - peuvent faire de dégats réels et sont - instantanément détruits lorsqu'ils sont blessés. - - - Der Traumweber beschwört vor dem - Kampf grauenerregende Trugbilder herauf, die - viele Gegner in Panik versetzen. Die Betroffenen - werden versuchen, vor den Trugbildern zu - fliehen. - Before a battle the mentalist creates - terrifying illusions of hideous creatures that - will cause panic among the enemies. Those who - believe in the illusions will try to flee from - battle. - - - Dieses magische Ritual beruhigt die - gequälten Seelen der gewaltsam zu Tode - gekommenen und ermöglicht es ihnen so, ihre - letzte Reise in die Anderlande zu beginnen. Je - Stufe des Zaubers werden ungefähr 50 Seelen ihre - Ruhe finden. Der Zauber vermag nicht, bereits - wieder auferstandene lebende Tote zu erlösen, da - deren Bindung an diese Welt zu stark ist. - This ritual calms the tortured souls - of those who died a violent death and finally - releases them to the Otherlands. About 50 souls - per level of the spell will be released. The - spell will not affect existing undead, because - they are too strongly tied to the Material - World. - - - Mit Hilfe dieses Zaubers kann der - Traumweber die Illusion eines beliebigen - Gebäudes erzeugen. Die Illusion kann betreten - werden, ist aber ansonsten funktionslos und - benötigt auch keinen Unterhalt. Sie wird einige - Wochen bestehen bleiben. - With this spell the mentalist can - create the illusion of any building. The - illusion can be entered, but it has no function - and requires no maintenance. It will remain - existing for several weeks. - - - Mit Hilfe dieses Zaubers kann der - Traumweber eigene Aura im Verhältnis 2:1 auf - einen anderen Traumweber übertragen. - With the help of this spell the - mentalist can transfer aura at a ratio of 2:1 to - another mentalist. - - - Mit Hilfe dieses arkanen Rituals - vermag der Traumweber die wahre Gestalt einer - Gruppe - zu verschleiern. Unbedarften Beobachtern - erscheint - sie dann als einer anderen Rasse zugehörig. - With the help of this ritual the - mentalist is able to conceal the true form of a - target unit. To unknowing observers all persons - in the target unit appear to be of a different - race. - - - Dieser Zauber ermöglicht es dem - Traumweber, in die Träume einer Einheit - einzudringen und so einen Bericht über die - Umgebung zu erhalten. - This spell enables the mentalist to - penetrate the dreams of a target unit and gather - information about that unit's surroundings. He - will receive a report from the corresponding - region. - - - Dieser Kampfzauber führt dazu, dass - einige Gegner im Kampf unter schwerer Müdigkeit - leiden. Die Soldaten verschlafen manchmal ihren - Angriff und verteidigen sich schlechter. - This combat spell causes several - enemies to suffer from an unnatural tiredness - during combat. The soldiers will defend - themselves worse than normal and sometimes sink - into a slumber instead of attacking. - - - Stirbt ein Krieger im Kampf so macht - sich seine Seele auf die lange Wanderung zu den - Sternen. Mit Hilfe eines Rituals kann ein - Traumweber versuchen, die Seele wieder - einzufangen und in den Körper des Verstorbenen - zurückzubringen. Zwar heilt der Zauber keine - körperlichen Verwundungen, doch ein Behandelter - wird den Kampf überleben. - When a warrior dies in a battle, his - soul begins its long journey to the stars. With - the help of this ritual, the mentalist can try - to catch those escaping souls and bring them - back to their bodies. The spell does not heal - physical injuries, but an affected person will - survive the battle. - - - Dieser Zauber führt in der betroffenen - Region für einige Wochen zu Schlaflosigkeit und - Unruhe. Den Betroffenen fällt das Lernen - deutlich schwerer. - This spell causes insomnia and - restlessness in a whole region for several - weeks. All affected persons will learn much - slower than normal. - - - Dieser Zauber läßt einige feindliche - Kämpfer einschlafen. Schlafende Kämpfer greifen - nicht an und verteidigen sich schlechter, sie - wachen jedoch auf, sobald sie im Kampf getroffen - werden. - This spell causes several enemies to - fall asleep. Sleeping warriors don't attack and - defend themselves worse than normal, but they'll - wake up if they get hit during combat. - - - Mit diesem Zauber dringt der - Traumweber in die Gedanken und Traumwelt seines - Opfers ein und kann so seine intimsten - Geheimnisse ausspähen. Seine Fähigkeiten, seinen - Besitz und seine Parteizugehörigkeit wird nicht - länger ungewiss sein. - With this spell the mentalist - penetrates the thoughts and dreams of his victim - to reveal his most intimate secrets. The - target's faction, skills and possessions will no - longer be unknown. - - - Ein mit diesem Zauber belegtes Drachenauge, welches zum Abendmahle - verzehrt wird, erlaubt es dem Benutzer, in die Träume einer anderen - Person einzudringen und diese zu lesen. Lange Zeit wurde eine solche - Fähigkeit für nutzlos erachtet, bis die ehemalige waldelfische - Magistra für Kampfmagie, Liarana Sonnentau von der Akademie Thall, - eine besondere Anwendung vorstellte: Feldherren träumen vor großen - Kämpfen oft unruhig und verraten im Traum ihre Pläne. Dies kann dem - Anwender einen großen Vorteil im kommenden Kampf geben. Aber Vorsicht: - Die Interpretation von Träumen ist eine schwierige Angelegenheit. - An enchanted eye of a dragon gives the person who eats it for supper the - power to see - other people's dreams. For a long time this abillity was counted as - beeing - useless until - the former elfish mistress for theurgy of war, Liarana Sonnentau from - the - academy Thall, - presented a special appliance for this artefact: Before a battle - captains - often have an - uncomfortable sleep and betray their plans in their dreams. This might - give the user of - the artefact a small advantage in the upcoming battle, but be warned: - Interpreting dreams - is a difficult exercise. - - - Mit diesem Spruch kann der Zauberer eine Sphäre der - Unsichtbarkeit - erschaffen. Die Späre macht ihren Träger sowie neunundneunzig weitere - Personen in derselben Einheit unsichtbar. - Using this spell the magician can create a Sphere of - Invisibility. This artefact hides the person bearing it and one hundred - persons in the same unit. - - - Dieser Zauber ermöglicht es dem - Traumweber, den Schlaf aller aliierten Einheiten - in - der Region so zu beeinflussen, dass sie für - einige - Zeit einen Bonus in allen Talenten bekommen. - This spell allows the mentalist to - influence the sleep of all allied units in a - region - in such a way that they will gain a bonus to all - talents for some time. - - - Dieser Zauber ermöglicht es dem - Traumweber die natürlichen und aufgezwungenen - Traumbilder einer Person, eines Gebäudes, - Schiffes oder einer Region zu unterscheiden und - diese zu entwirren. - This spell allows the mentalist to - distinguish between the natural and unnatural - dreams of a person, a ship, a building or a - region and remove those that are of magical - origin. - - - Aus 'Die Gesänge der Alten' von - Firudin dem Weisen: 'Diese verführerische kleine Melodie - und einige einschmeichelnde Worte überwinden das - Misstrauen der Bauern im Nu. Begeistert werden sie sich - Euch anschliessen und selbst Haus und Hof in Stich - lassen.' - From the 'Songs of the Elder' by - Firudin the Sage: 'This enticing little melody and its - ingratiating words will lure the peasants in no time. - They will leave home and hearth to follow your lead.' - - - Dieser fröhliche Gesang wird sich wie - ein Gerücht in der Region ausbreiten und alle Welt in - Feierlaune versetzen. Überall werden Tavernen und - Theater gut gefüllt sein und selbst die Bettler satt - werden. - This joyous song will spread like - wildfire throughout the region and cause festive spirits - in all the population. All the taverns and theaters will - be packed to the brim and even the beggars will not go - hungry. - - - Mit diesem Zauber greift der Magier - direkt den Geist seiner Gegner an. Ein Schlag aus - astraler und elektrischer Energie trifft die Gegner, - wird die Magieresistenz durchbrochen, verliert ein Opfer - permanent einen Teil seiner Erinnerungen. Wird es zu oft - ein Opfer dieses Zaubers kann es daran sterben. - With this spell the mentalist directly - attacks his enemies' souls. A blast of astral and - electrical energy strikes the foes. If a victim fails to - resist the magic, he will permanently lose part of his - memories. Being the target of this spell for too many - times may result in death. - - - Dieser Zauber - dessen Anwendung in - den meisten Kulturen streng verboten ist - löst im Opfer - ein unkontrollierbares Verlangen nach körperlicher Liebe - aus. Die betroffenen Personen werden sich Hals über Kopf - in ein Liebesabenteuer stürzen, zu blind vor Verlangen, - um an etwas anderes zu denken. Meistens bereuen sie es - einige Wochen später... - This spell - whose use is forbidden in - most cultures - creates an uncontrollable desire for - physical love in the victim. The affected persons will - rush head over heels into a love affair, unable to think - of anything else. Most of them will regret this a few - months later... - - - - - - Winter - winter - - - Sommer - summer - - - Frühling - spring - - - Herbst - fall - - - die erste Woche - the first week - - - die zweite Woche - the second week - - - die letzte Woche - the last week - - - der ersten Woche - of the first week - - - der zweiten Woche - of the second week - - - der letzten Woche - of the third week - - - Feldsegen - harvest moon - - - Nebeltage - impenetrable fog - - - Sturmmond - storm moon - - - Herdfeuer - hearth fire - - - Eiswind - icewind - - - Schneebann - snowbane - - - Blütenregen - flowerrain - - - Mond der milden Winde - mild winds - - - Sonnenfeuer - sunfire - - - neuer Zeitrechnung - of the new age - - - des zweiten Zeitalters - the second age - - - des dritten Zeitalters - the third age - - - - - - Gemein - common - - - Kein Magiegebiet - no magic school yet - - - Illaun - Illaun - - - Tybied - Tybied - - - Gwyrrd - Gwyrrd - - - Cerddor - Cerddor - - - Draig - Draig - - - - - Mallornbaum - mallorn tree - - - Mallornbäume - mallorn trees - - - AUSSTOSSEN - KICK - - - NEU - NEW - - - KOMMANDO - COMMAND - - - VERLASSEN - LEAVE - - - BEITRETEN - JOIN - - - EINLADEN - INVITE - - - - Schößling - sapling - - - - Schößlinge - saplings - - - - Mallornschößling - mallorn sapling - - - - Mallornschößlinge - mallorn saplings - - - - Winter - winter - - - - Frühling - spring - - - - Sommer - summer - - - - Herbst - autumn - - - - Vorlage für den nächsten Zug: - Template for the next turn: - - - - Wir schreiben %s des Monats %s im Jahre %d %s. - It is %s of the month of %s in the %d. year of %s. - - - - Wir schreiben %s des Monats %s im Jahre %d %s. Es ist - %s. - It is %s of the month of %s in the %d. year of %s. It is - %s. - - - - aggressiv - aggressive - - - - vorne - front - - - - hinten - rear - - - - defensiv - defensive - - - - flieht - fleeing - - - - kämpft nicht - not fighting - - - - bekommt keine Hilfe - gets no aid - - - - Attacke gegen: - Attacked against - - - - Kämpft gegen: - Fighting against - - - - Hilft: - Helping - - - - Heer - army - - - - Unbekannte Partei - unknown faction - - - einer unbekannten Partei - an unknown faction - - - und - and - - - - Das Schiff des Elfen hat ein rotes Segel - - - - Der Zwerg hat eine Nuss dabei - - - - Die Katze führt eine Hellebarde - - - - Das Schiff mit dem grünen Segel liegt links neben dem - mit - einem weissen Segel - - - - Auf dem Schiff mit grünen Segeln kam der Speerkämpfer - - - - Der Krieger mit dem Kreis im Wappen hat einen Keks - - - - Der Krieger des mittleren Schiffs hat ein Schwert - - - - Auf dem gelben Segel prankt ein Kreuz als Wappen - - - - Der Mensch kam mit dem ersten Schiff - - - - Das Schiff mit dem Stern im Wappen liegt neben dem der - einen Mandelkern hat - - - - Das Schiff des Kriegers, der ein Apfel hat, liegt neben - dem, der ein Kreuz als Wappen hat - - - - Der Krieger mit dem Turm im Wappen trägt eine Axt - - - - Das Schiff des Menschen liegt neben dem blauen Schiff - - - - Das Insekt trägt einen Baum als Wappen - - - - Das Schiff mit dem Stern im Wappen liegt neben dem des - Kriegers, der einen Zweihänder führt - - - - Held - hero - - - - Helden - heroes - - - - - - Dunkel - dark - - - - Schwarz - black - - - - Licht - light - - - - Flammen - flame - - - - Eis - ice - - - - Klein - gully - - - - Hoch - high - - - - Hügel - hill - - - - Berg - mountain - - - - Wald - wood - - - - Sumpf - swamp - - - - Schnee - snow - - - - Sonnen - sun - - - - Mond - moon - - - - See - sea - - - - Tal - valley - - - - Schatten - shadow - - - - Höhlen - cave - - - - Blut - blood - - - - Wild - wild - - - - Chaos - chaos - - - - Nacht - night - - - - Nebel - mist - - - - Grau - grey - - - - Frost - cold - - - - Finster - gloom - - - - Düster - black - - - - Erz - arch - - - - Sternen - star - - - - - 'Ho ho ho!' Ein dicker Gnom fliegt auf einem von - 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner - Partei ein Sonnensegel. (Um das Segel einer Einheit zu geben, gib - ihr den Befehl 'BEANSPRUCHE 1 Sonnensegel'). - 'Ho ho ho!' A fat little gnome Gnom on a sled - pulled by 8 young dragons flies through the stary night and presents - your faction with a solar sail. (To claim this item, one of your units - must issue the order 'CLAIM 1 solar sail'. - - - - 'Ho ho ho!' Ein dicker Gnom fliegt auf einem von - 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner - Partei eine Phiole mit Sternenstaub. (Informationen dazu gibt es mit - BEANSPRUCHE und ZEIGE). - 'Ho ho ho!' A fat little gnome Gnom on a sled - pulled by 8 young dragons flies through the stary night and presents - your faction with a vial of stardust. (To get more information about - this item, use the CLAIM and SHOW commands). - - - - 'Ho ho ho!' Ein dicker Gnom fliegt auf einem von - 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner - Partei einen wundervoll geschmueckten Weihnachtsbaum. (Informationen dazu gibt es mit - BEANSPRUCHE und ZEIGE). - 'Ho ho ho!' A fat little gnome Gnom on a sled - pulled by 8 young dragons flies through the stary night and presents - your faction with a beautifully decorated tree. (To get more information about - this item, use the CLAIM and SHOW commands). - - - - Lerntrank - brain boost - - - - Lerntränke - brain boosts - - - - GE je - stone per - - - - GE je - stones per - - - - GE - stone - - - - GE - stones - - - - bewacht die Region - guards the region - - - - hungert - hungry - - - - Fernzauber - far - - - - Seezauber - sea - - - - Schiffszauber - ship - - - - Magier exklusiv - magicians only - - - - Keine - none - - - - Wir helfen - We are helping - - - - hilft - is helping - - - - Die Region wurde durchquert von - The region was crossed by - - - - durchgereist - travel - - - - benachbart - neighbour - - - - vom Turm erblickt - from lighthouse - - - - und - and - - - - Dorfbewohner - Villagers - - - - Bauernmob - Angry mob - - - - Aufgebrachte Bauern - Furious peasants - - - - Feuerdrache - fire dragon - - - - unbewaffnet - unarmed - - - - Trefferpunkte - hitpoints - - - - Rüstung - armor - - - - Angriff - attack - - - - Angriffe - attacks - - - - Verteidigung - defense - - - - Kann Waffen benutzen. - May use weapons. - - - - Ist durch Stichwaffen, Bögen und Armbrüste schwer zu verwunden. - Is hard to hit by piercing weapons. - - - - Ist durch Hiebwaffen schwer zu verwunden. - Is hard to hit by slashing weapons. - - - - Ist durch Schlagwaffen und Katapulte schwer zu verwunden. - Is hard to hit by blunt weapons and catapults. - - - - ein Angriff mit der Waffe oder unbewaffnet - an attack with a weapon or an unarmed attack - - - - ein unbewaffneter Angriff - an unarmed attack - - - - ein magischer Angriff - a magical attack - - - - Klon von %s - Clone of %s - - - - ein Angriff, der Gebäudeschaden verursacht - an attack causing structural damage to buildings - - - - Präkampfzauber - pre-combat spell - - - - Postkampfzauber - post-combat spell - - - - Kampfzauber - combat spell - - - - Normaler Zauber - regular spell - - - - Eigentümer - Owner - - - - - eine Straße - a road - - - - Straßen - roads - - - - Straße - road - - - - eine zu $percent% vollendete Straße - a road that is $percent% complete - - - - ein Straßenanschluß - a connection to another road - - - - eine unvollständige Straße - an incomplete road - - - - Wand - wall - - - - eine Wand - a wall - - - - Feuerwand - firewall - - - - eine Feuerwand - a firewall - - - - Nebelwand - wall of fog - - - - eine Nebelwand - a wall of fog - - - - Irrlichter - wisps - - - - eine Gruppe von Irrlichtern - a cloud of wisps - - - - gewaltiges offenes Tor - massive open door - - - - ein gewaltiges offenes Tor - a massive open door - - - - gewaltiges verschlossenes Tor - massive locked door - - - - ein gewaltiges verschlossenes Tor - a massive locked door - - - - Illusionswand - illusionary wall - - - - eine Illusionswand - an illusionary wall - - - - - - Einheit-Nr - unitid - - - - Schiff-Nr - shipid - - - - völker - tribes - - - - Gebäude-Nr - buildingid - - - - - Aura - aura - - - - Rasse - race - - - - Zauber-ID - spellid - - - - Richtung - direction - - - - Gebäudetyp - buildingtype - - - - - Groaamm... - - - Tschrrrk... - Tshrrrk... - - - Schhhhh... - Shhhhhh... - - - Roaarrr... - - - Chrrr... - - - - diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml deleted file mode 100644 index c4663d1b1..000000000 --- a/res/core/en/strings.xml +++ /dev/null @@ -1,1659 +0,0 @@ - - - - - - - - ADDRESSES - - - REPORT - - - BZIP2 - - - COMPUTER - - - DEBUG - - - ITEMPOOL - - - SCORE - - - SILVERPOOL - - - STATISTICS - - - EXPRESS - - - ZIPPED - - - TEMPLATE - - - SKILLCHANGES - - - - INFO - - - - - caravel - - - boat - - - longboat - - - dragonship - - - trireme - - - balloon - - - - - a caravel - - - a boat - - - a longboat - - - a balloon - - - a dragonship - - - a trireme - - - - - active volcano - - - corridor - - - desert - - - firewall - - - fog - - - forest - - - glacier - - - glacier - - - hallway - - - hell - - - highland - - - iceberg - - - maelstrom - - - mountain - - - ocean - - - plain - - - swamp - - - thick fog - - - volcano - - - magical storm - - - - the volcano of %s - - - a %s - - - the deserts of %s - - - a %s - - - fog_trail %s - - - the forests of %s - - - the glacier of %s - - - Wall - - - a solid wall - - - the %s - - - %s - - - the highlands of %s - - - a %s - - - the mountains of %s - - - the %s - - - the plain of %s - - - the swamps of %s - - - %s - - - the volcano of %s - - - a %s - - - - caldera - - - portal - - - - - NW - - - NE - - - East - - - SE - - - SW - - - West - - - - west - - - northwest - - - northeast - - - east - - - southwest - - - southeast - - - - an unknown unit - - - - Dispatches - - - Events - - - Warnings and Errors - - - Economy and Trade - - - Resources and Production - - - Magic and Artefacts - - - Movement and Travel - - - Learning and Teaching - - - Battles - - - Miscellaneous - - - New Spells - - - - - academy - - - blessed stonecircle - - - caravanserei - - - dam - - - structure - - - harbour - - - fairy castle - - - inn - - - lighthouse - - - mage tower - - - mine - - - monument - - - quarry - - - sawmill - - - smithy - - - stable - - - stonecircle - - - tunnel - - - - - foundation - - - tradepost - - - fortification - - - tower - - - castle - - - fortress - - - citadel - - - - - herb - - - vial - - - vials - - - - - silver - - - silver - - - hp - - - hps - - - aura - - - auras - - - permaura - - - permauras - - - peasant - - - peasants - - - - - almond - - - almonds - - - amulet - - - amulets - - - antimagic crystal - - - antimagic crystals - - - amulet of chastity - - - amulets of chastity - - - amulet of darkness - - - amulets of darkness - - - amulet of gathering - - - amulets of gathering - - - amulet of healing - - - amulets of healing - - - amulet of true seeing - - - amulets of true seeing - - - apple - - - apples - - - aurafocus - - - aurafocuses - - - axe - - - axes - - - bow - - - bows - - - cart - - - carts - - - catapult - - - catapults - - - chainmail - - - chainmails - - - cookie - - - cookies - - - crossbow - - - crossbows - - - dolphin - - - dolphins - - - dragonblood - - - dragonblood - - - dragonhead - - - dragonheads - - - dragonhoard - - - dreameye - - - dreameyes - - - elven horse - - - elven horses - - - eye of dragon - - - eye of dragons - - - fairy boots - - - fairy boots - - - flaming sword - - - flaming swords - - - elven bow - - - elven bows - - - claymore - - - claymores - - - halberd - - - halberds - - - healingpotion - - - healingpotions - - - herbbag - - - herbbags - - - horse - - - horses - - - iron - - - iron - - - laen - - - laen - - - laen chainmail - - - laen chainmails - - - laen shield - - - laen shields - - - laen sword - - - laen swords - - - lance - - - lances - - - wood - - - wood - - - magic bag - - - magic bags - - - bag of conservation - - - bags of conservation - - - mallorn - - - mallorn - - - mallorn bow - - - mallorn bows - - - mallorn crossbow - - - mallorn crossbows - - - mallorn lance - - - mallorn lances - - - mallorn spear - - - mallorn spear - - - silverbag - - - silverchest - - - returnticket for the grand museum - - - returntickets for the grand museum - - - ticket to the grand museum - - - tickets to the grand museum - - - nut - - - nuts - - - pegasus - - - pegasi - - - man - - - men - - - platemail - - - platemails - - - pangolin - - - pangolins - - - presspass - - - presspasses - - - ring of invisibility - - - rings of invisibility - - - ring of power - - - rings of power - - - ring of quick fingers - - - rings of quick fingers - - - ring of regeneration - - - rings of regeneration - - - runesword - - - runeswords - - - rustychainmail - - - rustychainmails - - - rusty shield - - - rusty shields - - - rusty sword - - - rusty swords - - - seaserpenthead - - - seaserpentheads - - - shield - - - shields - - - sack of holding - - - sacks of holding - - - spear - - - spears - - - stone - - - stones - - - sword - - - swords - - - pot of toadslime - - - pots of toadslime - - - trollbelt - - - trollbelts - - - unit - - - units - - - potion of skills - - - potions of skills - - - astralcrystal - - - astralcrystals - - - seed - - - seeds - - - mallorn seed - - - mallorn seeds - - - gingerbread heart - - - gingerbread hearts - - - - - balm - - - spice - - - gem - - - gems - - - myrrh - - - oil - - - silk - - - incense - - - balm - - - spice - - - myrrh - - - oil - - - silk - - - incense - - - - - Belt of Heroic Legends - - - Belts of Heroic Legends - - - - - flatroot - - - flatroots - - - tangy temerity - - - tangy temerities - - - owlsgaze - - - owlsgazes - - - spider ivy - - - spider ivies - - - cobalt fungus - - - cobalt fungi - - - elvendear - - - elvendears - - - bugleweed - - - bugleweeds - - - knotroot - - - knotroots - - - bubblemorel - - - bubblemorels - - - waterfinder - - - waterfinders - - - peyote - - - peyote - - - sand reeker - - - sand reekers - - - windbag - - - windbags - - - fjord fungus - - - fjord fungi - - - mandrake - - - mandrakes - - - rock weed - - - rock weed - - - gapgrowth - - - gapgrowths - - - cave lichen - - - cave lichen - - - ice begonia - - - ice begonias - - - white hemlock - - - white hemlocks - - - snowcrystal petal - - - snowcrystal petals - - - seven mile tea - - - seven mile teas - - - goliath water - - - goliath waters - - - water of life - - - waters of life - - - busybeer - - - busybeers - - - ointment - - - ointments - - - peasant blood - - - peasant bloods - - - brain wax - - - brain waxes - - - duncebun - - - duncebuns - - - potion of nest warmth - - - potions of nest warmth - - - horsepower potion - - - horsepower potions - - - berserkers blood potion - - - berserkers blood potions - - - peasant love potion - - - peasant love potion - - - potion of truth - - - potions of truth - - - elixir of power - - - elixirs of power - - - healing potion - - - healing potions - - - - - AGGRESSIVE - - - ALL - - - EACH - - - NUMBER - - - AURA - - - TREES - - - PEASANTS - - - ALLIANCE - - - GUARD - - - CASTLE - - - DEFENSIVE - - - UNIT - - - GROUP - - - LOCALE - - - ERESSEA - - - FLEE - - - FOREIGN - - - BUILDING - - - ITEMS - - - GIVE - - - HELP - - - REAR - - - AFTER - - - CONTROL - - - HERBS - - - COMBAT - - - NOT - - - NEXT - - - FACTION - - - FACTIONSTEALTH - - - PAUSE - - - MEN - - - PRIVATE - - - REGION - - - SHIP - - - SILVER - - - ROADS - - - LEVEL - - - TEMPORARY - - - POTIONS - - - BEFORE - - - FRONT - - - SPELLS - - - - - alchemy - - - armoursmithing - - - bow - - - masonry - - - cartmaking - - - catapult - - - crossbow - - - entertainment - - - espionage - - - forestry - - - herbalism - - - magic - - - melee - - - mining - - - perception - - - polearm - - - quarrying - - - riding - - - roadwork - - - sailing - - - shipcraft - - - endurance - - - stealth - - - tactics - - - taxation - - - trade - - - taming - - - unarmed combat - - - weaponsmithing - - - - - - - // - - - WORK - - - ATTACK - - - BANNER - - - STEAL - - - BESIEGE - - - NAME - - - USE - - - DESCRIBE - - - ENTER - - - GIVE - - - GUARD - - - BID - - - MESSAGE - - - DEFAULT - - - EMAIL - - - END - - - RIDE - - - FOLLOW - - - RESEARCH - - - GROUP - - - HELP - - - COMBATSPELL - - - BUY - - - CONTACT - - - COMBAT - - - TEACH - - - LEARN - - - LOCALE - - - MAKE - - - MAKETEMP - - - MOVE - - - ALLIANCE - - - NUMBER - - - OPTION - - - PASSWORD - - - PAY - - - PIRACY - - - PREFIX - - - CLAIM - - - RECRUIT - - - REPORT - - - RESERVE - - - ROUTE - - - SABOTAGE - - - SORT - - - SPY - - - QUIT - - - HIDE - - - CARRY - - - TAX - - - ENTERTAIN - - - ORIGIN - - - FORGET - - - SELL - - - LEAVE - - - CAST - - - SHOW - - - DESTROY - - - loot - - - - - - Options - - - Level - - - Political Status - - - Herbs required - - - under construction - - - damage - - - Your faction has been eliminated. We hope that you had a good time, and if you liked the game, you should sign up and play again. - - - - skills - - - has - - - size - - - spells - - - combat spells - - - none - - - Addresses - - - anonymous - - - attack - - - defense - - - armour - - - damage - - - - - wand - - - wands - - - - - - northwest coast - - - northeast coast - - - east coast - - - southeast coast - - - southwest coast - - - west coast - - - - - - Mistelzweig - mistletoe - - - Mistelzweige - mistletoes - - - diff --git a/res/core/fr/strings.xml b/res/core/fr/strings.xml deleted file mode 100644 index 1c9c524f4..000000000 --- a/res/core/fr/strings.xml +++ /dev/null @@ -1,2036 +0,0 @@ - - - - - - PASSAGE - - - XEPOTION - - - XEBALLON - - - XELAEN - - - GUERRE - - - PAIX - - - XONTORMIA - - - ALLIANCE - - - ADRESSES - - - RAPPORT - - - BZIP2 - - - ORDINATEUR - - - DEBOGUER - - - RESSOURCES COMMUNES - - - SCORE - - - ARGENT COMMUN - - - STATISTIQUES - - - EXPRESS - - - ZIPPE - - - MODELE - - - MODIFICATIONS - - - - INFO - - - - - nef - - - chaloupe - - - barge - - - drakkar - - - galčre - - - ballon - - - - - une nef - - - une chaloupe - - - une barge - - - un ballon - - - un drakkar - - - une galčre - - - - - volcan actif - - - couloir - - - désert - - - mur de feu - - - brume - - - foręt - - - glacier - - - vestibule - - - l'enfer - - - colline - - - iceberg - - - maelström - - - montagne - - - océan - - - plaine - - - marais - - - brouillard - - - volcan - - - tempęte magique - - - - le volcan %s - - - un %s - - - le désert de %s - - - un %s - - - fog_trail %s - - - la foręt de %s - - - le glacier de %s - - - le %s - - - %s - - - les collines de %s - - - un %s - - - un %s - - - les montagnes de %s - - - l'%s - - - la plaine de %s - - - les marais de %s - - - %s - - - le volcan de %s - - - une %s - - - - caldera - - - portail - - - - - NO - - - NE - - - Est - - - SE - - - SO - - - Ouest - - - - ouest - - - nord-ouest - - - nord-est - - - est - - - sud-ouest - - - sud-est - - - - une unité inconnue - - - - Messages et Evénements - - - Avertissements et Erreurs - - - Economie et Commerce - - - Ressources et Production - - - Magie et Reliques - - - Déplacements et Voyages - - - Apprentissage et Enseignement - - - Batailles - - - Divers - - - Nouveaux Sorts - - - - - université - - - cromlech sacré - - - caravansérail - - - barrage - - - bâtiment - - - port - - - château illusoire - - - auberge - - - phare - - - donjon - - - mine - - - monument - - - carričre - - - scierie - - - forge - - - écurie - - - cromlech - - - tunnel - - - - - palissade - - - comptoir - - - rempart - - - tour - - - château - - - place-forte - - - citadelle - - - - - plante - - - fiole - - - fioles - - - - - écu - - - écus - - - point de vie - - - points de vie - - - aura - - - aura - - - aura permanente - - - aura permanente - - - paysan - - - paysans - - - - - amande - - - amandes - - - amulette - - - amulettes - - - cristal antimagie - - - cristaux antimagie - - - amulette de chasteté - - - amulettes de chasteté - - - amulette de ténčbres - - - amulettes de ténčbres - - - amulette de rassemblement - - - amulettes de rassemblement - - - amulette de soin - - - amulettes de soin - - - amulette de vérité - - - amulettes de vérité - - - pomme - - - pommes - - - focus - - - foci - - - hache - - - haches - - - arc - - - arcs - - - chariot - - - chariots - - - catapulte - - - catapultes - - - cotte de mailles - - - cottes de mailles - - - gâteau - - - gâteaux - - - arbalčte - - - arbalčtes - - - dauphin - - - dauphins - - - sang de dragon - - - sang de dragon - - - tęte de dragon - - - tętes de dragons - - - trésor de dragon - - - oniroeil - - - oniryeux - - - cheval elfique - - - chevaux elfiques - - - oeil de dragon - - - yeux de dragon - - - bottes elfiques - - - bottes elfiques - - - épée ardente - - - épées ardentes - - - grand arc - - - grands arcs - - - claymore - - - claymores - - - halebarde - - - halebardes - - - potion de soin - - - potions de soin - - - sac de plantes - - - sacs de plantes - - - cheval - - - chevaux - - - lingot - - - lingots - - - laen - - - laen - - - cotte en laen - - - cottes en laen - - - bouclier en laen - - - boucliers en laen - - - épée en laen - - - épées en laen - - - lance - - - lances - - - stčre - - - stčres - - - sac magique - - - sacs magiques - - - sac de conservation - - - sacs de conservation - - - mallorn - - - mallorn - - - arc en mallorn - - - arcs en mallorn - - - arbalčte en mallorn - - - arbalčtes en mallorn - - - lance en mallorn - - - lances en mallorn - - - épieu en mallorn - - - épieux en mallorn - - - bourse - - - cassette - - - returnticket for the grand museum - - - returntickets for the grand museum - - - ticket to the grand museum - - - tickets to the grand museum - - - noix - - - noix - - - pégase - - - pégases - - - homme - - - hommes - - - armure de plates - - - armures de plates - - - carte de presse - - - cartes de presse - - - anneau d'invisibilité - - - anneaux d'invisibilité - - - anneau de pouvoir - - - anneaux de pouvoir - - - anneau de dextérité - - - anneaux de dextérité - - - anneau de régénération - - - anneaux de régénération - - - épée runique - - - épées runiques - - - cotte de mailles rouillée - - - cottes de mailles rouillées - - - bouclier rouillé - - - boucliers rouillés - - - épée rouillée - - - épées rouillées - - - tęte de serpent de mer - - - tętes de serpents de mer - - - bouclier - - - boucliers - - - sac de contenance - - - sacs de contenance - - - épieu - - - épieux - - - pierre - - - pierres - - - épée - - - épées - - - pot de bave de crapaud - - - pots de bave de crapaud - - - ceinture de troll - - - ceintures de trolls - - - unité - - - unités - - - potion de compétences - - - potions de compétences - - - cristal astral - - - cristaux astraux - - - graine - - - graines - - - graine de mallorn - - - graines de mallorn - - - coeur de pain d'épices - - - coeurs de pain d'épices - - - - - baume - - - épices - - - joyau - - - joyaux - - - myrrhe - - - huile - - - soie - - - encens - - - baume - - - épices - - - myrrhe - - - huile - - - soie - - - encens - - - - - Ceinture des Légendes - - - Ceintures des Légendes - - - - - astragale - - - astragales - - - méritoine - - - méritoines - - - oeil de hibou - - - yeux de hibou - - - soie d'araignée - - - soies d'araignée - - - obbadion - - - obbadions - - - cheveux d'elfe - - - cheveux d'elfe - - - ortigal - - - ortigals - - - tubercule de respiplante - - - tubercules de respiplante - - - oreille de morille - - - oreilles de morille - - - hydropousse - - - hydropousses - - - ossiphage - - - ossiphages - - - fleur de souffre - - - fleurs de souffre - - - feuille de Tshaď - - - feuilles de Tshaď - - - bélidane - - - bélidanes - - - racine de mandragore - - - racines de mandragore - - - percepierre - - - percepierres - - - tanemiel - - - tanemiels - - - boralme - - - boralmes - - - ficoďde ŕ cristaux - - - ficoďdes ŕ cristaux - - - blémissure - - - blémissures - - - rose des neiges - - - roses des neiges - - - thé de sept lieues - - - thé de sept lieues - - - breuvage de Goliath - - - breuvage de Goliath - - - élixir de vie - - - élixir de vie - - - vin du travail acharné - - - vin du travail acharné - - - onguent de soin - - - onguents de soin - - - fiole d'essence vitale - - - fioles d'essence vitale - - - huile de cogitation - - - huile de cogitation - - - petit pain rance - - - petits pains rances - - - extrait de canicule - - - extraits de canicule - - - fourrage de l'étalon - - - fourrage de l'étalon - - - vin de folie - - - vin de folie - - - philtre d'amour - - - philtres d'amour - - - sirop de claivoyance - - - sirops de claivoyance - - - elixir d'endurance - - - elixir d'endurance - - - potion de survie - - - potions de survie - - - - - AGRESSIF - - - TOUT - - - NOMBRE - - - AURA - - - ARBRES - - - PAYSANS - - - SOUTIEN - - - GUARDE - - - CHATEAU - - - DEFENSIF - - - UNITE - - - ERESSEA - - - FUITE - - - ETRANGER - - - BATIMENT - - - OBJETS - - - DONNER - - - AIDE - - - DERRIERE - - - APRES - - - CONTROLE - - - PLANTES - - - COMBAT - - - NON - - - SUIVANT - - - FACTION - - - CAMOUFLAGE - - - PAUSE - - - HOMMES - - - PRIVE - - - REGION - - - BATEAU - - - ECUS - - - ROUTES - - - NIVEAU - - - TEMPORAIRE - - - POTIONS - - - AVANT - - - DEVANT - - - SORTS - - - - - alchimie - - - armurier - - - arc - - - maçon - - - charron - - - catapulte - - - arbalčte - - - divertissement - - - espionnage - - - bucheron - - - herboriste - - - magie - - - męlée - - - mineur - - - observation - - - hast - - - perrayeur - - - équitation - - - cantonnier - - - navigation - - - charpentier - - - endurance - - - discrétion - - - tactique - - - percepteur - - - commerce - - - dresseur - - - mains-nues - - - fourbisseur - - - - - - - // - - - TRAVAILLER - - - ATTAQUER - - - ANNONCE - - - VOLER - - - ASSIEGER - - - NOMMER - - - UTILISER - - - DECRIRE - - - ENTRER - - - DONNER - - - GUARDER - - - MESSAGE - - - DEFAUT - - - EMAIL - - - FIN - - - CHEVAUCHER - - - SUIVRE - - - CHERCHER - - - GROUPER - - - AIDER - - - PREPARER - - - ACHETER - - - CONTACTER - - - COMBATTRE - - - ENSEIGNER - - - APPRENDRE - - - FOURNIR - - - LOCAL - - - FAIRE - - - ALLER - - - NOMBRE - - - OPTION - - - PASSWORD - - - PLANTER - - - PIRATERIE - - - PREFIXE - - - RECRUTER - - - RAPPORT - - - RESERVER - - - TRAJET - - - SABOTER - - - TRIER - - - ESPIONNER - - - ABANDONNER - - - CACHER - - - TRANSPORTER - - - TAXER - - - DIVERTIR - - - ORIGINE - - - OUBLIER - - - VENDRE - - - SORTIR - - - INCANTER - - - MONTRER - - - DETRUIRE - - - ACCROITRE - - - - - - sangsunicornes - - - sangsunicorne - - - cauchemars - - - cauchemar - - - ombreillards - - - ombreillard - - - draco tenebrae - - - draco tenebrae - - - nains - - - nain - - - elfes - - - elfe - - - orques - - - orque - - - snotlings - - - snotling - - - gobelins - - - gobelin - - - humains - - - humain - - - trolls - - - troll - - - démons - - - démons - - - insectes - - - insecte - - - hobbits - - - hobbit - - - chats - - - chat - - - atlantes - - - atlante - - - morts-vivants - - - mort-vivant - - - illusions - - - illusion - - - dragonnets - - - dragonnet - - - dragons - - - dragon - - - wyrms - - - wyrm - - - ents - - - ent - - - dragons-chats - - - dragon-chat - - - draconiens - - - draconien - - - spéciaux - - - spécial - - - enchantements - - - enchantement - - - golems de fer - - - golem de fer - - - golems de pierre - - - golem de pierre - - - ombres - - - ombre - - - lémures - - - lémure - - - yétis - - - yéti - - - quauquemaires - - - quauquemaire - - - crapauds - - - crapaud - - - céphalophages - - - céphalophage - - - paysans - - - paysan - - - wargs - - - warg - - - lynx - - - lynx - - - vers des profondeurs - - - ver des profondeurs - - - rats - - - rat - - - dragons chinois - - - dragon chinois - - - loups - - - loup - - - fantômes - - - fantôme - - - chats des ręves - - - chat des ręves - - - chats de l'Enfer - - - chat de l'Enfer - - - tigres - - - tigre - - - dauphins - - - dauphin - - - tortues géantes - - - tortue géante - - - krakens - - - kraken - - - serpents de mer - - - serpent de mer - - - guerriers illusoires - - - guerrier illusoire - - - diablotins - - - diablotin - - - nymphes - - - nymphe - - - licornes - - - licorne - - - hiboux - - - hibou - - - fées - - - fée - - - aigles - - - aigle - - - squelettes - - - squelette - - - liches - - - liche - - - zombies - - - zombie - - - zombies juju - - - zombie juju - - - goules - - - goule - - - spectres - - - spectre - - - fantômes du musée - - - fantôme du musée - - - gnomes - - - gnome - - - modčles - - - modčle - - - métamorphes - - - métamorphe - - - - - - Options - - - Niveau - - - Statut Politique - - - Plantes nécessaires - - - en construction - - - de dégâts - - - Votre faction a été éliminée. Nous espérons que vous vous ętes bien amusé malgré tout, et vous encourageons ŕ vous réincrire pour une nouvelle partie. - - - - compétences - - - possessions - - - taille - - - sorts - - - sorts de combat - - - aucun - - - Adresses - - - anonyme - - - attaque - - - défense - - - armure - - - dégâts - - - - - baguette - - - baguettes - - - - - - côte nord-ouest - - - côte nord-est - - - côte est - - - côte sud-est - - - côte sud-ouest - - - côte ouest - - - diff --git a/res/e3a/shipnames.xml b/res/e3a/shipnames.xml deleted file mode 100644 index 6d5c46b05..000000000 --- a/res/e3a/shipnames.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - ein Einbaum - a canoe - - - ein Floß - a raft - - - ein Kutter - a cutter - - - eine Barke - a barge - - - - eine Königsbarke - a royal barge - - - ein Katamaran - a catamaran - - - - eine Kogge - a cog - - - eine Karavelle - a caravel - - - - eine Fregatte - a frigate - - - eine Galeone - a galleon - - - - ein Drachenschiff - a dragonship - - - eine Trireme - a trireme - - - - Einbaum - canoe - - - Floß - raft - - - Kutter - cutter - - - Barke - barge - - - - Königsbarke - royal barge - - - Katamaran - catamaran - - - - Kogge - cog - - - Karavelle - caravel - - - - Fregatte - frigate - - - Galeone - galleon - - - - Drachenschiff - dragonship - - - Trireme - trireme - - - diff --git a/res/e3a/strings.xml b/res/e3a/strings.xml deleted file mode 100644 index f3d91e952..000000000 --- a/res/e3a/strings.xml +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - Adamantium - adamantium - - - Adamantium - adamantium - - - Adamantium - adamantium - - - - Adamantiumaxt - adamantium axe - - - Adamantiumäxte - adamantium axes - - - - Adamantiumrüstung - adamantium plate - - - Adamantiumrüstungen - adamantium plates - - - - Packeis - fast ice - - - %s - %s - - - - Urkunden - Certificates - - - Nußhälften - nut halves - - - Flaschengeister - bottle demons - - - Pandoras Urkunde für Halbling ehrenhalber, weiblich - Pandora's Certificate - - - Heilige Nußhälfte - piece of a holy nut - - - Flaschengeist Zhardamon - bottle demon Zhardamon - - - - Repetierarmbrust - repeating crossbow - - - Repetierarmbrüste - repeating crossbows - - - - - Gerüst - scaffolding - - - Wachstube - guard house - - - Wachturm - guard tower - - - Wache - watch - - - - Marktplatz - marketplace - - - - - aufständische - rebellious - - - wütende - mad - - - zornige - angry - - - unruhige - agitated - - - gleichgültige - indifferent - - - entspannte - relaxed - - - zufriedene - content - - - glückliche - happy - - - treue - loyal - - - ergebene - devoted - - - unterwürfige - subservient - - - - Streitross - charger - - - Streitrösser - chargers - - - Turmschild - tower shield - - - Turmschilde - tower shields - - - - - Braue Siebenmeilentee - brew seven mile tea - - - Braue Wasser des Lebens - brew water of life - - - Braue Schaffenstrunk - brew busy beer - - - Braue Wundsalbe - brew ointment - - - Braue Bauernblut - brew peasant blood - - - Braue Pferdeglück - brew horsepower potion - - - Braue Elixier der Macht - brew elixir of power - - - Braue Heiltrank - brew healing potion - - - - - - Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Zeit vor den Blicken anderer verschleiern. Der Zauber schützt nicht vor Dieben und Spionen. - This spell will hide the whole equipment of a target unit from the looks of others. It will not protect against thieves or spies. - - - Durch dieses uralte Tanzritual ruft der Zauberkundige die Kräfte des Lebens und der Fruchtbarkeit an. Die darauf folgenden Regenfälle begünstigen das Wachstum und erhöhen die Ernteerträge einiger Bauern der Region bis der Regen wieder nachlässt. - This ancient rite calls upon the forces of life and fertility. For the next few weeks, the peasants' harvest will be extraordinary good. - - - Für dieses Ernteritual sendet der Druide seine arkane Energie entlang der astralen Kraftlinien der gesamten Umgebung, um selbst weit entfernte Naturgeister zu erreichen. Die Beschwörung dieser Naturgeister ist eine hohe Kunst, die höchste Konzentration und vor allem viel Erfahrung erfordert. Die Bauern werden nach und nach von den besseren Ernten profitieren und ihre Ersparnisse steigern können. - This ritual not only increases the output of the local farms. Activating the astral ley lines, the druid is capable of activating even the nature spirits far away. Peasants' harvest in the affected regions will be extraordinarily good for a few weeks. - - - In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll: niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 25 Silber pro Stufe ein. - In the dark alleys you can find those who sell curses and hexes on demand -- but you can buy the apropriate counterspells from the followers of Draig as well. May it be a love spell for the son of a neighbour or a wart in the face of a rival. For offering these services, the sorcerer charges 25 silver pieces per level. - - - Niemand kann so gut die Träume deuten wie ein Magier des Illaun. Auch die Kunst der Wahrsagerei, des Kartenlegens und des Handlesens sind ihm geläufig. Dafür zahlen ihm die Bauern 25 Silber pro Stufe. - No one can read dreams as well as the mages of Illaun. Furthermore, they are also familiar with all other common means of foretelling the future like crystal balls, tarot cards or palms. A mentalist can earn 25 silver pieces per level and week for offering these services to peasants. - - - Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat -- nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 25 Silber pro Stufe lassen sich so in einer Woche verdienen. - If the local alchemist could not help you, you should visit a scholar of Tybied. His potions and tinctures may help when nothing else does. If the cryptic formula under the wooden shoes of the unfaithful husband really helped? - Well, the peasant, who isn't capable of reading, will never know. At least it helped the magician... to fill his purse. In one week he can earn 25 silver per level that way. - - - Cerddormagier sind _die_ Gaukler unter den Magiern; sie lieben es, das Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen die kleinen Kunststücke und magischen Tricks, mit denen man das Volk locken und verführen kann, den Geldbeutel ganz weit zu öffnen, und am Ende der Woche wird der Gaukler 25 Silber pro Stufe verdient haben. - The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 25 silver per level. - - - Die Fähigkeiten der Gwyrrd-Magier in der Viehzucht und Heilung sind bei den Bauern sehr begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr gefragt. Manch einer mag auch sein Talent dazu nutzen, ein Tier für einen besseren Preis zu verkaufen. Pro Stufe kann der Magier so 25 Silber verdienen. - The abilities of the mages of Gwyrrd concerning the breeding and healing of cattle are highly appreciated among the peasants. Especially at the markets their services are demanded frequently. Some of them also use their talents to sell an animal at a higher price. A magician can earn 25 silver pieces per level in this way. - - - Time is one of the first mysteries every magician tries to solve. If they succeed, they can focus all their energies on their magical studies as the ways between dormatory, library and magician tower now pass much faster. To keep their heart in tune the magicians use a special self-made tea. Some mages even share it with up to 10 people - Die Zeit ist eines der ersten Geheimnisse, die jeder Magier zu erkunden versucht. Gelingt ihm dies, kann er alle seine Energie auf das Studium der Magie verwenden; die Wege zwischen Dormitorium, Bibliothek und Magierturm schafft er nun viel schneller. Um sein Herz im Takt zu halten, verwendet er einen speziellen selbstgemachten Tee. Manche Magier teilen diesen Tee mit bis zu 10 Personen. - - - One of the most strange spells enables the magician to withdraw a little life energy from their surroundings to produce the so called water of life. The juice of some selected herbs is used to conserve the energies of life. As the magician is protected by his magical abilities, he is the only one who can touch the juice without taking damage. This is necessary because the juice must be carried around from place to place to avoid damaging one region by taking too much energy at once. - In einem der seltsamsten Zauber kann der Magier seiner Umgebung ein klein wenig der Lebensenergie entziehen um das sogenannte Wasser des Lebens herstellen. Als Basis dient ihm hierbei der Saft aus einigen ausgesuchten Kräutern, welcher die Lebensenergie speichern kann. Da der Magier aufgrund seiner magischen Fähigkeiten immun ist, ist er der einzige, der den Saft berühren kann, ohne Schaden zu nehmen. Sodann muss er diesen eine Woche lang von Ort zu Ort tragen, damit er sich mit Lebensenergie vollsaugt, ohne einem einzelnen Ort soviel zu entfernen, dass er Schaden nimmt. - - - Busybeer is another application for the knowledge about time a magician accumulates. Even though manual labour is only seldom done by mages, they still show interest in increasing the efficiency of their minions that do this work for them. Mornac the Wise was the first to discover how to produce a potion that would enable 10 minions to do the work of 20, thus freeing the other 10 for different experiments. - Ein weiteres Anwendungsgebiet des Wissens über die Zeit, welches ein Magier ansammelt, stellt der Schaffenstrunk dar. Auch wenn körperliche Arbeiten eher selten von Magiern ausgeführt werden, so haben diese doch ein Interesse daran, die Effizienz ihrer Untergebenen bei solchen Arbeiten zu steigern. Mornac der Weise war der erste, der entdeckte, dass man einen Trunk herstellen kann, durch den 10 Untergebene die Arbeit von 20 erledigen, wodurch der Rest für andere Experimente eingesetzt werden kann. - - - In the aftermath of battle it is vital to heal your own troops. This can be done by a healer as well as by a magician. In contrast to a healer, the magician can fullfill this treatment already before the battle by binding magical powers into a potent salve. This salve can be stored and only needs to be applied to the wounds after the battle. - Nach einem harten Kampf sollte man sich heilen lassen. Diese Möglichkeit bietet der Magier ebenso wie der Heiler. Im Gegensatz zum Heiler ist der Magier jedoch in der Lage, seine Behandlung bereits vor dem Kampf durchzuführen, indem er seine Heilkräfte in eine magische Salbe bindet, welche gelagert werden kann und nach dem Kampf nur aufgetragen werden muss. - - - One of the most dangerous and best guarded secrets of all mages is the knowledge about the power of death. Even though most of them would not openly admit it, and it is at least partially forbidden in most countries, each of them studies death sooner or later. When they do, they quickly find out that there is another plane of existance: the home of the demons. Only blood can quelch the thirst of those, when they switch from their home to our world. But experienced mages will find out that the demons bloodwine can be deluted when appropiate herbs are included, making it enough for 100 instead of 10 demons. As the demons may not know about that, the magician has to secretly sacrifice one of his freed minions. - Zu dem gefährlichsten und geheimsten Wissen der Magier zählt das Wissen über die Macht des Todes. Auch wenn die meisten es nicht zugeben, so fasziniert dieses Thema jeden Magier. Früher oder später beschäftigen sich alle mit diesem teilweise verbotenen Gebiet. Sodann werden sie feststellen, dass es noch eine weitere Ebene der Existenz gibt, in der die Dämonen beheimatet sind. Nur Blut allein vermag den Hunger dieser Wesen zu befriedigen, wenn sie ihre Ebene verlassen und unsere betreten. Erfahrene Magier werden jedoch feststellen, dass man den Blutwein, den die Dämonen zu sich nehmen, strecken kann, so dass davon 100 anstatt nur 10 Dämonen satt werden. Da die Dämonen davon jedoch nichts wissen dürfen, muss der Magier selbst klammheimlich einen seiner urplötzlich verfügbar gewordenen Untergebenen opfern. - - - Even though mages live in strict celibacy, they know a lot about creating certain longings. Peasants keep asking them for this love potion or that. But the penality for bewitching a peasant is death, so the mages offer their services only to farmers for their breeding stock. In an elaborate ritual, which only serves to hide the simplicity of the procedure, the magician draws the fluids from certains plants. While doing so he calls upon the spirits of fertility, which of course only listen when he talkes to them. Now the farmer knows that any attempt to draw the fluids himself will only result in a useless waste of resources. Finally, the magician hands the vial with the fluids to the farmer, who pours it into his horses' drinking water. - Obwohl für Magier das Gebiet der Liebe tabu ist und sie im strengen Zölibat leben, haben sie ein großes Wissen darüber, wie man gewisse Bedürfnisse weckt, weshalb sie immer wieder von Dorfbewohnerinnen und Dorfbewohnern nach entsprechenden Zaubern gefragt werden. Da die Verzauberung eines Bewohners jedoch streng verboten ist, bieten sie ihre Dienste nur für die Züchter an. In einem aufwendigen Ritual, welches jedoch nur dazu dient zu verschleiern, wie einfach dies eigentlich ist, vermischt der Magier vor den Augen des Züchters einige Pflanzensäfte. Dabei ruft er die Geister an, die dem Pferdezüchter das Glück bescheren sollen, um klarzumachen, das diese nur mit ihm sprechen und jeglicher Versuch des Züchters, selbst die Kräuter zu mischen, nur eine unbrauchbare Pampe produzieren würde. Anschließend überreicht der Magier dem Züchter eine Phiole, die dieser in die Tränke seiner Pferde entleeren muss. - - - Just like with the knowledge about death, the peasants feel uncomfortable with the knowledge about monsters. A few warriors though, who have already faced these creatures in combat, found that the monsters blood had an invigourating effect on them. There is talk about some warriors who bathed in the blood of the slain monsters to take up their strength. But this effect ends soon, and only occurs with fresh blood. As no one has time to quickly slay a wyrm before attacking their neighbors, a way had to be found to make the effect last longer. After lots of experiments that cost the life of lots of good warriors who had to constantly bring in fresh dragon blood, Manasouf the black finally found a way. Originally a closely guarded secret, the recipe is now known in all lands. First, the hardened dragon blood needs to be melted in hot tin. After that, the magician binds the spirit of the dragon to its blood once again. It can not find eternal rest until the last bit of blood has been used. - Ebenso wie das Wissen über den Tod ist das Wissen über gewisse Monster bei der abergläubigen Bevölkerung nicht gerne gesehen. Einige wenige Krieger jedoch, die diesen Kreaturen schon mal im Kampf gegenüberstanden, haben entdeckt, dass deren Blut eine belebende Wirkung auf sie hatte. So soll es schon Krieger gegeben haben, die im Blut der erschlagenen Monster badeten, um deren Stärke in sich aufzunehmen. Diese Wirkung verfliegt jedoch rasch und wirkt nur bei frischen Blut. Da niemand vor dem Kampf gegen seinen Nachbarn die Zeit hat, schnell noch einen Wyrm zu erschlagen, musste ein Weg gefunden werden, die Wirkung haltbar zu machen. Manasouf dem Schwarzen gelang dies nach zahlreichen Experimenten, die das Leben vieler guter Männer kosteten, welche ständig neues Drachenblut für seine Versuche beschaffen mussten. Ursprünglich ein streng gehütetes Geheimnis ist das Rezept inzwischen im ganzen Land bekannt. Zunächst muss geronnenes Drachenblut in heißem Zinn verflüssigt werden. Anschließend wird der Geist des erschlagenen Drachen in der Geisterebene wieder an sein Blut gebunden und kann so lange nicht in Frieden ruhen, bis das letzte bisschen seines Blutes verbraucht wurde. - - - Some mages research death's secrets until they can bring the dead back to life. But those who are brought back are often only shadows of ther former self and turn against their erstwhile friends. But those mages that study life and its iteraction with death find a possibility to bring the deceased back as their original selves. A drawback is that this is only possible in the very first minutes after death. As even mages can not be everywhere at the same time, a way had to be found to give this ability to helpers. All healers who tried to learn this from the mages failed, though, until one of those healers was backstabbingly killed. In the moment of his death he used the knowledge gained and was able to have his murderer executed the following day. The potion he designed has to be blessed by a magician before usage at any given time. This potion gives four people (or one person four times) a 50% chance to survive an otherwise deadly wound. It is used automatically by the victom. - Manche Magier erforschen den Tod, bis sie Verstorbene wieder ins Leben zurück bringen können. Diese sind jedoch meist bösartig und nur noch Schatten ihres früheren Selbst. Diejenigen jedoch, die sich intensiv mit dem Leben und seiner Kombination mit dem Tod beschäftigen, finden eine Möglichkeit, Verstorbene in ihrer wahren Gestalt zurück zu rufen. Dies ist allerdings nur wenige Minuten nach dem Tod möglich. Da selbst Magier nicht überall gleichzeitig sein können, musste ein Weg gefunden werden, diese Fähigkeit auf andere zu übertragen. Alle Versuche, dies Feldschern beizubringen, scheiterten jedoch, bis einer dieser Feldscher von einem Widersacher hinterrücks ermordet wurde. Im Moment seines Todes wandte er sein erworbenes Wissen an und konnte tags darauf den Übeltäter wegen Mordes hinrichten lassen. Der von ihm entwickelte magische Trank muss jedoch von einem der Magie des Lebens Kundigen gesegnet werden, um seine volle Wirkung zu entfalten. Ein solcher Trank gibt vier Männern (oder einem Mann viermal) im Kampf eine Chance von 50%, sonst tödliche Wunden zu überleben. Der Trank wird von ihnen automatisch bei Verletzung angewandt. - - - - - - Vertrauten binden - Bind Familiar - - - - - Einem erfahrenen Magier wird irgendwann auf seinen Wanderungen ein ungewöhnliches Exemplar einer Gattung begegnen, welches sich dem Magier anschließen wird. - During their travel, seasoned magicians will occasionally befriend an extraordinary creature of an unusual species that will join them. - - - - - - Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht um aus fünf Holzstämmen neue Bäume wachsen zu lassen. - The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for five trees to be grown from logs. - - - - - diff --git a/res/eressea/spellinfo.xml b/res/eressea/spellinfo.xml deleted file mode 100644 index 4304bb5fd..000000000 --- a/res/eressea/spellinfo.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Dieser Zauber wird die gesamte Ausrüstung der - Zieleinheit für einige Zeit vor den Blicken anderer verschleiern. - This spell will hide the whole equipment of a target - unit from the looks of others. - - - Dieses uralte Tanzritual ruft die - Kräfte des Lebens und der Fruchtbarkeit. Die Erträge der - Bauern werden für einige Wochen deutlich besser - ausfallen. - This ancient rite calls upon the - forces of life and fertility. For the next few weeks, - the peasant's harvest will be extraordinary good. - - - Dieses Ernteritual verbessert die Erträge der - arbeitenden Bauern in der Region um ein Silberstück. Je mehr Kraft der - Druide investiert, desto länger wirkt der Zauber. - This ritual increases the output of the local farms. - Peasants in the region produce an extra silverpiece. The stronger the - druid's spell is, the longer the effect will last. - - - Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem - gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen - alles, was man sonst nicht bekommen kann. Ob nun die kryptische - Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen - hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen. - Dem Magier hilft es auf jeden Fall... beim Füllen seines - Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche - verdienen. - If the local alchemist could not help you, you should visit a - scholar of Tybied. His potions and tinctures may help when nothing - else does. If the cryptic formula under the wooden shoes of the - unfaithful husband really helped? - well, the peasant, who isn't - capable of reading, will never know. At least it helped the magician... - to fill his purse. In one week he can earn 50 silver per level that - way. - - - Cerddormagier sind _die_ Gaukler unter - den Magiern, sie lieben es das Volk zu unterhalten und - im Mittelpunkt zu stehen. Schon Anfänger lernen die - kleinen Kunststücke und magischen Tricks, mit denen man - das Volk locken und verführen kann, den Geldbeutel ganz - weit zu öffnen, und am Ende der Woche wird der Gaukler - 50 Silber pro Stufe verdient haben. - The mages of Cerddor truly are the - bards of the wizards; they love to use their sorcery to - entertain the crowds and to be the center of attention. - Even the apprentices study those little magic tricks, - which attract and fascinate the people and thus ensnare - them into leaving a few coins or more for the artist. By - the end of the week, the bard will have earned 50 silver - per level. - - - Die Fähigkeiten der Gwyrrd-Magier in - der Viehzucht und Heilung sind bei den Bauern sehr - begehrt. Gerade auf Märkten sind ihre Dienste häufig sehr - gefragt. Manch einer mag auch sein Talent dazu nutzen, - ein Tier für einen besseren Preis zu verkaufen. Pro - Stufe kann der Magier so 50 Silber verdienen. - The abilities of the mages of Gwyrrd - concerning the breeding and healing of cattle are highly - appreciated among the peasants. Especially at the - markets, their services are demanded frequently. Some of - them also use their talents to sell an animal at a - higher price. A magician can earn 50 silver pieces per level - in this way. - - - In den dunkleren Gassen gibt es sie, - die Flüche und Verhexungen auf Bestellung. Aber - auch Gegenzauber hat der Jünger des Draigs - natürlich im Angebot. Ob nun der Sohn des - Nachbarn in einen Liebesbann gezogen werden soll - oder die Nebenbuhlerin Pickel und Warzen - bekommen soll, niemand gibt gerne zu, zu solchen - Mitteln gegriffen zu haben. Für diese - Dienstleistung streicht der Magier 50 Silber pro - Stufe ein. - In the dark alleys you can find those - who sell curses and hexes on demand - but you - can buy the apropriate counterspells from the - followers of Draig as well. May it be a love - spell for the son of a neighbour or a wart in - the face of a rival. For offering these - services, the sorcerer charges 50 silver pieces - per level. - - - Personne n'interprète aussi bien les - rêves que les mages d'Illaun. Ils sont également - versés dans l'utilisation des objets utilisés - pour prédire le futur comme les boules de - cristal, les cartes de tarot ou les lignes de la - main. Un mentaliste peut gagner 50 écus par - niveau et par semaine en proposant ses services - aux paysans. - Niemand kann so gut die Träume deuten - wie ein Magier des Illaun. Auch die Kunst der - Wahrsagerei, des Kartenlegens und des Handlesens - sind ihm geläufig. Dafür zahlen ihm die Bauern - 50 Silber pro Stufe. - No one can read dreams as well as the - mages of Illaun. Furthermore, they are also - familiar with all other common means of - foretelling the future like crystal balls, tarot - cards or palms. A mentalist can earn 50 silver - pieces per level and week for offering these - services to peasants. - - - - diff --git a/res/eressea/strings.xml b/res/eressea/strings.xml deleted file mode 100644 index 87f622fd4..000000000 --- a/res/eressea/strings.xml +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - The "Water of Life" allows living trees to be created from logs. A Knotroot and Elvendear are heated until one can just still keep one's finger in. This is then poured into a jar and allowed to cool slowly. The extract is sufficient for 10 pieces of wood. - Das 'Wasser des Lebens' ist in der Lage, aus gefällten Baumstämmen wieder lebende Bäume zu machen. Dazu wird ein knotiger Saugwurz zusammen mit einem Elfenlieb erwärmt, so dass man gerade noch den Finger reinhalten kann. Dies gieße man in ein Gefäß und lasse es langsam abkühlen. Der Extrakt reicht für 10 Holzstämme. - - - - - - Aufzeichung des Vortrags von Selen Ard'Ragorn in Bar'Glingal: - 'Es heisst, dieser Spruch wäre wohl in den Spelunken der Westgassen - entstanden, doch es kann genausogut in jedem andern verrufenen - Viertel gewesen sein. Seine wichtigste Zutat ist etwa ein Fass - schlechtesten Weines, je billiger und ungesunder, desto - wirkungsvoller wird die Essenz. Die Kunst, diesen Wein in pure - Essenz zu destillieren, die weitaus anspruchsvoller als das einfache - Rezeptmischen eines Alchemisten ist, und diese dergestalt zu binden - und konservieren, das sie sich nicht gleich wieder verflüchtigt, wie - es ihre Natur wäre, ja, dies ist etwas, das nur ein Meister des - Cerddor vollbringen kann. Nun besitzt Ihr eine kleine Phiola mit - einer rubinrotschimmernden - nun, nicht flüssig, doch auch nicht - ganz Dunst - nennen wir es einfach nur Elixier. Doch nicht dies ist - die wahre Herausforderung, sodann muss, da sich ihre Wirkung leicht - verflüchtigt, diese innerhalb weniger Tage unbemerkt in das Getränk - des Opfers geträufelt werden. Ihr Meister der Betöhrung und - Verführung, hier nun könnt Ihr Eure ganze Kunst unter Beweis - stellen. Doch gebt Acht, nicht unbedacht selbst von dem Elixier zu - kosten, denn wer einmal gekostet hat, der kann vom Weine nicht mehr - lassen, und er säuft sicherlich eine volle Woche lang. Jedoch nicht - die Verführung zum Trunke ist die wahre Gefahr, die dem Elixier - innewohnt, sondern das der Trunkenheit so sicher ein gar - fürchterliches Leid des Kopfes folgen wird, wie der Tag auf die - Nacht folgt. Und er wird gar sicherlich von seiner besten Fähigkeit - einige Tage bis hin zu den Studien zweier Wochen vergessen haben. - Noch ein Wort der Warnung: dieses ist sehr aufwendig, und so Ihr - noch weitere Zauber in der selben Woche wirken wollt, so werden sie Euch - schwerer fallen.' - - - Transcript to the lecture of Selen Ard'Ragorn in Bar'Glingal: - 'It is said, this spell had its beginnings in the drinking holes of the - Westgassen, but every other disreputable quarter is just as likely. Its - most important ingredient is about a cask of terrible wine, the cheaper - and more unbecoming, the more effective will be the essence. The art to - distill this wine into pure essence is far more demanding than the simple - brewery of an alchemist. Even more so to bind and conserve it, preventing - its natural tendency to evaporate. This can only be accomplished by a - master of Cerddor. Say, you manage to produce a vial of this ruby red, - shimmering - well, not fluid, but also not exactly vapor - let's call it - elixir. More challenges still lie ahead. The effective properties of the - elixir are quick to dissipate. Therefore it has to be dribbled into the - drink of the chosen victim within days. That is when you masters of - infatuation and seduction can truly proof your worth. But take care not - to drink of the concoction yourselves, for one taste will ensnare you to - the tastes of wine and you will spend a full week on a bender. And as - sure as day follows night, a dreadful agony will claim your head - afterwards. You will lose knowledge of your best skill, two weeks worth - of study just gone. - Another word of warning: this spell is very complex. Should you try - further spells during the same week, they will be far more difficult to - perform.' - - - - Mit diesem Spruch kann der Traumweber - versuchen, die Verzauberungen einer einzelnen - Einheit zu erkennen. Von allen Sprüchen, die - seine eigenen Fähigkeiten nicht überschreiten, - wird er einen Eindruck ihres Wirkens erhalten - können. Bei stärkeren Sprüchen benötigt er ein - wenig Glück für eine gelungene Analyse. - With this spell the mentalist can - attempt to detect enchantments on a target unit. - He will get an idea of the effect of all spells - that don't exceed his own abilities. If a spell - is stronger, it takes a little luck for a - successful analysis. - - - - - Traumbilder analysieren - Analyse Dreams - - - Schaler Wein - Hangover - - - - - Schneemann - snowman - - - Schneemänner - snowmen - - - - - - Der Sumpfgasballon besteht aus einem großen - Weidenkorb, welcher Platz - für maximal 5 Personen oder 500 Gewichtseinheiten bietet, und einer - großen, mit Sumpfgas gefüllten Wyrmblase. Bei guten Winden kann sich - der Ballon zwei Regionen pro Woche fortbewegen. Das Führen eines - Ballons ist nicht einfach, und der Kapitän muss mindestens ein - Segeltalent von 6 besitzen. Diese neue Entwicklung auf Eressea wird - ausschließlich für den Xontormia-Expreß hergestellt und die Baupläne - sind streng geheim. So ist es auch bisher noch niemandem gelungen, ein - Exemplar nachzubauen. - - - - - Benutzt der Kapitän des Schiffes diesen Talisman, so wird allen an Bord befindlichen Mallornsamen ihre magisch Energie entzogen, und das Schiff kann mit dieser Energie bis zu zwei Wochen lang fliegen. - - - Eine Geburtstagstorte mit 10 Kerzen. Herzlichen Glückwunsch, Eressea! - A birthday cake with 10 candles. Happy Birthday, Eressea! - - - Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e - - - So wisse denn, dass das Auge des Drachen den Weg zur Herausforderung - aufzeigt. Doch die Überlieferung sagt, das nur der Unschuldige und - Ungewappnete es benutzen kann. Sie sagt auch, daß er einen Beutel mit - einem Betrag von bis zu zweitausend Silber mit sich führen soll, - jedoch nicht mehr als einem Fünftel der Stärke seines Volkes - entsprechend - dem Torwächter zum Geschenke als Beweis seiner - asketischen Gesinnung. Die 5 scheidet ganz aus. - - - (Prunus dulcis) [...] Die Nüsse existieren in zwei Varianten, süß und - bitter. Süße Mandeln sind der bekannte eßbare Typ, der in Form von - Nüssen gegessen, beim Kochen verwandt oder zu Mandelöl und Mandelmehl - verarbeitet wird. - - - A tasty fruit. - Frucht aus der Gattung Malus (ca. 25 Arten), gehört - zur Familie der - Rosengewächse. Die am häufigsten kultivierte Baumfrucht. Der Apfel - gehört zu den fleischigen Früchten, in dem der gereifte Fruchtknoten - und - das umgebende Gewebe fleischig und eßbar werden. Die Apfelblüte der - meisten Varianten erfordert Kreuzbestäubung zur Befruchtung. Form und - Größe des Apfels bei der Ernte variieren abhängig von kulturellen und - umweltbedingten Einflüssen in Größe, Form, Farbe und Geschmack, sind - jedoch nichtsdestotrotz üblicherweise rund, zwischen 50 und 100mm im - Durchmesser und weisen röt- oder gelbliche Farbtöne auf. - - - Nuß, im umgangssprachlichen Sinne alle trockenen, - hartschaligen - Früchte oder Samen, die eine Schale besitzen, die sich leicht - vom inneren, eßbaren Kern entfernen läßt. In der botanischen - Terminologie beschränkt sich die Bezeichnung Nuß auf eine - einsamige Frucht, die aus einem Fruchtknoten (Ovarium) - entstanden ist, dessen äußere Wände sich verholzt haben und der - sich nicht öffnet, um seinen Samen zu entlassen. Solche echten - Nüsse können eßbar, aber auch ungenießbar sein. Bekannte - Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse. - Beispiele für Früchte oder Samen, die vom Volksmund fälschlich - als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im - botanischen Sinne sind dies Steinfrüchte, denen die fleischige - äußere Schale entfernt wurde. Andere Beispiele für unechte - Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie - Roßkastanien und Paranüsse, bei denen es sich um von Kapseln - umhüllte Samen handelt. - - - Zwerge schufen diesen wunderschönen Ring aus Weissgold und Platin. Die - Oberfläche ist so glatt, dass man nur bei genauem Hinsehen entdeckt, - dass hier eigentlich zwei Metalle ineinander verarbeitet worden sind. - In der Innenseite des Rings ist eine Gravur zu lesen: "Wildente, 3. - Woche Eiswind Jahr 8". - - - Dieses Brautkleid ist mit Abstand das schönste, was je jemand - irgendwie irgendwo gesehen hat. Auch wenn nur Wildente und Jadee das - finden müssten, wird jeder Bewohner Eresseas dies neidlos bestätigen. - Das sehr stilvolle Kleid lässt die zarten Schultern seiner Trägerin - frei und liegt am Oberkörper eng an. Dies betont atemberaubend die - zarten Kurven der Braut. Der Rock fällt leicht ausgestellt den ganzen - langen Weg an den Beinen herunter Richtung Boden, wo er sich in einer - sehr stilvollen Schleppe ergiesst. - - - Dieser Ring ist ein wahres Meisterwerk. Obwohl er sehr gross ist - (weil auch sein Träger sehr gross ist), wirkt er filigran. Weissgold - und Platin verschmelzen in diesem Ring zu einer Einheit, die die - Schönheit der einzelnen Elemente nur noch unterstreich. In der - Innenseite des Rings ist eine Gravur zu lesen: 'Jadee, 3. Woche - Eiswind Jahr 8'. - - - Hach! Sieht der Mann beeindruckend aus in diesem Frack! Und so - ordentlich! Und so ernst! Und so beeindruckend! Es fällt ein - wenig schwer, sich auf den Bräutigam zu konzentrieren, weil das - Brautkleid noch daneben strahlt, aber der Anzug des Bräutigams ist - auf jeden Fall so, wie er sein soll und sieht toll aus und sehr - geschmackvoll. - - - Orange nose, black hat, frosty character. A snowman. - He'll make a fine guard if you use him in a cold place. (USE 1 - snowman) - Rübennase, schwarzer Hut, kaltes Herz. Ein Schneemann. Er gibt - einen prima Wachmann ab, wenn er in einem Gletscher belebt wird - (BENUTZE 1 Schneemann). - - - These items stay frozen all year round. There seem to be bits of - ice in them - in the right hands, these might put an eye out! - Ein Schneeball. Es scheinen kleine Eissplitter darin zu sein. In - den richtigen Händen können sie sicher weh tun. - - - This badge pronounces its wearer an official visitor to the - embassies of Muschelplateau. - Dieses Abzeichen identifiziert die Partei seines Trägers offiziell - als einen Besucher der Botschafterregion 'Muschelplateau'. - - - Dieser wunderschoen geschmueckte Baum entfaltet in den Wintermonaten eine magische Wirkung auf den ganzen Wald. - In the winter months, this beautifully decorated tree has a magical effect on the entire forest. - - - Dieser magische Staub ist aus einem im Winter vom Himmel gefallenen - Stern gewonnen worden, und ihm werden aphrodisiakische Eigenschaften - nachgesagt. - This vial of dust, made from the remains of a star that fell from - the sky one cold winter night, is said to have aphrodisiacal powers. - - - - Ring der Levitation - ring of levitation - - - Ringe der Levitation - rings of levitation - - - Geburtstagstorte - birthday cake - - - Geburtstagstorten - birthday cakes - - - Muschel - seashell - - - Muscheln - seashells - - - Mit der ersten Auswertung bekommst du einen - Computerreport, den du mit vielen Tools wie z.B. Magellan benutzen kannst. Wenn du ihn - weiterhin bekommen willst, gib einer deiner Einheiten den Befehl OPTION - COMPUTER. - With the first two turns, you will get a computer report - (CR). It can be used with some tools like Magellan. If you want to continue - getting it after the second turn, please make one of your units give the - order OPTION COMPUTER. - - - Tempel - temple - - - Seeschlangenkopf - - - Seeschlangenköpfe - - - - - Pavillion - pavilion - - - - Portal - portal - - - - Jadees Hochzeitsring - Jadee's wedding ring - - - - Jadees Hochzeitsringe - Jadee's wedding rings - - - - Wildentes Hochzeitsring - Wildente's wedding ring - - - - Wildentes Hochzeitsringe - Wildente's wedding rings - - - - Hochzeitskleid - wedding dress - - - - Hochzeitskleider - wedding dresses - - - - Frack - tuxedo - - - - Fräcke - tuxedos - - - - Ring - ring - - - - Ringe - rings - - - - - - Akademie der Künste - academy of arts - - - Auratrank - aura potion - - - Auratränke - aura potions - - - Dudelsack der Furcht - bagpipe of fear - - - Dudelsäcke der Furcht - bagpipes of fear - - - - - Adamantium - adamantium - - - Adamantium - adamantium - - - Adamantium - adamantium - - - - Adamantiumaxt - adamantium axe - - - Adamantiumäxte - adamantium axes - - - - Adamantiumrüstung - adamantium plate - - - Adamantiumrüstungen - adamantium plates - - - Katzenamulett - amulet of the kitten - amulette du chaton - - - amulets of the kitten - Katzenamulette - amulettes du chaton - - - diff --git a/res/names-dragons.xml b/res/names-dragons.xml deleted file mode 100644 index 18723086f..000000000 --- a/res/names-dragons.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - der Weise - - - der Allwissende - - - der Mächtige - - - die Ehrwürdige - - - die Listige - - - der Grüne - - - die Strafende - - - der Sehende - - - der Reisende - - - die Wissende - - - der Goldene - - - der Graue - - - der Steinerne - - - die Alte - - - die Mächtige - - - die Goldene - - - der Grausame - - - der Sanddrache - - - der Durstige - - - die Verzehrende - - - die Grüne - - - die Rote - - - der Furchtlose - - - der Allmächtige - - - der Weitblickende - - - der Weiße - - - die Glänzende - - - der Wissende - - - die Unbarmherzige - - - die Schöne - - - diff --git a/res/names-ghouls.xml b/res/names-ghouls.xml deleted file mode 100644 index b1514f317..000000000 --- a/res/names-ghouls.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - Faulende - - - Angsteinflößende - - - Leise - - - Kinderfressende - - - Menschenfressende - - - Wahnsinnige - - - Brutale - - - Schwarze - - - Dunkle - - - Fürchterliche - - - Grauenhafte - - - Furchtbare - - - Entsetzliche - - - Schauderhafte - - - Schreckliche - - - Düstere - - - Schaurige - - - - Ghoule - - - Kreaturen - - - Verlorene - - - Erschlagene - - - Verdammte - - - Schlurfende Ghoule - - - - 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 - - - - diff --git a/res/names-skeletons.xml b/res/names-skeletons.xml deleted file mode 100644 index adb994fab..000000000 --- a/res/names-skeletons.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Klapperige - - - Stöhnende - - - Schwarzknochige - - - Schwarzgewandete - - - Angsteinflößende - - - Heulende - - - Wartende - - - Grauenvolle - - - Schwarze - - - Dunkle - - - Fürchterliche - - - Grauenhafte - - - Furchtbare - - - Entsetzliche - - - Schauderhafte - - - Schreckliche - - - Düstere - - - Schaurige - - - Erbarmungslose - - - - Skelette - - - Kreaturen - - - Krieger - - - Kämpfer - - - Rächer - - - - 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 - - - diff --git a/res/names-undead.xml b/res/names-undead.xml deleted file mode 100644 index 4c6b16726..000000000 --- a/res/names-undead.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - - Grausige - - - Stöhnende - - - Schlurfende - - - Schwarzgewandete - - - Faulende - - - Angsteinflößende - - - Heulende - - - Wartende - - - Grauenvolle - - - Schwarze - - - Dunkle - - - Fürchterliche - - - Grauenhafte - - - Furchtbare - - - Entsetzliche - - - Schauderhafte - - - Schreckliche - - - Gespenstische - - - Ekelhafte - - - Düstere - - - Schaurige - - - Erbarmungslose - - - Hungrige - - - - Geister - - - Phantome - - - Vampire - - - Zombies - - - Gespenster - - - Kreaturen - - - Gestalten - - - Schemen - - - Monster - - - Krieger - - - Ghule - - - Kopflose - - - Irrlichter - - - - 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 - - - - diff --git a/res/names-zombies.xml b/res/names-zombies.xml deleted file mode 100644 index 5aa3fb961..000000000 --- a/res/names-zombies.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - Faulende - - - Zerschlagene - - - Gefolterte - - - Angsteinflößende - - - Leise Schlurfende - - - Kinderfressende - - - Schwarze - - - Dunkle - - - Fürchterliche - - - Grauenhafte - - - Furchtbare - - - Entsetzliche - - - Schauderhafte - - - Schreckliche - - - Düstere - - - Schaurige - - - - Zombies - - - Kreaturen - - - Verlorene - - - Erschlagene - - - Verdammte - - - - 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 - - - - diff --git a/src/bindings.c b/src/bindings.c index cb84d684e..3f93a8a2f 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -922,8 +922,16 @@ static void export_locale(const struct locale *lang, const char *name) { F = fopen(fname, "wt"); if (F) { export_messages(lang, F, NULL); + } +#if 0 + /* disabled, because it also export message text */ + sprintf(fname, "strings.%2s.po", name); + F = fopen(fname, "wt"); + if (F) { + export_strings(lang, F); fclose(F); } +#endif } static int tolua_export_locales(lua_State *L) { From 409f5df9a9d198172e38574e84ee2e0ff1e2577a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:29:12 +0200 Subject: [PATCH 199/231] po export code removed. --- scripts/export.lua | 16 ---------------- src/bindings.c | 27 --------------------------- src/util/nrmessage.c | 10 ---------- src/util/nrmessage.h | 2 -- 4 files changed, 55 deletions(-) delete mode 100644 scripts/export.lua diff --git a/scripts/export.lua b/scripts/export.lua deleted file mode 100644 index 050c163e1..000000000 --- a/scripts/export.lua +++ /dev/null @@ -1,16 +0,0 @@ -local path = 'scripts' -if config.install then - path = config.install .. '/' .. path -end -package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua' -require 'eressea' -require 'eressea.xmlconf' -- read xml data - -local rules = {} -if config.rules then - rules = require('eressea.' .. config.rules) - eressea.log.info('loaded ' .. #rules .. ' modules for ' .. config.rules) -else - eressea.log.warning('no rule modules loaded, specify a game in eressea.ini or with -r') -end -export_locales() diff --git a/src/bindings.c b/src/bindings.c index 3f93a8a2f..5c6174c75 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -914,32 +914,6 @@ static int lua_rng_default(lua_State *L) { return 0; } -static void export_locale(const struct locale *lang, const char *name) { - char fname[64]; - FILE * F; - - sprintf(fname, "messages.%2s.po", name); - F = fopen(fname, "wt"); - if (F) { - export_messages(lang, F, NULL); - } -#if 0 - /* disabled, because it also export message text */ - sprintf(fname, "strings.%2s.po", name); - F = fopen(fname, "wt"); - if (F) { - export_strings(lang, F); - fclose(F); - } -#endif -} - -static int tolua_export_locales(lua_State *L) { - UNUSED_ARG(L); - locale_foreach(export_locale); - return 0; -} - void tolua_bind_open(lua_State * L); int tolua_bindings_open(lua_State * L, const dictionary *inifile) @@ -1057,7 +1031,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "spells", tolua_get_spells); tolua_function(L, TOLUA_CAST "read_xml", tolua_read_xml); tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits); - tolua_function(L, TOLUA_CAST "export_locales", tolua_export_locales); } tolua_endmodule(L); return 1; } diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 5adbde86f..057019242 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -175,13 +175,3 @@ void free_nrmesssages(void) { } } -void export_messages(const struct locale * lang, FILE *F, const char *msgctxt) { - int i; - for (i = 0; i != NRT_MAXHASH; ++i) { - nrmessage_type *nrt = nrtypes[i]; - while (nrt) { - po_write_msg(F, nrt->mtype->name, nrt_string(nrt, lang), msgctxt); - nrt = nrt->next; - } - } -} diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index e6c9f3ebc..abb47551c 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -43,8 +43,6 @@ extern "C" { char *buffer, size_t size, const void *userdata); const char *nr_section(const struct message *msg); - void export_messages(const struct locale * lang, FILE *F, const char *msgctxt); - #ifdef __cplusplus } #endif From 7fa568da09768e876927208f5f72d682d4b8102d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 17 May 2018 23:53:44 +0200 Subject: [PATCH 200/231] eliminate dead code, fix compile --- src/jsonconf.c | 8 +++++--- src/xmlreader.c | 35 ----------------------------------- 2 files changed, 5 insertions(+), 38 deletions(-) diff --git a/src/jsonconf.c b/src/jsonconf.c index e04c7690c..f1e781cb0 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -1036,12 +1036,14 @@ static int include_po(const char *uri) { const char *filename = uri_to_file(uri, name, sizeof(name)); const char *pos = strstr(filename, ".po"); if (pos) { + size_t len; const char *str = --pos; while (str > filename && *str != '.') --str; - if ((pos - str) < sizeof(lname)) { + len = (size_t)(pos - str); + if (len < sizeof(lname)) { struct locale * lang; - memcpy(lname, str+1, pos - str); - lname[pos - str] = 0; + memcpy(lname, str+1, len); + lname[len] = 0; lang = get_or_create_locale(lname); if (lang) { int err = pofile_read(filename, add_po_string, lang); diff --git a/src/xmlreader.c b/src/xmlreader.c index 1535cb208..b5dd272bd 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -83,16 +83,6 @@ static variant xml_fraction(xmlNodePtr node, const char *name) { return frac_make(0, 1); } -static void xml_readtext(xmlNodePtr node, struct locale **lang, xmlChar ** text) -{ - xmlChar *propValue = xmlGetProp(node, BAD_CAST "locale"); - assert(propValue != NULL); - *lang = get_locale((const char *)propValue); - xmlFree(propValue); - - *text = xmlNodeListGetString(node->doc, node->children, 1); -} - static spellref *xml_spellref(xmlNode * node, const char *name) { xmlChar *propValue = xmlGetProp(node, BAD_CAST name); @@ -104,31 +94,6 @@ static spellref *xml_spellref(xmlNode * node, const char *name) return NULL; } -static xmlChar *xml_cleanup_string(xmlChar * str) -{ - xmlChar *read = str; - xmlChar *write = str; - - while (*read) { - /* eat leading whitespace */ - if (*read && isspace(*read)) { - while (*read && isspace(*read)) { - ++read; - } - *write++ = ' '; - } - while (*read) { - if (*read == '\n') - break; - if (*read == '\r') - break; - *write++ = *read++; - } - } - *write = 0; - return str; -} - static resource_mod * xml_readmodifiers(xmlXPathObjectPtr result, xmlNodePtr node) { /* reading eressea/resources/resource/modifier */ if (result->nodesetval != NULL && result->nodesetval->nodeNr > 0) { From 42f59fbd9e7bb20ff0f1a2232f6bfe7c75024cc4 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 00:08:30 +0200 Subject: [PATCH 201/231] I think pofile.c belongs in the util directory. --- src/CMakeLists.txt | 1 - src/jsonconf.c | 2 +- src/util/CMakeLists.txt | 1 + src/{ => util}/pofile.c | 5 ++--- src/{ => util}/pofile.h | 0 5 files changed, 4 insertions(+), 5 deletions(-) rename src/{ => util}/pofile.c (98%) rename src/{ => util}/pofile.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ee2dbe9da..bdf0465d2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -126,7 +126,6 @@ set (ERESSEA_SRC summary.c travelthru.c monsters.c - pofile.c wormhole.c xmlreader.c ${SPELLS_SRC} diff --git a/src/jsonconf.c b/src/jsonconf.c index f1e781cb0..995e84af2 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -37,6 +37,7 @@ without prior permission by the authors of Eressea. #include "util/message.h" #include "util/nrmessage.h" #include "util/path.h" +#include "util/pofile.h" #include "util/strings.h" #include "util/xml.h" @@ -45,7 +46,6 @@ without prior permission by the authors of Eressea. #include "keyword.h" #include "move.h" #include "prefix.h" -#include "pofile.h" #include "skill.h" /* external libraries */ diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index dce14684a..19f9b608b 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -51,6 +51,7 @@ nrmessage.c parser.c password.c path.c +pofile.c rand.c resolve.c strings.c diff --git a/src/pofile.c b/src/util/pofile.c similarity index 98% rename from src/pofile.c rename to src/util/pofile.c index 7cb1a5460..63ee6dcc8 100644 --- a/src/pofile.c +++ b/src/util/pofile.c @@ -3,9 +3,8 @@ #endif #include "pofile.h" - -#include "util/log.h" -#include "util/strings.h" +#include "log.h" +#include "strings.h" #include #include diff --git a/src/pofile.h b/src/util/pofile.h similarity index 100% rename from src/pofile.h rename to src/util/pofile.h From 3867388834502191f9d3032f9e1f41ebdb003732 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 30 Dec 2017 21:16:27 +0100 Subject: [PATCH 202/231] iwyu --- src/spells.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/spells.h b/src/spells.h index 39157aaf6..7d80e49c6 100644 --- a/src/spells.h +++ b/src/spells.h @@ -15,9 +15,6 @@ #ifndef H_SPL_SPELLS #define H_SPL_SPELLS -#include "magic.h" - - #ifdef __cplusplus extern "C" { #endif From ef74b8e7596bb8a73449ebb232ba850cbace6a6b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 02:46:34 +0200 Subject: [PATCH 203/231] reduce the footprint of nrmessage --- src/creport.c | 19 ++++++++----------- src/report.c | 2 +- src/util/nrmessage.c | 20 ++++++++------------ src/util/nrmessage.h | 7 +++---- 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/creport.c b/src/creport.c index d48c61739..325d0dec0 100644 --- a/src/creport.c +++ b/src/creport.c @@ -512,17 +512,14 @@ static void report_crtypes(FILE * F, const struct locale *lang) for (i = 0; i != MTMAXHASH; ++i) { struct known_mtype *kmt; for (kmt = mtypehash[i]; kmt; kmt = kmt->nexthash) { - const struct nrmessage_type *nrt = nrt_find(kmt->mtype); - if (nrt) { - char buffer[DISPLAYSIZE]; - int hash = (int)kmt->mtype->key; - assert(hash > 0); - fprintf(F, "MESSAGETYPE %d\n", hash); - fputc('\"', F); - fputs(str_escape(nrt_string(nrt, lang), buffer, sizeof(buffer)), F); - fputs("\";text\n", F); - fprintf(F, "\"%s\";section\n", nrt_section(nrt)); - } + char buffer[DISPLAYSIZE]; + int hash = (int)kmt->mtype->key; + assert(hash > 0); + fprintf(F, "MESSAGETYPE %d\n", hash); + fputc('\"', F); + fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F); + fputs("\";text\n", F); + fprintf(F, "\"%s\";section\n", nrt_section(kmt->mtype)); } while (mtypehash[i]) { kmt = mtypehash[i]; diff --git a/src/report.c b/src/report.c index 9edc8aca2..dd8b50a5d 100644 --- a/src/report.c +++ b/src/report.c @@ -723,7 +723,7 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden struct mlist *m = msgs->begin; while (m) { /* messagetype * mt = m->type; */ - if (!categorized || strcmp(nr_section(m->msg), section->name) == 0) { + if (!categorized || strcmp(nrt_section(m->msg->type), section->name) == 0) { char lbuf[8192]; if (!k && categorized) { diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 057019242..c123add92 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -30,17 +30,18 @@ #define NRT_MAXHASH 1021 static nrmessage_type *nrtypes[NRT_MAXHASH]; -const char *nrt_string(const struct nrmessage_type *nrt, const struct locale *lang) +const char *nrt_string(const struct message_type *mtype, + const struct locale *lang) { - const char * str = locale_getstring(lang, nrt->mtype->name); + const char * str = locale_getstring(lang, mtype->name); if (!str) { - str = locale_getstring(default_locale, nrt->mtype->name); + str = locale_getstring(default_locale, mtype->name); } assert(str); return str; } -nrmessage_type *nrt_find(const struct message_type * mtype) +static nrmessage_type *nrt_find(const struct message_type * mtype) { nrmessage_type *found = NULL; unsigned int hash = mtype->key % NRT_MAXHASH; @@ -139,7 +140,7 @@ size_t size, const void *userdata) if (nrt) { const char *m = - translate(nrt_string(nrt, lang), userdata, nrt->vars, msg->parameters); + translate(nrt_string(msg->type, lang), userdata, nrt->vars, msg->parameters); if (m) { return str_strlcpy((char *)buffer, m, size); } @@ -152,14 +153,9 @@ size_t size, const void *userdata) return 0; } -const char *nr_section(const struct message *msg) -{ - nrmessage_type *nrt = nrt_find(msg->type); - return nrt ? nrt->section : NULL; -} - -const char *nrt_section(const nrmessage_type * nrt) +const char *nrt_section(const struct message_type * mtype) { + nrmessage_type *nrt = nrt_find(mtype); return nrt ? nrt->section : NULL; } diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index abb47551c..357e5d5c5 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -35,13 +35,12 @@ extern "C" { void free_nrmesssages(void); void nrt_register(const struct message_type *mtype, const char *section); - struct nrmessage_type *nrt_find(const struct message_type *); - const char *nrt_string(const struct nrmessage_type *nrt, const struct locale *lang); - const char *nrt_section(const struct nrmessage_type *nrt); + const char *nrt_string(const struct message_type *mtype, + const struct locale *lang); + const char *nrt_section(const struct message_type *mtype); size_t nr_render(const struct message *msg, const struct locale *lang, char *buffer, size_t size, const void *userdata); - const char *nr_section(const struct message *msg); #ifdef __cplusplus } From 9e64f66409beb8903b980fc17313cdcce1980386 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 02:55:03 +0200 Subject: [PATCH 204/231] gates are never created, probably dead code --- src/triggers/gate.c | 8 -------- src/triggers/gate.h | 2 -- 2 files changed, 10 deletions(-) diff --git a/src/triggers/gate.c b/src/triggers/gate.c index d3fa1a1a8..4c2c7a9cd 100644 --- a/src/triggers/gate.c +++ b/src/triggers/gate.c @@ -103,11 +103,3 @@ struct trigger_type tt_gate = { gate_read }; -trigger *trigger_gate(building * b, region * target) -{ - trigger *t = t_new(&tt_gate); - gate_data *td = (gate_data *)t->data.v; - td->gate = b; - td->target = target; - return t; -} diff --git a/src/triggers/gate.h b/src/triggers/gate.h index ab90c50ff..297393d70 100644 --- a/src/triggers/gate.h +++ b/src/triggers/gate.h @@ -24,8 +24,6 @@ extern "C" { extern struct trigger_type tt_gate; - struct trigger *trigger_gate(struct building *b, struct region *r); - #ifdef __cplusplus } #endif From 810bf3b40aa99e21a89e27446fb44479aab27704 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 02:55:33 +0200 Subject: [PATCH 205/231] fix some cppcheck warnings --- src/battle.c | 2 +- src/kernel/unit.c | 27 --------------------------- src/kernel/unit.h | 6 ------ src/move.c | 5 +++-- src/util/strings.c | 4 ++-- src/util/strings.h | 2 +- 6 files changed, 7 insertions(+), 39 deletions(-) diff --git a/src/battle.c b/src/battle.c index 77d2fd5db..fdc29bcb7 100644 --- a/src/battle.c +++ b/src/battle.c @@ -3999,7 +3999,7 @@ void force_leave(region *r, battle *b) { void do_battle(region * r) { battle *b = NULL; - bool fighting = false; + bool fighting; ship *sh; fighting = start_battle(r, &b); diff --git a/src/kernel/unit.c b/src/kernel/unit.c index d189d8728..07c6c0856 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -530,33 +530,6 @@ attrib_type at_target = { NO_READ }; -unit *utarget(const unit * u) -{ - attrib *a; - if (!fval(u, UFL_TARGET)) - return NULL; - a = a_find(u->attribs, &at_target); - assert(a || !"flag set, but no target found"); - return (unit *)a->data.v; -} - -void usettarget(unit * u, const unit * t) -{ - attrib *a = a_find(u->attribs, &at_target); - if (!a && t) - a = a_add(&u->attribs, a_new(&at_target)); - if (a) { - if (!t) { - a_remove(&u->attribs, a); - freset(u, UFL_TARGET); - } - else { - a->data.v = (void *)t; - fset(u, UFL_TARGET); - } - } -} - /*********************/ /* at_siege */ /*********************/ diff --git a/src/kernel/unit.h b/src/kernel/unit.h index de7d8c4cb..ac61affde 100644 --- a/src/kernel/unit.h +++ b/src/kernel/unit.h @@ -141,12 +141,6 @@ extern "C" { struct building *usiege(const struct unit *u); void usetsiege(struct unit *u, const struct building *b); - struct unit *utarget(const struct unit *u); - void usettarget(struct unit *u, const struct unit *b); - - struct unit *utarget(const struct unit *u); - void usettarget(struct unit *u, const struct unit *b); - const char *uprivate(const struct unit *u); void usetprivate(struct unit *u, const char *c); diff --git a/src/move.c b/src/move.c index b30717596..f98da3431 100644 --- a/src/move.c +++ b/src/move.c @@ -320,11 +320,12 @@ int walkingcapacity(const struct unit *u) /* Genug Trolle, um die Restwagen zu ziehen? */ wagen_mit_trollen = u->number / 4; - if (wagen_mit_trollen > wagen_ohne_pferde) wagen_mit_trollen = wagen_ohne_pferde; + if (wagen_mit_trollen > wagen_ohne_pferde) { + wagen_mit_trollen = wagen_ohne_pferde; + } /* Wagenkapazität hinzuzählen */ n += wagen_mit_trollen * vcap; - wagen_ohne_pferde -= wagen_mit_trollen; } n += animals * acap; diff --git a/src/util/strings.c b/src/util/strings.c index 38cb020f9..f0c02c8fc 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -144,9 +144,9 @@ void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, c *s = 0; } -unsigned int str_hash(const char *s) +int str_hash(const char *s) { - unsigned int key = 0; + int key = 0; assert(s); while (*s) { key = key * 37 + *s++; diff --git a/src/util/strings.h b/src/util/strings.h index fdf4a6c7c..156f41011 100644 --- a/src/util/strings.h +++ b/src/util/strings.h @@ -26,7 +26,7 @@ extern "C" { #endif void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, const char *value); - unsigned int str_hash(const char *s); + int str_hash(const char *s); size_t str_slprintf(char * dst, size_t size, const char * format, ...); size_t str_strlcpy(char *dst, const char *src, size_t len); size_t str_strlcat(char *dst, const char *src, size_t len); From 26dc593ddb76f09d167507911b76f9e1e3058b34 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 08:34:00 +0200 Subject: [PATCH 206/231] shrink nrmessage --- src/util/nrmessage.c | 8 +++++++- src/util/nrmessage_struct.h | 17 ----------------- 2 files changed, 7 insertions(+), 18 deletions(-) delete mode 100644 src/util/nrmessage_struct.h diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index c123add92..2df1f4864 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -13,7 +13,6 @@ #include #include "nrmessage.h" -#include "nrmessage_struct.h" /* util includes */ #include "log.h" @@ -27,6 +26,13 @@ #include #include +typedef struct nrmessage_type { + const struct message_type *mtype; + char *vars; + struct nrmessage_type *next; + const char *section; +} nrmessage_type; + #define NRT_MAXHASH 1021 static nrmessage_type *nrtypes[NRT_MAXHASH]; diff --git a/src/util/nrmessage_struct.h b/src/util/nrmessage_struct.h deleted file mode 100644 index a25a6341a..000000000 --- a/src/util/nrmessage_struct.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef CLASS_NRMESSAGE_STRUCT -#define CLASS_NRMESSAGE_STRUCT - -/* This file should not be included by anything in the server. If you - * feel that you need to include it, it's a sure sign that you're trying to - * do something BAD. */ - -typedef struct nrmessage_type { - const struct message_type *mtype; - char *vars; - struct nrmessage_type *next; - const char *section; -} nrmessage_type; - -extern nrmessage_type *get_nrmessagetypes(void); - -#endif From 3cd51fe3847e79eba91326c6f14f291e266452a9 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 15:34:21 +0200 Subject: [PATCH 207/231] cppcheck niggles. --- src/battle.c | 16 ---------------- src/economy.test.c | 16 ++++++++-------- src/kernel/connection.c | 30 ------------------------------ src/kernel/connection.h | 2 -- src/kernel/item.c | 16 ---------------- src/kernel/item.h | 1 - src/move.c | 11 ----------- src/tests.c | 16 ++++++++++++++++ src/tests.h | 1 + 9 files changed, 25 insertions(+), 84 deletions(-) diff --git a/src/battle.c b/src/battle.c index fdc29bcb7..1e0924aee 100644 --- a/src/battle.c +++ b/src/battle.c @@ -948,22 +948,6 @@ void drain_exp(struct unit *u, int n) } } -const char *rel_dam(int dam, int hp) -{ - double q = (double)dam / (double)hp; - - if (q > 0.75) { - return "eine klaffende Wunde"; - } - else if (q > 0.5) { - return "eine schwere Wunde"; - } - else if (q > 0.25) { - return "eine Wunde"; - } - return "eine kleine Wunde"; -} - static void vampirism(troop at, int damage) { if (rule_vampire > 0) { diff --git a/src/economy.test.c b/src/economy.test.c index 3e5d39007..0ed869ef0 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -250,7 +250,7 @@ static void test_trade_insect(CuTest *tc) { unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s", LOC(u->faction->locale, resourcename(it_luxury->rtype, 0)))); - set_item(u, it_silver, 10); + test_set_item(u, it_silver, 10); CuAssertPtrEquals(tc, r, u->region); CuAssertPtrEquals(tc, (void *)it_luxury, (void *)r_luxury(u->region)); produce(u->region); @@ -283,7 +283,7 @@ static void test_buy_cmd(CuTest *tc) { u = test_create_unit(test_create_faction(NULL), r); unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s", LOC(u->faction->locale, resourcename(it_luxury->rtype, 0)))); - set_item(u, rt_silver->itype, 1000); + test_set_item(u, rt_silver->itype, 1000); produce(r); CuAssertPtrNotNullMsg(tc, "trading requires a castle", test_find_messagetype(u->faction->msgs, "error119")); @@ -525,13 +525,13 @@ static void test_modify_material(CuTest *tc) { itype->construction->materials[0].rtype = rtype; itype->construction->materials[0].number = 2; - set_item(u, rtype->itype, 1); /* 1 iron should get us 1 sword */ + test_set_item(u, rtype->itype, 1); /* 1 iron should get us 1 sword */ make_item(u, itype, 1); CuAssertIntEquals(tc, 1, get_item(u, itype)); CuAssertIntEquals(tc, 0, get_item(u, rtype->itype)); u_setrace(u, test_create_race("smurf")); - set_item(u, rtype->itype, 2); /* 2 iron should be required now */ + test_set_item(u, rtype->itype, 2); /* 2 iron should be required now */ make_item(u, itype, 1); CuAssertIntEquals(tc, 2, get_item(u, itype)); CuAssertIntEquals(tc, 0, get_item(u, rtype->itype)); @@ -576,20 +576,20 @@ static void test_modify_skill(CuTest *tc) { mod[0].value.sa[1] = 1; mod[0].race_mask = rc_mask(u_race(u)); - set_item(u, rtype->itype, 2); /* 2 iron should get us 2 swords */ + test_set_item(u, rtype->itype, 2); /* 2 iron should get us 2 swords */ make_item(u, itype, 2); CuAssertIntEquals(tc, 2, get_item(u, itype)); CuAssertIntEquals(tc, 0, get_item(u, rtype->itype)); mod[0].value.sa[0] = NOSKILL; /* match any skill */ - set_item(u, rtype->itype, 2); + test_set_item(u, rtype->itype, 2); make_item(u, itype, 2); CuAssertIntEquals(tc, 4, get_item(u, itype)); CuAssertIntEquals(tc, 0, get_item(u, rtype->itype)); u_setrace(u, test_create_race("smurf")); - set_item(u, rtype->itype, 2); + test_set_item(u, rtype->itype, 2); make_item(u, itype, 1); /* only enough skill to make 1 now */ CuAssertIntEquals(tc, 5, get_item(u, itype)); CuAssertIntEquals(tc, 1, get_item(u, rtype->itype)); @@ -626,7 +626,7 @@ static void test_modify_production(CuTest *tc) { itype->construction->materials[0].rtype = rt_silver; itype->construction->materials[0].number = 1; set_level(u, SK_ALCHEMY, 1); - set_item(u, rt_silver->itype, 1); + test_set_item(u, rt_silver->itype, 1); make_item(u, itype, 1); CuAssertIntEquals(tc, 1, get_item(u, itype)); CuAssertIntEquals(tc, 0, get_item(u, rt_silver->itype)); diff --git a/src/kernel/connection.c b/src/kernel/connection.c index 9cfe9c140..014fce9d8 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -73,36 +73,6 @@ void free_borders(void) } } -connection *find_border(int id) -{ - int key; - for (key = 0; key != BORDER_MAXHASH; key++) { - connection *bhash; - for (bhash = borders[key]; bhash != NULL; bhash = bhash->nexthash) { - connection *b; - for (b = bhash; b; b = b->next) { - if (b->id == id) - return b; - } - } - } - return NULL; -} - -int resolve_borderid(variant id, void *addr) -{ - int result = 0; - connection *b = NULL; - if (id.i != 0) { - b = find_border(id.i); - if (b == NULL) { - result = -1; - } - } - *(connection **)addr = b; - return result; -} - static void walk_i(region *r, connection *b, void(*cb)(connection *, void *), void *data) { for (; b; b = b->nexthash) { if (b->from == r || b->to == r) { diff --git a/src/kernel/connection.h b/src/kernel/connection.h index 80177c638..c847f690f 100644 --- a/src/kernel/connection.h +++ b/src/kernel/connection.h @@ -97,8 +97,6 @@ extern "C" { struct border_type *next; /* for internal use only */ } border_type; - connection *find_border(int id); - int resolve_borderid(variant data, void *addr); void free_borders(void); void walk_connections(struct region *r, void(*cb)(struct connection *, void *), void *data); diff --git a/src/kernel/item.c b/src/kernel/item.c index 7307c82c2..d641e8837 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -582,22 +582,6 @@ int get_item(const unit * u, const item_type *itype) return i ? i->number : 0; } -int set_item(unit * u, const item_type *itype, int value) -{ - item *i; - - assert(itype); - i = *i_find(&u->items, itype); - if (!i) { - i = i_add(&u->items, i_new(itype, value)); - } - else { - i->number = value; - assert(i->number >= 0); - } - return value; -} - #include "move.h" static int diff --git a/src/kernel/item.h b/src/kernel/item.h index e08c95e57..789517e95 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -284,7 +284,6 @@ extern "C" { struct item *item_spoil(const struct race *rc, int size); int get_item(const struct unit * u, const struct item_type *itype); - int set_item(struct unit * u, const struct item_type *itype, int value); int get_money(const struct unit *); int set_money(struct unit *, int); int change_money(struct unit *, int); diff --git a/src/move.c b/src/move.c index f98da3431..c1ded5faa 100644 --- a/src/move.c +++ b/src/move.c @@ -2022,17 +2022,6 @@ static void sail(unit * u, order * ord, region_list ** routep, bool drifting) * the token parser needs to be initialized before calling this function! */ -/** fleeing units use this function -*/ -void run_to(unit * u, region * to) -{ - region_list *route = NULL; - add_regionlist(&route, to); - travel_route(u, route, NULL, NULL, TRAVEL_RUNNING); - free_regionlist(route); - /* weder transport noch follow */ -} - static const region_list *travel_i(unit * u, const region_list * route_begin, const region_list * route_end, order * ord, int mode, follower ** followers) { diff --git a/src/tests.c b/src/tests.c index d69651b82..01767d801 100644 --- a/src/tests.c +++ b/src/tests.c @@ -37,6 +37,22 @@ #include #include +int test_set_item(unit * u, const item_type *itype, int value) +{ + item *i; + + assert(itype); + i = *i_find(&u->items, itype); + if (!i) { + i = i_add(&u->items, i_new(itype, value)); + } + else { + i->number = value; + assert(i->number >= 0); + } + return value; +} + struct race *test_create_race(const char *name) { race *rc = rc_get_or_create(name ? name : "smurf"); diff --git a/src/tests.h b/src/tests.h index c3eb6bae3..dd8bed3c8 100644 --- a/src/tests.h +++ b/src/tests.h @@ -58,6 +58,7 @@ extern "C" { struct building_type *test_create_buildingtype(const char *name); void test_create_castorder(struct castorder *co, struct unit *u, int level, float force, int range, struct spellparameter *par); struct spell * test_create_spell(void); + int test_set_item(struct unit * u, const struct item_type *itype, int value); void test_translate_param(const struct locale *lang, param_t param, const char *text); const char * test_get_messagetype(const struct message *msg); From f8b8a5284c0ccdad4d6ded0f58b599c9702ad3a8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 18:50:13 +0200 Subject: [PATCH 208/231] begin expat message parsing --- src/exparse.c | 27 +++++++++++++++++++++++---- src/util/message.c | 13 +++++-------- src/util/nrmessage.c | 8 ++++---- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index b016c89df..e323bb74c 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -16,6 +16,7 @@ #include "util/functions.h" #include "util/log.h" +#include "util/message.h" #include "util/strings.h" #include @@ -47,7 +48,6 @@ enum { EXP_SHIPS, EXP_RACES, EXP_MESSAGES, - EXP_STRINGS, EXP_SPELLS, EXP_SPELLBOOKS, }; @@ -285,6 +285,25 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } +static void XMLCALL start_messages(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + if (xml_strcmp(el, "message") == 0) { + const XML_Char *name = NULL, *section = NULL; + int i; + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "name") == 0) { + name = val; + } + else if (xml_strcmp(key, "section") == 0) { + section = val; + } + } + if (name) { + pi->object = mt_new(name, NULL); + } + } +} + #define MAX_COMPONENTS 8 static spell_component components[MAX_COMPONENTS]; static int ncomponents; @@ -1192,9 +1211,6 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char else if (xml_strcmp(el, "messages") == 0) { pi->type = EXP_MESSAGES; } - else if (xml_strcmp(el, "strings") == 0) { - pi->type = EXP_STRINGS; - } else if (xml_strcmp(el, "spells") == 0) { pi->type = EXP_SPELLS; } @@ -1232,6 +1248,9 @@ static void XMLCALL handle_start(void *data, const XML_Char *el, const XML_Char case EXP_SPELLS: start_spells(pi, el, attr); break; + case EXP_MESSAGES: + start_messages(pi, el, attr); + break; case EXP_UNKNOWN: handle_bad_input(pi, el, NULL); break; diff --git a/src/util/message.c b/src/util/message.c index a919f5f7d..71795cfc7 100644 --- a/src/util/message.c +++ b/src/util/message.c @@ -79,16 +79,9 @@ message_type *mt_new(const char *name, const char *args[]) mtype->name = str_strdup(name); mtype->nparameters = nparameters; if (nparameters > 0) { + int i; mtype->pnames = (char **)malloc(sizeof(char *) * nparameters); mtype->types = (arg_type **)malloc(sizeof(arg_type *) * nparameters); - } - else { - mtype->pnames = NULL; - mtype->types = NULL; - } - if (args != NULL) { - int i; - for (i = 0; args[i]; ++i) { const char *x = args[i]; const char *spos = strchr(x, ':'); @@ -110,6 +103,10 @@ message_type *mt_new(const char *name, const char *args[]) } } } + else { + mtype->pnames = NULL; + mtype->types = NULL; + } return mtype; } diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 2df1f4864..9461e11c5 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -27,10 +27,10 @@ #include typedef struct nrmessage_type { - const struct message_type *mtype; - char *vars; - struct nrmessage_type *next; - const char *section; + const struct message_type *mtype; + char *vars; + struct nrmessage_type *next; + const char *section; } nrmessage_type; #define NRT_MAXHASH 1021 From 19b3b5b35a271610f142189cdc7247fc25d38774 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 19:58:49 +0200 Subject: [PATCH 209/231] change how message types are created (more prep work for expat) --- src/creport.c | 2 +- src/donations.test.c | 2 +- src/economy.test.c | 18 +++---- src/give.test.c | 34 ++++++------ src/kernel/build.test.c | 2 +- src/kernel/messages.c | 6 +-- src/kernel/messages.test.c | 8 +-- src/laws.test.c | 30 +++++------ src/market.test.c | 2 +- src/monsters.test.c | 5 +- src/move.test.c | 18 ++++--- src/orderfile.test.c | 2 +- src/piracy.test.c | 18 ++++--- src/renumber.test.c | 2 +- src/report.c | 15 +++--- src/spells.test.c | 6 ++- src/spells/flyingship.test.c | 3 +- src/spells/magicresistance.test.c | 6 ++- src/spy.test.c | 39 +++++++++----- src/study.test.c | 18 ++++--- src/tests.c | 9 ++-- src/triggers/shock.test.c | 3 +- src/util/message.c | 88 +++++++++++++++---------------- src/util/message.h | 7 +-- src/util/message.test.c | 3 +- src/util/nrmessage.c | 65 +++++++++-------------- src/util/nrmessage.h | 11 ++-- src/volcano.test.c | 12 +++-- src/wormhole.test.c | 12 +++-- src/xmlreader.c | 24 ++++----- 30 files changed, 250 insertions(+), 220 deletions(-) diff --git a/src/creport.c b/src/creport.c index 325d0dec0..17cf60fdb 100644 --- a/src/creport.c +++ b/src/creport.c @@ -519,7 +519,7 @@ static void report_crtypes(FILE * F, const struct locale *lang) fputc('\"', F); fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F); fputs("\";text\n", F); - fprintf(F, "\"%s\";section\n", nrt_section(kmt->mtype)); + fprintf(F, "\"%s\";section\n", kmt->mtype->section); } while (mtypehash[i]) { kmt = mtypehash[i]; diff --git a/src/donations.test.c b/src/donations.test.c index a3a428a73..2cdc8f174 100644 --- a/src/donations.test.c +++ b/src/donations.test.c @@ -13,7 +13,7 @@ static void test_add_donation(CuTest *tc) { region *r; test_setup(); - mt_register(mt_new_va("donation", "from:faction", "to:faction", "amount:int", MT_NEW_END)); + mt_create_va(mt_new("donation", NULL), "from:faction", "to:faction", "amount:int", MT_NEW_END); r = test_create_region(0, 0, NULL); f1 = test_create_faction(NULL); f2 = test_create_faction(NULL); diff --git a/src/economy.test.c b/src/economy.test.c index 0ed869ef0..3b5745be4 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -143,10 +143,10 @@ static struct unit *create_recruiter(void) { static void setup_production(void) { init_resources(); - mt_register(mt_new_va("produce", "unit:unit", "region:region", "amount:int", "wanted:int", "resource:resource", MT_NEW_END)); - mt_register(mt_new_va("income", "unit:unit", "region:region", "amount:int", "wanted:int", "mode:int", MT_NEW_END)); - mt_register(mt_new_va("buy", "unit:unit", "money:int", MT_NEW_END)); - mt_register(mt_new_va("buyamount", "unit:unit", "amount:int", "resource:resource", MT_NEW_END)); + mt_create_va(mt_new("produce", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "resource:resource", MT_NEW_END); + mt_create_va(mt_new("income", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "mode:int", MT_NEW_END); + mt_create_va(mt_new("buy", NULL), "unit:unit", "money:int", MT_NEW_END); + mt_create_va(mt_new("buyamount", NULL), "unit:unit", "amount:int", "resource:resource", MT_NEW_END); } static void test_heroes_dont_recruit(CuTest * tc) { @@ -378,11 +378,11 @@ static void test_tax_cmd(CuTest *tc) { } static void setup_economy(void) { - mt_register(mt_new_va("recruit", "unit:unit", "region:region", "amount:int", "want:int", MT_NEW_END)); - mt_register(mt_new_va("maintenance", "unit:unit", "building:building", MT_NEW_END)); - mt_register(mt_new_va("maintenancefail", "unit:unit", "building:building", MT_NEW_END)); - mt_register(mt_new_va("maintenance_nowork", "building:building", MT_NEW_END)); - mt_register(mt_new_va("maintenance_noowner", "building:building", MT_NEW_END)); + mt_create_va(mt_new("recruit", NULL), "unit:unit", "region:region", "amount:int", "want:int", MT_NEW_END); + mt_create_va(mt_new("maintenance", NULL), "unit:unit", "building:building", MT_NEW_END); + mt_create_va(mt_new("maintenancefail", NULL), "unit:unit", "building:building", MT_NEW_END); + mt_create_va(mt_new("maintenance_nowork", NULL), "building:building", MT_NEW_END); + mt_create_va(mt_new("maintenance_noowner", NULL), "building:building", MT_NEW_END); } /** diff --git a/src/give.test.c b/src/give.test.c index 3e58216c9..d02c27e6f 100644 --- a/src/give.test.c +++ b/src/give.test.c @@ -54,24 +54,24 @@ static void setup_give(struct give *env) { } /* success messages: */ - mt_register(mt_new_va("receive_person", "unit:unit", "target:unit", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("give_person", "unit:unit", "target:unit", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("give_person_peasants", "unit:unit", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("give_person_ocean", "unit:unit", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("receive", "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("give", "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END)); - mt_register(mt_new_va("give_peasants", "unit:unit", "resource:resource", "amount:int", MT_NEW_END)); + mt_create_va(mt_new("receive_person", NULL), "unit:unit", "target:unit", "amount:int", MT_NEW_END); + mt_create_va(mt_new("give_person", NULL), "unit:unit", "target:unit", "amount:int", MT_NEW_END); + mt_create_va(mt_new("give_person_peasants", NULL), "unit:unit", "amount:int", MT_NEW_END); + mt_create_va(mt_new("give_person_ocean", NULL), "unit:unit", "amount:int", MT_NEW_END); + mt_create_va(mt_new("receive", NULL), "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END); + mt_create_va(mt_new("give", NULL), "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END); + mt_create_va(mt_new("give_peasants", NULL), "unit:unit", "resource:resource", "amount:int", MT_NEW_END); /* error messages: */ - mt_register(mt_new_va("too_many_units_in_faction", "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END)); - mt_register(mt_new_va("too_many_units_in_alliance", "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END)); - mt_register(mt_new_va("feedback_no_contact", "unit:unit", "region:region", "command:order", "target:unit", MT_NEW_END)); - mt_register(mt_new_va("feedback_give_forbidden", "unit:unit", "region:region", "command:order", MT_NEW_END)); - mt_register(mt_new_va("peasants_give_invalid", "unit:unit", "region:region", "command:order", MT_NEW_END)); - mt_register(mt_new_va("giverestriction", "unit:unit", "region:region", "command:order", "turns:int", MT_NEW_END)); - mt_register(mt_new_va("error_unit_size", "unit:unit", "region:region", "command:order", "maxsize:int", MT_NEW_END)); - mt_register(mt_new_va("nogive_reserved", "unit:unit", "region:region", "command:order", "resource:resource", "reservation:int", MT_NEW_END)); - mt_register(mt_new_va("race_notake", "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END)); - mt_register(mt_new_va("race_noregroup", "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END)); + mt_create_va(mt_new("too_many_units_in_faction", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END); + mt_create_va(mt_new("too_many_units_in_alliance", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END); + mt_create_va(mt_new("feedback_no_contact", NULL), "unit:unit", "region:region", "command:order", "target:unit", MT_NEW_END); + mt_create_va(mt_new("feedback_give_forbidden", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END); + mt_create_va(mt_new("peasants_give_invalid", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END); + mt_create_va(mt_new("giverestriction", NULL), "unit:unit", "region:region", "command:order", "turns:int", MT_NEW_END); + mt_create_va(mt_new("error_unit_size", NULL), "unit:unit", "region:region", "command:order", "maxsize:int", MT_NEW_END); + mt_create_va(mt_new("nogive_reserved", NULL), "unit:unit", "region:region", "command:order", "resource:resource", "reservation:int", MT_NEW_END); + mt_create_va(mt_new("race_notake", NULL), "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END); + mt_create_va(mt_new("race_noregroup", NULL), "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END); } static void test_give_unit(CuTest * tc) { diff --git a/src/kernel/build.test.c b/src/kernel/build.test.c index 1261e5496..9bae742c2 100644 --- a/src/kernel/build.test.c +++ b/src/kernel/build.test.c @@ -253,7 +253,7 @@ static void test_build_destroy_road(CuTest *tc) message *m; test_setup(); - mt_register(mt_new_va("destroy_road", "unit:unit", "from:region", "to:region", MT_NEW_END)); + mt_create_va(mt_new("destroy_road", NULL), "unit:unit", "from:region", "to:region", MT_NEW_END); r2 = test_create_region(1, 0, 0); r = test_create_region(0, 0, NULL); rsetroad(r, D_EAST, 100); diff --git a/src/kernel/messages.c b/src/kernel/messages.c index 9875d303e..e0513b00d 100644 --- a/src/kernel/messages.c +++ b/src/kernel/messages.c @@ -82,8 +82,8 @@ struct message *msg_feedback(const struct unit *u, struct order *ord, if (!mtype) { log_warning("trying to create message of unknown type \"%s\"\n", name); if (!mt_find("missing_feedback")) { - mt_register(mt_new_va("missing_feedback", "unit:unit", - "region:region", "command:order", "name:string", MT_NEW_END)); + mt_create_va(mt_new("missing_feedback", NULL), "unit:unit", + "region:region", "command:order", "name:string", MT_NEW_END); } return msg_message("missing_feedback", "name unit region command", name, u, u->region, ord); @@ -153,7 +153,7 @@ static message *missing_message(const char *name) { log_warning("trying to create undefined message of type \"%s\"\n", name); if (strcmp(name, "missing_message") != 0) { if (!mt_find("missing_message")) { - mt_register(mt_new_va("missing_message", "name:string", MT_NEW_END)); + mt_create_va(mt_new("missing_message", NULL), "name:string", MT_NEW_END); } return msg_message("missing_message", "name", name); } diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c index ad6a08071..961d2e63a 100644 --- a/src/kernel/messages.test.c +++ b/src/kernel/messages.test.c @@ -22,10 +22,10 @@ void test_missing_message(CuTest *tc) { void test_message(CuTest *tc) { message *msg; - message_type *mtype = mt_new("custom", NULL); + message_type *mtype; test_setup(); - mt_register(mtype); + mtype = mt_create(mt_new("custom", NULL), NULL); CuAssertPtrEquals(tc, mtype, (void *)mt_find("custom")); CuAssertIntEquals(tc, 0, mtype->nparameters); CuAssertPtrEquals(tc, NULL, (void *)mtype->pnames); @@ -47,11 +47,11 @@ void test_message(CuTest *tc) { static void test_merge_split(CuTest *tc) { message_list *mlist = 0, *append = 0; struct mlist **split; /* TODO: why is this a double asterisk? */ - message_type *mtype = mt_new("custom", NULL); + message_type *mtype; message *msg; test_setup(); - mt_register(mtype); + mtype = mt_create(mt_new("custom", NULL), NULL); add_message(&mlist, msg = msg_message(mtype->name, "")); msg_release(msg); add_message(&append, msg = msg_message(mtype->name, "")); diff --git a/src/laws.test.c b/src/laws.test.c index f9b4cfcf3..8d13b7c81 100644 --- a/src/laws.test.c +++ b/src/laws.test.c @@ -258,7 +258,7 @@ static void test_force_leave_buildings(CuTest *tc) { building * b; test_setup(); - mt_register(mt_new_va("force_leave_building", "unit:unit", "owner:unit", "building:building", MT_NEW_END)); + mt_create_va(mt_new("force_leave_building", NULL), "unit:unit", "owner:unit", "building:building", MT_NEW_END); r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION)); u1 = test_create_unit(test_create_faction(NULL), r); u2 = test_create_unit(u1->faction, r); @@ -288,7 +288,7 @@ static void test_force_leave_ships(CuTest *tc) { ship *sh; test_setup(); - mt_register(mt_new_va("force_leave_ship", "unit:unit", "owner:unit", "ship:ship", MT_NEW_END)); + mt_create_va(mt_new("force_leave_ship", NULL), "unit:unit", "owner:unit", "ship:ship", MT_NEW_END); r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION)); u1 = test_create_unit(test_create_faction(NULL), r); u2 = test_create_unit(test_create_faction(NULL), r); @@ -876,7 +876,7 @@ static void test_luck_message(CuTest *tc) { attrib *a; test_setup(); - mt_register(mt_new_va("peasantluck_success", "births:int", MT_NEW_END)); + mt_create_va(mt_new("peasantluck_success", NULL), "births:int", MT_NEW_END); setup_terrains(tc); r = test_create_region(0, 0, NULL); rsetpeasants(r, 1); @@ -901,8 +901,8 @@ static unit * setup_name_cmd(void) { faction *f; test_setup(); - mt_register(mt_new_va("renamed_building_seen", "renamer:unit", "region:region", "building:building", MT_NEW_END)); - mt_register(mt_new_va("renamed_building_notseen", "region:region", "building:building", MT_NEW_END)); + mt_create_va(mt_new("renamed_building_seen", NULL), "renamer:unit", "region:region", "building:building", MT_NEW_END); + mt_create_va(mt_new("renamed_building_notseen", NULL), "region:region", "building:building", MT_NEW_END); f = test_create_faction(NULL); return test_create_unit(f, test_create_region(0, 0, NULL)); } @@ -1301,9 +1301,9 @@ static void test_ally_cmd(CuTest *tc) { static void test_nmr_warnings(CuTest *tc) { faction *f1, *f2; test_setup(); - mt_register(mt_new_va("nmr_warning", MT_NEW_END)); - mt_register(mt_new_va("nmr_warning_final", MT_NEW_END)); - mt_register(mt_new_va("warn_dropout", "faction:faction", "turn:int", MT_NEW_END)); + mt_create_va(mt_new("nmr_warning", NULL), MT_NEW_END); + mt_create_va(mt_new("nmr_warning_final", NULL), MT_NEW_END); + mt_create_va(mt_new("warn_dropout", NULL), "faction:faction", "turn:int", MT_NEW_END); config_set("nmr.timeout", "3"); f1 = test_create_faction(NULL); f2 = test_create_faction(NULL); @@ -1325,9 +1325,9 @@ static unit * setup_mail_cmd(void) { faction *f; test_setup(); - mt_register(mt_new_va("regionmessage", "region:region", "sender:unit", "string:string", MT_NEW_END)); - mt_register(mt_new_va("unitmessage", "region:region", "sender:unit", "string:string", "unit:unit", MT_NEW_END)); - mt_register(mt_new_va("mail_result", "message:string", "unit:unit", MT_NEW_END)); + mt_create_va(mt_new("regionmessage", NULL), "region:region", "sender:unit", "string:string", MT_NEW_END); + mt_create_va(mt_new("unitmessage", NULL), "region:region", "sender:unit", "string:string", "unit:unit", MT_NEW_END); + mt_create_va(mt_new("mail_result", NULL), "message:string", "unit:unit", MT_NEW_END); f = test_create_faction(NULL); return test_create_unit(f, test_create_region(0, 0, NULL)); } @@ -1444,7 +1444,7 @@ static void test_show_without_item(CuTest *tc) struct locale *loc; test_setup(); - mt_register(mt_new_va("displayitem", "weight:int", "item:resource", "description:string", MT_NEW_END)); + mt_create_va(mt_new("displayitem", NULL), "weight:int", "item:resource", "description:string", MT_NEW_END); loc = get_or_create_locale("de"); locale_setstring(loc, parameters[P_ANY], "ALLE"); @@ -1489,7 +1489,7 @@ static void test_show_race(CuTest *tc) { test_setup(); - mt_register(mt_new_va("msg_event", "string:string", MT_NEW_END)); + mt_create_va(mt_new("msg_event", NULL), "string:string", MT_NEW_END); test_create_race("human"); rc = test_create_race("elf"); @@ -1529,8 +1529,8 @@ static void test_show_both(CuTest *tc) { message * msg; test_setup(); - mt_register(mt_new_va("msg_event", "string:string", MT_NEW_END)); - mt_register(mt_new_va("displayitem", "weight:int", "item:resource", "description:string", MT_NEW_END)); + mt_create_va(mt_new("msg_event", NULL), "string:string", MT_NEW_END); + mt_create_va(mt_new("displayitem", NULL), "weight:int", "item:resource", "description:string", MT_NEW_END); rc = test_create_race("elf"); test_create_itemtype("elvenhorse"); diff --git a/src/market.test.c b/src/market.test.c index 452f75091..4877dbf29 100644 --- a/src/market.test.c +++ b/src/market.test.c @@ -33,7 +33,7 @@ static void test_market_curse(CuTest * tc) building_type *btype; test_setup(); - mt_register(mt_new_va("buyamount", "unit:unit", "amount:int", "resource:resource", MT_NEW_END)); + mt_create_va(mt_new("buyamount", NULL), "unit:unit", "amount:int", "resource:resource", MT_NEW_END); htype = test_create_itemtype("herb"); htype->flags |= ITF_HERB; diff --git a/src/monsters.test.c b/src/monsters.test.c index 8fe9a6b7f..54b3f7f87 100644 --- a/src/monsters.test.c +++ b/src/monsters.test.c @@ -51,7 +51,8 @@ static void create_monsters(unit **up, unit **um) { region *r; faction *fp, *fm; - mt_register(mt_new_va("dragon_growl", "dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END)); + mt_create_va(mt_new("dragon_growl", NULL), + "dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END); test_create_horse(); default_locale = test_create_locale(); fp = test_create_faction(NULL); @@ -223,8 +224,6 @@ static void test_dragon_moves(CuTest * tc) plan_monsters(m->faction); CuAssertPtrNotNull(tc, find_order("move east", m)); - mt_register(mt_new_va("dragon_growl", "dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END)); - random_growl(m, findregion(1, 0), 3); msg = test_get_last_message(r->msgs); diff --git a/src/move.test.c b/src/move.test.c index 07fde591c..a2fa4e760 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -28,8 +28,10 @@ #include static void setup_move(void) { - mt_register(mt_new_va("travel", "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END)); - mt_register(mt_new_va("moveblocked", "unit:unit", "direction:int", MT_NEW_END)); + mt_create_va(mt_new("travel", NULL), + "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END); + mt_create_va(mt_new("moveblocked", NULL), + "unit:unit", "direction:int", MT_NEW_END); } static void test_ship_not_allowed_in_coast(CuTest * tc) @@ -285,9 +287,12 @@ void setup_drift (struct drift_fixture *fix) { u_set_ship(fix->u, fix->sh = test_create_ship(fix->u->region, fix->st_boat)); assert(fix->sh); - mt_register(mt_new_va("ship_drift", "ship:ship", "dir:int", MT_NEW_END)); - mt_register(mt_new_va("shipsink", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("massive_overload", "ship:ship", MT_NEW_END)); + mt_create_va(mt_new("ship_drift", NULL), + "ship:ship", "dir:int", MT_NEW_END); + mt_create_va(mt_new("shipsink", NULL), + "ship:ship", MT_NEW_END); + mt_create_va(mt_new("massive_overload", NULL), + "ship:ship", MT_NEW_END); } static void test_ship_no_overload(CuTest *tc) { @@ -482,7 +487,8 @@ static void test_follow_ship_msg(CuTest * tc) { td->dir = D_NORTHWEST; td->age = 2; - mt_register(mt_new_va("error18", "unit:unit", "region:region", "command:order", MT_NEW_END)); + mt_create_va(mt_new("error18", NULL), + "unit:unit", "region:region", "command:order", MT_NEW_END); init_order_depr(ord); getstrtoken(); diff --git a/src/orderfile.test.c b/src/orderfile.test.c index 11eb9ea7b..ca98fdeb0 100644 --- a/src/orderfile.test.c +++ b/src/orderfile.test.c @@ -64,7 +64,7 @@ static void test_faction_password_bad(CuTest *tc) { const char *orders[] = { "ERESSEA 1 password", NULL }; test_setup(); - mt_register(mt_new_va("wrongpasswd", "password:string", MT_NEW_END)); + mt_create_va(mt_new("wrongpasswd", NULL), "password:string", MT_NEW_END); f = test_create_faction(NULL); renumber_faction(f, 1); diff --git a/src/piracy.test.c b/src/piracy.test.c index 110dc3dcf..096e267b7 100644 --- a/src/piracy.test.c +++ b/src/piracy.test.c @@ -30,12 +30,18 @@ static void setup_piracy(void) { st_boat = test_create_shiptype("boat"); st_boat->cargo = 1000; - mt_register(mt_new_va("piratenovictim", "ship:ship", "unit:unit", "region:region", MT_NEW_END)); - mt_register(mt_new_va("piratesawvictim", "ship:ship", "unit:unit", "region:region", "dir:int", MT_NEW_END)); - mt_register(mt_new_va("shipsail", "ship:ship", "from:region", "to:region", MT_NEW_END)); - mt_register(mt_new_va("shipfly", "ship:ship", "from:region", "to:region", MT_NEW_END)); - mt_register(mt_new_va("shipnoshore", "ship:ship", "region:region", MT_NEW_END)); - mt_register(mt_new_va("travel", "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END)); + mt_create_va(mt_new("piratenovictim", NULL), + "ship:ship", "unit:unit", "region:region", MT_NEW_END); + mt_create_va(mt_new("piratesawvictim", NULL), + "ship:ship", "unit:unit", "region:region", "dir:int", MT_NEW_END); + mt_create_va(mt_new("shipsail", NULL), + "ship:ship", "from:region", "to:region", MT_NEW_END); + mt_create_va(mt_new("shipfly", NULL), + "ship:ship", "from:region", "to:region", MT_NEW_END); + mt_create_va(mt_new("shipnoshore", NULL), + "ship:ship", "region:region", MT_NEW_END); + mt_create_va(mt_new("travel", NULL), + "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END); } static void setup_pirate(unit **pirate, int p_r_flags, int p_rc_flags, const char *p_shiptype, diff --git a/src/renumber.test.c b/src/renumber.test.c index f176cc3d2..98ca9b48b 100644 --- a/src/renumber.test.c +++ b/src/renumber.test.c @@ -38,7 +38,7 @@ static void test_renumber_faction_duplicate(CuTest *tc) { const struct locale *lang; test_setup_ex(tc); - mt_register(mt_new_va("renumber_inuse", "id:int", MT_NEW_END)); + mt_create_va(mt_new("renumber_inuse", NULL), "id:int", MT_NEW_END); f2 = test_create_faction(NULL); u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL)); no = f->no; diff --git a/src/report.c b/src/report.c index 00089421a..4aee1eb2c 100644 --- a/src/report.c +++ b/src/report.c @@ -714,16 +714,17 @@ static void rp_messages(struct stream *out, message_list * msgs, faction * viewer, int indent, bool categorized) { - nrsection *section; - - if (!msgs) + int i; + if (!msgs) { return; - for (section = sections; section; section = section->next) { + } + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + const char * section = sections[i]; int k = 0; struct mlist *m = msgs->begin; while (m) { /* messagetype * mt = m->type; */ - if (!categorized || strcmp(nrt_section(m->msg->type), section->name) == 0) { + if (!categorized || strcmp(m->msg->type->section, section) == 0) { char lbuf[8192]; if (!k && categorized) { @@ -731,14 +732,14 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden char cat_identifier[24]; newline(out); - sprintf(cat_identifier, "section_%s", section->name); + sprintf(cat_identifier, "section_%s", section); section_title = LOC(viewer->locale, cat_identifier); if (section_title) { centre(out, section_title, true); newline(out); } else { - log_error("no title defined for section %s in locale %s", section->name, locale_name(viewer->locale)); + log_error("no title defined for section %s in locale %s", section, locale_name(viewer->locale)); } k = 1; } diff --git a/src/spells.test.c b/src/spells.test.c index dc0644ecc..e6150cb46 100644 --- a/src/spells.test.c +++ b/src/spells.test.c @@ -130,8 +130,10 @@ static void test_view_reality(CuTest *tc) { test_setup(); setup_spells(); - mt_register(mt_new_va("spell_astral_only", "unit:unit", "region:region", "command:order", MT_NEW_END)); - mt_register(mt_new_va("viewreality_effect", "unit:unit", MT_NEW_END)); + mt_create_va(mt_new("spell_astral_only", NULL), + "unit:unit", "region:region", "command:order", MT_NEW_END); + mt_create_va(mt_new("viewreality_effect", NULL), + "unit:unit", MT_NEW_END); r = test_create_region(0, 0, NULL); ra = test_create_region(real2tp(r->x), real2tp(r->y), NULL); ra->_plane = get_astralplane(); diff --git a/src/spells/flyingship.test.c b/src/spells/flyingship.test.c index 4440c5fdf..1b1c4d7a1 100644 --- a/src/spells/flyingship.test.c +++ b/src/spells/flyingship.test.c @@ -29,7 +29,8 @@ static void test_flyingship(CuTest * tc) ship *sh1, *sh2; test_setup(); - mt_register(mt_new_va("flying_ship_result", "mage:unit", "ship:ship", MT_NEW_END)); + mt_create_va(mt_new("flying_ship_result", NULL), + "mage:unit", "ship:ship", MT_NEW_END); par.param = &par_data_ptr; par_data.typ = SPP_SHIP; diff --git a/src/spells/magicresistance.test.c b/src/spells/magicresistance.test.c index 86a66bc0e..cbfdeb4af 100644 --- a/src/spells/magicresistance.test.c +++ b/src/spells/magicresistance.test.c @@ -29,7 +29,8 @@ static void test_magicresistance_unit(CuTest *tc) { curse *c; test_setup(); - mt_register(mt_new_va("magicresistance_unit", "unit:unit", "id:int", MT_NEW_END)); + mt_create_va(mt_new("magicresistance_unit", NULL), + "unit:unit", "id:int", MT_NEW_END); r = test_create_plain(0, 0); f1 = test_create_faction(NULL); u1 = test_create_unit(f1, r); @@ -57,7 +58,8 @@ static void test_magicresistance_building(CuTest *tc) { curse *c; test_setup(); - mt_register(mt_new_va("magicresistance_building", "building:building", "id:int", MT_NEW_END)); + mt_create_va(mt_new("magicresistance_building", NULL), + "building:building", "id:int", MT_NEW_END); r = test_create_plain(0, 0); f1 = test_create_faction(NULL); u1 = test_create_unit(f1, r); diff --git a/src/spy.test.c b/src/spy.test.c index 3c4503c98..ed10c4b7e 100644 --- a/src/spy.test.c +++ b/src/spy.test.c @@ -33,19 +33,32 @@ typedef struct { } spy_fixture; static void setup_spy(spy_fixture *fix) { - mt_register(mt_new_va("spyreport", "spy:unit", "target:unit", "status:int", MT_NEW_END)); - mt_register(mt_new_va("spyreport_mage", "spy:unit", "target:unit", "type:int", MT_NEW_END)); - mt_register(mt_new_va("spyreport_faction", "spy:unit", "target:unit", "faction:faction", MT_NEW_END)); - mt_register(mt_new_va("spyreport_skills", "spy:unit", "target:unit", "skills:string", MT_NEW_END)); - mt_register(mt_new_va("spyreport_items", "spy:unit", "target:unit", "items:items", MT_NEW_END)); - mt_register(mt_new_va("destroy_ship_0", "unit:unit", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("destroy_ship_1", "unit:unit", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("destroy_ship_2", "unit:unit", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("destroy_ship_3", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("destroy_ship_4", "ship:ship", MT_NEW_END)); - mt_register(mt_new_va("sink_msg", "ship:ship", "region:region", MT_NEW_END)); - mt_register(mt_new_va("sink_lost_msg", "unit:unit", "region:region", "dead:int", MT_NEW_END)); - mt_register(mt_new_va("sink_saved_msg", "unit:unit", "region:region", MT_NEW_END)); + mt_create_va(mt_new("spyreport", NULL), + "spy:unit", "target:unit", "status:int", MT_NEW_END); + mt_create_va(mt_new("spyreport_mage", NULL), + "spy:unit", "target:unit", "type:int", MT_NEW_END); + mt_create_va(mt_new("spyreport_faction", NULL), + "spy:unit", "target:unit", "faction:faction", MT_NEW_END); + mt_create_va(mt_new("spyreport_skills", NULL), + "spy:unit", "target:unit", "skills:string", MT_NEW_END); + mt_create_va(mt_new("spyreport_items", NULL), + "spy:unit", "target:unit", "items:items", MT_NEW_END); + mt_create_va(mt_new("destroy_ship_0", NULL), + "unit:unit", "ship:ship", MT_NEW_END); + mt_create_va(mt_new("destroy_ship_1", NULL), + "unit:unit", "ship:ship", MT_NEW_END); + mt_create_va(mt_new("destroy_ship_2", NULL), + "unit:unit", "ship:ship", MT_NEW_END); + mt_create_va(mt_new("destroy_ship_3", NULL), + "ship:ship", MT_NEW_END); + mt_create_va(mt_new("destroy_ship_4", NULL), + "ship:ship", MT_NEW_END); + mt_create_va(mt_new("sink_msg", NULL), + "ship:ship", "region:region", MT_NEW_END); + mt_create_va(mt_new("sink_lost_msg", NULL), + "unit:unit", "region:region", "dead:int", MT_NEW_END); + mt_create_va(mt_new("sink_saved_msg", NULL), + "unit:unit", "region:region", MT_NEW_END); if (fix) { fix->r = test_create_region(0, 0, NULL); diff --git a/src/study.test.c b/src/study.test.c index 46722c0f6..c1d0b0841 100644 --- a/src/study.test.c +++ b/src/study.test.c @@ -58,9 +58,12 @@ typedef struct { } study_fixture; static void setup_study(void) { - mt_register(mt_new_va("studycost", "unit:unit", "region:region", "cost:int", "skill:int", MT_NEW_END)); - mt_register(mt_new_va("teach_teacher", "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END)); - mt_register(mt_new_va("teach_student", "teacher:unit", "student:unit", "skill:int", MT_NEW_END)); + mt_create_va(mt_new("studycost", NULL), + "unit:unit", "region:region", "cost:int", "skill:int", MT_NEW_END); + mt_create_va(mt_new("teach_teacher", NULL), + "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END); + mt_create_va(mt_new("teach_student", NULL), + "teacher:unit", "student:unit", "skill:int", MT_NEW_END); } static void setup_locale(struct locale *lang) { @@ -218,7 +221,8 @@ static void test_academy_building(CuTest *tc) { message * msg; test_setup(); - mt_register(mt_new_va("teach_asgood", "unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END)); + mt_create_va(mt_new("teach_asgood", NULL), + "unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END); random_source_inject_constant(0.0); init_resources(); @@ -636,8 +640,10 @@ static void test_teach_message(CuTest *tc) { teaching_info *teach; test_setup(); - mt_register(mt_new_va("teach_teacher", "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END)); - mt_register(mt_new_va("teach_student", "teacher:unit", "student:unit", "skill:int", MT_NEW_END)); + mt_create_va(mt_new("teach_teacher", NULL), + "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END); + mt_create_va(mt_new("teach_student", NULL), + "teacher:unit", "student:unit", "skill:int", MT_NEW_END); init_resources(); u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL)); scale_number(u, 20); diff --git a/src/tests.c b/src/tests.c index 306148af2..09f533a9f 100644 --- a/src/tests.c +++ b/src/tests.c @@ -246,9 +246,12 @@ static void test_reset(void) { } random_source_reset(); - mt_register(mt_new_va("changepasswd", "value:string", MT_NEW_END)); - mt_register(mt_new_va("starvation", "unit:unit", "region:region", "dead:int", "live:int", MT_NEW_END)); - mt_register(mt_new_va("malnourish", "unit:unit", "region:region", MT_NEW_END)); + mt_create_va(mt_new("changepasswd", NULL), + "value:string", MT_NEW_END); + mt_create_va(mt_new("starvation", NULL), + "unit:unit", "region:region", "dead:int", "live:int", MT_NEW_END); + mt_create_va(mt_new("malnourish", NULL), + "unit:unit", "region:region", MT_NEW_END); if (errno) { int error = errno; diff --git a/src/triggers/shock.test.c b/src/triggers/shock.test.c index dad675e64..43b8d394b 100644 --- a/src/triggers/shock.test.c +++ b/src/triggers/shock.test.c @@ -12,7 +12,8 @@ #include static void shock_setup(void) { - mt_register(mt_new_va("shock", "mage:unit", "reason:string", MT_NEW_END)); + mt_create_va(mt_new("shock", NULL), + "mage:unit", "reason:string", MT_NEW_END); } static void test_shock(CuTest *tc) { diff --git a/src/util/message.c b/src/util/message.c index 71795cfc7..0f8b7cc36 100644 --- a/src/util/message.c +++ b/src/util/message.c @@ -60,26 +60,34 @@ arg_type *find_argtype(const char *name) return NULL; } -message_type *mt_new(const char *name, const char *args[]) +static unsigned int mt_id(const message_type * mtype) +{ + unsigned int key = 0; + size_t i = strlen(mtype->name); + + while (i > 0) { + /* TODO: why not use str_hash? */ + key = (mtype->name[--i] + key * 37); + } + return key % 0x7FFFFFFF; +} + +#define MT_MAXHASH 1021 +static selist *messagetypes[MT_MAXHASH]; + +message_type *mt_create(message_type * mtype, const char *args[]) { int nparameters = 0; - message_type *mtype; + unsigned int hash = str_hash(mtype->name) % MT_MAXHASH; + selist **qlp = messagetypes + hash; - assert(name != NULL); - if (name == NULL) { - log_error("Trying to create message_type with name=0x0\n"); - return NULL; - } if (args != NULL) { /* count the number of parameters */ while (args[nparameters]) ++nparameters; } - mtype = (message_type *)malloc(sizeof(message_type)); - mtype->key = 0; - mtype->name = str_strdup(name); - mtype->nparameters = nparameters; if (nparameters > 0) { int i; + mtype->nparameters = nparameters; mtype->pnames = (char **)malloc(sizeof(char *) * nparameters); mtype->types = (arg_type **)malloc(sizeof(arg_type *) * nparameters); for (i = 0; args[i]; ++i) { @@ -103,20 +111,38 @@ message_type *mt_new(const char *name, const char *args[]) } } } - else { - mtype->pnames = NULL; - mtype->types = NULL; + if (selist_set_insert(qlp, mtype, NULL)) { + mtype->key = mt_id(mtype); } return mtype; } -message_type *mt_new_va(const char *name, ...) +message_type *mt_new(const char *name, const char *section) +{ + message_type *mtype; + + assert(name != NULL); + if (name == NULL) { + log_error("Trying to create message_type with name=0x0\n"); + return NULL; + } + mtype = (message_type *)malloc(sizeof(message_type)); + mtype->key = 0; + mtype->name = str_strdup(name); + mtype->section = section; + mtype->nparameters = 0; + mtype->pnames = NULL; + mtype->types = NULL; + return mtype; +} + +message_type *mt_create_va(message_type *mtype, ...) { const char *args[16]; int i = 0; va_list marker; - va_start(marker, name); + va_start(marker, mtype); for (;;) { const char *c = va_arg(marker, const char *); args[i++] = c; @@ -124,8 +150,8 @@ message_type *mt_new_va(const char *name, ...) break; } va_end(marker); - args[i] = 0; - return mt_new(name, args); + args[i] = NULL; + return mt_create(mtype, args); } static variant copy_arg(const arg_type * atype, variant data) @@ -165,9 +191,6 @@ message *msg_create(const struct message_type *mtype, variant args[]) return msg; } -#define MT_MAXHASH 1021 -static selist *messagetypes[MT_MAXHASH]; - static void mt_free(void *val) { message_type *mtype = (message_type *)val; int i; @@ -205,29 +228,6 @@ const message_type *mt_find(const char *name) return 0; } -static unsigned int mt_id(const message_type * mtype) -{ - unsigned int key = 0; - size_t i = strlen(mtype->name); - - while (i > 0) { - /* TODO: why not use str_hash? */ - key = (mtype->name[--i] + key * 37); - } - return key % 0x7FFFFFFF; -} - -const message_type *mt_register(message_type * type) -{ - unsigned int hash = str_hash(type->name) % MT_MAXHASH; - selist **qlp = messagetypes + hash; - - if (selist_set_insert(qlp, type, NULL)) { - type->key = mt_id(type); - } - return type; -} - void msg_free(message * msg) { int i; diff --git a/src/util/message.h b/src/util/message.h index 7521b8e24..41d58b448 100644 --- a/src/util/message.h +++ b/src/util/message.h @@ -29,6 +29,7 @@ extern "C" { typedef struct message_type { unsigned int key; char *name; + const char *section; int nparameters; char **pnames; struct arg_type ** types; @@ -43,8 +44,6 @@ extern "C" { void message_done(void); void mt_clear(void); - struct message_type *mt_new(const char *name, const char *args[]); - struct message_type *mt_new_va(const char *name, ...); #define MT_NEW_END ((const char *)0) /* mt_new("simple_sentence", "subject:string", "predicate:string", * "object:string", "lang:locale", MT_NEW_END); */ @@ -59,8 +58,10 @@ extern "C" { const char *mt_name(const struct message_type *mtype); + struct message_type *mt_new(const char *name, const char *section); /** message_type registry (optional): **/ - const struct message_type *mt_register(struct message_type *); + struct message_type *mt_create(struct message_type *, const char *args[]); + struct message_type *mt_create_va(struct message_type *, ...); const struct message_type *mt_find(const char *); void register_argtype(const char *name, void(*free_arg) (variant), diff --git a/src/util/message.test.c b/src/util/message.test.c index 4b00b4006..df8c75126 100644 --- a/src/util/message.test.c +++ b/src/util/message.test.c @@ -8,8 +8,7 @@ static void test_mt_new(CuTest *tc) { message_type *mt; test_setup(); - mt = mt_new_va("test", "name:string", "number:int", MT_NEW_END); - mt_register(mt); + mt = mt_create_va(mt_new("test", NULL), "name:string", "number:int", MT_NEW_END); CuAssertPtrNotNull(tc, mt); CuAssertStrEquals(tc, "test", mt->name); CuAssertIntEquals(tc, 2, mt->nparameters); diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 9461e11c5..047d3565b 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -30,7 +30,6 @@ typedef struct nrmessage_type { const struct message_type *mtype; char *vars; struct nrmessage_type *next; - const char *section; } nrmessage_type; #define NRT_MAXHASH 1021 @@ -66,41 +65,44 @@ static nrmessage_type *nrt_find(const struct message_type * mtype) return found; } -nrsection *sections; +char *sections[MAXSECTIONS]; -const nrsection *section_find(const char *name) +const char *section_find(const char *name) { - nrsection **mcp = §ions; - if (name == NULL) + int i; + + if (name == NULL) { return NULL; - for (; *mcp; mcp = &(*mcp)->next) { - nrsection *mc = *mcp; - if (!strcmp(mc->name, name)) - break; } - return *mcp; + + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + if (strcmp(sections[i], name) == 0) { + return sections[i]; + } + } + return NULL; } -const nrsection *section_add(const char *name) -{ - nrsection **mcp = §ions; - if (name == NULL) +const char *section_add(const char *name) { + int i; + if (name == NULL) { return NULL; - for (; *mcp; mcp = &(*mcp)->next) { - nrsection *mc = *mcp; - if (!strcmp(mc->name, name)) - break; } - if (!*mcp) { - nrsection *mc = calloc(sizeof(nrsection), 1); - mc->name = str_strdup(name); - *mcp = mc; + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + if (strcmp(sections[i], name) == 0) { + return sections[i]; + } } - return *mcp; + assert(i < MAXSECTIONS); + assert(sections[i] == NULL); + if (i + 1 < MAXSECTIONS) { + sections[i + 1] = NULL; + } + return sections[i] = str_strdup(name); } void -nrt_register(const struct message_type *mtype, const char *section) +nrt_register(const struct message_type *mtype) { unsigned int hash = mtype->key % NRT_MAXHASH; nrmessage_type *nrt = nrtypes[hash]; @@ -118,15 +120,6 @@ nrt_register(const struct message_type *mtype, const char *section) nrt = malloc(sizeof(nrmessage_type)); nrt->mtype = mtype; nrt->next = nrtypes[hash]; - if (section) { - const nrsection *s = section_find(section); - if (s == NULL) { - s = section_add(section); - } - nrt->section = s->name; - } - else - nrt->section = NULL; nrtypes[hash] = nrt; *c = '\0'; for (i = 0; i != mtype->nparameters; ++i) { @@ -159,12 +152,6 @@ size_t size, const void *userdata) return 0; } -const char *nrt_section(const struct message_type * mtype) -{ - nrmessage_type *nrt = nrt_find(mtype); - return nrt ? nrt->section : NULL; -} - void free_nrmesssages(void) { int i; for (i = 0; i != NRT_MAXHASH; ++i) { diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index 357e5d5c5..c0d9257aa 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -25,19 +25,14 @@ extern "C" { struct message_type; struct nrmessage_type; - typedef struct nrsection { - char *name; - struct nrsection *next; - } nrsection; - - extern nrsection *sections; +#define MAXSECTIONS 8 + extern char *sections[MAXSECTIONS]; void free_nrmesssages(void); - void nrt_register(const struct message_type *mtype, const char *section); + void nrt_register(const struct message_type *mtype); const char *nrt_string(const struct message_type *mtype, const struct locale *lang); - const char *nrt_section(const struct message_type *mtype); size_t nr_render(const struct message *msg, const struct locale *lang, char *buffer, size_t size, const void *userdata); diff --git a/src/volcano.test.c b/src/volcano.test.c index 8a8358c1c..c62febc0d 100644 --- a/src/volcano.test.c +++ b/src/volcano.test.c @@ -20,7 +20,8 @@ static void test_volcano_update(CuTest *tc) { const struct terrain_type *t_volcano, *t_active; test_setup(); - mt_register(mt_new_va("volcanostopsmoke", "region:region", MT_NEW_END)); + mt_create_va(mt_new("volcanostopsmoke", NULL), + "region:region", MT_NEW_END); t_volcano = test_create_terrain("volcano", LAND_REGION); t_active = test_create_terrain("activevolcano", LAND_REGION); r = test_create_region(0, 0, t_active); @@ -42,9 +43,12 @@ static void test_volcano_outbreak(CuTest *tc) { const struct terrain_type *t_volcano, *t_active; test_setup(); - mt_register(mt_new_va("volcanooutbreak", "regionv:region", "regionn:region", MT_NEW_END)); - mt_register(mt_new_va("volcanooutbreaknn", "region:region", MT_NEW_END)); - mt_register(mt_new_va("volcano_dead", "unit:unit", "region:region", "dead:int", MT_NEW_END)); + mt_create_va(mt_new("volcanooutbreak", NULL), + "regionv:region", "regionn:region", MT_NEW_END); + mt_create_va(mt_new("volcanooutbreaknn", NULL), + "region:region", MT_NEW_END); + mt_create_va(mt_new("volcano_dead", NULL), + "unit:unit", "region:region", "dead:int", MT_NEW_END); t_volcano = test_create_terrain("volcano", LAND_REGION); t_active = test_create_terrain("activevolcano", LAND_REGION); r = test_create_region(0, 0, t_active); diff --git a/src/wormhole.test.c b/src/wormhole.test.c index e275d4d67..b8baaa79a 100644 --- a/src/wormhole.test.c +++ b/src/wormhole.test.c @@ -19,10 +19,14 @@ void sort_wormhole_regions(selist *rlist, region **match, int count); void make_wormholes(region **match, int count, const building_type *bt_wormhole); static void setup_wormholes(void) { - mt_register(mt_new_va("wormhole_appear", "region:region", MT_NEW_END)); - mt_register(mt_new_va("wormhole_dissolve", "region:region", MT_NEW_END)); - mt_register(mt_new_va("wormhole_exit", "unit:unit", "region:region", MT_NEW_END)); - mt_register(mt_new_va("wormhole_requirements", "unit:unit", "region:region", MT_NEW_END)); + mt_create_va(mt_new("wormhole_appear", NULL), + "region:region", MT_NEW_END); + mt_create_va(mt_new("wormhole_dissolve", NULL), + "region:region", MT_NEW_END); + mt_create_va(mt_new("wormhole_exit", NULL), + "unit:unit", "region:region", MT_NEW_END); + mt_create_va(mt_new("wormhole_requirements", NULL), + "unit:unit", "region:region", MT_NEW_END); } static void test_make_wormholes(CuTest *tc) { diff --git a/src/xmlreader.c b/src/xmlreader.c index 88ab51237..8ba33db84 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1304,18 +1304,28 @@ static int parse_messages(xmlDocPtr doc) xmlXPathFreeObject(result); /* add the messagetype */ + propSection = xmlGetProp(node, BAD_CAST "section"); + if (propSection == NULL) { + propSection = BAD_CAST default_section; + } + propValue = xmlGetProp(node, BAD_CAST "name"); mtype = mt_find((const char *)propValue); if (mtype == NULL) { - mtype = mt_register(mt_new((const char *)propValue, (const char **)argv)); + mtype = mt_create(mt_new((const char *)propValue, (const char *)propSection), (const char **)argv); } else { assert(argv != NULL || !"cannot redefine arguments of message now"); } xmlFree(propValue); - /* register the type for the CR */ + if (propSection != BAD_CAST default_section) { + xmlFree(propSection); + } + + /* register the type for CR and NR */ crt_register(mtype); + nrt_register(mtype); /* let's clean up the mess */ if (argv != NULL) { @@ -1323,16 +1333,6 @@ static int parse_messages(xmlDocPtr doc) free(argv[k]); free(argv); } - - propSection = xmlGetProp(node, BAD_CAST "section"); - if (propSection == NULL) { - propSection = BAD_CAST default_section; - } - nrt_register(mtype, (const char *)propSection); - - if (propSection != BAD_CAST default_section) { - xmlFree(propSection); - } } xmlXPathFreeObject(messages); From 6b0f75339f0c31402277d59eaea5b94e9fc11015 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 20:42:22 +0200 Subject: [PATCH 210/231] message parsing from exparse is working, but allocates too much. --- src/exparse.c | 88 +++++++++++++++++++++++++++++--------- src/kernel/messages.test.c | 4 +- src/util/message.c | 23 ++++++---- src/util/message.h | 8 ++-- src/xmlreader.c | 16 ++++--- 5 files changed, 97 insertions(+), 42 deletions(-) diff --git a/src/exparse.c b/src/exparse.c index e323bb74c..271443c05 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -17,6 +17,8 @@ #include "util/functions.h" #include "util/log.h" #include "util/message.h" +#include "util/crmessage.h" +#include "util/nrmessage.h" #include "util/strings.h" #include @@ -285,8 +287,56 @@ static void handle_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **at wtype->flags = flags; } -static void XMLCALL start_messages(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static int msg_nargs; +static char * msg_args[MSG_MAXARGS]; + +static void end_messages(parseinfo *pi, const XML_Char *el) { if (xml_strcmp(el, "message") == 0) { + int i; + struct message_type *mtype = (struct message_type *)pi->object; + assert(mtype); + assert(msg_nargs < MSG_MAXARGS); + mt_create(mtype, (const char **)msg_args, msg_nargs); + /* register the type for CR and NR */ + crt_register(mtype); + nrt_register(mtype); + + for (i = 0; i != msg_nargs; ++i) { + free(msg_args[i]); + msg_args[i] = NULL; + } + msg_nargs = 0; + } + else if (xml_strcmp(el, "messages") == 0) { + pi->type = EXP_UNKNOWN; + } +} + +static void start_messages(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { + if (xml_strcmp(el, "arg") == 0) { + int i; + const XML_Char *name = NULL, *type = NULL; + + assert(msg_nargs < MSG_MAXARGS); + for (i = 0; attr[i]; i += 2) { + const XML_Char *key = attr[i], *val = attr[i + 1]; + if (xml_strcmp(key, "name") == 0) { + name = val; + } + else if (xml_strcmp(key, "type") == 0) { + type = val; + } + else { + handle_bad_input(pi, el, key); + } + } + if (name && type) { + char zBuffer[128]; + sprintf(zBuffer, "%s:%s", name, type); + msg_args[msg_nargs++] = str_strdup(zBuffer); + } + } + else if (xml_strcmp(el, "message") == 0) { const XML_Char *name = NULL, *section = NULL; int i; for (i = 0; attr[i]; i += 2) { @@ -297,18 +347,24 @@ static void XMLCALL start_messages(parseinfo *pi, const XML_Char *el, const XML_ else if (xml_strcmp(key, "section") == 0) { section = val; } + else { + handle_bad_input(pi, el, key); + } } if (name) { - pi->object = mt_new(name, NULL); + pi->object = mt_new(name, section); } } + else if (xml_strcmp(el, "type") != 0 && xml_strcmp(el, "text") != 0) { + handle_bad_input(pi, el, NULL); + } } #define MAX_COMPONENTS 8 static spell_component components[MAX_COMPONENTS]; static int ncomponents; -static void XMLCALL start_spells(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_spells(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "far", "variable", "ocean", "ship", "los", "unittarget", "shiptarget", "buildingtarget", "regiontarget", "globaltarget", NULL }; @@ -390,7 +446,7 @@ static void XMLCALL start_spells(parseinfo *pi, const XML_Char *el, const XML_Ch } } -static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_spellbooks(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { spellbook * sb = (spellbook *)pi->object; if (xml_strcmp(el, "spellbook") == 0) { const XML_Char *name = attr_get(attr, "name"); @@ -430,7 +486,7 @@ static void XMLCALL start_spellbooks(parseinfo *pi, const XML_Char *el, const XM } } -static void XMLCALL start_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_weapon(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { resource_type *rtype = (resource_type *)pi->object; assert(rtype && rtype->wtype); @@ -791,7 +847,7 @@ static void start_resources(parseinfo *pi, const XML_Char *el, const XML_Char ** } } -static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_ships(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "opensea", "fly", "nocoast", "speedy", NULL }; if (xml_strcmp(el, "ship") == 0) { const XML_Char *name; @@ -899,7 +955,7 @@ static void XMLCALL start_ships(parseinfo *pi, const XML_Char *el, const XML_Cha static int nattacks; static int nfamiliars; -static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { race *rc = (race *)pi->object; const char *flag_names[] = { "playerrace", "killpeasants", "scarepeasants", "!cansteal", @@ -1116,7 +1172,7 @@ static void XMLCALL start_races(parseinfo *pi, const XML_Char *el, const XML_Cha } } -static void XMLCALL start_buildings(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { +static void start_buildings(parseinfo *pi, const XML_Char *el, const XML_Char **attr) { const char *flag_names[] = { "nodestroy", "nobuild", "unique", "decay", "magic", "namechange", "fort", "oneperturn", NULL }; if (xml_strcmp(el, "building") == 0) { const XML_Char *name; @@ -1427,6 +1483,9 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { case EXP_SPELLS: end_spells(pi, el); break; + case EXP_MESSAGES: + end_messages(pi, el); + break; default: if (pi->depth == 1) { pi->object = NULL; @@ -1444,18 +1503,6 @@ static void XMLCALL handle_end(void *data, const XML_Char *el) { } } -static void XMLCALL handle_data(void *data, const XML_Char *xs, int len) { - parseinfo *pi = (parseinfo *)data; - if (len > 0) { - if (pi->type == EXP_MESSAGES && pi->depth == 4) { - size_t bytes = (size_t)len; - pi->cdata = realloc(pi->cdata, pi->clength + bytes); - memcpy(pi->cdata + pi->clength, xs, bytes); - pi->clength = pi->clength + bytes; - } - } -} - int exparse_readfile(const char * filename) { XML_Parser xp; FILE *F; @@ -1469,7 +1516,6 @@ int exparse_readfile(const char * filename) { } xp = XML_ParserCreate("UTF-8"); XML_SetElementHandler(xp, handle_start, handle_end); - XML_SetCharacterDataHandler(xp, handle_data); XML_SetUserData(xp, &pi); memset(&pi, 0, sizeof(pi)); for (;;) { diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c index 961d2e63a..c017f6ec1 100644 --- a/src/kernel/messages.test.c +++ b/src/kernel/messages.test.c @@ -25,7 +25,7 @@ void test_message(CuTest *tc) { message_type *mtype; test_setup(); - mtype = mt_create(mt_new("custom", NULL), NULL); + mtype = mt_create(mt_new("custom", NULL), NULL, 0); CuAssertPtrEquals(tc, mtype, (void *)mt_find("custom")); CuAssertIntEquals(tc, 0, mtype->nparameters); CuAssertPtrEquals(tc, NULL, (void *)mtype->pnames); @@ -51,7 +51,7 @@ static void test_merge_split(CuTest *tc) { message *msg; test_setup(); - mtype = mt_create(mt_new("custom", NULL), NULL); + mtype = mt_create(mt_new("custom", NULL), NULL, 0); add_message(&mlist, msg = msg_message(mtype->name, "")); msg_release(msg); add_message(&append, msg = msg_message(mtype->name, "")); diff --git a/src/util/message.c b/src/util/message.c index 0f8b7cc36..b01993098 100644 --- a/src/util/message.c +++ b/src/util/message.c @@ -75,15 +75,22 @@ static unsigned int mt_id(const message_type * mtype) #define MT_MAXHASH 1021 static selist *messagetypes[MT_MAXHASH]; -message_type *mt_create(message_type * mtype, const char *args[]) -{ - int nparameters = 0; +static void mt_register(message_type * mtype) { unsigned int hash = str_hash(mtype->name) % MT_MAXHASH; selist **qlp = messagetypes + hash; - if (args != NULL) { + if (selist_set_insert(qlp, mtype, NULL)) { + mtype->key = mt_id(mtype); + } +} + +message_type *mt_create(message_type * mtype, const char *args[], int nparameters) +{ + if (args != NULL && args[nparameters]) { /* count the number of parameters */ - while (args[nparameters]) ++nparameters; + do { + ++nparameters; + } while (args[nparameters]); } if (nparameters > 0) { int i; @@ -111,9 +118,7 @@ message_type *mt_create(message_type * mtype, const char *args[]) } } } - if (selist_set_insert(qlp, mtype, NULL)) { - mtype->key = mt_id(mtype); - } + mt_register(mtype); return mtype; } @@ -151,7 +156,7 @@ message_type *mt_create_va(message_type *mtype, ...) } va_end(marker); args[i] = NULL; - return mt_create(mtype, args); + return mt_create(mtype, args, i - 1); } static variant copy_arg(const arg_type * atype, variant data) diff --git a/src/util/message.h b/src/util/message.h index 41d58b448..40cc09086 100644 --- a/src/util/message.h +++ b/src/util/message.h @@ -18,6 +18,9 @@ extern "C" { #endif +#define MSG_MAXARGS 8 +#define MT_NEW_END ((const char *)0) + typedef struct arg_type { struct arg_type *next; variant_type vtype; @@ -44,9 +47,6 @@ extern "C" { void message_done(void); void mt_clear(void); -#define MT_NEW_END ((const char *)0) - /* mt_new("simple_sentence", "subject:string", "predicate:string", - * "object:string", "lang:locale", MT_NEW_END); */ struct message *msg_create(const struct message_type *type, variant args[]); @@ -60,7 +60,7 @@ extern "C" { struct message_type *mt_new(const char *name, const char *section); /** message_type registry (optional): **/ - struct message_type *mt_create(struct message_type *, const char *args[]); + struct message_type *mt_create(struct message_type *, const char *args[], int nargs); struct message_type *mt_create_va(struct message_type *, ...); const struct message_type *mt_find(const char *); diff --git a/src/xmlreader.c b/src/xmlreader.c index 8ba33db84..2decd9cb5 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1277,7 +1277,7 @@ static int parse_messages(xmlDocPtr doc) xmlChar *propSection; xmlChar *propValue; xmlXPathObjectPtr result; - int k; + int nargs = 0; char **argv = NULL; const message_type *mtype; @@ -1285,8 +1285,10 @@ static int parse_messages(xmlDocPtr doc) xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "type/arg", xpath); if (result->nodesetval && result->nodesetval->nodeNr > 0) { - argv = malloc(sizeof(char *) * (result->nodesetval->nodeNr + 1)); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { + int k; + nargs = result->nodesetval->nodeNr; + argv = malloc(sizeof(char *) * (nargs + 1)); + for (k = 0; k != nargs; ++k) { xmlNodePtr node = result->nodesetval->nodeTab[k]; char zBuffer[128]; xmlChar *propName, *propType; @@ -1299,7 +1301,7 @@ static int parse_messages(xmlDocPtr doc) xmlFree(propType); argv[k] = str_strdup(zBuffer); } - argv[result->nodesetval->nodeNr] = NULL; + argv[nargs] = NULL; } xmlXPathFreeObject(result); @@ -1312,7 +1314,7 @@ static int parse_messages(xmlDocPtr doc) propValue = xmlGetProp(node, BAD_CAST "name"); mtype = mt_find((const char *)propValue); if (mtype == NULL) { - mtype = mt_create(mt_new((const char *)propValue, (const char *)propSection), (const char **)argv); + mtype = mt_create(mt_new((const char *)propValue, (const char *)propSection), (const char **)argv, nargs); } else { assert(argv != NULL || !"cannot redefine arguments of message now"); @@ -1329,8 +1331,10 @@ static int parse_messages(xmlDocPtr doc) /* let's clean up the mess */ if (argv != NULL) { - for (k = 0; argv[k] != NULL; ++k) + int k; + for (k = 0; argv[k] != NULL; ++k) { free(argv[k]); + } free(argv); } } From f5d6e6ac6e2a8bb4cc52c1ad053421ac91236a2a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 20:43:22 +0200 Subject: [PATCH 211/231] we do not need xmlreader anymore! --- src/xmlreader.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/xmlreader.c b/src/xmlreader.c index 2decd9cb5..5a11eaf91 100644 --- a/src/xmlreader.c +++ b/src/xmlreader.c @@ -1354,8 +1354,6 @@ void register_xmlreader(void) xml_register_callback(parse_spellbooks); xml_register_callback(parse_spells); xml_register_callback(parse_races); -#endif - - xml_register_callback(parse_messages); +#endif } From ce37fd1bb7c77f3f3616973405d9fe7dbc60f8c0 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:14:14 +0200 Subject: [PATCH 212/231] remove libxml2 from dependencies remove the converter, that isn't a way we're going. --- CMakeLists.txt | 4 +- src/CMakeLists.txt | 29 +- src/bindings.c | 23 - src/convert.c | 37 -- src/eressea.c | 2 - src/gmtool.c | 1 - src/jsonconf.c | 12 +- src/kernel/build.c | 1 - src/kernel/config.c | 6 - src/kernel/ship.c | 1 - src/spells.c | 1 - src/util/CMakeLists.txt | 2 - src/util/xml.c | 131 ---- src/util/xml.h | 39 -- src/xmlreader.c | 1361 --------------------------------------- src/xmlreader.h | 28 - 16 files changed, 4 insertions(+), 1674 deletions(-) delete mode 100644 src/convert.c delete mode 100644 src/util/xml.c delete mode 100644 src/util/xml.h delete mode 100644 src/xmlreader.c delete mode 100644 src/xmlreader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f73ba04a1..4b91565da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,8 +50,7 @@ else() find_package (SQLite3 REQUIRED QUIET) endif() -find_package(EXPAT) -find_package (LibXml2 REQUIRED) +find_package(EXPAT REQUIRED) find_package (ToLua REQUIRED) if (TOLUA_FOUND) if (${TOLUA_VERSION_STRING} VERSION_EQUAL "5.2") @@ -71,6 +70,7 @@ add_subdirectory (process) add_subdirectory (src eressea) install(DIRECTORY etc DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.txt") +install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.po") install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.xml") install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.json") install(DIRECTORY scripts DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.lua") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 21d07e9b2..5b267c0d5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -111,6 +111,7 @@ set (ERESSEA_SRC report.c steal.c economy.c + exparse.c give.c items.c laws.c @@ -127,7 +128,6 @@ set (ERESSEA_SRC travelthru.c monsters.c wormhole.c - xmlreader.c ${SPELLS_SRC} ${RACES_SRC} ${ITEMS_SRC} @@ -139,11 +139,6 @@ set (ERESSEA_SRC ${UTIL_SRC} ) -IF(EXPAT_FOUND) -set (ERESSEA_SRC ${ERESSEA_SRC} exparse.c) -ENDIF(EXPAT_FOUND) - - set(SERVER_SRC main.c console.c @@ -187,15 +182,6 @@ target_link_libraries(eressea ${INIPARSER_LIBRARIES} ) -add_executable(convert convert.c) -target_link_libraries(convert - game - ${LUA_MATH_LIBRARY} - ${STORAGE_LIBRARIES} - ${CLIBS_LIBRARIES} - ${INIPARSER_LIBRARIES} -) - set(TESTS_SRC test_eressea.c tests.c @@ -235,7 +221,6 @@ set(TESTS_SRC volcano.test.c vortex.test.c wormhole.test.c -# xmlreader.test.c spells/flyingship.test.c spells/magicresistance.test.c triggers/shock.test.c @@ -285,18 +270,15 @@ endif(HAVE_STRDUP) if (HAVE_LIBBSD) target_link_libraries(test_eressea bsd) target_link_libraries(eressea bsd) -target_link_libraries(convert bsd) endif (HAVE_LIBBSD) if (SQLITE3_FOUND) include_directories (${SQLITE3_INCLUDE_DIR}) target_link_libraries(eressea ${SQLITE3_LIBRARIES}) -target_link_libraries(convert ${SQLITE3_LIBRARIES}) target_link_libraries(test_eressea ${SQLITE3_LIBRARIES}) add_definitions(-DUSE_SQLITE) elseif (DB_FOUND) include_directories (${DB_INCLUDE_DIR}) -target_link_libraries(convert ${DB_LIBRARIES}) target_link_libraries(eressea ${DB_LIBRARIES}) target_link_libraries(test_eressea ${DB_LIBRARIES}) add_definitions(-DUSE_DB) @@ -317,14 +299,5 @@ endif(CURSES_FOUND) if (EXPAT_FOUND) include_directories (${EXPAT_INCLUDE_DIRS}) target_link_libraries(eressea ${EXPAT_LIBRARIES}) -target_link_libraries(convert ${EXPAT_LIBRARIES}) target_link_libraries(test_eressea ${EXPAT_LIBRARIES}) -add_definitions(-DUSE_EXPAT) endif (EXPAT_FOUND) - -if (LIBXML2_FOUND) -include_directories (${LIBXML2_INCLUDE_DIR}) -target_link_libraries(eressea ${LIBXML2_LIBRARIES}) -target_link_libraries(convert ${LIBXML2_LIBRARIES}) -target_link_libraries(test_eressea ${LIBXML2_LIBRARIES}) -endif (LIBXML2_FOUND) diff --git a/src/bindings.c b/src/bindings.c index 5c6174c75..d72bddac2 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -59,7 +59,6 @@ #include #include #include -#include #include #include @@ -833,33 +832,12 @@ static int tolua_get_spells(lua_State * L) return tolua_selist_push(L, "spell_list", "spell", spells); } -static int init_data(const char *filename) -{ - int l; - l = read_xml(filename); - reset_locales(); - if (l) { - return l; - } - if (turn <= 0) { - turn = first_turn(); - } - return 0; -} - static int tolua_equip_newunits(lua_State * L) { unit *u = (unit *)tolua_tousertype(L, 1, 0); equip_newunits(u); return 0; } -static int tolua_read_xml(lua_State * L) -{ - const char *filename = tolua_tostring(L, 1, "config.xml"); - lua_pushinteger(L, init_data(filename)); - return 1; -} - static int tolua_report_unit(lua_State * L) { char buffer[512]; @@ -1029,7 +1007,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile) tolua_function(L, TOLUA_CAST "set_key", tolua_setkey); tolua_function(L, TOLUA_CAST "translate", &tolua_translate); tolua_function(L, TOLUA_CAST "spells", tolua_get_spells); - tolua_function(L, TOLUA_CAST "read_xml", tolua_read_xml); tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits); } tolua_endmodule(L); return 1; diff --git a/src/convert.c b/src/convert.c deleted file mode 100644 index 6470c9e32..000000000 --- a/src/convert.c +++ /dev/null @@ -1,37 +0,0 @@ -#include - - -#include "xmlreader.h" -#include -#include -#include -#include - -#include - -#include - -static int usage(void) { - return -1; -} - -int main(int argc, char **argv) { - const char *mode; - - register_races(); - register_xmlreader(); - if (argc < 2) return usage(); - mode = argv[1]; - if (strcmp(mode, "rules")==0) { - const char *xmlfile; - if (argc < 4) return usage(); - xmlfile = argv[2]; - read_xml(xmlfile); - write_rules("rules.dat"); - return 0; - } - if (strcmp(mode, "po")==0) { - return 0; - } - return usage(); -} diff --git a/src/eressea.c b/src/eressea.c index 81f19b5a6..bdb20edcc 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -33,7 +33,6 @@ #include "spells.h" #include "vortex.h" #include "wormhole.h" -#include "xmlreader.h" #include #include @@ -80,7 +79,6 @@ void game_init(void) register_weapons(); register_xerewards(); - register_xmlreader(); register_attributes(); register_gmcmd(); diff --git a/src/gmtool.c b/src/gmtool.c index d63b93c5c..e13701f6f 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -55,7 +55,6 @@ #include "listbox.h" #include "wormhole.h" #include "teleport.h" -#include "xmlreader.h" #include #include diff --git a/src/jsonconf.c b/src/jsonconf.c index c91f8a749..fcd6f5c78 100644 --- a/src/jsonconf.c +++ b/src/jsonconf.c @@ -39,7 +39,6 @@ without prior permission by the authors of Eressea. #include "util/path.h" #include "util/pofile.h" #include "util/strings.h" -#include "util/xml.h" /* game modules */ #include "direction.h" @@ -47,9 +46,7 @@ without prior permission by the authors of Eressea. #include "move.h" #include "prefix.h" #include "skill.h" -#ifdef USE_EXPAT #include "exparse.h" -#endif /* external libraries */ #include @@ -1017,14 +1014,7 @@ static int include_xml(const char *uri) { char name[PATH_MAX]; const char *filename = uri_to_file(uri, name, sizeof(name)); int err; -#ifdef USE_EXPAT err = exparse_readfile(filename); - if (err != 0) { - err = read_xml(filename); - } -#else - err = read_xml(filename); -#endif if (err != 0) { log_error("could not parse XML from %s", uri); } @@ -1058,7 +1048,7 @@ static int include_po(const char *uri) { if (lang) { int err = pofile_read(filename, add_po_string, lang); if (err < 0) { - log_error("could not parse XML from %s", uri); + log_error("could not parse translations from %s", uri); } return err; } diff --git a/src/kernel/build.c b/src/kernel/build.c index 45a7d0898..310e4bd43 100644 --- a/src/kernel/build.c +++ b/src/kernel/build.c @@ -60,7 +60,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include /* from libc */ #include diff --git a/src/kernel/config.c b/src/kernel/config.c index 54d030b76..8eef66341 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -66,16 +66,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include #include "donations.h" #include "guard.h" #include "prefix.h" -/* libxml includes */ -#include -#include - /* external libraries */ #include #include @@ -559,7 +554,6 @@ void kernel_done(void) /* calling this function releases memory assigned to static variables, etc. * calling it is optional, e.g. a release server will most likely not do it. */ - xml_done(); attrib_done(); item_done(); message_done(); diff --git a/src/kernel/ship.c b/src/kernel/ship.c index def6dd1fa..4719945b0 100644 --- a/src/kernel/ship.c +++ b/src/kernel/ship.c @@ -42,7 +42,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include -#include #include #include diff --git a/src/spells.c b/src/spells.c index bd2c8ea1a..4e98b1a2a 100644 --- a/src/spells.c +++ b/src/spells.c @@ -26,7 +26,6 @@ #include "randenc.h" #include "monsters.h" #include "teleport.h" -#include "xmlreader.h" /* triggers includes */ #include diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 19f9b608b..b462d2bd3 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -28,7 +28,6 @@ log.test.c umlaut.test.c unicode.test.c variant.test.c -# xml.test.c ) SET(_FILES @@ -59,7 +58,6 @@ translation.c umlaut.c unicode.c variant.c -xml.c ) FOREACH(_FILE ${_FILES}) diff --git a/src/util/xml.c b/src/util/xml.c deleted file mode 100644 index 7ce893916..000000000 --- a/src/util/xml.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - +-------------------+ Christian Schlittchen - | | Enno Rehling - | Eressea PBEM host | Katja Zedel - | (c) 1998 - 2003 | Henning Peters - | | Ingo Wilken - +-------------------+ Stefan Reich - - This program may not be used, modified or distributed - without prior permission by the authors of Eressea. - */ -#include -#include "xml.h" - -/* util includes */ -#include "log.h" -#include "assert.h" - -#include -#include - -/* libc includes */ -#include -#include -#include -#include - -int xml_ivalue(xmlNodePtr node, const char *name, int dflt) -{ - int i = dflt; - xmlChar *propValue = xmlGetProp(node, BAD_CAST name); - if (propValue != NULL) { - i = atoi((const char *)propValue); - xmlFree(propValue); - } - return i; -} - -bool xml_bvalue(xmlNodePtr node, const char *name, bool dflt) -{ - bool result = dflt; - xmlChar *propValue = xmlGetProp(node, BAD_CAST name); - if (propValue != NULL) { - if (strcmp((const char *)propValue, "no") == 0) - result = false; - else if (strcmp((const char *)propValue, "yes") == 0) - result = true; - else if (strcmp((const char *)propValue, "false") == 0) - result = false; - else if (strcmp((const char *)propValue, "true") == 0) - result = true; - else if (strcmp((const char *)propValue, "1") == 0) { - log_warning("bool value is '1': %s::%s\n", node->name, name); - result = true; - } - else if (strcmp((const char *)propValue, "0") == 0) { - log_warning("bool value is '0': %s::%s\n", node->name, name); - result = false; - } - xmlFree(propValue); - } - return result; -} - -double xml_fvalue(xmlNodePtr node, const char *name, double dflt) -{ - double result = dflt; - xmlChar *propValue = xmlGetProp(node, BAD_CAST name); - if (propValue != NULL) { - result = atof((const char *)propValue); - xmlFree(propValue); - } - return result; -} - -/* new xml functions */ -/* libxml includes */ -#include -#include - -typedef struct xml_reader { - struct xml_reader *next; - xml_callback callback; -} xml_reader; - -static xml_reader *xmlReaders; - -void xml_done(void) { - xml_reader ** xrp = &xmlReaders; - while (*xrp) { - xml_reader *xr = *xrp; - *xrp = xr->next; - free(xr); - } -} - -void xml_register_callback(xml_callback callback) -{ - xml_reader *reader = (xml_reader *)malloc(sizeof(xml_reader)); - xml_reader **insert = &xmlReaders; - assert_alloc(reader); - reader->callback = callback; - reader->next = NULL; - - while (*insert) - insert = &(*insert)->next; - *insert = reader; -} - -int read_xml(const char *filename) -{ - xml_reader *reader = xmlReaders; - xmlDocPtr doc; - int results = 0; - - doc = xmlReadFile(filename, NULL, XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT); - if (doc == NULL) { - log_error("could not open '%s'\n", filename); - return -1; - } - while (reader != NULL) { - int i = reader->callback(doc); - if (i < 0) { - return i; - } - results += i; - reader = reader->next; - } - xmlFreeDoc(doc); - return (results > 0) ? 0 : -1; -} diff --git a/src/util/xml.h b/src/util/xml.h deleted file mode 100644 index c7a67a82c..000000000 --- a/src/util/xml.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - +-------------------+ Christian Schlittchen - | | Enno Rehling - | Eressea PBEM host | Katja Zedel - | (c) 1998 - 2003 | Henning Peters - | | Ingo Wilken - +-------------------+ Stefan Reich - - This program may not be used, modified or distributed - without prior permission by the authors of Eressea. -*/ - -#ifndef H_UTIL_XML -#define H_UTIL_XML - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - /* new xml functions: */ -#include - - - typedef int (*xml_callback) (xmlDocPtr); - - void xml_register_callback(xml_callback callback); - double xml_fvalue(xmlNodePtr node, const char *name, double dflt); - int xml_ivalue(xmlNodePtr node, const char *name, int dflt); - bool xml_bvalue(xmlNodePtr node, const char *name, bool dflt); - - void xml_done(void); - int read_xml(const char *filename); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/xmlreader.c b/src/xmlreader.c deleted file mode 100644 index 2decd9cb5..000000000 --- a/src/xmlreader.c +++ /dev/null @@ -1,1361 +0,0 @@ -/* -+-------------------+ -| | Enno Rehling -| Eressea PBEM host | Christian Schlittchen -| (c) 1998 - 2004 | Katja Zedel -| | Henning Peters -+-------------------+ - -This program may not be used, modified or distributed -without prior permission by the authors of Eressea. -*/ - -#ifdef _MSC_VER -#include -#endif - -#include "xmlreader.h" - -#include "alchemy.h" -#include "guard.h" -#include "keyword.h" -#include "move.h" -#include "prefix.h" - -#include "attributes/attributes.h" -#include "modules/score.h" - -#include "kernel/building.h" -#include "kernel/calendar.h" -#include "kernel/item.h" -#include "kernel/messages.h" -#include "kernel/race.h" -#include "kernel/region.h" -#include "kernel/resources.h" -#include "kernel/ship.h" -#include "kernel/terrain.h" -#include "kernel/skills.h" -#include "kernel/spell.h" -#include "kernel/spellbook.h" - -#include "util/attrib.h" -#include "util/crmessage.h" -#include "util/functions.h" -#include "util/language.h" -#include "util/log.h" -#include "util/message.h" -#include "util/nrmessage.h" -#include "util/strings.h" -#include "util/xml.h" - -/* libxml includes */ -#include -#include -#include - -/* libc includes */ -#include -#include -#include -#include - - -static void mask_races(xmlNodePtr node, const char *key, int *maskp) { - xmlChar *propValue = xmlGetProp(node, BAD_CAST key); - int mask = 0; - assert(maskp); - if (propValue) { - mask = rc_get_mask((char *)propValue); - xmlFree(propValue); - } - *maskp = mask; -} - -static variant xml_fraction(xmlNodePtr node, const char *name) { - xmlChar *propValue = xmlGetProp(node, BAD_CAST name); - if (propValue != NULL) { - int num, den = 100; - double fval = atof((const char *)propValue); - num = (int)(fval * den + 0.5); - xmlFree(propValue); - return frac_make(num, den); - } - return frac_make(0, 1); -} - -static spellref *xml_spellref(xmlNode * node, const char *name) -{ - xmlChar *propValue = xmlGetProp(node, BAD_CAST name); - if (propValue != NULL) { - spellref *ref = spellref_create(NULL, (const char *)propValue); - xmlFree(propValue); - return ref; - } - return NULL; -} - -static resource_mod * xml_readmodifiers(xmlXPathObjectPtr result, xmlNodePtr node) { - /* reading eressea/resources/resource/modifier */ - if (result->nodesetval != NULL && result->nodesetval->nodeNr > 0) { - int k; - resource_mod * modifiers = - calloc(result->nodesetval->nodeNr + 1, sizeof(resource_mod)); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - xmlChar *propValue; - building_type *btype = NULL; - - mask_races(node, "races", &modifiers[k].race_mask); - - propValue = xmlGetProp(node, BAD_CAST "building"); - if (propValue != NULL) { - btype = bt_get_or_create((const char *)propValue); - xmlFree(propValue); - } - modifiers[k].btype = btype; - - propValue = xmlGetProp(node, BAD_CAST "type"); - assert(propValue != NULL); - if (strcmp((const char *)propValue, "skill") == 0) { - xmlChar *propSkill; - skill_t sk = NOSKILL; - - modifiers[k].type = RMT_PROD_SKILL; - propSkill = xmlGetProp(node, BAD_CAST "skill"); - if (propSkill) { - sk = findskill((const char *)propSkill); - xmlFree(propSkill); - } - modifiers[k].value.sa[0] = (short)sk; - modifiers[k].value.sa[1] = (short)xml_ivalue(node, "value", 0); - } - else if (strcmp((const char *)propValue, "material") == 0) { - modifiers[k].value = xml_fraction(node, "value"); - modifiers[k].type = RMT_PROD_SAVE; - } - else { - if (strcmp((const char *)propValue, "require") == 0) { - modifiers[k].type = RMT_PROD_REQUIRE; - } - else if (strcmp((const char *)propValue, "save") == 0) { - modifiers[k].type = RMT_USE_SAVE; - modifiers[k].value = xml_fraction(node, "value"); - } - else { - log_error("unknown type '%s' for resourcelimit-modifier", (const char *)propValue); - } - } - xmlFree(propValue); - } - return modifiers; - } - return NULL; -} - -static void -xml_readrequirements(xmlNodePtr * nodeTab, int nodeNr, requirement ** reqArray) -{ - int req; - requirement *radd = *reqArray; - - assert(radd == NULL); - if (nodeNr == 0) - return; - - radd = *reqArray = calloc(sizeof(requirement), nodeNr + 1); - - for (req = 0; req != nodeNr; ++req) { - xmlNodePtr node = nodeTab[req]; - xmlChar *propValue; - - radd->number = xml_ivalue(node, "quantity", 1); - - propValue = xmlGetProp(node, BAD_CAST "type"); - radd->rtype = rt_get_or_create((const char *)propValue); - xmlFree(propValue); - - ++radd; - } -} - -static construction * -xml_readconstruction(xmlXPathContextPtr xpath, xmlNodePtr node) -{ - construction *con; - xmlChar *propValue; - xmlXPathObjectPtr req; - skill_t sk = NOSKILL; - - propValue = xmlGetProp(node, BAD_CAST "skill"); - if (propValue != NULL) { - sk = findskill((const char *)propValue); - if (sk == NOSKILL) { - log_error("construction requires skill '%s' that does not exist.\n", (const char *)propValue); - xmlFree(propValue); - return NULL; - } - xmlFree(propValue); - } - - con = (construction *)calloc(sizeof(construction), 1); - - con->skill = sk; - con->maxsize = xml_ivalue(node, "maxsize", -1); - con->minskill = xml_ivalue(node, "minskill", -1); - con->reqsize = xml_ivalue(node, "reqsize", 1); - - /* read construction/requirement */ - xpath->node = node; - req = xmlXPathEvalExpression(BAD_CAST "requirement", xpath); - xml_readrequirements(req->nodesetval->nodeTab, - req->nodesetval->nodeNr, &con->materials); - xmlXPathFreeObject(req); - - return con; -} - -static void -xml_readconstructions(xmlXPathContextPtr xpath, xmlNodeSetPtr nodeSet, building_type *btype) -{ - building_stage **stage_ptr = &btype->stages; - int k; - - for (k = 0; k != nodeSet->nodeNr; ++k) { - building_stage *stage = calloc(1, sizeof(building_stage)); - xmlNodePtr node = nodeSet->nodeTab[k]; - construction *con = xml_readconstruction(xpath, node); - xmlChar *propValue = xmlGetProp(node, BAD_CAST "name"); - - if (propValue != NULL) { - stage->name = str_strdup((const char *)propValue); - xmlFree(propValue); - } - stage->next = NULL; - stage->construction = con; - - *stage_ptr = stage; - stage_ptr = &stage->next; - } -} - -static int -parse_function(xmlNodePtr node, pf_generic * funPtr, xmlChar ** namePtr) -{ - pf_generic fun; - xmlChar *propValue = xmlGetProp(node, BAD_CAST "value"); - assert(propValue != NULL); - fun = get_function((const char *)propValue); - xmlFree(propValue); - propValue = xmlGetProp(node, BAD_CAST "name"); - *namePtr = propValue; - *funPtr = fun; - return 0; -} - -static int parse_buildings(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr buildings; - int result = 0; - - /* reading eressea/buildings/building */ - buildings = - xmlXPathEvalExpression(BAD_CAST "/eressea/buildings/building", xpath); - if (buildings->nodesetval != NULL) { - xmlNodeSetPtr nodes = buildings->nodesetval; - int i; - result += nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlNodePtr node = nodes->nodeTab[i]; - xmlChar *propValue; - building_type *btype; - xmlXPathObjectPtr result; - int k; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - btype = bt_get_or_create((const char *)propValue); - xmlFree(propValue); - - btype->capacity = xml_ivalue(node, "capacity", btype->capacity); - btype->maxcapacity = xml_ivalue(node, "maxcapacity", btype->maxcapacity); - btype->maxsize = xml_ivalue(node, "maxsize", btype->maxsize); - - btype->magres = frac_make(xml_ivalue(node, "magres", 0), 100); - btype->magresbonus = xml_ivalue(node, "magresbonus", btype->magresbonus); - btype->fumblebonus = xml_ivalue(node, "fumblebonus", btype->fumblebonus); - btype->auraregen = xml_fvalue(node, "auraregen", btype->auraregen); - btype->taxes = xml_ivalue(node, "taxes", btype->taxes); - - if (xml_bvalue(node, "nodestroy", false)) - btype->flags |= BTF_INDESTRUCTIBLE; - if (xml_bvalue(node, "nobuild", false)) - btype->flags |= BTF_NOBUILD; - if (xml_bvalue(node, "unique", false)) - btype->flags |= BTF_UNIQUE; - if (xml_bvalue(node, "decay", false)) - btype->flags |= BTF_DECAY; - if (xml_bvalue(node, "magic", false)) - btype->flags |= BTF_MAGIC; - if (xml_bvalue(node, "namechange", true)) - btype->flags |= BTF_NAMECHANGE; - if (xml_bvalue(node, "fort", false)) - btype->flags |= BTF_FORTIFICATION; - if (xml_bvalue(node, "oneperturn", false)) - btype->flags |= BTF_ONEPERTURN; - - /* reading eressea/buildings/building/modifier */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "modifier", xpath); - btype->modifiers = xml_readmodifiers(result, node); - xmlXPathFreeObject(result); - - /* reading eressea/buildings/building/construction */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "construction", xpath); - xml_readconstructions(xpath, result->nodesetval, btype); - xmlXPathFreeObject(result); - - /* reading eressea/buildings/building/function */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "function", xpath); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - pf_generic fun; - parse_function(node, &fun, &propValue); - - if (fun == NULL) { - log_error("unknown function name '%s' for building %s\n", (const char *)propValue, btype->_name); - xmlFree(propValue); - continue; - } - assert(propValue != NULL); - log_error("unknown function type '%s' for building %s\n", (const char *)propValue, btype->_name); - xmlFree(propValue); - } - xmlXPathFreeObject(result); - - /* reading eressea/buildings/building/maintenance */ - result = xmlXPathEvalExpression(BAD_CAST "maintenance", xpath); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - maintenance *mt; - - if (btype->maintenance == NULL) { - btype->maintenance = (struct maintenance *) - calloc(sizeof(struct maintenance), result->nodesetval->nodeNr + 1); - } - mt = btype->maintenance + k; - mt->number = xml_ivalue(node, "amount", 0); - - propValue = xmlGetProp(node, BAD_CAST "type"); - assert(propValue != NULL); - mt->rtype = rt_get_or_create((const char *)propValue); - assert(mt->rtype != NULL); - xmlFree(propValue); - - if (xml_bvalue(node, "variable", false)) - mt->flags |= MTF_VARIABLE; - } - xmlXPathFreeObject(result); - } - } - xmlXPathFreeObject(buildings); - - xmlXPathFreeContext(xpath); - return result; -} - -static int parse_ships(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr ships; - int result = 0; - - /* reading eressea/ships/ship */ - ships = xmlXPathEvalExpression(BAD_CAST "/eressea/ships/ship", xpath); - if (ships->nodesetval != NULL) { - xmlNodeSetPtr nodes = ships->nodesetval; - int i; - result += nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlNodePtr child, node = nodes->nodeTab[i]; - xmlChar *propValue; - ship_type *st; - xmlXPathObjectPtr result; - int k, c; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - st = st_get_or_create((const char *)propValue); - xmlFree(propValue); - - st->cabins = xml_ivalue(node, "cabins", 0) * PERSON_WEIGHT; - st->cargo = xml_ivalue(node, "cargo", st->cargo); - st->combat = xml_ivalue(node, "combat", st->combat); - st->damage = xml_fvalue(node, "damage", st->damage); - if (xml_bvalue(node, "nocoast", false)) - st->flags |= SFL_NOCOAST; - if (xml_bvalue(node, "fly", false)) - st->flags |= SFL_FLY; - if (xml_bvalue(node, "opensea", false)) - st->flags |= SFL_OPENSEA; - if (xml_bvalue(node, "speedy", false)) - st->flags |= SFL_SPEEDY; - st->fishing = xml_ivalue(node, "fishing", st->fishing); - st->cptskill = xml_ivalue(node, "cptskill", st->cptskill); - st->minskill = xml_ivalue(node, "minskill", st->minskill); - st->sumskill = xml_ivalue(node, "sumskill", st->sumskill); - st->range = xml_ivalue(node, "range", st->range); - st->range_max = xml_ivalue(node, "maxrange", st->range_max); - st->storm = xml_fvalue(node, "storm", st->storm); - - for (child = node->children; child; child = child->next) { - if (strcmp((const char *)child->name, "modifier") == 0) { - propValue = xmlGetProp(child, BAD_CAST "type"); - if (strcmp((const char *)propValue, "tactics") == 0) { - st->tac_bonus = xml_fvalue(child, "factor", 1.0); - } - else { - int value = xml_ivalue(child, "value", 0); - if (strcmp((const char *)propValue, "attack") == 0) { - st->at_bonus = (int)value; - } - else if (strcmp((const char *)propValue, "defense") == 0) { - st->df_bonus = (int)value; - } - } - xmlFree(propValue); - } - else if (strcmp((const char *)child->name, "construction") == 0) { - assert(!st->construction); - st->construction = xml_readconstruction(xpath, child); - } - } - /* reading eressea/ships/ship/coast */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "coast", xpath); - for (c = 0, k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - - if (k == 0) { - assert(st->coasts == NULL); - st->coasts = - (terrain_type **)malloc(sizeof(terrain_type *) * - (result->nodesetval->nodeNr + 1)); - st->coasts[result->nodesetval->nodeNr] = NULL; - } - - propValue = xmlGetProp(node, BAD_CAST "terrain"); - assert(propValue != NULL); - st->coasts[c] = get_or_create_terrain((const char *)propValue); - if (st->coasts[c] != NULL) - ++c; - else { - log_warning("ship %s mentions a non-existing terrain %s.\n", st->_name, propValue); - } - xmlFree(propValue); - } - xmlXPathFreeObject(result); - } - } - xmlXPathFreeObject(ships); - - xmlXPathFreeContext(xpath); - return result; -} - -static void xml_readpotion(xmlNodePtr node, item_type * itype) -{ - int level = xml_ivalue(node, "level", 0); - - if ((itype->flags & ITF_CANUSE) == 0) { - log_error("potion %s has no use attribute", itype->rtype->_name); - itype->flags |= ITF_CANUSE; - } - new_potiontype(itype, level); -} - -static luxury_type *xml_readluxury(xmlNodePtr node, item_type * itype) -{ - int price = xml_ivalue(node, "price", 0); - if (itype->rtype->ltype) { - itype->rtype->ltype->price = price; - return itype->rtype->ltype; - } - return new_luxurytype(itype, price); -} - -static armor_type *xml_readarmor(xmlNodePtr node, item_type * itype) -{ - armor_type *atype = NULL; - unsigned int flags = ATF_NONE; - int ac = xml_ivalue(node, "ac", 0); - double penalty = xml_fvalue(node, "penalty", 0.0); - variant magres = xml_fraction(node, "magres"); - - if (xml_bvalue(node, "laen", false)) - flags |= ATF_LAEN; - if (xml_bvalue(node, "shield", false)) - flags |= ATF_SHIELD; - - atype = new_armortype(itype, penalty, magres, ac, flags); - atype->projectile = (float)xml_fvalue(node, "projectile", 0.0); - return atype; -} - -static weapon_type *xml_readweapon(xmlXPathContextPtr xpath, item_type * itype) -{ - xmlNodePtr node = xpath->node; - weapon_type *wtype = NULL; - unsigned int flags = WTF_NONE; - xmlXPathObjectPtr result; - xmlChar *propValue; - int k; - skill_t sk; - int offmod = xml_ivalue(node, "offmod", 0); - int defmod = xml_ivalue(node, "defmod", 0); - int reload = xml_ivalue(node, "reload", 0); - variant magres = xml_fraction(node, "magres"); - - if (xml_bvalue(node, "armorpiercing", false)) - flags |= WTF_ARMORPIERCING; - if (xml_bvalue(node, "magical", false)) - flags |= WTF_MAGICAL; - if (xml_bvalue(node, "missile", false)) - flags |= WTF_MISSILE; - if (xml_bvalue(node, "pierce", false)) - flags |= WTF_PIERCE; - if (xml_bvalue(node, "cut", false)) - flags |= WTF_CUT; - if (xml_bvalue(node, "bash", false)) - flags |= WTF_BLUNT; - if (xml_bvalue(node, "siege", false)) - flags |= WTF_SIEGE; - if (xml_bvalue(node, "horse", (flags & WTF_MISSILE) == 0)) - flags |= WTF_HORSEBONUS; - if (xml_bvalue(node, "useshield", true)) - flags |= WTF_USESHIELD; - - propValue = xmlGetProp(node, BAD_CAST "skill"); - assert(propValue != NULL); - sk = findskill((const char *)propValue); - assert(sk != NOSKILL); - xmlFree(propValue); - - wtype = new_weapontype(itype, flags, magres, NULL, offmod, defmod, reload, sk); - - /* reading weapon/damage */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "damage", xpath); - assert(result->nodesetval->nodeNr <= 2); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - int pos = 0; - - propValue = xmlGetProp(node, BAD_CAST "type"); - if (strcmp((const char *)propValue, "footman") != 0) { - pos = 1; - } - xmlFree(propValue); - - propValue = xmlGetProp(node, BAD_CAST "value"); - wtype->damage[pos] = str_strdup((const char *)propValue); /* TODO: this is a memory leak */ - xmlFree(propValue); - } - xmlXPathFreeObject(result); - - /* reading weapon/modifier */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "modifier", xpath); - assert(wtype->modifiers == NULL); - wtype->modifiers = calloc(result->nodesetval->nodeNr + 1, sizeof(weapon_mod)); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - int flags = 0; - - if (xml_bvalue(node, "walking", false)) - flags |= WMF_WALKING; - if (xml_bvalue(node, "riding", false)) - flags |= WMF_RIDING; - if (xml_bvalue(node, "against_walking", false)) - flags |= WMF_AGAINST_WALKING; - if (xml_bvalue(node, "against_riding", false)) - flags |= WMF_AGAINST_RIDING; - if (xml_bvalue(node, "offensive", false)) - flags |= WMF_OFFENSIVE; - if (xml_bvalue(node, "defensive", false)) - flags |= WMF_DEFENSIVE; - - propValue = xmlGetProp(node, BAD_CAST "type"); - if (strcmp((const char *)propValue, "damage") == 0) - flags |= WMF_DAMAGE; - else if (strcmp((const char *)propValue, "skill") == 0) - flags |= WMF_SKILL; - else if (strcmp((const char *)propValue, "missile_target") == 0) - flags |= WMF_MISSILE_TARGET; - xmlFree(propValue); - - wtype->modifiers[k].flags = flags; - wtype->modifiers[k].value = xml_ivalue(node, "value", 0); - - mask_races(node, "races", &wtype->modifiers[k].race_mask); - wtype->modifiers[k].race_mask = 0; - } - xmlXPathFreeObject(result); - - /* reading weapon/function */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "function", xpath); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - xmlChar *propValue; - pf_generic fun; - - parse_function(node, &fun, &propValue); - if (fun == NULL) { - log_error("unknown function name '%s' for item '%s'\n", (const char *)propValue, itype->rtype->_name); - xmlFree(propValue); - continue; - } - assert(propValue != NULL); - if (strcmp((const char *)propValue, "attack") == 0) { - wtype->attack = (wtype_attack)fun; - } - else { - log_error("unknown function type '%s' for item '%s'\n", (const char *)propValue, itype->rtype->_name); - } - xmlFree(propValue); - } - xmlXPathFreeObject(result); - - xpath->node = node; - return wtype; -} - -static item_type *xml_readitem(xmlXPathContextPtr xpath, resource_type * rtype) -{ - xmlNodePtr child, node = xpath->node; - item_type *itype = NULL; - unsigned int flags = ITF_NONE; - - if (xml_bvalue(node, "cursed", false)) - flags |= ITF_CURSED; - if (xml_bvalue(node, "use", false)) - flags |= ITF_CANUSE; - if (xml_bvalue(node, "notlost", false)) - flags |= ITF_NOTLOST; - if (xml_bvalue(node, "herb", false)) - flags |= ITF_HERB; - if (xml_bvalue(node, "big", false)) - flags |= ITF_BIG; - if (xml_bvalue(node, "animal", false)) - flags |= ITF_ANIMAL; - if (xml_bvalue(node, "vehicle", false)) - flags |= ITF_VEHICLE; - - itype = rtype->itype ? rtype->itype : it_get_or_create(rtype); - /* exparse: recreate child data. */ - if (itype->construction) { - free_construction(itype->construction); - itype->construction = NULL; - } - - itype->weight = xml_ivalue(node, "weight", 0); - itype->capacity = xml_ivalue(node, "capacity", 0); - itype->score = xml_ivalue(node, "score", 0); - - mask_races(node, "allow", &itype->mask_allow); - mask_races(node, "deny", &itype->mask_deny); - itype->flags |= flags; - - for (child = node->children; child; child = child->next) { - if (strcmp((const char *)child->name, "construction") == 0) { - /* reading item/construction */ - assert(!itype->construction); - xpath->node = child; - itype->construction = xml_readconstruction(xpath, child); - } - else if (strcmp((const char *)child->name, "weapon") == 0) { - /* reading item/weapon */ - assert(!rtype->wtype); - xpath->node = child; - rtype->wtype = xml_readweapon(xpath, itype); - } - else if (strcmp((const char *)child->name, "armor") == 0) { - /* reading item/weapon */ - assert(!rtype->atype); - rtype->atype = xml_readarmor(child, itype); - } - else if (strcmp((const char *)child->name, "luxury") == 0) { - /* reading item/luxury */ - assert(!rtype->ltype); - rtype->ltype = xml_readluxury(child, itype); - } - else if (strcmp((const char *)child->name, "potion") == 0) { - /* reading item/potion */ - xml_readpotion(child, itype); - } - } - - if (!itype->score) { - /* do this last, because score depends on itype data */ - itype->score = default_score(itype); - } - return itype; -} - -static int parse_resources(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr resources; - int results = 0; - - /* reading eressea/resources/resource */ - resources = - xmlXPathEvalExpression(BAD_CAST "/eressea/resources/resource", xpath); - if (resources->nodesetval) { - int i; - xmlNodeSetPtr nodes = resources->nodesetval; - results = nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlNodePtr node = nodes->nodeTab[i]; - xmlChar *propValue, *name, *appearance; - resource_type *rtype; - unsigned int flags = RTF_NONE; - xmlXPathObjectPtr result; - - if (xml_bvalue(node, "pooled", true)) - flags |= RTF_POOLED; - - name = xmlGetProp(node, BAD_CAST "name"); - if (!name) { - assert(name); - log_error("invalid resource %d has no name", i); - continue; - } - - rtype = rt_get_or_create((const char *)name); - /* exparse: recreate child data. */ - if (rtype->atype) { - free_atype(rtype->atype); - rtype->atype = NULL; - } - if (rtype->wtype) { - free_wtype(rtype->wtype); - rtype->wtype = NULL; - } - - rtype->flags |= flags; - xmlFree(name); - - /* reading eressea/resources/resource/function */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "function", xpath); - if (result->nodesetval != NULL) { - int k; - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - pf_generic fun; - - parse_function(node, &fun, &propValue); - if (fun == NULL) { - log_error("unknown function name '%s' for resource %s\n", (const char *)propValue, rtype->_name); - xmlFree(propValue); - continue; - } - - assert(propValue != NULL); - if (strcmp((const char *)propValue, "change") == 0) { - rtype->uchange = (rtype_uchange)fun; - } - else if (strcmp((const char *)propValue, "name") == 0) { - rtype->name = (rtype_name)fun; - } - else { - log_error("unknown function type '%s' for resource %s\n", (const char *)propValue, rtype->_name); - } - xmlFree(propValue); - } - } - xmlXPathFreeObject(result); - - if (xml_bvalue(node, "limited", false)) { - rtype->flags |= RTF_LIMITED; - } - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "modifier", xpath); - rtype->modifiers = xml_readmodifiers(result, node); - xmlXPathFreeObject(result); - - /* reading eressea/resources/resource/item */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "item", xpath); - assert(result->nodesetval->nodeNr <= 1); - if (result->nodesetval->nodeNr != 0) { - rtype->flags |= RTF_ITEM; - xpath->node = result->nodesetval->nodeTab[0]; - rtype->itype = xml_readitem(xpath, rtype); - appearance = xmlGetProp(node, BAD_CAST "appearance"); - if (appearance) { - it_set_appearance(rtype->itype, (const char *)appearance); - xmlFree(appearance); - } - } - xmlXPathFreeObject(result); - - if (xml_bvalue(node, "material", false)) { - assert(!rtype->itype || rtype->itype->construction); - rmt_create(rtype); - } - } - } - xmlXPathFreeObject(resources); - - xmlXPathFreeContext(xpath); - - /* make sure old items (used in requirements) are available */ - init_resources(); - - return results; -} - -static int parse_spellbooks(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr spellbooks; - int results = 0; - - /* reading eressea/spells/spell */ - spellbooks = xmlXPathEvalExpression(BAD_CAST "/eressea/spellbook", xpath); - - if (spellbooks->nodesetval != NULL) { - xmlNodeSetPtr nodes = spellbooks->nodesetval; - int i, k; - - results += nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlXPathObjectPtr result; - xmlNodePtr node = nodes->nodeTab[i]; - xmlChar *propValue; - spellbook * sb; - - propValue = xmlGetProp(node, BAD_CAST "name"); - if (propValue) { - sb = get_spellbook((const char *)propValue); - xmlFree(propValue); - } - else { - log_error("spellbook at index '%d' has n name\n", i); - continue; - } - - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "entry", xpath); - - if (result->nodesetval->nodeNr > 0) { - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - int level = xml_ivalue(node, "level", -1); - - if (level > 0 && (propValue = xmlGetProp(node, BAD_CAST "spell")) != NULL) { - spellbook_addref(sb, (const char *)propValue, level); - xmlFree(propValue); - } - else { - log_error("invalid entry at index '%d' in spellbook '%s'\n", k, sb->name); - } - } - } - xmlXPathFreeObject(result); - } - } - xmlXPathFreeObject(spellbooks); - xmlXPathFreeContext(xpath); - return results; -} - -static int parse_spells(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr spells; - int result = 0; - - /* reading eressea/spells/spell */ - spells = xmlXPathEvalExpression(BAD_CAST "/eressea/spells/spell", xpath); - if (spells->nodesetval != NULL) { - xmlNodeSetPtr nodes = spells->nodesetval; - int i; - - result += nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlXPathObjectPtr result; - xmlNodePtr node = nodes->nodeTab[i]; - xmlChar *propValue; - int k; - spell_component *component; - spell *sp; - static int modes[] = { 0, PRECOMBATSPELL, COMBATSPELL, POSTCOMBATSPELL }; - - /* spellname */ - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - sp = create_spell((const char *)propValue); - xmlFree(propValue); - if (!sp) { - continue; - } - - propValue = xmlGetProp(node, BAD_CAST "parameters"); - if (propValue) { - sp->parameter = str_strdup((const char *)propValue); - xmlFree(propValue); - } - - propValue = xmlGetProp(node, BAD_CAST "syntax"); - if (propValue) { - sp->syntax = str_strdup((const char *)propValue); - xmlFree(propValue); - } - sp->rank = (char)xml_ivalue(node, "rank", sp->rank); - if (xml_bvalue(node, "los", false)) - sp->sptyp |= TESTCANSEE; /* must see or have contact */ - if (xml_bvalue(node, "ship", false)) - sp->sptyp |= ONSHIPCAST; - if (xml_bvalue(node, "ocean", false)) - sp->sptyp |= OCEANCASTABLE; - if (xml_bvalue(node, "far", false)) - sp->sptyp |= FARCASTING; - if (xml_bvalue(node, "variable", false)) - sp->sptyp |= SPELLLEVEL; - - if (xml_bvalue(node, "globaltarget", false)) - sp->sptyp |= GLOBALTARGET; /* target need not be in same region */ - if (xml_bvalue(node, "buildingtarget", false)) - sp->sptyp |= BUILDINGSPELL; - if (xml_bvalue(node, "shiptarget", false)) - sp->sptyp |= SHIPSPELL; - if (xml_bvalue(node, "unittarget", false)) - sp->sptyp |= UNITSPELL; - if (xml_bvalue(node, "regiontarget", false)) - sp->sptyp |= REGIONSPELL; - - k = xml_ivalue(node, "combat", 0); - if (k >= 0 && k <= 3) { - sp->sptyp |= modes[k]; - } - /* reading eressea/spells/spell/resource */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "resource", xpath); - if (result->nodesetval->nodeNr) { - sp->components = - (spell_component *)malloc(sizeof(spell_component) * - (result->nodesetval->nodeNr + 1)); - sp->components[result->nodesetval->nodeNr].type = 0; - } - for (component = sp->components, k = 0; k != result->nodesetval->nodeNr; - ++k) { - const resource_type *rtype; - xmlNodePtr node = result->nodesetval->nodeTab[k]; - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue); - rtype = rt_get_or_create((const char *)propValue); - component->type = rtype; - xmlFree(propValue); - component->amount = xml_ivalue(node, "amount", 1); - component->cost = SPC_FIX; - propValue = xmlGetProp(node, BAD_CAST "cost"); - if (propValue != NULL) { - if (strcmp((const char *)propValue, "linear") == 0) { - if ((sp->sptyp&SPELLLEVEL) == 0) { - log_error("spell '%s' has linear cost but fixed level\n", sp->sname); - } - component->cost = SPC_LINEAR; - } - else if (strcmp((const char *)propValue, "level") == 0) { - if ((sp->sptyp&SPELLLEVEL) == 0) { - log_error("spell '%s' has levelled cost but fixed level\n", sp->sname); - } - component->cost = SPC_LEVEL; - } - xmlFree(propValue); - } - component++; - } - xmlXPathFreeObject(result); - } - } - - xmlXPathFreeObject(spells); - - xmlXPathFreeContext(xpath); - - return result; -} - -static void parse_ai(race * rc, xmlNodePtr node) -{ - xmlChar *propValue; - - propValue = xmlGetProp(node, BAD_CAST "scare"); - if (propValue) { - rc_set_param(rc, "scare", (const char *)propValue); - xmlFree(propValue); - } - rc->splitsize = xml_ivalue(node, "splitsize", 0); - if (xml_bvalue(node, "killpeasants", false)) - rc->flags |= RCF_KILLPEASANTS; - if (xml_bvalue(node, "moverandom", false)) - rc->flags |= RCF_MOVERANDOM; - if (xml_bvalue(node, "learn", false)) - rc->flags |= RCF_LEARN; - if (xml_bvalue(node, "moveattack", false)) - rc->flags |= RCF_ATTACK_MOVED; -} - -static int parse_races(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath = xmlXPathNewContext(doc); - xmlXPathObjectPtr races; - int results = 0; - - /* reading eressea/races/race */ - races = xmlXPathEvalExpression(BAD_CAST "/eressea/races/race", xpath); - if (races->nodesetval) { - xmlNodeSetPtr nodes = races->nodesetval; - int i; - results += nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlNodePtr node = nodes->nodeTab[i]; - xmlNodePtr child; - xmlChar *propValue; - race *rc, *frc = 0; - xmlXPathObjectPtr result; - int k, study_speed_base, attacks; - struct att *attack; - skill_t sk; - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - rc = rc_get_or_create((const char *)propValue); - xmlFree(propValue); - - propValue = xmlGetProp(node, BAD_CAST "damage"); - assert(propValue != NULL); - rc->def_damage = str_strdup((const char *)propValue); - xmlFree(propValue); - - rc->magres = frac_make(xml_ivalue(node, "magres", 100), 100); - rc->healing = (int)(xml_fvalue(node, "healing", rc->healing) * 100); /* TODO: store as int in XML */ - rc->maxaura = (int)(xml_fvalue(node, "maxaura", rc->maxaura) * 100); /* TODO: store as int in XML */ - rc->regaura = (float)xml_fvalue(node, "regaura", rc->regaura); - rc->recruitcost = xml_ivalue(node, "recruitcost", rc->recruitcost); - rc->maintenance = xml_ivalue(node, "maintenance", rc->maintenance); - rc->weight = xml_ivalue(node, "weight", rc->weight); - rc->capacity = xml_ivalue(node, "capacity", rc->capacity); - rc->income = xml_ivalue(node, "income", rc->income); - rc->speed = (float)xml_fvalue(node, "speed", rc->speed); - rc->hitpoints = xml_ivalue(node, "hp", rc->hitpoints); - rc->armor = xml_ivalue(node, "ac", rc->armor); - study_speed_base = xml_ivalue(node, "studyspeed", 0); - if (study_speed_base != 0) { - for (sk = 0; sk < MAXSKILLS; ++sk) { - set_study_speed(rc, sk, study_speed_base); - } - } - - rc->at_default = (char)xml_ivalue(node, "unarmedattack", rc->at_default); - rc->df_default = (char)xml_ivalue(node, "unarmeddefense", rc->df_default); - rc->at_bonus = (char)xml_ivalue(node, "attackmodifier", rc->at_bonus); - rc->df_bonus = (char)xml_ivalue(node, "defensemodifier", rc->df_bonus); - - if (!xml_bvalue(node, "teach", true)) - rc->flags |= RCF_NOTEACH; - if (!xml_bvalue(node, "cansteal", true)) - rc->flags |= RCF_NOSTEAL; - if (!xml_bvalue(node, "learn", true)) - rc->flags |= RCF_NOLEARN; - if (xml_bvalue(node, "playerrace", false)) { - assert(rc->recruitcost == 0); - rc->flags |= RCF_PLAYABLE; - } - if (xml_bvalue(node, "scarepeasants", false)) - rc->flags |= RCF_SCAREPEASANTS; - if (xml_bvalue(node, "cansail", true)) - rc->flags |= RCF_CANSAIL; - if (xml_bvalue(node, "cannotmove", false)) - rc->flags |= RCF_CANNOTMOVE; - if (xml_bvalue(node, "fly", false)) - rc->flags |= RCF_FLY; - if (xml_bvalue(node, "invisible", false)) - rc->flags |= RCF_INVISIBLE; - if (xml_bvalue(node, "coastal", false)) - rc->flags |= RCF_COASTAL; - if (xml_bvalue(node, "unarmedguard", false)) - rc->flags |= RCF_UNARMEDGUARD; - if (xml_bvalue(node, "swim", false)) - rc->flags |= RCF_SWIM; - if (xml_bvalue(node, "walk", false)) - rc->flags |= RCF_WALK; - if (xml_bvalue(node, "horse", false)) - rc->flags |= RCF_HORSE; - if (xml_bvalue(node, "desert", false)) - rc->flags |= RCF_DESERT; - if (xml_bvalue(node, "absorbpeasants", false)) - rc->flags |= RCF_ABSORBPEASANTS; - if (xml_bvalue(node, "noheal", false)) - rc->flags |= RCF_NOHEAL; - if (xml_bvalue(node, "noweapons", false)) - rc->flags |= RCF_NOWEAPONS; - if (xml_bvalue(node, "shapeshift", false)) - rc->flags |= RCF_SHAPESHIFT; - if (xml_bvalue(node, "shapeshiftany", false)) - rc->flags |= RCF_SHAPESHIFTANY; - if (xml_bvalue(node, "illusionary", false)) - rc->flags |= RCF_ILLUSIONARY; - if (xml_bvalue(node, "undead", false)) - rc->flags |= RCF_UNDEAD; - if (xml_bvalue(node, "dragon", false)) - rc->flags |= RCF_DRAGON; - if (xml_bvalue(node, "shipspeed", false)) - rc->flags |= RCF_SHIPSPEED; - - if (xml_bvalue(node, "giveperson", false)) - rc->ec_flags |= ECF_GIVEPERSON; - if (xml_bvalue(node, "giveunit", false)) - rc->ec_flags |= ECF_GIVEUNIT; - if (xml_bvalue(node, "getitem", false)) - rc->ec_flags |= ECF_GETITEM; - if (xml_bvalue(node, "recruitethereal", false)) - rc->ec_flags |= ECF_REC_ETHEREAL; - if (xml_bvalue(node, "recruitunlimited", false)) - rc->ec_flags |= ECF_REC_UNLIMITED; - if (xml_bvalue(node, "stonegolem", false)) - rc->ec_flags |= ECF_STONEGOLEM; - if (xml_bvalue(node, "irongolem", false)) - rc->ec_flags |= ECF_IRONGOLEM; - - if (xml_bvalue(node, "equipment", false)) - rc->battle_flags |= BF_EQUIPMENT; /* TODO: invert this flag, so rc_get_or_create gets simpler */ - if (xml_bvalue(node, "noblock", false)) - rc->battle_flags |= BF_NOBLOCK; - if (xml_bvalue(node, "invinciblenonmagic", false)) - rc->battle_flags |= BF_INV_NONMAGIC; - if (xml_bvalue(node, "resistbash", false)) - rc->battle_flags |= BF_RES_BASH; - if (xml_bvalue(node, "resistcut", false)) - rc->battle_flags |= BF_RES_CUT; - if (xml_bvalue(node, "resistpierce", false)) - rc->battle_flags |= BF_RES_PIERCE; - if (xml_bvalue(node, "noattack", false)) - rc->battle_flags |= BF_NO_ATTACK; - - rc->recruit_multi = 1.0; - for (child = node->children; child; child = child->next) { - if (strcmp((const char *)child->name, "ai") == 0) { - parse_ai(rc, child); - } - else if (strcmp((const char *)child->name, "param") == 0) { - xmlChar *propName = xmlGetProp(child, BAD_CAST "name"); - xmlChar *propValue = xmlGetProp(child, BAD_CAST "value"); - rc_set_param(rc, (const char *)propName, (const char *)propValue); - xmlFree(propName); - xmlFree(propValue); - } - } - - /* reading eressea/races/race/skill */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "skill", xpath); - memset(rc->bonus, 0, sizeof(rc->bonus)); - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - int mod = xml_ivalue(node, "modifier", 0); - int speed = xml_ivalue(node, "speed", study_speed_base); - - propValue = xmlGetProp(node, BAD_CAST "name"); - assert(propValue != NULL); - sk = findskill((const char *)propValue); - if (sk != NOSKILL) { - rc->bonus[sk] = (char)mod; - if (speed) { - set_study_speed(rc, sk, speed); - } - } - else { - log_error("unknown skill '%s' in race '%s'\n", (const char *)propValue, rc->_name); - } - xmlFree(propValue); - } - xmlXPathFreeObject(result); - - /* reading eressea/races/race/familiar */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "familiar", xpath); - if (result->nodesetval->nodeNr > MAXMAGIETYP) { - log_error("race %s has %d potential familiars", rc->_name, result->nodesetval->nodeNr); - } - else { - for (k = 0; k != MAXMAGIETYP; ++k) { - if (k < result->nodesetval->nodeNr) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - - propValue = xmlGetProp(node, BAD_CAST "race"); - assert(propValue != NULL); - frc = rc_get_or_create((const char *)propValue); - frc->flags |= RCF_FAMILIAR; - rc->familiars[k] = frc; - xmlFree(propValue); - } - else { - rc->familiars[k] = frc; - } - } - } - xmlXPathFreeObject(result); - - /* reading eressea/races/race/attack */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "attack", xpath); - attack = rc->attack; - attacks = 0; - for (k = 0; k != result->nodesetval->nodeNr; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - while (attack->type != AT_NONE) { - ++attack; - if (attacks++ >= RACE_ATTACKS) { - log_error("too many attacks for race '%s'\n", rc->_name); - assert(!"aborting"); - } - } - - propValue = xmlGetProp(node, BAD_CAST "damage"); - if (propValue != NULL) { - attack->data.dice = str_strdup((const char *)propValue); - xmlFree(propValue); - } - else { - attack->data.sp = xml_spellref(node, "spell"); - if (attack->data.sp) { - attack->level = xml_ivalue(node, "level", 0); - if (attack->level <= 0) { - log_error("magical attack '%s' for race '%s' needs a level: %d\n", - spellref_name(attack->data.sp), rc->_name, attack->level); - } - } - } - attack->type = xml_ivalue(node, "type", 0); - attack->flags = xml_ivalue(node, "flags", 0); - } - xmlXPathFreeObject(result); - } - } - xmlXPathFreeObject(races); - - xmlXPathFreeContext(xpath); - - return results; -} - -static int parse_messages(xmlDocPtr doc) -{ - xmlXPathContextPtr xpath; - xmlXPathObjectPtr messages; - xmlNodeSetPtr nodes; - int i, results; - - xpath = xmlXPathNewContext(doc); - - /* reading eressea/messages/message */ - messages = - xmlXPathEvalExpression(BAD_CAST "/eressea/messages/message", xpath); - nodes = messages->nodesetval; - results = nodes->nodeNr; - for (i = 0; i != nodes->nodeNr; ++i) { - xmlNodePtr node = nodes->nodeTab[i]; - const char *default_section = "events"; - xmlChar *propSection; - xmlChar *propValue; - xmlXPathObjectPtr result; - int nargs = 0; - char **argv = NULL; - const message_type *mtype; - - /* arguments */ - xpath->node = node; - result = xmlXPathEvalExpression(BAD_CAST "type/arg", xpath); - if (result->nodesetval && result->nodesetval->nodeNr > 0) { - int k; - nargs = result->nodesetval->nodeNr; - argv = malloc(sizeof(char *) * (nargs + 1)); - for (k = 0; k != nargs; ++k) { - xmlNodePtr node = result->nodesetval->nodeTab[k]; - char zBuffer[128]; - xmlChar *propName, *propType; - - propName = xmlGetProp(node, BAD_CAST "name"); - propType = xmlGetProp(node, BAD_CAST "type"); - sprintf(zBuffer, "%s:%s", (const char *)propName, - (const char *)propType); - xmlFree(propName); - xmlFree(propType); - argv[k] = str_strdup(zBuffer); - } - argv[nargs] = NULL; - } - xmlXPathFreeObject(result); - - /* add the messagetype */ - propSection = xmlGetProp(node, BAD_CAST "section"); - if (propSection == NULL) { - propSection = BAD_CAST default_section; - } - - propValue = xmlGetProp(node, BAD_CAST "name"); - mtype = mt_find((const char *)propValue); - if (mtype == NULL) { - mtype = mt_create(mt_new((const char *)propValue, (const char *)propSection), (const char **)argv, nargs); - } - else { - assert(argv != NULL || !"cannot redefine arguments of message now"); - } - xmlFree(propValue); - - if (propSection != BAD_CAST default_section) { - xmlFree(propSection); - } - - /* register the type for CR and NR */ - crt_register(mtype); - nrt_register(mtype); - - /* let's clean up the mess */ - if (argv != NULL) { - int k; - for (k = 0; argv[k] != NULL; ++k) { - free(argv[k]); - } - free(argv); - } - } - - xmlXPathFreeObject(messages); - - xmlXPathFreeContext(xpath); - return results; -} - -void register_xmlreader(void) -{ -#ifndef _MSC_VER /* gcc and clang complain about unused function */ - xml_register_callback(parse_resources); - xml_register_callback(parse_buildings); - xml_register_callback(parse_ships); - xml_register_callback(parse_spellbooks); - xml_register_callback(parse_spells); - xml_register_callback(parse_races); -#endif - - - xml_register_callback(parse_messages); -} diff --git a/src/xmlreader.h b/src/xmlreader.h deleted file mode 100644 index 290b785c3..000000000 --- a/src/xmlreader.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -+-------------------+ -| | Enno Rehling -| Eressea PBEM host | Christian Schlittchen -| (c) 1998 - 2007 | Katja Zedel -| | Henning Peters -+-------------------+ - -This program may not be used, modified or distributed -without prior permission by the authors of Eressea. -*/ - -#ifndef H_KRNL_XMLREADER_H -#define H_KRNL_XMLREADER_H - -struct spell; - -#ifdef __cplusplus -extern "C" { -#endif - extern void register_xmlreader(void); - - /* game-specific callbacks */ - extern void(*set_spelldata_cb) (struct spell * sp); -#ifdef __cplusplus -} -#endif -#endif From bbae56633bed1f885f79176062f94e094e08ff40 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:18:55 +0200 Subject: [PATCH 213/231] rules was part of convert, and we do never finished that branch. --- src/kernel/CMakeLists.txt | 1 - src/kernel/rules.c | 12 ------------ src/kernel/rules.h | 5 ----- 3 files changed, 18 deletions(-) delete mode 100644 src/kernel/rules.c delete mode 100644 src/kernel/rules.h diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 59b8cb806..86c2fb90c 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -69,7 +69,6 @@ pool.c race.c region.c resources.c -rules.c save.c ship.c skills.c diff --git a/src/kernel/rules.c b/src/kernel/rules.c deleted file mode 100644 index c7499fe0c..000000000 --- a/src/kernel/rules.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include "rules.h" - -int write_rules(const char *filename) { - return -1; -} - -int read_rules(const char *filename) -{ - return -1; -} - diff --git a/src/kernel/rules.h b/src/kernel/rules.h deleted file mode 100644 index 98f0bf240..000000000 --- a/src/kernel/rules.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -int read_rules(const char *filename); -int write_rules(const char * filename); - From c11a0208460ff3ffed954ea086771954a6cd2de1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:24:08 +0200 Subject: [PATCH 214/231] remove the text from messages.xml --- res/core/messages.xml | 1878 ----------------------------------------- src/exparse.c | 2 +- 2 files changed, 1 insertion(+), 1879 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index b8f8125dc..757243d9f 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -2,58 +2,32 @@ - Es ist Winter, und Insekten können nur in Wüsten oder mit Hilfe des Nestwärme-Tranks Personen rekrutieren. - It is winter, and insects can only recruit in deserts or with the aid of nestwarmth potions. - Es ist Spätherbst, und diese Woche ist die letzte vor dem Winter, in der Insekten rekrutieren können. - It is the last week before winter in which insects can still recruit. - Bitte denke daran, deine Befehle mit dem Betreff - $subject an $email zu senden. - Remember to send your orders to - $email with the subject ${subject}. - "$unit($unit): '$command' - Dieser Befehl ist unbekannt." - "$unit($unit): '$command' - Parse error, unknown command." - Die Region ist verwüstet, der Boden karg. - The region is ravaged, the ground infertile. - 'Ho ho ho!' Ein dicker Gnom fliegt auf einem von - 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner - Partei eine $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib - ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)'). - 'Ho ho ho!' A fat little gnome Gnom on a sled - pulled by 8 young dragons flies through the stary night and presents - your faction with a $resource($item,1). - 'Ho ho ho!' Ein dicker Gnom fliegt auf einem von - 8 Jungdrachen gezogenen Schlitten durch die Nacht und vermacht Deiner - Partei einen $resource($item,1). (Um diesen Gegenstand einer Einheit zu geben, gib - ihr den Befehl 'BEANSPRUCHE 1 $resource($item,1)'). - 'Ho ho ho!' A fat little gnome Gnom on a sled - pulled by 8 young dragons flies through the stary night and presents - your faction with a $resource($item,1). @@ -62,8 +36,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ungültige Zielregion." - "$unit($unit) in $region($region): '$order($command)' - invalid target region." @@ -72,8 +44,6 @@ - "$unit($unit) in $region($region): '$order($command)' - keine Richtung angegeben." - "$unit($unit) in $region($region): '$order($command)' - no direction was specified." @@ -82,8 +52,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In der Zielregion befinden sich noch Einheiten." - "$unit($unit) in $region($region): '$order($command)' - There are units in the target region." @@ -92,8 +60,6 @@ - $unit($owner) bittet $unit($unit), $ship($ship) zu verlassen. - $unit($owner) asks $unit($unit) to leave $ship($ship). @@ -101,15 +67,11 @@ - $unit($owner) bittet $unit($unit), $building($building) zu verlassen. - $unit($owner) asks $unit($unit) to leave $building($building). - "Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)" - "Units can claim the following items: $resources($items)" @@ -117,67 +79,45 @@ - "$if($isnull($region),"Es","In $region($region)") wurde$if($eq($number,1),"","n") $int($number) $race($race,$number) gesichtet." - "$if($isnull($region),"","In $region($region), ")$int($number) $race($race,$number) were discovered." - "$unit($mage) läßt einen Teil seiner selbst in die Erde fliessen. Die Bäume, die Transformation überlebt haben, erscheinen nun viel kräftiger." - "The power of $unit($mage) flows into the ground and the trees which survived the spell appear much stronger now." - "$unit($mage) beschwört einen Luftgeist, der die $ship($ship) in die Wolken hebt." - "$unit($mage) summons a wind spirit that lifts the $ship($ship) into the clouds." - "$unit($mage) beschwört einen Schleier der Verwirrung." - "$unit($mage) summons a fog of confusion." - Eine Feuerwand blockiert die Ein- und Ausreise. ($int36($id)) - A wall of fire blocks entry and exit. ($int36($id)) - Der Magier besitzt die Gabe des Chaos. ($int36($id)) - The magician possesses the gift of Chaos. ($int36($id)) - Dieser mächtige Bann scheint die Einheit ihres freien Willens zu berauben. Solange der Zauber wirkt, wird sie nur den Befehlen ihres neuen Herrn gehorchen. ($int36($id)) - This powerful curse appears to rob the unit of its free will. As long as the curse is active, it will only obey the orders of its new lord. ($int36($id)) - Dieser Beeinflussungszauber scheint die Einheit einem ganz bestimmten Volk wohlgesonnen zu machen. ($int36($id)) - This enchantment appears to make the unit well-disposed towards a particular faction. ($int36($id)) - Der Mahlstrom in dieser Region wird alle Schiffe, die in seinen Sog geraten, schwer beschädigen. ($int36($id)) - The maelstrom in this area will heavily damage all ships coming into its wake. ($int36($id)) - Heilung ist in dieser Region magisch beeinflusst. ($int36($id)) - Healing in this region is affected by magic. ($int36($id)) - Dieses Schiff hat sich verfahren. ($int36($id)) - This ship has lost its path. ($int36($id)) @@ -185,151 +125,113 @@ - "$unit($unit) ist im Traum eine Fee erschienen. ($int36($id))" - "In a dream, a fairy appears to $unit($unit). ($int36($id))" - "$unit($unit) wird von bösen Alpträumen geplagt. ($int36($id))" - "$unit($unit) is haunted by terrbile nightmares. ($int36($id))" - "$unit($unit) wird von einem glitzernden Funkenregen umgeben. ($int36($id))" - "$unit($unit) is surrounded by a shower of glittering sparkles. ($int36($id))" - "Ein schimmernder Lichterkranz umgibt $unit($unit). ($int36($id))" - "A circle of shimmering lights surrounds $unit($unit). ($int36($id))" - "Eine Melodie erklingt, und $unit($unit) tanzt bis spät in die Nacht hinein. ($int36($id))" - "A haunting melody fills the air, and $unit($unit) dances until late into the night. ($int36($id))" - "$unit($unit) findet eine kleine Flöte, die eine wundersame Melodie spielt. ($int36($id))" - "$unit($unit) finds a small flute that plays a beautiful melody. ($int36($id))" - "Die Frauen des nahegelegenen Dorfes bewundern $unit($unit) verstohlen. ($int36($id))" - "The women of the nearby village cast furtive looks at $unit($unit). ($int36($id))" - "Eine Gruppe vorbeiziehender Bergarbeiter rufen $unit($unit) eindeutig Zweideutiges nach. ($int36($id))" - "A group of passing miners makes passes at $unit($unit). ($int36($id))" - "$unit($unit) bekommt von einer Schlange einen Apfel angeboten. ($int36($id))" - "A large green snake offers $unit($unit) a fine-looking apple. ($int36($id))" - "A spell is deflecting magical energies and weakening all other spells cast in the region. ($int36($id))" - "Dieser Zauber scheint magische Energien irgendwie abzuleiten und so alle in der Region gezauberten Sprüche in ihrer Wirkung zu schwächen oder ganz zu verhindern. ($int36($id))" - "Ein Einhorn berührt $unit($unit) mit seinem Horn und verschwindet kurz darauf im Unterholz. ($int36($id))" - "A unicorn touches $unit($unit) with its horn and vanishes into the forest quickly after. ($int36($id))" - "Vogelzwitschern begleitet $unit($unit) auf all seinen Wegen. ($int36($id))" - "Bird songs follow $unit($unit) on all his travels. ($int36($id))" - "Leuchtende Blumen erblühen rund um das Lager von $unit($unit). ($int36($id))" - "Brightly coloured flowers pop up all around $unit($unit)'s camp. ($int36($id))" - "Über $unit($unit) zieht eine Gruppe Geier ihre Kreise. ($int36($id))" - "A group of vultures circles above $unit($unit). ($int36($id))" - "Der Kopf von $unit($unit) hat sich in einen grinsenden Totenschädel verwandelt. ($int36($id))" - "The head of $unit($unit) has turned into a madly grinning skull. ($int36($id))" - "Ratten folgen $unit($unit) auf Schritt und Tritt. ($int36($id))" - "Rats follow $unit($unit)'s every step. ($int36($id))" - "Pestbeulen befallen den Körper von $unit($unit). ($int36($id))" - "The body of $unit($unit) is disfigured by hideous boils. ($int36($id))" - "Eine dunkle Fee erscheint $unit($unit) im Schlaf. Sie ist von schauriger Schönheit. ($int36($id))" - "A dark and mysterious fairy appears before $unit($unit). She is of bewitching beauty. ($int36($id))" - "Fäulnisgeruch dringt $unit($unit) aus allen Körperöffnungen. ($int36($id))" - "The stench of decay is poring from all the orifices of $unit($unit). ($int36($id))" @@ -337,8 +239,6 @@ - "$unit($unit) scheint $faction($faction) zu mögen. ($int36($id))" - "$unit($unit) likes $faction($faction). ($int36($id))" @@ -346,8 +246,6 @@ - "$unit($unit) scheint $race($race, 0) zu mögen. ($int36($id))" - "$unit($unit) seems to like $race($race, 0). ($int36($id))" @@ -355,8 +253,6 @@ - "$unit($unit) ist ungewöhnlich ungeschickt in $skill($skill). ($int36($id))" - "$unit($unit) has some troubles with $skill($skill). ($int36($id))" @@ -364,8 +260,6 @@ - "$unit($unit) ist ungewöhnlich geschickt in $skill($skill). ($int36($id))" - "$unit($unit) is incredibly skilled at $skill($skill). ($int36($id))" @@ -373,8 +267,6 @@ - "$unit($unit) wird noch $int($duration) $if($eq($duration,1), "Woche", "Wochen") unter unserem Bann stehen. ($int36($id))" - "$unit($unit) will be under our influence for $int($duration) more $if($eq($duration,1), "week", "weeks"). ($int36($id))" @@ -383,8 +275,6 @@ - "$int($number) $if($eq($number,1), "Person", "Personen") von $unit($unit) $if($eq($number,1), "ist", "sind") noch $int($duration) $if($eq($duration,1), "Woche", "Wochen") beschleunigt. ($int36($id))" - "$int($number) $if($eq($number,1), "member", "members") of $unit($unit) $if($eq($number,1), "is", "are") accelerated for $int($duration) more $if($eq($duration,1), "week", "weeks"). ($int36($id))" @@ -392,270 +282,196 @@ - "$int($number) $if($eq($number,1), "Person", "Personen") von $unit($unit) $if($eq($number,1), "fühlt", "fühlen") sich vor Kälte geschützt. ($int36($id))" - "$int($number) $if($eq($number,1), "member", "members") of $unit($unit) $if($eq($number,1), "is", "are") protected from the cold. ($int36($id))" - "Ein unbekannter Zauber liegt auf dem Schiff. ($int36($id))" - "An unknown spell lies on this ship. ($int36($id))" - "Ein unbekannter Zauber liegt auf der Einheit. ($int36($id))" - "An unknown spell lies on this unit. ($int36($id))" - "Ein unbekannter Zauber liegt auf dem Gebäude. ($int36($id))" - "An unknown spell lies on this building. ($int36($id))" - "Ein unbekannter Zauber liegt auf der Region. ($int36($id))" - "An unknown spell lies on this region. ($int36($id))" - "Eine Wolke negativer Energie liegt über der Region. ($int36($id))" - "A fog of negative energy enshrouds the region. ($int36($id))" - "Die Leute strotzen nur so vor Kraft. ($int36($id))" - "Testosterone levels are at an all-time high. ($int36($id))" - "$unit($unit) wird von einem Alp geritten. ($int36($id))" - "$unit($unit) is chased by a nightmare. ($int36($id))" - "$unit($unit) stürzt sich von einem amourösen Abenteuer ins nächste. ($int36($id))" - "$unit($unit) goes from one amourous adventure to another. ($int36($id))" - "$unit($unit) kann sich kaum konzentrieren. ($int36($id))" - "$unit($unit) can hardly focus on anything. ($int36($id))" - "Die Ausrüstung von $unit($unit) scheint unsichtbar. ($int36($id))" - "$unit($unit)'s equipment is invisible. ($int36($id))" - "Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))" - "The magical resistance has been strengthened. ($int36($id))" - "Die natürliche Widerstandskraft gegen Verzauberung ist gestärkt. ($int36($id))" - "The magical resistance has been strengthened. ($int36($id))" - "Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde gestärkt. ($int36($id))" - "The magical resistance of some units in this region was boosted. ($int36($id))" - "Die natürliche Widerstandskraft gegen Verzauberung bestimmter Einheiten in dieser Region wurde geschwächt. ($int36($id))" - "The magical resistance of some units in this region was weakened. ($int36($id))" - "Diese Mauern wirken, als wären sie direkt aus der Erde gewachsen und nicht erbaut. ($int36($id))" - "These walls appear to have grown straight out of the earth. ($int36($id))" - "Ein magischer Schimmer liegt auf diesen Mauern. ($int36($id))" - "A magical shimmer lies on these walls. ($int36($id))" - "Die Straßen sind erstaunlich trocken und gut begehbar, doch an manchen Stellen bilden sich wieder die erste Schlammlöcher. ($int36($id))" - "The roads are extremely dry and well-kept, but some areas show the first signs of potholes reappearing. ($int36($id))" - "Die Straßen sind erstaunlich trocken und gut begehbar. ($int36($id))" - "The roads are extremely dry and well-kept. ($int36($id))" - "Albträume plagen die Leute. ($int36($id))" - "Nightmares plague the population. ($int36($id))" - "Die Leute haben schöne Träume. ($int36($id))" - "The people in this region have sweet dreams. ($int36($id))" - "Diese Region wurde von den Göttern verflucht. Das Meer ist eine ekelige Brühe, braunschwarze, stinkende Gase steigen aus den unergründlichen Tiefen hervor, und untote Seeungeheuer, Schiffe zerfressend und giftige grüne Galle geifernd, sind der Schrecken aller Seeleute, die diese Gewässer durchqueren. Niemand kann hier lange überleben. ($int36($id))" - "This region was cursed by the gods. The sea is a foul cesspool, noxious gases rise from the deep, undead seamonsters attack all ships. Noone can live here for long. ($int36($id))" - "Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen über die tote Erde und furchtbare Kreaturen ziehen über das Land. Die Brunnen sind vergiftet, und die wenigen essbaren Früchte sind von einem rosa Pilz überzogen. Niemand kann hier lange überleben. ($int36($id))" - "This region was cursed by the gods. Stinking vapors billow over the dead ground and hideous creatures move about the country. The wells are poisened and the edible plants are covered by a pink fungus. Noone can live here for long. ($int36($id))" - "Ein Schleier der Verwirrung liegt über der Region. ($int36($id))" - "A veil of confusion lies over the region. ($int36($id))" - "In der Region treibt ein Giftelementar sein Unwesen. ($int36($id))" - "A poison elemental is spreading pestilence and death. ($int36($id))" - "Die ganze Region ist von einer friedlichen Stimmung erfasst. ($int36($id))" - "Everyone in this region seems to be in a peacful mood. ($int36($id))" - "Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))" - "Everyone in this region seems to be having a very good time. ($int36($id))" - "Die Bauern sind unzufrieden. ($int36($id))" - "The peasants are upset. ($int36($id))" - "Alle Leute in der Region haben Schlafstörungen. ($int36($id))" - "People in this region suffer from insomnia. ($int36($id))" - "In dieser Gegend herrscht eine Dürre. ($int36($id))" - "This region was hit by a drought. ($int36($id))" - "In dieser Gegend steht das Korn besonders gut im Feld. ($int36($id))" - "The grain in this region is especially healthy. ($int36($id))" - "Die Winde scheinen dieses Schiff besonders zu beguenstigen. ($int36($id))" - "The winds seem to favor this ship. ($int36($id))" - "Untote schrecken vor dieser Region zurück. ($int36($id))" - "The undead turn away from this region. ($int36($id))" - "Der Zahn der Zeit kann diesen Mauern nichts anhaben. ($int36($id))" - "Time cannot touch these walls. ($int36($id))" - "Dichte Nebel bedecken diese Woche die Region. Keine Einheit schafft es, diese Nebel zu durchdringen und die Region zu verlassen. ($int36($id))" - "Heavy fog makes it impossible to leave the region. ($int36($id))" - "$unit($unit) setzt ein Sonnensegel. Die Geschwindigkeit des Schiffes erhöht um $int($speed)." - "$unit($unit) sets a solar sail. The ship's speed is increased by $int($speed)." - "Interner Fehler: Meldung '$name' nicht definiert." - "Internal Error: Message '$name' is undefined." @@ -664,8 +480,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Interner Fehler: Meldung '$name' nicht definiert." - "$unit($unit) in $region($region): '$order($command)' - Internal Error: Message '$name' is undefined." @@ -673,8 +487,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier ist kein passendes Schloss." - "$unit($unit) in $region($region): '$order($command)' - No fitting lock can be found here." @@ -682,8 +494,6 @@ - "$unit($unit) öffnet eines der Schlösser in $region($region) mit $if($eq($key,1),"dem Achatenen Schlüssel","dem Saphirnen Schlüssel")." - "$unit($unit) unlocks one of the locks in $region($region) with $if($eq($key,1),"the Agate Key","the Sapphire Key")." @@ -691,31 +501,23 @@ - "$unit($unit) verschließt eines der Schlösser in $region($region) mit $if($eq($key,1),"dem Achatenen Schlüssel","dem Saphirnen Schlüssel")." - "$unit($unit) locks one of the locks in $region($region) with $if($eq($key,1),"the Agate Key","the Sapphire Key")." - "$unit($unit) in $region($region) verwandelt sich in ein Werwesen." - "$unit($unit) in $region($region) becomes a lycantrope." - "SIEG! $if($eq($n,1), "Die Partei $winners hat", "Die Parteien $winners haben") die Siegbedingung für die erforderliche Zeit erfüllt. Das Spiel ist damit beendet." - "VICTORY! $if($eq($n,1), "The faction $winners has", "The factions $winners have") fulfilled the victory condition for the necessary time. The game is over." - "Achtung: $faction($faction) hat die Siegbedingungen erfüllt und wird in $if($eq($remain,1),"einer Woche","$int($remain) Wochen") zum Sieger erklärt werden." - "Attention: $faction($faction) has fulfilled the victory condition and will be declared winner in $if($eq($remain,1),"one week","$int($remain) weeks")." @@ -723,8 +525,6 @@ - "$unit($unit) wurde in $region($region) von einem GM gelöscht: \"$string\"." - "$unit($unit) in $region($region) was removed by a GM: \"$string\"." @@ -732,14 +532,10 @@ - "$resource($item,1) (Gewicht: $weight($weight)): $description" - "$resource($item,1) (weight: $weight($weight)): $description" - "Ein Hauch des Lebens liegt über der Welt und alle Wesen fühlen sich frisch und erholt." - "Life itself touches the world and all beings are healed." @@ -747,16 +543,12 @@ - "$unit($unit) hat Glück und findet einen Hort von $int($amount) $resource($item,$amount)." - "$unit($unit) luckily finds a cache of $int($amount) $resource($item,$amount)." - "$int36($unit.id($unit))/$int($index) erzielt einen kritischen Treffer." - "$int36($unit.id($unit))/$int($index) does critical damage." @@ -765,8 +557,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) muß mindestens 2 Stufen besser sein als $unit($student)." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) needs to be at least 2 levels better than $unit($student)." @@ -775,8 +565,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($student) lernt nicht." - "$unit($unit) in $region($region): '$order($command)' - $unit($student) is not learning." @@ -785,23 +573,17 @@ - "$unit($unit) in $region($region): '$order($command)' - Dafür braucht die Einheit $resources($required)." - "$unit($unit) in $region($region): '$order($command)' - For this, the unit needs $resources($required)." - $trailto($region) - $trailto($region) - "Deine Partei hat $int($units) Migranten und kann maximal $int($maxunits) Migranten aufnehmen." - "Your faction has $int($units) migrants out of a possible total of $int($maxunits)." @@ -810,16 +592,12 @@ - "Seit $int($age) Wochen Mitglied der Allianz '$name ($int36($id))', angeführt von $faction($leader)." - "Member of '$name ($int36($id))' for $int($age) weeks, led by $faction($leader)." - "Deine Partei hat $int($units) Helden und kann maximal $int($maxunits) Helden ernennen." - "Your faction has promoted $int($units) heroes out of a possible total of $int($maxunits)." @@ -827,180 +605,132 @@ - "Deine Partei hat $int($population) Personen in $int($units) von maximal $int($limit) Einheiten." - "Your faction has $int($population) people in $int($units) of $int($limit) possible units." - "Statistik für $region($region):" - "Statistics for $region($region):" - "Unterhaltung: max. $int($max) Silber" - "entertainment: max. $int($max) silver" - "Moral der Bauern: $int($morale)" - "peasant morale: $int($morale)" - "Luxusgüter zum angegebenen Preis: $int($max)" - "luxury goods at this price: $int($max)" - "Lohn für Arbeit: $int($max) Silber" - "worker salary: $int($max) silver" - "Bauerneinnahmen: $int($max) Silber" - "peasant wages: $int($max) silver" - "Personen: $int($max)" - "people: $int($max)" - "Rekruten: max. $int($max) Bauern" - "recruits: $int($max) peasants" - "Deine Partei hat ${score} Punkte. Der Durchschnitt für Parteien ähnlichen Alters ist ${average} Punkte." - "Your faction has a score of ${score}. The average score for similar factions is ${average}." - "Report für $game, $date" - "Report for $game, $date" - "Im $direction($dir) der Region liegt $trailto($region)" - "To the $direction($dir) lies $trailto($region)" - "$resource($product,0) $int($price) Silber" - "$resource($product,0) for $int($price) silver" - "Auf dem Markt wird für $resource($product,0) $int($price) Silber verlangt." - "The local market offers $resource($product,0) at a price of $int($price) silver." - "Auf dem Markt werden $resource($p1,0) und $resource($p2,0) feilgeboten." - "The local market offers $resource($p1,0) and $resource($p2,0)." - "Auf dem Markt wird $resource($p1,0) feilgeboten." - "The local market offers $resource($p1,0)." - "Auf der Einheit $if($eq($left,1),"liegt","liegen") $int($left) Wirkung$if($eq($left,1),"","en") $resource($potion,1)." - "There $if($eq($left,1),"is","are") $int($left) $if($eq($left,1),"use","uses") of $resource($potion,1) left." - "Die Region ist im Besitz von $faction($faction)." - "The region is owned by $faction($faction)." - "$if($transparent," befindet sich"," versperrt") ${object}$if($transparent,""," die Sicht")." - "$if($transparent," there is"," sight is blocked by ") ${object}." - ", belagert von $int($soldiers) Personen$if($lt($diff,0),""," (abgeschnitten)")" - ", besieged by $int($soldiers) soldiers$if($lt($diff,0),""," (cut off)")" - "Dein Passwort lautet ${password}." - "Your password is ${password}." - "Die Mannschaft krank vom vergifteten Wasser, Planken, Ruder und Segel zerfressen von den Wassern des verfluchten Meeres, ergibt sich die $ship($ship) in ihr Schicksal und sinkt." - "Her sailors sick from the poisened ocean, planks, rudder und sails corroded by the waters of the cursed ocean, the $ship($ship) finally succumbs to her destiny and sinks." - "$unit($unit) benutzt einen Talenttrunk und fühlt, wie sein Wissen zunimmt." - "$unit($unit) uses a potion of skills and feels his knowledge grow." - "$unit($unit) benutzt einen Astralkristall und gewinnt $int($aura) Aura hinzu." - "$unit($unit) uses an astral crystal and gains $int($aura) aura." @@ -1008,8 +738,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Luxusgut wird hier nicht verkauft." - "$unit($unit) in $region($region): '$order($command)' - These goods are not on sale here." @@ -1018,8 +746,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dazu benötigt man $resource($missing,0)." - "$unit($unit) in $region($region): '$order($command)' - This requires $resource($missing,0)." @@ -1028,8 +754,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) nehmen nichts an." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) will not accept anything." @@ -1038,8 +762,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht neu gruppiert werden." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be regrouped." @@ -1048,8 +770,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts stehelen." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot steal anything." @@ -1057,8 +777,6 @@ - "Eine Botschaft von $unit.dative($sender) aus $region($region): '$string'" - "A message by $unit($sender) from $region($region): '$string'" @@ -1067,8 +785,6 @@ - "In $region($region) erhielt $unit($unit) eine Botschaft von $unit.dative($sender): '$string'" - "In $region($region), $unit($unit) received a message by $unit($sender): '$string'" @@ -1077,22 +793,16 @@ - "In $region($region) erhielt $unit($unit) von $unit.dative($sender) $resources($items)" - "In $region($region), $unit($unit) received $resources($items) from $unit($sender)" - "$building($building) hat diese Woche nicht funktioniert, da zu Beginn der Woche der Unterhalt nicht gezahlt werden konnte." - "$building($building) was nonfunctional because upkeep could not be paid at the beginning of the week." - "Plötzlich löst sich $building($building) in kleine Traumwolken auf." - "$building($building) suddenly dissolves into small pink clouds." @@ -1101,8 +811,6 @@ - "In $region($region) stürzte $building($building) ein.$if($road," Beim Einsturz wurde die halbe Straße vernichtet.","")$if($opfer," $int($opfer) Opfer $if($eq($opfer,1),"ist","sind") zu beklagen.","")" - "$building($building) in $region($region) collapses.$if($road," The collapse ruined half of the road.","")$if($opfer," There are $int($opfer) casualties.","")" @@ -1111,8 +819,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In der Ebene der Herausforderung kann niemand rekrutiert werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot recruit in this plane." @@ -1121,8 +827,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht so gut tarnen." - "$unit($unit) in $region($region): '$order($command)' -The unit cannot hide that well." @@ -1130,8 +834,6 @@ - "$ship($ship) was destroyed by $unit($unit)." - "$ship($ship) wurde von $unit($unit) zerstört." @@ -1139,8 +841,6 @@ - "$unit($unit) could not destroy $ship($ship)." - "$unit($unit) konnte $ship($ship) nicht zerstören." @@ -1148,24 +848,18 @@ - "$unit($unit) was detected while trying to destroy $ship($ship)." - "$unit($unit) wurde beim Versuch $ship($ship) zu zerstören entdeckt." - "Somebody attempted to destroy $ship($ship)." - "Es wurde versucht, $ship($ship) zu zerstören." - "$ship($ship) was destroyed." - "$ship($ship) wurde zerstört." @@ -1174,8 +868,6 @@ - "$int($amount) Personen von $unit($unit) ertrinken.$if($isnull($region),""," Die Einheit rettet sich nach $region($region).")" - "$int($amount) people of $unit($unit) drown.$if($isnull($region),""," The unit makes it to $region($region).")" @@ -1183,8 +875,6 @@ - "$unit($unit) überlebt unbeschadet und rettet sich nach $region($region)." - "$unit($unit) survives unscathed and makes it to $region($region)." @@ -1192,8 +882,6 @@ - "$ship($ship) versinkt in den Fluten von $region($region)." - "$ship($ship) disappears in the depths of $region($region)." @@ -1201,8 +889,6 @@ - "$unit($unit) wurde beim versenken von $ship($ship) entdeckt." - "$unit($unit) was spotted sinking $ship($ship)." @@ -1211,8 +897,6 @@ - "$unit($unit) entdeckte $unit($saboteur) beim Versenken von $ship($ship)." - "$unit($unit) caught $unit($saboteur) trying to sink $ship($ship)." @@ -1220,8 +904,6 @@ - "$unit($unit) ertrinkt in $region($region)." - "$unit($unit) drowns in $region($region)." @@ -1229,8 +911,6 @@ - "$unit($unit) nimmt Schaden durch den Giftelementar in $region($region)." - "$unit($unit) is taking poison damage in $region($region)." @@ -1238,8 +918,6 @@ - "$unit($unit) stirbt am Schaden durch den Giftelementar in $region($region)." - "$unit($unit) dies from poison damage taken in $region($region)." @@ -1248,8 +926,6 @@ - "$unit($unit) stolpert bei der Erforschung der Region über $localize($location). Nähere Durchsuchung fördert ein zerfleddertes altes Buch mit dem Titel '$localize($book)' zu Tage. Der Wissensschub ist enorm." - "$unit($unit) stumbles upon $localize($location) while exploring the region. Closer inspection reveals a torn old book titled '$localize($book)'. The expansion of knowledge is tremendous." @@ -1257,8 +933,6 @@ - "$unit($unit) fühlt sich von starken magischen Energien durchströmt. ($int36($id))" - "Powerful magical energies are pulsing through $unit($unit). ($int36($id))" @@ -1266,8 +940,6 @@ - "$unit($unit) hat Schwierigkeiten seine magischen Energien zu sammeln. ($int36($id))" - "$unit($unit) finds it difficult to gather its magical energies. ($int36($id))" @@ -1276,8 +948,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger sind für einen Moment benommen." - "$unit($mage) casts $spell($spell): $int($amount) fighters were momentarily stunned." @@ -1285,8 +955,6 @@ - "$unit($mage) besänftigt den Bauernaufstand in $region($region)." - "$unit($mage) quells the uprising in $region($region)." @@ -1294,8 +962,6 @@ - "$unit($mage) rief in $region($region) einen Riss in dem Gefüge der Magie hervor, der alle magische Kraft aus der Region riss." - "$unit($mage) in $region($region) caused a tear in the fabric of magic, that sucked all magical energies out of the region." @@ -1304,8 +970,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in Schlaf versetzt." - "$unit($mage) casts $spell($spell): $int($amount) fighters have fallen asleep." @@ -1314,8 +978,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurde ihre Lebenskraft entzogen." - "$unit($mage) casts $spell($spell): $int($amount) fighters had their life energy drained." @@ -1324,8 +986,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Kriegern wurden versteinert." - "$unit($mage) casts $spell($spell): $int($amount) fighters were petrified." @@ -1334,8 +994,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden in einen Blutrausch versetzt." - "$unit($mage) casts $spell($spell): $int($amount) fighters went into a mindless rage." @@ -1344,8 +1002,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden eingeschüchtert." - "$unit($mage) casts $spell($spell): $int($amount) fighters were intimidated." @@ -1353,8 +1009,6 @@ - "$unit($mage) zaubert $spell($spell), aber es gab niemanden, der beeinflusst werden konnte." - "$unit($mage) casts $spell($spell), but nobody is affected." @@ -1363,8 +1017,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden von Furcht gepackt." - "$unit($mage) casts $spell($spell): $int($amount) fighters were consumed by fear." @@ -1372,8 +1024,6 @@ - "$unit($mage) zaubert $spell($spell): Das Kampfgetümmel erstirbt und er kann unbehelligt seines Weges ziehen." - "$unit($mage) casts $spell($spell): The noise of the battle dies down and the mage is able to slip away unharmed." @@ -1381,8 +1031,6 @@ - "$unit($mage) zaubert $spell($spell): Ein Sturm kommt auf und die Schützen können kaum noch zielen." - "$unit($mage) casts $spell($spell): Strong stormwinds are blowing and the archers are having a hard time aiming." @@ -1391,8 +1039,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger schleppten sich müde in den Kampf." - "$unit($mage) casts $spell($spell): $int($amount) fighters had trouble staying awake." @@ -1401,8 +1047,6 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden moralisch gestärkt." - "$unit($mage) casts $spell($spell): $int($amount) fighters had their moral boosted." @@ -1411,32 +1055,24 @@ - "$unit($mage) zaubert $spell($spell): $int($amount) Krieger wurden magisch beschleunigt." - "$unit($mage) casts $spell($spell): $int($amount) fighters were magically accelerated." - "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte." - "$unit($mage) calls forth a terrible torment over the enemy side, but there was nobody who could be affected by it." - "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt." - "$unit($mage) causes a terrible storm over the enemy, but the magic rain does not do any harm." - "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde. Der magischen Regen lässt alles Eisen rosten." - "$unit($mage) calls forth a terrible torment over the enemy. The magical rain makes all iron rusty." @@ -1444,8 +1080,6 @@ - "$unit($mage) kümmert sich um die Verletzten und heilt $int($amount) Verwundete." - "$unit($mage) sees after the wounded and heals $int($amount)." @@ -1454,8 +1088,6 @@ - "$unit($mage) kümmert sich um die Verletzten und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Verwundete werden geheilt." - "$unit($mage) sees after the wounded and heals $int($amount). A $resource($item,1) improves the spell." @@ -1464,8 +1096,6 @@ - "Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde von $region($region) in die Mauern von $building($building)." - "$unit($mage) performs a ritual that binds the magical forces of $region($region) into the walls of $building($building)." @@ -1474,8 +1104,6 @@ - "$unit($mage) opfert $unit($target) $int($amount) Aura." - "$unit($mage) sacrifices $int($amount) aura for $unit($target)." @@ -1483,8 +1111,6 @@ - "$unit($mage) beginnt ein Ritual der Wiederbelebung. $int($amount) Krieger stehen von den Toten auf." - "$unit($mage) begins a ritual of resurrection. $int($amount) warriors rise from the dead." @@ -1493,21 +1119,15 @@ - "$unit($mage) beginnt ein Ritual der Wiederbelebung und benutzt ein $resource($item,1), um den Zauber zu verstärken. $int($amount) Krieger stehen von den Toten auf." - "$unit($mage) begins a ritual of resurrection augmented by a $resource($item,1). $int($amount) warriors rise from the dead." - "$unit($mage) öffnet ein Chaostor." - "$unit($mage) opens a chaos gate." - "Ein Wirbel aus blendendem Licht erscheint." - "A vortex of blinding light appears." @@ -1515,8 +1135,6 @@ - "$unit($mage) kann in $region($region) keine Untoten rufen." - "$unit($mage) cannot summon any undead in $region($region)." @@ -1525,8 +1143,6 @@ - "$unit($mage) erweckt in $region($region) $int($amount) Untote aus ihren Gräbern." - "$unit($mage) calls $int($amount) undead from their graves in $region($region)." @@ -1534,16 +1150,12 @@ - "$unit($mage) stört in $region($region) die Ruhe der Toten." - "$unit($mage) communicates with the dead in $region($region)." - "$unit($unit) gelingt es, durch die Nebel auf die Realität zu blicken." - "$unit($unit) manages to catch a glimpse of reality through the fog." @@ -1551,8 +1163,6 @@ - "$unit($mage) konnte $int($amount) $if($eq($amount,1),"Bauer","Bauern") anwerben." - "$unit($mage) managed to recruit $int($amount) $if($eq($amount,1),"peasant","peasants")." @@ -1561,67 +1171,49 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine höhere Macht hindert $unit($unit) daran, das Objekt zu übergeben. 'ES IST DEINS, MEIN KIND. DEINS GANZ ALLEIN'." - "$unit($unit) in $region($region): '$order($command)' - A higher power prevents $unit($unit) from giving the object away. 'IT IS YOURS MY CHILD. ONLY YOURS.'." - "Der Eisberg $region($region) schmilzt." - "The iceberg $region($region) melts." - "Der Gletscher von $region($region) bricht und treibt davon." - "The glacier in $region($region) breaks up and drifts away." - "Der Eisberg $region($region) treibt an eine Küste." - "The iceberg $region($region) drifts onto a coast." - "Die $ship($ship) wird bei einer Kollision mit einem Eisberg zerstört." - "The $ship($ship) has been destroyed by a collision with an iceberg." - "Die $ship($ship) wird bei einer Kollision mit einem Eisberg beschädigt." - "The $ship($ship) has been damaged by a collision with an iceberg." - "Die $ship($ship) ist zu stark überladen und wird stark beschädigt." - "The $ship($ship) is massively overloaded and is damaged heavily." - "Die $ship($ship) treibt nach $direction($dir)." - "The ship $ship($ship) drifts to the $direction($dir)." - "Der Eisberg $region($region) treibt nach $direction($dir)." - "The iceberg $region($region) drifts $direction($dir)." @@ -1631,8 +1223,6 @@ - "$unit($unit) verlor $int($fallen) Personen$if($alive,", $int($alive) überlebten","")$if($run," und $int($run) flohen$if($isnull($runto),""," nach $region($runto)")","")." - "$unit($unit) lost $int($fallen) people$if($alive,", $int($alive) survived","")$if($run," and $int($run) fled$if($isnull($runto),""," to $region($runto)")","")." @@ -1640,31 +1230,23 @@ - "$unit($unit) erzielte $int($hits) Treffer und tötete $int($kills) Gegner." - "$unit($unit) hit $int($hits) times and killed $int($kills) enemies." - "$string" - "$string" - "Heer $int($index): $name" - "Army $int($index): $name" - "Verwundert blicken die Bauern von $region($region) auf ein neues Gebäude." - "Flabbergasted, the peasants of $region($region) behold a new building." @@ -1674,8 +1256,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) gewinnt durch das Ritual $int($amount) Aura." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) receives $int($amount) aura." @@ -1683,8 +1263,6 @@ - "$unit($mage) beschwört Naturgeister in den Boden von $region($region)." - "$unit($mage) summons natural spirits into the ground of $region($region)." @@ -1693,8 +1271,6 @@ - "$unit($mage) verwandelt $int($amount) aus $unit($target) in $race($race,0)." - "$unit($mage) transforms $int($amount) from $unit($target) into $race($race,0)." @@ -1702,38 +1278,28 @@ - "$unit($mage) verwandelt $unit($target) in $race($race,0)." - "$unit($mage) tranforms $unit($target) to $race($race,0)." - "$unit($mage) erlöst die gequälten Seelen der Toten." - "$unit($mage) redeems the tormented souls of the dead." - "$unit($mage) verwandelt sich in einen Wyrm." - "$unit($mage) turns into a wyrm." - "$unit($mage) erschafft in $region($region) eine Wand aus Feuer." - "$unit($mage) creates a wall of fire in $region($region)." - "$unit($mage) wiegelt in $region($region) die Bauern zum Aufstand auf." - "$unit($mage) incites a revolt among the peasants of $region($region)." @@ -1742,8 +1308,6 @@ - "$unit($mage) wiegelt in $region($region) $int($amount) Bauern zum Aufstand auf." - "$unit($mage) incites a revolt among $int($amount) peasants of $region($region)." @@ -1751,8 +1315,6 @@ - "$unit($mage) sorgt in $region($region) für Trübsal unter den Bauern." - "$unit($mage) causes great sadness among the peasants of $region($region)." @@ -1761,8 +1323,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude." - "$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building." @@ -1772,8 +1332,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) kann nicht $race($race,1) werden." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) cannot take the form of $race($race,1)." @@ -1782,8 +1340,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen." - "$unit($unit) in $region($region): '$order($command)' - The elemental is too small to carry the building." @@ -1793,8 +1349,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen." - "$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction)." @@ -1804,8 +1358,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) ist von unserer Art, das Ritual wäre verschwendete Aura." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) is one of our kind, we should not waste aura on this." @@ -1814,8 +1366,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) wird von uns aufgenommen." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) has become one of our kind." @@ -1824,8 +1374,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) ruft Drachen nach $region($target)." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) calls dragons to $region($target)." @@ -1836,8 +1384,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) erschafft $int($amount) ${object}." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) creates $int($amount) ${object}." @@ -1845,8 +1391,6 @@ - "Ein Beben erschüttert $building($building). Viele kleine Pseudopodien erheben das Gebäude und tragen es in Richtung $direction($direction)." - "An tremor shakes $building($building). Many little pseudopods lift up the building and carry it to $direction($direction)." @@ -1854,15 +1398,11 @@ - "$unit($unit) benutzt in $region($region) ein Traumauge." - "$unit($unit) uses a dreameye in $region($region)." - "$unit($unit) benutzt einen Antimagiekristall." - "$unit($unit) uses an antimagic crystal." @@ -1870,8 +1410,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Sphären des Chaos geben dem Magier einen Teil ihrer Kraft." - "$unit($unit) in $region($region): '$order($command)' - The Spheres of Chaos return a part of his power to the magician." @@ -1879,8 +1417,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier konnte keinen Fluch zerstören." - "$unit($unit) in $region($region): '$order($command)' - The magician could not destroy any curse." @@ -1888,8 +1424,6 @@ - "In $region($region) dehnt $unit($unit) die Zeit für $int($amount) Personen." - "In $region($region), $unit($unit) bends time for $int($amount) men." @@ -1899,8 +1433,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört $int($succ) Flüche auf ${target}." - "$unit($unit) in $region($region): '$order($command)' - The magician destroys $int($succ) spells on ${target}." @@ -1910,8 +1442,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier zerstört den Fluch ($id) auf ${target}." - "$unit($unit) in $region($region): '$order($command)' - The magician destroys the spell ($id) on ${target}." @@ -1921,16 +1451,12 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber ist nicht stark genug, um den Fluch ($id) auf ${target} zu zerstören." - "$unit($unit) in $region($region): '$order($command)' - The spell is not strong enough to destroy the curse ($id) on ${target}." - "$unit($mage) beschwört einen Giftelementar in $region($region)." - "$unit($mage) summons a poison elemental in $region($region)." @@ -1938,8 +1464,6 @@ - "$unit($unit) in $region($region) wird von einem Unbekannten verflucht." - "$unit($unit) in $region($region) was cursed by an unknown magician." @@ -1947,24 +1471,18 @@ - "$unit($mage) belegt $unit($target) mit einem Zauber." - "$unit($mage) puts a spell on $unit($target)." - "$unit($mage) belegt $unit($target) mit einem Kälteschutz." - "$unit($mage) puts protection from cold on $unit($target)." - "$unit($mage) legt einen Rosthauch auf $unit($target), doch der Rosthauch fand keine Nahrung." - "$unit($mage) puts a spell of rust on $unit($target) but it found nothing to consume." @@ -1972,61 +1490,45 @@ - "$unit($mage) legt einen Rosthauch auf $unit($target). $int($amount) Waffen wurden vom Rost zerfressen." - "$unit($mage) puts a spell of rust on $unit($target). $int($amount) weapons are eaten by rust." - $if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) erschuf einen heiligen Hain von $int($amount) Schößlingen. - $if($isnull($mage),"An unknown magician",$unit($mage)) created a holy forest of $int($amount) young trees. - "$if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) führt einen sonderbaren Tanz auf. Kurz darauf beginnt es zu regnen." - "$if($isnull($mage),"an unseen magician",$unit($mage)) dances a strange dance. Shortly after, rain begins to fall on the fields." - "$if($isnull($mage),"Ein unentdeckter Magier",$unit($mage)) segnet in einem kurzen Ritual die Felder." - "$if($isnull($mage),"An unseen magician",$unit($mage)) blesses the fields in a short ritual." - "$unit($mage) beschwört die Mächte des Wassers und ein gigantischer Strudel bildet sich." - "$unit($mage) summons the power of the seas and a giant maelstrom forms." - "$unit($mage) belebt $int($amount) Bäume." - "$unit($mage) animates $int($amount) trees." - "$unit($mage) sorgt für trockene Straßen in $region($region)." - "$unit($mage) creates dry and well-repaired roads in $region($region)." - "$unit($mage) erfleht den Segen der Götter des Windes und des Wassers für $ship($ship)." - "$unit($mage) asks the gods of wind and water on behalf of the $ship($ship)." @@ -2034,8 +1536,6 @@ - "$unit($unit) transferiert $int($aura) Aura auf $unit($target)." - "$unit($unit) transfers $int($aura) aura to $unit($target)." @@ -2043,31 +1543,23 @@ - "$unit($mage) entzieht $unit($target) $int($aura) Aura." - "$unit($mage) draws $int($aura) aura from $unit($target)." - "$unit($unit) fühlt seine magischen Kräfte schwinden und verliert $int($aura) Aura." - "$unit($unit) feels the powers of magic fade and loses $int($aura) aura." - "$unit($unit) fühlt sich einen Moment seltsam geschwächt." - "$unit($unit) fühlt strangely weakened." - "$unit($unit) konnte $unit($target) keine Aura entziehen." - "$unit($unit) could not draw aura from $unit($target)." @@ -2075,8 +1567,6 @@ - "$unit($unit) wurde von $region($source) nach $unit($target) teleportiert." - "$unit($unit) was teleported from $region($source) to $unit($target)." @@ -2085,8 +1575,6 @@ - "$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt." - "$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for, about $int($months) more weeks." @@ -2095,8 +1583,6 @@ - "$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt." - "$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for about $int($months) more weeks." @@ -2105,8 +1591,6 @@ - "$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt." - "$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)' that will last for about $int($months) more weeks." @@ -2115,8 +1599,6 @@ - "$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, der noch etwa $int($months) Wochen bestehen bleibt." - "$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for about $int($months) more weeks." @@ -2124,8 +1606,6 @@ - "$unit($mage) fand heraus, dass auf $ship($ship) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben." - "$unit($mage) discovers that $ship($ship) is charmed with '$curse($curse)', which will last for centuries." @@ -2133,8 +1613,6 @@ - "$unit($mage) fand heraus, dass auf $building($building) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben." - "$unit($mage) discovers that $building($building) is charmed with '$curse($curse)', which will last for centuries." @@ -2142,8 +1620,6 @@ - "$unit($mage) fand heraus, dass auf $unit($unit) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben." - "$unit($mage) discovers that $unit($unit) is charmed with '$curse($curse)', which will last for centuries." @@ -2151,72 +1627,54 @@ - "$unit($mage) fand heraus, dass auf $region($region) der Zauber '$curse($curse)' liegt, dessen Kraft ausreicht, um noch Jahrhunderte bestehen zu bleiben." - "$unit($mage) discovers that $region($region) is charmed with '$curse($curse)', which will last for centuries." - "$unit($mage) meint, dass auf $ship($ship) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden." - "It appears to $unit($mage) that $ship($ship) is charmed, but no details have been revealed." - "$unit($mage) meint, dass auf $building($building) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden." - "It appears to $unit($mage) that $building($building) is charmed, but no details have been revealed." - "$unit($mage) meint, dass $unit($unit) verzaubert ist, konnte aber über den Zauber nichts herausfinden." - "It appears to $unit($mage) that $unit($unit) is charmed, but no details have been revealed." - "$unit($mage) meint, dass auf $region($region) ein Zauber liegt, konnte aber über den Zauber nichts herausfinden." - "It appears to $unit($mage) that $region($region) is charmed, but no details have been revealed." - "$unit($mage) meint, dass auf $ship($ship) kein Zauber liegt." - "It appears to $unit($mage) that $ship($ship) is not charmed." - "$unit($mage) meint, dass auf $building($building) kein Zauber liegt." - "It appears to $unit($mage) that $building($building) is not charmed." - "$unit($mage) meint, dass auf $unit($target) kein Zauber liegt." - "It appears to $unit($mage) that $unit($target) is not charmed." - "$unit($mage) meint, dass auf $region($region) kein Zauber liegt." - "It appears to $unit($mage) that $region($region) is not charmed." @@ -2224,8 +1682,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region konnte nicht verzaubert werden." - "$unit($unit) in $region($region): '$order($command)' - The region could not be charmed." @@ -2234,8 +1690,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $ship($ship) widersteht dem Zauber." - "$unit($unit) in $region($region): '$order($command)' - $ship($ship) resists the spell." @@ -2244,8 +1698,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) konnte nicht verzaubert werden." - "$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be charmed." @@ -2254,8 +1706,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) widersteht dem Zauber." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) resists the spell." @@ -2264,8 +1714,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Schiff $int36($id) wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - Ship $int36($id) could not be located." @@ -2274,8 +1722,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Gebäude $int36($id) wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - Building $int36($id) could not be located." @@ -2284,8 +1730,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheit $id wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - Unit $id could not be located." @@ -2293,16 +1737,12 @@ - "$unit($unit) in $region($region): '$order($command)' - Es wurde kein Ziel gefunden." - "$unit($unit) in $region($region): '$order($command)' - The spell could not find a target." - "$unit($mage) erleidet durch den Tod seines Vertrauten einen Schock." - "$unit($mage) receives a shock when his familiar dies." @@ -2310,8 +1750,6 @@ - "$unit($unit) schafft es nicht, genug Kraft aufzubringen, um $spell($spell) auf Stufe $int($level) zu zaubern." - "$unit($unit) cannot muster enough energy to cast $spell($spell) on level $int($level)." @@ -2320,8 +1758,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Für diesen Zauber fehlen noch $resources($list)." - "$unit($unit) in $region($region): '$order($command)' - Casting this spell requires an additional $resources($list)." @@ -2329,8 +1765,6 @@ - "$unit($unit) hat nicht genügend Komponenten um $spell($spell) auf Stufe $int($level) zu zaubern." - "$unit($unit) has insufficient components to cast $spell($spell) on level $int($level)." @@ -2338,8 +1772,6 @@ - "$unit($unit) unterläuft in $region($region) beim Zaubern von $spell($spell) ein Patzer." - "$unit($unit) fumbles while casting $spell($spell) in $region($region)." @@ -2347,8 +1779,6 @@ - "Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern, scheint plötzlich ein Beben durch die magische Essenz zu laufen und ein furchtbarer Sog versucht $unit($unit) in eine andere Dimension zu ziehen. Mit letzter Kraft gelingt es $unit($unit) sich zu retten." - "When $unit($unit) in $region($region) tries to cast $spell($spell), a sudden disturbance ripples through the magical realm and a terrible force attempts to drag the magician to another dimension. However, with a final effort of strength, $unit($unit) manages to save himself." @@ -2356,8 +1786,6 @@ - "Als $unit($unit) in $region($region) versucht, $spell($spell) zu zaubern erhebt sich plötzlich ein dunkler Wind. Bizarre geisterhafte Gestalten kreisen um den Magier und scheinen sich von den magischen Energien des Zaubers zu ernähren. Mit letzter Kraft gelingt es $unit($unit) dennoch den Spruch zu zaubern." - "When $unit($unit) in $region($region) tries to cast $spell($spell), strong winds suddenly rise. Bizarre ghostlike creatures circle around the magician and seem to be leeching magical energy. However, with a final effort of strength, $unit($unit) manages to complete the spell." @@ -2365,8 +1793,6 @@ - "Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'" - "A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'" @@ -2375,8 +1801,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten." - "$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions." @@ -2385,8 +1809,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann nicht genug Energie aufbringen, um diesen Spruch durch $unit($unit) zu wirken." - "$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot raise enough energy to channel the spell through $unit($unit)." @@ -2394,8 +1816,6 @@ - "$unit($mage) ruft einen Vertrauten. $race($race, 0) können $skills lernen." - "$unit($mage) summons a familiar. $race($race, 0) can learn ${skills}." @@ -2403,16 +1823,12 @@ - "$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl $unit($mage) seine ganze Lebensgeschichte erzählt zu haben." - "$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told $unit($mage) the story of his entire life." - "$unit($unit) hat einen feuchtfröhlichen Abend in der Taverne verbracht. Ausser einem fürchterlichen Brummschädel ist da auch noch das dumme Gefühl die ganze Taverne mit seiner Lebensgeschichte unterhalten zu haben." - "$unit($unit) spent the evening carousing in the tavern. In addition to a terrible headache, there remains this feeling of having told everyone the story of his entire life." @@ -2421,8 +1837,6 @@ - "$unit($mage) gelingt es $unit($unit) zu verzaubern. $unit($unit) wird für etwa $int($duration) Wochen unseren Befehlen gehorchen." - "$unit($mage) chamrs $unit($unit). $unit($unit) will obey our orders for approximatley $int($duration) more weeks." @@ -2431,8 +1845,6 @@ - "$unit($unit) gelingt es $spell($spell) zu zaubern, doch der Spruch zeigt keine Wirkung." - "$unit($unit) manages to cast $spell($spell), but the spell seems to have no effect." @@ -2440,16 +1852,12 @@ - "$unit($unit) fühlt sich nach dem Zaubern von $spell($spell) viel erschöpfter als sonst und hat das Gefühl, dass alle weiteren Zauber deutlich mehr Kraft als normalerweise kosten werden." - "$unit($unit) feels far more exhausted than he should after casting $spell($spell) and assumes that any following spells will cost far more energy than usual." - "$unit($unit) in $region($region) hat rasende Kopfschmerzen und kann sich nicht mehr richtig konzentrieren. Irgendwas bei diesem Zauber ist fürchterlich schiefgelaufen." - "$unit($unit) in $region($region) is hit by a massive headache and cannot concentrate on the spell. Some part of this ritual has gone very wrong indeed." @@ -2457,12 +1865,8 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier verfängt sich im eigenen Zauber." - "$unit($unit) in $region($region): '$order($command)' - The magician is caught in their own spell." - "In der Region erstrahlen des Nachts bunte Lichter, Gloeckchen klingeln und frohes Kindergelaechter klingt durch den Wald." - "At night, colourful lights can be seen in this region, bells are a-ringing and the laughter of happy children seems to be everywhere in the forests." @@ -2470,8 +1874,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber von $unit.dative($unit) war viel zu schwach und löst sich gleich wieder auf." - "$unit($unit) in $region($region): '$order($command)' - The spell of $unit($unit) was way to weak and its magic dissolves immediately." @@ -2480,8 +1882,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) verzaubert ${target}." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on ${target}." @@ -2489,8 +1889,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es zwar die Region zu verzaubern, aber irgendwas ging schief." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) manages to put a spell on the region, but something went wrong nonetheless." @@ -2498,16 +1896,12 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) gelingt es die Region zu verzaubern." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) puts a spell on the region." - "$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich." - "$unit($mage) increases the strength of $unit($target) dramatically." @@ -2515,8 +1909,6 @@ - "$unit($unit) in $region($region) regeneriert $int($amount) Aura." - "$unit($unit) regenerates $int($amount) aura in $region($region)." @@ -2525,16 +1917,12 @@ - "$unit($unit) in $region($region) verbraucht $int($cost) Silber für das Studium von $skill($skill)." - "$unit($unit) spends $int($cost) silver in $region($region) to study $skill($skill)." - "$unit($teacher) kann durch Dumpfbackenbrot nur $int($amount) Schüler lehren." - "Due to the effect of duncebuns, $unit($teacher) can only teach $int($amount) students." @@ -2543,8 +1931,6 @@ - "$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level)." - "$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level)." @@ -2552,8 +1938,6 @@ - "$unit($teacher) lehrt $unit($student) $skill($skill)." - "$unit($teacher) teaches $unit($student) $skill($skill)." @@ -2561,8 +1945,6 @@ - "$unit($unit) verkauft $int($amount) $resource($resource,$amount)." - "$unit($unit) sells $int($amount) $resource($resource,$amount)." @@ -2570,16 +1952,12 @@ - "$unit($unit) kauft $int($amount) $resource($resource,$amount)." - "$unit($unit) buys $int($amount) $resource($resource,$amount)." - "$unit($unit) bezahlt $int($money) Silber für den Kauf von Luxusgütern." - "$unit($unit) pays $int($money) silver for luxury items." @@ -2587,8 +1965,6 @@ - "$unit($unit) verdient in $region($region) $int($amount) Silber durch den Verkauf von Luxusgütern." - "$unit($unit) earned $int($amount) silver in $region($region) by selling luxury items." @@ -2597,8 +1973,6 @@ - "$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber." - "$unit($unit) works in $region($region) for a wage of $int($amount) $if($eq($wanted,$amount),""," out of $int($wanted)") silver." @@ -2606,8 +1980,6 @@ - "$unit($unit) arbeitet in $region($region) für einen Lohn von $int($amount) Silber." - "In $region($region), $unit($unit) works for a wage of $int($amount) silver." @@ -2616,8 +1988,6 @@ - "$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber durch Unterhaltung." - "In $region($region), $unit($unit) earns only $int($amount) instead of$if($eq($wanted,$amount),""," of$if($eq($wanted,$amount),""," of $int($wanted)") ") with entertainment." @@ -2625,8 +1995,6 @@ - "$unit($unit) fängt in $region($region) Fische im Wert von $int($amount) Silber." - "In $region($region), $unit($unit) catches fish worth $int($amount) silver." @@ -2634,8 +2002,6 @@ - "$unit($unit) verdient in $region($region) $int($amount) Silber durch Unterhaltung." - "$unit($unit) earns $int($amount) in $region($region) with entertainment." @@ -2644,8 +2010,6 @@ - "$unit($unit) verdient in $region($region) $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber durch Zauberei." - "$unit($unit) in $region($region) earns $int($amount)$if($eq($wanted,$amount),""," instead of $int($wanted)") silver through magic." @@ -2653,8 +2017,6 @@ - "$unit($unit) verdient in $region($region) $int($amount) Silber durch Zauberei." - "$unit($unit) earns $int($amount) silver through simple magical services in $region($region)." @@ -2663,8 +2025,6 @@ - "$unit($unit) klaut in $region($region) $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber." - "$unit($unit) steals only $int($amount) silver instead of$if($eq($wanted,$amount),""," of$if($eq($wanted,$amount),""," of $int($wanted)") ") in $region($region)." @@ -2672,8 +2032,6 @@ - "$unit($unit) klaut in $region($region) $int($amount) Silber." - "$unit($unit) steals $int($amount) silver in $region($region)." @@ -2682,8 +2040,6 @@ - "$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber ein." - "$unit($unit) collects taxes of$if($eq($wanted,$amount),""," only") $int($amount) silver$if($eq($wanted,$amount),""," instead of $int($wanted) silver") ") in $region($region)." @@ -2691,8 +2047,6 @@ - "$unit($unit) treibt in $region($region) Steuern in Höhe von $int($amount) Silber ein." - "$unit($unit) collects taxes of $int($amount) silver in $region($region)." @@ -2702,8 +2056,6 @@ - "$unit($unit) verdient$if($eq($mode,4)," am Handel","") in $region($region) $int($amount)$if($eq($wanted,$amount),""," statt $int($wanted)") Silber$if($eq($mode,1)," durch Unterhaltung",$if($eq($mode,2)," durch Steuern",$if($eq($mode,3)," durch Handel",$if($eq($mode,5)," durch Diebstahl",$if($eq($mode,6)," durch Zauberei",$if($eq($mode,7)," durch Plündern",""))))))." - "$unit($unit) earns $int($amount)$if($eq($wanted,$amount),""," of $int($wanted)") in $region($region) $if($eq($mode,1)," by entertainment",$if($eq($mode,2)," by taxes",$if($eq($mode,3)," by trade",$if($eq($mode,5)," by stealing",$if($eq($mode,6)," by magic",$if($eq($mode,7)," by pillaging",""))))))." @@ -2712,16 +2064,12 @@ - "$unit($unit) in $region($region) findet $int($amount) $resource($herb,$amount)." - "$unit($unit) in $region($region) finds $int($amount) $resource($herb,$amount)." - "$unit($unit) züchtet $int($amount) Pferde." - "$unit($unit) breeds $int($amount) horses." @@ -2730,23 +2078,17 @@ - "$unit($unit) pflanzt in $region($region) $int($amount) $resource($herb,$amount)." - "$unit($unit) plants $int($amount) $resource($herb,$amount) in $region($region)." - "$unit($unit) in $region($region) entdeckt eine Laenader." - "$unit($unit) discovers laen in $region($region)." - "Die Laenader in $region($region) ist erschöpft." - "There is no more laen left in $region($region)." @@ -2754,8 +2096,6 @@ - "$unit($unit) in $region($region) hat ein zu niedriges Talent, um $resource($resource,0) abzubauen." - "$unit($unit) in $region($region) is not proficient enough to produce $resource($resource,0)." @@ -2765,8 +2105,6 @@ - "$unit($unit) in $region($region) produziert $int($amount)$if($eq($wanted,$amount),""," von $int($wanted)") $resource($resource,$wanted)." - "$unit($unit) in $region($region) produces $int($amount)$if($eq($wanted,$amount),""," of $int($wanted)") $resource($resource,$amount)." @@ -2774,8 +2112,6 @@ - "$unit($unit) baut für $int($size) an $building($building) weiter." - "$unit($unit) builds $int($size) more on $building($building)." @@ -2783,24 +2119,18 @@ - "$unit($unit) baut für $int($size) an $ship($ship) weiter." - "$unit($unit) builds $int($size) more on $ship($ship)." - "$unit($unit) stirbt beim Versuch, die Feuerwand nach $region($region) zu durchqueren." - "$unit($unit) dies trying to cross the wall of fire into $region($region)." - "$unit($unit) erleidet beim Durchqueren der Feuerwand nach $region($region) schwere Verbrennungen." - "$unit($unit) steps through the wall of fire into $region($region) and receives severe burn damage." @@ -2809,8 +2139,6 @@ - "$unit($unit) transportiert $unit($target) von $region($start) nach $region($end)." - "$unit($unit) transported $unit($target) from $region($start) to $region($end)." @@ -2820,8 +2148,6 @@ - "$unit($unit) $if($eq($mode,1),"reitet", "wandert") von $region($start) nach $region($end).$if($isnull($regions),""," Dabei wurde $trail($regions) durchquert.")" - "$unit($unit) $if($eq($mode,1),"rides", "walks") from $region($start) to $region($end)$if($isnull($regions),""," by way of $trail($regions)")." @@ -2829,72 +2155,54 @@ - "$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist." - "$unit($unit) discovered that $region($region) is $localize($terrain)." - "$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen." - "$unit($unit) has just landed and cannot continue moving to $region($region)." - "Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft." - "At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region)." - "Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff." - "The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel." - "Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen." - "The crew of the $ship($ship) refuses to travel to the $direction($direction)." - "Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen." - "The crew of the $ship($ship) refuses to travel to $region($region)." - "$unit($unit) weigert sich, nach $direction($direction) zu reisen." - "$unit($unit) refuses to travel to the $direction($direction)." - "$unit($unit) weigert sich, nach $region($region) zu reisen." - "$unit($unit) refuses to travel to $region($region)." - "Die $ship($ship) konnte $region($region) nicht verlassen." - "The $ship($ship) could not leave $region($region)." @@ -2902,8 +2210,6 @@ - "$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten." - "$unit($unit) was kept in $region($region) by $unit($guard)." @@ -2911,40 +2217,30 @@ - "$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte." - "$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance." - "$unit($unit) konnte aus $region($region) nicht ausreisen." - "$unit($unit) could not leave $region($region)." - "$unit($follower) ist $unit($unit) gefolgt." - "$unit($follower) followed $unit($unit)." - "$unit($follower) konnte $unit($unit) nicht folgen." - "$unit($follower) could not follow $unit($unit)." - "$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt." - "$unit($unit) discovers that there is no route going $direction($direction)." @@ -2952,22 +2248,16 @@ - "$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht." - "$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense." - "In $region($region) erschienen die Herren der Bäume." - "In $region($region), the Lords of the Trees have risen." - "In $region($region) erhoben sich die Toten aus den Gräbern." - "The dead rise from their graves in $region($region)." @@ -2975,30 +2265,22 @@ - "$unit($unit) vermehrt sich um $int($amount) $race($race,$amount)." - "$unit($unit) breeds $int($amount) new $race($race,$amount)." - "Die Partei bekommt einen Spitznamen." - "Your faction received a nickname." - "Die Partei bekommt von $unit.dative($unit) in $region($region) einen Spitznamen." - "Your faction received a nickname from $unit($unit) in $region($region)." - "$building($building) in $region($region) bekommt einen Spitznamen." - "$building($building) in $region($region) received a nickname." @@ -3006,16 +2288,12 @@ - "$building($building) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen." - "$building($building) in $region($region) received a nickname from $unit($renamer)." - "Die $ship($ship) in $region($region) bekommt einen Spitznamen." - "$ship($ship) in $region($region) received a nickname." @@ -3023,16 +2301,12 @@ - "Die $ship($ship) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen." - "$ship($ship) in $region($region) received a nickname from $unit($renamer)." - "$unit($renamed) in $region($region) bekommt einen Spitznamen." - "$unit($renamed) in $region($region) received a nickname." @@ -3040,30 +2314,22 @@ - "$unit($renamed) in $region($region) bekommt von $unit.dative($renamer) einen Spitznamen." - "$unit($renamed) in $region($region) received a nickname from $unit($renamer)." - "$if($eq($dead,1),"Ein Bauer verhungert","$int($dead) Bauern verhungern")." - "$if($eq($dead,1),"One peasant starves","$int($dead) peasants starve")." - "Der Vulkan in $region($region) bricht aus." - "The volcano in $region($region) erupts." - "Der Vulkan in $region($regionv) bricht aus. Die Lavamassen verwüsten $region($regionn)." - "The volcano in $region($regionv) erupts. The lava devastates $region($regionn)." @@ -3071,30 +2337,22 @@ - "Beim Vulkanausbruch in $region($region) sterben $int($dead) Personen in $unit($unit)." - "$int($dead) people in $unit($unit) perish when the volcano in $region($region) erupts." - "Aus dem Vulkankrater von $region($region) steigt kein Rauch mehr." - "The volcano of $region($region) stops releasing smoke." - "Aus dem Vulkankrater von $region($region) steigt plötzlich Rauch." - "Columns of smoke are released by the volcano of $region($region)." - "$unit($unit) in $region($region) desertiert." - "$unit($unit) in $region($region) abandons your cause." @@ -3102,16 +2360,12 @@ - "$unit($unit) reißt die Straße zwischen $region($from) und $region($to) ein." - "$unit($unit) demolishes the road between $region($from) and $region($to)." - "$unit($unit) in $region($region) kann keine Kräuter finden." - "$unit($unit) could not find any herbs in $region($region)." @@ -3120,24 +2374,18 @@ - "$unit($unit) in $region($region) stellt fest, dass es hier $localize($amount) $resource($herb,0) gibt." - "$unit($unit) discovers that $localize($amount) $resource($herb,0) grow in $region($region)." - "$unit($unit) reißt einen Teil von $building($building) ein." - "$unit($unit) tears down parts of $building($building)." - "$unit($unit) zerstört $building($building)." - "$unit($unit) destroys $building($building)." @@ -3145,8 +2393,6 @@ - "$unit($unit) erweitert in $region($region) das Straßennetz um $int($size)." - "$unit($unit) extends the road network in $region($region) by $int($size)." @@ -3154,16 +2400,12 @@ - "$unit($unit) $if($eq($amount,1),"schließt","schließen") sich $int($amount) $resource($rtype,$amount) an." - "$int($amount) $resource($rtype,$amount) $if($eq($amount,1),"joins","join") $unit($unit)." - "$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($target)." - "$unit($mage) shrouds the equipment of $unit($target) in shadows." @@ -3172,8 +2414,6 @@ - "$if($isnull($ship),"$unit($unit)","Die $ship($ship)") in $region($region) entdeckt ein Opfer im $direction($dir)." - "$if($isnull($ship),"$unit($unit)","The $ship($ship)") in $region($region) made $direction($dir) a target." @@ -3181,22 +2421,16 @@ - "$if($isnull($ship),"$unit($unit)","Die $ship($ship)") in $region($region) kann keine Schiffe aufbringen." - "$if($isnull($ship),"$unit($unit)","The $ship($ship)") could not capture other ships in $region($region)." - "Langsam kehren andere Völker nach $region($region) zurück." - "Little by little, people return to $region($region)." - "Vor den vielen Orks in $region($region) fliehen die anderen Einwohner." - "People in $region($region) flee because of too many orcs." @@ -3204,8 +2438,6 @@ - "$unit($unit) in $region($region) beschädigt die $ship($ship)." - "$unit($unit) in $region($region) damages the $ship($ship)." @@ -3213,23 +2445,17 @@ - "$unit($unit) in $region($region) versenkt die $ship($ship)." - "$unit($unit) sunk $ship($ship) in $region($region)." - "$unit($unit) marschiert in eine Antimagiezone und löst sich auf." - "$unit($unit) walks into an antimagical zone and dissolves." - "$int($amount) Bauern flohen aus Furcht vor $unit($unit)." - "$int($amount) peasants fled in fear of $unit($unit)." @@ -3237,59 +2463,43 @@ - "$int($amount) Bauern werden zu $race($race,0) und schliessen sich $unit($unit) an." - "$int($amount) peasants become $race($race,0) and join the ranks of $unit($unit)." - "$unit($unit) verspeiste $int($amount) Pferde." - "$unit($unit) ate $int($amount) horses." - "$unit($unit) verspeiste $int($amount) Bauern." - "$unit($unit) ate $int($amount) peasants." - "Deine Befehle hatten ein falsches Passwort (${password})." - "Your orders had the wrong password (${password})." - "Das Passwort für diese Partei lautet ${value}." - "The password of this faction is '$value'." - "Die Reportadresse wurde nicht geändert, '${value}' ist keine gültige email." - "Address not changed, '$value' is an invalid email." - "Die Reportadresse wurde auf ${value} geändert." - "Address has been changed to '$value'." - "Das Banner wurde auf '$value' geändert." - "Banner has been changed to '$value'." @@ -3298,8 +2508,6 @@ - "Eine Partei muß mindestens $int($turns) Wochen alt sein, bevor sie angegriffen oder bestohlen werden kann." - "A faction must be at least $int($turns) weeks old before it can be attacked or stolen from." @@ -3307,47 +2515,35 @@ - "$unit($unit) wurden in $region($region) $int($amount) Silberstücke geklaut." - "In $region($region), thieves stole $int($amount) silver from $unit($unit)." - "$unit($target) ertappte $unit($unit) beim versuchten Diebstahl." - "$unit($target) caught $unit($unit) in attempted theft." - "$unit($unit) wurde von $unit.dative($target) beim versuchten Diebstahl ertappt." - "$unit($unit) was caught by $unit($target) in attempted theft." - "$unit($unit) fühlt sich beobachtet." - "$unit($unit) feels watched." - "$unit($unit) gelang es nicht, sich nahe genug an $unit($target) heranzuschleichen." - "$unit($unit) could not sneak close enough to $unit($target)." - "$unit($spy) gelang es nicht, etwas über $unit($target) herauszufinden." - "$unit($spy) could not find out anything about $unit($target)." @@ -3355,8 +2551,6 @@ - "$unit($spy) gelang es, Informationen über $unit($target) herauszubekommen: Kampfstatus ${status}." - "$unit($spy) managed to gather information about $unit($target): combat status ${status}." @@ -3364,8 +2558,6 @@ - "$unit($target) ist ein ${type}-Magier." - "$unit($target) is a ${type}-magician" @@ -3373,8 +2565,6 @@ - "$unit($target) beherrscht ${skills}." - "$unit($target) knows ${skills}." @@ -3382,8 +2572,6 @@ - "Im Gepäck von $unit($target) sind $resources($items)." - "$unit($target) carries $resources($items)" @@ -3391,16 +2579,12 @@ - "$unit($target) gehört der Partei $faction($faction) an." - "$unit($target) belongs to $faction($faction)." - "$unit($target) fühlt sich $if($isnull($spy),"","durch $unit($spy) ")beobachtet." - "$unit($target) feels watched$if($isnull($spy),""," by $unit($spy)")." @@ -3408,8 +2592,6 @@ - "$faction($from) gibt ein Almosen von $int($amount) Silber an $faction($to)." - "$faction($from) donates $int($amount) silver to $faction($to)." @@ -3417,16 +2599,12 @@ - "$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill)." - "$unit($unit) eats a duncebuns and forgets $int($weeks) weeks worth of $skill($skill)." - "$unit($unit) in $region($region) wird durch unzureichende Nahrung geschwächt." - "$unit($unit) is weakened due to malnourishment." @@ -3435,8 +2613,6 @@ - "$unit($unit) verliert in $region($region) $int($dead) von $int($add($live,$dead)) Personen durch Unterernährung." - "$unit($unit) loses $int($dead) of $int($add($live,$dead)) people due to starvation in $region($region)." @@ -3444,30 +2620,22 @@ - "$unit($unit): '$order($command)' - Die Einheit benutzt bereits $resource($using,0)." - "$unit($unit): '$order($command)' - The unit already uses $resource($using,0)." - "$if($eq($births,1),"Einen Bauern","$int($births) Bauern") besucht unverhofft der Storch." - "The stork paid an unexpected visit to $if($eq($births,1),"a peasant","$int($births) peasants")." - "Die $ship($ship) ist zu stark beschädigt und sinkt." - "The $ship($ship) has suffered too much damage and sinks." - "Die $ship($ship) entdeckt, dass $region($region) Festland ist." - "The $ship($ship) discovers that $region($region) is dry land." @@ -3475,8 +2643,6 @@ - "Die $ship($ship) fliegt von $region($from) nach $region($to)." - "The $ship($ship) flies from $region($from) to $region($to)." @@ -3484,8 +2650,6 @@ - "Die $ship($ship) segelt von $region($from) nach $region($to)." - "The $ship($ship) sails from $region($from) to $region($to)." @@ -3493,8 +2657,6 @@ - "Die $ship($ship) wird in $region($region) von Stürmen abgetrieben$if($sink," und sinkt","")." - "The $ship($ship) in $region($region) gets off course in heavy storm$if($sink," and sinks","")." @@ -3503,24 +2665,18 @@ - "Die $ship($ship) fährt in den Mahlstrom von $region($region) und nimmt $int($damage) Schaden$if($sink," und sinkt","")." - "The $ship($ship) sails into the maelstrom of $region($region) and takes $int($damage) damage$if($sink,". The ship sinks","")." - "$unit($unit) vergisst $skill($skill)." - "$unit($unit) forgets $skill($skill)." - "$unit($unit) gibt das Kommando an $unit($recipient)." - "$unit($unit) gave control to $unit($recipient)." @@ -3528,8 +2684,6 @@ - "$unit($unit) gibt $int($amount) Dumpfbackenbrot an $unit($recipient)." - "$unit($unit) administers $int($amount) duncebuns to $unit($recipient)." @@ -3538,8 +2692,6 @@ - "$unit($unit) in $region($region) rekrutiert $int($amount) von $int($want) Personen." - "$unit($unit) in $region($region) recruits $int($amount) of $int($want) people." @@ -3547,16 +2699,12 @@ - "$unit($unit) belagert $building($building). Dabei richten die Katapulte Zerstörungen von $int($destruction) Größenpunkten an." - "$building($building) is under siege by $unit($unit). During siege, catapults caused $int($destruction) points destruction." - "$unit($unit) belagert $building($building)." - "$building($building) is under siege by $unit($unit)." @@ -3564,8 +2712,6 @@ - "$unit($unit) ertrinkt beim Untergang der $ship($ship) in $region($region)." - "$unit($unit) drowns when $ship($ship) in $region($region) sinks." @@ -3574,10 +2720,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht bewachen, da sie versucht zu fliehen." - "$unit($unit) in $region($region): - '$order($command)' - The unit cannot guard the region because it - is trying to flee." @@ -3586,8 +2728,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie an einem Kampf teilgenommen hat." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has been in combat." @@ -3596,8 +2736,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude kann nur einmal pro Runde erweitert werden." - "$unit($unit) in $region($region): '$order($command)' - The building can be expanded only once per turn." @@ -3606,8 +2744,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Objekt ist unzerstörbar." - "$unit($unit) in $region($region): '$order($command)' - This object is indestructible." @@ -3615,8 +2751,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ohne Zutaten kann ein Alchemist nichts herstellen." - "$unit($unit) in $region($region): '$order($command)' - Without ingredients an alchemist can not produce anything." @@ -3624,8 +2758,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nicht alle Zutaten vorhanden." - "$unit($unit) in $region($region): '$order($command)' - Not all ingredients present." @@ -3633,8 +2765,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine Partei kann nur einmal neu starten." - "$unit($unit) in $region($region): '$order($command)' - Restart can only be used once." @@ -3642,8 +2772,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht arbeiten." - "$unit($unit) in $region($region): '$order($command)' - Lycantropes don't work." @@ -3651,8 +2779,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Werwesen können nicht mit anderen Personen gemischt werden." - "$unit($unit) in $region($region): '$order($command)' - Lycantropes may not be mixed with normal people." @@ -3660,8 +2786,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht verwandeln." - "$unit($unit) in $region($region): '$order($command)' - This unit can not change shape." @@ -3669,8 +2793,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist kein Werwesen." - "$unit($unit) in $region($region): '$order($command)' - This unit is not in lycantropic form." @@ -3678,8 +2800,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Einheit ist schon ein Werwesen." - "$unit($unit) in $region($region): '$order($command)' - This unit already assumed lycantropic form." @@ -3687,8 +2807,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann nicht höher gelernt werden." - "$unit($unit) in $region($region): '$order($command)' - This skill cannot be raised any higher." @@ -3696,8 +2814,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Snotlinge sind zu dumm, um auf den Feldern zu arbeiten." - "$unit($unit) in $region($region): '$order($command)' - We snotlings is too stupid fer dat!" @@ -3705,8 +2821,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 9 Wochen alt sein, um einen Neustart zu versuchen." - "$unit($unit) in $region($region): '$order($command)' - Your faction is not old enough to start over." @@ -3714,8 +2828,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Optionen ZIP und BZIP2 können nur um-, nicht ausgeschaltet werden." - "$unit($unit) in $region($region): '$order($command)' - Options ZIP and BZIP2 can only be switched, not turned off." @@ -3723,8 +2835,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen." - "$unit($unit) in $region($region): '$order($command)' - Units of a faction that can't be attacked may not guard." @@ -3732,8 +2842,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Region kann man nichts verkaufen." - "$unit($unit) in $region($region): '$order($command)' - No trade is possible in this region." @@ -3741,8 +2849,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Bereits ein Synonym gesetzt." - "$unit($unit) in $region($region): '$order($command)' - Synonym already set." @@ -3750,8 +2856,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Kein Synonym angegeben." - "$unit($unit) in $region($region): '$order($command)' - Synonym missing." @@ -3759,8 +2863,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ungültiges Synonym." - "$unit($unit) in $region($region): '$order($command)' - Invalid synonym." @@ -3768,8 +2870,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ungültiges Prefix." - "$unit($unit) in $region($region): '$order($command)' - Invalid prefix." @@ -3777,8 +2877,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Klon." - "$unit($unit) in $region($region): '$order($command)' - The magician already has a clone." @@ -3786,8 +2884,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Gebäude auf dem Ozean können nicht betreten werden." - "$unit($unit) in $region($region): '$order($command)' - Buildings on the ocean may not be entered." @@ -3795,8 +2891,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier werden niemals Bäume wachsen." - "$unit($unit) in $region($region): '$order($command)' - Trees won't grow here." @@ -3804,8 +2898,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nur ein Magier kann einen Astralkristall benutzen." - "$unit($unit) in $region($region): '$order($command)' - Only mages may use an astralcrystal." @@ -3813,7 +2905,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Verbände können nur zwischen Einheiten derselben Partei gebildet werden." @@ -3821,7 +2912,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keinem Verband." @@ -3829,7 +2919,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine Einheit kann nur in einem Verband Mitglied sein." @@ -3837,8 +2926,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Wie sollen wir uns tarnen?" - "$unit($unit) in $region($region): '$order($command)' - What should we disguise as?" @@ -3846,8 +2933,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Wieviel sollen wir einreißen?" - "$unit($unit) in $region($region): '$order($command)' - How much shall we tear down?" @@ -3855,8 +2940,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dorthin können wir die Einheit nicht transportieren." - "$unit($unit) in $region($region): '$order($command)' - We cannot transport this unit there." @@ -3864,8 +2947,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit transportiert uns nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit is not transporting us." @@ -3873,8 +2954,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Einheit kennt keine Trankrezepte." - "$unit($unit) in $region($region): '$order($command)' - This unit knows no recipes for potions." @@ -3882,8 +2961,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein." - "$unit($unit) in $region($region): '$order($command)' - Undead can only be affected once by this spell." @@ -3891,8 +2968,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Passwort darf nur Buchstaben und Ziffern enthalten." - "$unit($unit) in $region($region): '$order($command)' - Your password may only contain alphanumeric symbols." @@ -3900,8 +2975,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Gegen diese Rasse kann kein Jihad ausgerufen werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot start a jihad against this race." @@ -3909,8 +2982,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Gegen welche Rasse soll der Jihad ausgerufen werden?" - "$unit($unit) in $region($region): '$order($command)' - What race did you want the jihad to be against?" @@ -3918,7 +2989,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dazu muss erst die Spezialeigenschaft erworben werden." @@ -3926,8 +2996,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Name und Beschreibung des Gebäudes können nicht geändert werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot change the name and description of this building." @@ -3935,8 +3003,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das kann die Einheit nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot do this." @@ -3944,8 +3010,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Schiffe bauen." - "$unit($unit) in $region($region): '$order($command)' - Ships cannot be built here." @@ -3953,8 +3017,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Gebäude errichten." - "$unit($unit) in $region($region): '$order($command)' - Buildings cannot be built here." @@ -3962,8 +3024,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichten." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot teach." @@ -3971,8 +3031,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht unterrichten." - "$unit($unit) in $region($region): '$order($command)' - You cannot teach here." @@ -3980,8 +3038,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Pferde müssen leider draußen bleiben." - "$unit($unit) in $region($region): '$order($command)' - Horses are not allowed inside." @@ -3989,8 +3045,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden angreifen." - "$unit($unit) in $region($region): '$order($command)' - You cannot attack here." @@ -3998,7 +3052,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man niemanden bestehlen." @@ -4006,8 +3059,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man nicht zaubern." - "$unit($unit) in $region($region): '$order($command)' - You cannot cast spells here." @@ -4015,8 +3066,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man nichts übergeben." - "$unit($unit) in $region($region): '$order($command)' - You cannot transfer items here." @@ -4024,8 +3073,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nur eine Einzelperson kann das Ticket benutzen." - "$unit($unit) in $region($region): '$order($command)' - Only a single person can use the ticket." @@ -4033,8 +3080,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der Eingangshalle." - "$unit($unit) in $region($region): '$order($command)' - This item only functions in the entry hall." @@ -4042,8 +3087,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand funktioniert nur in der normalen Welt." - "$unit($unit) in $region($region): '$order($command)' - This item only works in the normal world." @@ -4051,8 +3094,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Gut hat die Einheit nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have this good." @@ -4060,8 +3101,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Gut wird hier produziert." - "$unit($unit) in $region($region): '$order($command)' - This good is not produced here." @@ -4069,8 +3108,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei kann keine weiteren Wyrme besitzen." - "$unit($unit) in $region($region): '$order($command)' - The faction cannot have any more wyrms." @@ -4078,8 +3115,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Vor den Besitzer eines Schiffes oder Gebäudes kann nicht sortiert werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot sort before the owner of a ship or a building." @@ -4087,8 +3122,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Besitzer eines Schiffes oder Gebäudes kann nicht neu sortiert werden." - "$unit($unit) in $region($region): '$order($command)' - The owner of a ship or a building cannot be sorted." @@ -4096,8 +3129,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Befehl ist nur auf Einheiten innerhalb des selben Gebäudes oder Schiffes anwendbar." - "$unit($unit) in $region($region): '$order($command)' - That order only applies to units in the same building or ship." @@ -4105,8 +3136,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Zieleinheit ist ungültig." - "$unit($unit) in $region($region): '$order($command)' - The target unit is invalid." @@ -4114,8 +3143,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ungültiges Locale." - "$unit($unit) in $region($region): '$order($command)' - Invalid locale." @@ -4123,8 +3150,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um so etwas kann man nicht beten." - "$unit($unit) in $region($region): '$order($command)' - You cannot pray for this." @@ -4132,8 +3157,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht opfern." - "$unit($unit) in $region($region): '$order($command)' - You cannot sacrifice this." @@ -4141,8 +3164,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft oder zuwenig Aura." - "$unit($unit) in $region($region): '$order($command)' - Invalid aura specification or not enough aura." @@ -4150,8 +3171,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier ist nicht stark genug, sich den Göttern zu opfern." - "$unit($unit) in $region($region): '$order($command)' - This magician is not strong enough to be sacrificed to the gods." @@ -4159,8 +3178,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Was und wieviel soll geopfert werden?" - "$unit($unit) in $region($region): '$order($command)' - What and how much should be sacrificed?" @@ -4168,8 +3185,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen." - "$unit($unit) in $region($region): '$order($command)' - Even the gods cannot improve this power." @@ -4177,8 +3192,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nicht genug Karma." - "$unit($unit) in $region($region): '$order($command)' - Not enough karma." @@ -4186,8 +3199,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff kann nicht aufs offene Meer hinaus segeln." - "$unit($unit) in $region($region): '$order($command)' - The ship cannot sail into the open seas." @@ -4195,8 +3206,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 10 Runden alt sein." - "$unit($unit) in $region($region): '$order($command)' - The faction has to be 10 turns old." @@ -4204,8 +3213,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei hat schon einen Namen." - "$unit($unit) in $region($region): '$order($command)' - The faction is already named." @@ -4213,8 +3220,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude hat schon einen Namen." - "$unit($unit) in $region($region): '$order($command)' - The building is already named." @@ -4222,8 +3227,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff hat schon einen Namen." - "$unit($unit) in $region($region): '$order($command)' - The ship is already named." @@ -4231,8 +3234,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat schon einen Namen." - "$unit($unit) in $region($region): '$order($command)' - The unit is already named." @@ -4240,8 +3241,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Keine gültige Rasse angegeben." - "$unit($unit) in $region($region): '$order($command)' - You did not specify a valid race." @@ -4249,8 +3248,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit muß sich an Land befinden." - "$unit($unit) in $region($region): '$order($command)' - The unit must be on land." @@ -4260,8 +3257,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $building($building) ist kein Steinkreis." - "$unit($unit) in $region($region): '$order($command)' - $building($building) is not a stone circle." @@ -4271,8 +3266,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $building($building) muss vor der Weihe fertiggestellt sein." - "$unit($unit) in $region($region): '$order($command)' - $building($building) has to be complete before it can be blessed." @@ -4282,8 +3275,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In $region($target) sind keine Gräber." - "$unit($unit) in $region($region): '$order($command)' - There are no graves in $region($target)." @@ -4291,8 +3282,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei muß mindestens 81 Wochen alt sein, um einen Neustart mit einer anderen Rasse zu versuchen." - "$unit($unit) in $region($region): '$order($command)' - The faction must be at least 81 weeks old to restart with a new race." @@ -4300,8 +3289,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff verfolgt werden?" - "$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to be followed?" @@ -4309,8 +3296,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Soll eine Einheit oder ein Schiff eine neue Nummer bekommen?" - "$unit($unit) in $region($region): '$order($command)' - Is a unit or a ship supposed to get a new number?" @@ -4318,8 +3303,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier können nur Orks rekrutiert werden." - "$unit($unit) in $region($region): '$order($command)' - You can recruit only orcs here." @@ -4327,8 +3310,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region befindet sich in Aufruhr." - "$unit($unit) in $region($region): '$order($command)' - There are riots in this region." @@ -4336,8 +3317,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist noch nicht fertig gebaut." - "$unit($unit) in $region($region): '$order($command)' - The building is not finished yet." @@ -4345,8 +3324,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Für das Gebäude wurde noch kein Unterhalt bezahlt." - "$unit($unit) in $region($region): '$order($command)' - Maintenance has not been paid yet." @@ -4354,8 +3331,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit Ausschiffen beschäftigt.." - "$unit($unit) in $region($region): '$order($command)' - The unit is busy disembarking." @@ -4363,8 +3338,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Schiffe betreten." - "$unit($unit) in $region($region): '$order($command)' - Swimmers cannot enter ships." @@ -4372,8 +3345,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Typ Einheit kann keine Gebäude betreten." - "$unit($unit) in $region($region): '$order($command)' - This type of unit cannot enter a building." @@ -4381,8 +3352,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit oder ihre Tiere würden dort nicht überleben." - "$unit($unit) in $region($region): '$order($command)' - The unit or its animals would not survive there." @@ -4390,8 +3359,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dorthin kann die Einheit uns nicht transportieren." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot transport us to this place." @@ -4400,8 +3367,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $building($building) wird belagert." - "$unit($unit) in $region($region): '$order($command)' - $building($building) is under siege." @@ -4410,8 +3375,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Eintritt in $building($building) wurde verwehrt." - "$unit($unit) in $region($region): '$order($command)' - Entrance to $building($building) was denied." @@ -4419,8 +3382,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ein Vertrauter wird beschworen, verschwindet jedoch wieder, als er keine Verbindung zu seinem Element herstellen kann." - "$unit($unit) in $region($region): '$order($command)' - A familiar is summoned, but it disappears again when it cannot get in contact with its natural element." @@ -4428,8 +3389,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nur normale Personen können Steuern eintreiben." - "$unit($unit) in $region($region): '$order($command)' - Only normal characters can collect taxes." @@ -4437,8 +3396,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dafür braucht ein Einheit mindestens Kräuterkunde 7." - "$unit($unit) in $region($region): '$order($command)' - A herbalism skill of 7 or higher is required." @@ -4446,8 +3403,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheiten in den hinteren Reihen können nicht angreifen." - "$unit($unit) in $region($region): '$order($command)' - Units from the backmost rows cannot attack." @@ -4455,8 +3410,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Unbekannter Kampfstatus." - "$unit($unit) in $region($region): '$order($command)' - Unknown combat status." @@ -4464,8 +3417,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig." - "$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight." @@ -4473,8 +3424,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits ein Magiegebiet." - "$unit($unit) in $region($region): '$order($command)' - The faction has already chosen a magical school." @@ -4483,8 +3432,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nicht arbeiten." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot work." @@ -4492,8 +3439,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hungernde Soldaten kämpfen nicht." - "$unit($unit) in $region($region): '$order($command)' - Starving units do not fight." @@ -4501,8 +3446,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht zaubern." - "$unit($unit) in $region($region): '$order($command)' - Starving units cannot cast spells." @@ -4510,8 +3453,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hungernde Einheiten können nicht bewachen." - "$unit($unit) in $region($region): '$order($command)' - Starving units cannot guard." @@ -4519,8 +3460,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zeige alle was?" - "$unit($unit) in $region($region): '$order($command)' - Show all what?" @@ -4528,8 +3467,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas kann man hier nicht bauen." - "$unit($unit) in $region($region): '$order($command)' - You cannot build this here." @@ -4537,8 +3474,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Im astralen Nebel konnte niemand entdeckt werden." - "$unit($unit) in $region($region): '$order($command)' - No one could be seen in the astral fog." @@ -4546,8 +3481,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ein Zauber in dieser Region verhindert das." - "$unit($unit) in $region($region): '$order($command)' - There is an active spell in this region that prevents this." @@ -4555,8 +3488,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur im Astralraum gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - This spell can only be cast on the astral plane." @@ -4564,8 +3495,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Verbindung zur astralen Welt." - "$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here." @@ -4573,8 +3502,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Von hier aus kann man die astrale Ebene nicht erreichen." - "$unit($unit) in $region($region): '$order($command)' - You cannot reach the astral plane from here." @@ -4582,8 +3509,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheit ist kein Magier." - "$unit($unit) in $region($region): '$order($command)' - Unit is not a magician." @@ -4591,8 +3516,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Parameter nicht korrekt angegeben." - "$unit($unit) in $region($region): '$order($command)' - Incorrect parameter." @@ -4600,8 +3523,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff." - "$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship." @@ -4609,8 +3530,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff liegt bereits so ein Zauber." - "$unit($unit) in $region($region): '$order($command)' - The ship is already under this spell." @@ -4618,8 +3537,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen." - "$unit($unit) in $region($region): '$order($command)' - It is too dangerous to fly the ship in the storm." @@ -4627,8 +3544,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Syntax Error." - "$unit($unit) in $region($region): '$order($command)' - Syntax Error." @@ -4636,8 +3551,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auraangabe fehlerhaft." - "$unit($unit) in $region($region): '$order($command)' - Wrong aura values." @@ -4645,8 +3558,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zu dieser Einheit kann keine Aura übertragen werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot transfer aura to this unit." @@ -4654,8 +3565,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auf dem Gebäude liegt bereits so ein Zauber." - "$unit($unit) in $region($region): '$order($command)' - There is alrady a spell on that building." @@ -4664,8 +3573,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf hoher See gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast while you are on the ocean." @@ -4674,8 +3581,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Monster gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on monsters." @@ -4684,8 +3589,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast on undead." @@ -4694,8 +3597,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Stimmung in der Region ist so schlecht, dass niemand auf den Zauber reagiert." - "$unit($unit) in $region($region): '$order($command)' - The mood in this region is so bad that nobody reacts to the spell." @@ -4706,8 +3607,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) wusste trotz intensivem Verhör nichts über $region($tregion) zu berichten." - "$unit($unit) in $region($region): '$order($command)' - Despite intense questioning, $unit($target) did not have anything to tell about $region($tregion)." @@ -4716,8 +3615,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So viele Persoenen übersteigen die Kräfte des Magiers." - "$unit($unit) in $region($region): '$order($command)' - This many people exceed the powers of the magician." @@ -4727,8 +3624,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) hat unaufkündbare Bindungen an seine alte Partei." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) have unbreakable commitments to their faction." @@ -4737,8 +3632,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber gelingt nur in einer Ozeanregion." - "$unit($unit) in $region($region): '$order($command)' - This spell works only in an ocean region." @@ -4746,8 +3639,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In einer Region ohne Bäume kann man diesen Zauber nicht wirken." - "$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a region without trees." @@ -4755,8 +3646,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Ziel wurde vergessen." - "$unit($unit) in $region($region): '$order($command)' - No target has been supplied." @@ -4764,8 +3653,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das ist keine gültige Rasse." - "$unit($unit) in $region($region): '$order($command)' - This is not a valid race." @@ -4773,8 +3660,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Rasse und Zieleinheit wurden vergessen." - "$unit($unit) in $region($region): '$order($command)' - Race and target unit have not been supplied." @@ -4782,8 +3667,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die maximale Aura reicht nicht für diesen Zauber." - "$unit($unit) in $region($region): '$order($command)' - Magician's maximum aura is not high enough for this spell." @@ -4791,8 +3674,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier hat bereits einen Vertrauten." - "$unit($unit) in $region($region): '$order($command)' - The magician already has a familiar." @@ -4800,8 +3681,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Flammen finden keine Nahrung. Das Feuer erlischt, ohne Schaden anzurichten." - "$unit($unit) in $region($region): '$order($command)' - The flames find no kindling. The fire dies quickly, causing no damage whatsoever." @@ -4809,8 +3688,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um einen Heimstein zu erschaffen, muß der Zauberer in einer Burg sein." - "$unit($unit) in $region($region): '$order($command)' - The magician has to be in a castle to create a homestone." @@ -4818,8 +3695,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das ist keine Waldregion." - "$unit($unit) in $region($region): '$order($command)' - This is not a forest region." @@ -4827,8 +3702,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg." - "$unit($unit) in $region($region): '$order($command)' - There is no route leading there." @@ -4836,8 +3709,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Zielregion wurde nicht korrekt angegeben." - "$unit($unit) in $region($region): '$order($command)' - Target region was supplied incorrectly." @@ -4845,8 +3716,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der Geisterwelt." - "$unit($unit) in $region($region): '$order($command)' - This spell will only work in the realm of spirits." @@ -4854,8 +3723,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Wege zwischen Geisterwelt und Realität scheinen blockiert zu sein." - "$unit($unit) in $region($region): '$order($command)' - The paths to the spirit world seem to be blocked." @@ -4863,8 +3730,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in Wäldern." - "$unit($unit) in $region($region): '$order($command)' - This spell works only in forests." @@ -4872,8 +3737,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber funktioniert nur in der materiellen Welt." - "$unit($unit) in $region($region): '$order($command)' - This spell works only in the material world." @@ -4881,8 +3744,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Selbst der mächtigste Magier der Welt könnte keinen Ozean austrocknen lassen." - "$unit($unit) in $region($region): '$order($command)' - Even the gods cannot dry out an entire ocean." @@ -4890,8 +3751,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht im Sumpf gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell in a swamp." @@ -4899,8 +3758,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nur auf Land gelegt werden." - "$unit($unit) in $region($region): '$order($command)' - This spell only works on dry land." @@ -4908,8 +3765,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber scheint ungewöhnlich schwach zu sein. Irgendetwas hat die magischen Energien abgeleitet." - "$unit($unit) in $region($region): '$order($command)' - The spell seems exceptionally weak. Something has interfred with the magical energies." @@ -4917,8 +3772,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann den Befehl in dieser Runde nicht ausführen, da sie sich bewegt hat." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot execute this command because it has moved." @@ -4926,8 +3779,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit bewegt sich nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not move." @@ -4935,8 +3786,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier befindet sich nicht auf einem Schiff." - "$unit($unit) in $region($region): '$order($command)' - The magician is not on board a ship." @@ -4944,8 +3793,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff kann in diese Richtung nicht ablegen." - "$unit($unit) in $region($region): '$order($command)' - The ship cannot leave in this direction." @@ -4953,8 +3800,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dazu muß sich der Magier in der Burg oder an Bord des Schiffes befinden." - "$unit($unit) in $region($region): '$order($command)' - To do this, the magician has to be in a castle or on board a ship." @@ -4962,8 +3807,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Zauber schlägt fehl." - "$unit($unit) in $region($region): '$order($command)' - The spell fails." @@ -4971,8 +3814,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Magiegebiet kann die Einheit nicht lernen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this magic sphere." @@ -4980,8 +3821,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es wurde kein Magiegebiet angegeben." - "$unit($unit) in $region($region): '$order($command)' - No magic sphere was supplied." @@ -4989,8 +3828,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann der Vertraute nicht zaubern." - "$unit($unit) in $region($region): '$order($command)' - The familiar cannot cast this spell." @@ -4998,8 +3835,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht in die Ferne richten." - "$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell on a distant target." @@ -5007,8 +3842,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Spruch kann man nicht auf einem sich bewegenden Schiff stehend zaubern." - "$unit($unit) in $region($region): '$order($command)' - You cannot cast this spell while standing on a moving ship." @@ -5016,8 +3849,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber ist nur im Kampf sinnvoll." - "$unit($unit) in $region($region): '$order($command)' - This spell only makes sense in combat." @@ -5025,8 +3856,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Selbst in der Bibliothek von Xontormia konnte dieser Spruch nicht gefunden werden." - "$unit($unit) in $region($region): '$order($command)' - Even in the Xontormia Library, this spell could not be found." @@ -5034,8 +3863,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es wurde kein Zauber angegeben." - "$unit($unit) in $region($region): '$order($command)' - There was no spell supplied." @@ -5043,8 +3870,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Kampfzauber gibt es nicht." - "$unit($unit) in $region($region): '$order($command)' - This combat spell does not exist." @@ -5052,8 +3877,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Bauern nehmen dieses großzügige Geschenk nicht an." - "$unit($unit) in $region($region): '$order($command)' - The peasants did not accept this gracious gift." @@ -5061,8 +3884,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Zauber kennt die Einheit nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not know this spell." @@ -5070,8 +3891,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter verkauft werden." - "$unit($unit) in $region($region): '$order($command)' - No luxury items could be sold." @@ -5079,8 +3898,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit geht nicht zu den Bauern." - "$unit($unit) in $region($region): '$order($command)' - The unit does not go to the peasants." @@ -5088,8 +3905,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann eine Burg nicht belagern." - "$unit($unit) in $region($region): '$order($command)' - This race cannot besiege a castle." @@ -5097,8 +3912,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Trank bekommt der Einheit nicht." - "$unit($unit) in $region($region): '$order($command)' - The potion does not agree with the unit." @@ -5106,8 +3919,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Nestwärme kann nur von Insektenvölkern benutzt werden." - "$unit($unit) in $region($region): '$order($command)' - This potion can only be used by insects." @@ -5115,8 +3926,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Heiltrank wird automatisch bei Bedarf benutzt." - "$unit($unit) in $region($region): '$order($command)' - This healing potion will be automatically used when needed." @@ -5124,8 +3933,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit besitzt den Trank nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion." @@ -5133,8 +3940,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es konnten keine Luxusgüter gekauft werden." - "$unit($unit) in $region($region): '$order($command)' - No luxury items could be bought." @@ -5142,8 +3947,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es konnten keine Personen übergeben werden." - "$unit($unit) in $region($region): '$order($command)' - No person could be handed over." @@ -5151,8 +3954,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Magier arbeiten grundsätzlich nur alleine!" - "$unit($unit) in $region($region): '$order($command)' - Magicians always work alone!" @@ -5160,8 +3961,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei hat ein anderes Magiegebiet." - "$unit($unit) in $region($region): '$order($command)' - The faction has a different magic sphere." @@ -5169,8 +3968,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zuviele Alchemisten in der Partei." - "$unit($unit) in $region($region): '$order($command)' - Too many alchemists in the faction." @@ -5178,8 +3975,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zuviele Magier in der Partei." - "$unit($unit) in $region($region): '$order($command)' - Too many magicians in the faction." @@ -5187,8 +3982,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hochqualifizierte Personen weigern sich, für andere Parteien zu arbeiten." - "$unit($unit) in $region($region): '$order($command)' - Highly qualified people refuse to work for other parties." @@ -5196,8 +3989,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit schließt sich den Bauern an." - "$unit($unit) in $region($region): '$order($command)' - The unit joins the local peasants." @@ -5205,8 +3996,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit springt über Bord und ertrinkt." - "$unit($unit) in $region($region): '$order($command)' - The unit jumps over board and drowns." @@ -5214,8 +4003,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region wird bewacht." - "$unit($unit) in $region($region): '$order($command)' - The region is guarded." @@ -5223,8 +4010,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Unbekannte Option." - "$unit($unit) in $region($region): '$order($command)' - Unknown option." @@ -5232,8 +4017,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit wird belagert." - "$unit($unit) in $region($region): '$order($command)' - The unit is under siege." @@ -5241,8 +4024,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zum Straßenbau braucht man Steine." - "$unit($unit) in $region($region): '$order($command)' - You need stones to build a road." @@ -5250,8 +4031,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Wohin soll die Botschaft gehen?" - "$unit($unit) in $region($region): '$order($command)' - Who is supposed to get this message?" @@ -5259,8 +4038,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Burgherr." - "$unit($unit) in $region($region): '$order($command)' - The unit is not in command of a castle." @@ -5268,8 +4045,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht Burgherr der größten Burg in der Region." - "$unit($unit) in $region($region): '$order($command)' - The unit is not in command of the largest castle in the region." @@ -5277,8 +4052,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Kapitän des Schiffes." - "$unit($unit) in $region($region): '$order($command)' - The unit is not captain of a ship." @@ -5286,8 +4059,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Burg." - "$unit($unit) in $region($region): '$order($command)' - The unit is not in a castle." @@ -5295,8 +4066,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf keinem Schiff." - "$unit($unit) in $region($region): '$order($command)' - The unit is not on board a ship." @@ -5304,8 +4073,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf einem Schiff." - "$unit($unit) in $region($region): '$order($command)' - The unit is on board a ship." @@ -5313,8 +4080,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat zuwenig Silber, um zu rekrutieren." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver for recruiting." @@ -5322,8 +4087,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht mehr genug Kristalle für so viele Personen." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have enough crystals left for this many people." @@ -5331,8 +4094,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich weder in einer Burg noch auf einem Schiff." - "$unit($unit) in $region($region): '$order($command)' - The unit is neither in a castle nor on board a ship." @@ -5340,8 +4101,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Unterschiedliche Typen können nicht gemischt werden." - "$unit($unit) in $region($region): '$order($command)' - Different types do not mix." @@ -5349,8 +4108,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Uns gehört nichts, was man abreißen oder versenken könnte." - "$unit($unit) in $region($region): '$order($command)' - We do not have anything that could be demolished." @@ -5358,8 +4115,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Unbekannter Hilfe-Modus." - "$unit($unit) in $region($region): '$order($command)' - Unknown help mode." @@ -5367,8 +4122,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Unbekannte Meldungs-Option." - "$unit($unit) in $region($region): '$order($command)' - Unknown report option." @@ -5376,8 +4129,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um in Wüsten Straßen bauen zu können, muß zuerst eine Karawanserei errichtet werden." - "$unit($unit) in $region($region): '$order($command)' - You must build a caravansary before building roads through deserts." @@ -5385,8 +4136,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um in Sümpfen Straßen bauen zu können, muß zuerst ein Damm errichtet werden." - "$unit($unit) in $region($region): '$order($command)' - You must build a dam before building roads through swamps." @@ -5394,8 +4143,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So viele Leute kann die Partei nicht aufnehmen." - "$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many people." @@ -5403,8 +4150,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann die Partei nicht aufnehmen." - "$unit($unit) in $region($region): '$order($command)' - The faction cannot hire so many strangers." @@ -5412,8 +4157,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So viele Fremde kann Deine Partei nicht aufnehmen." - "$unit($unit) in $region($region): '$order($command)' - Your faction cannot hire so many strangers." @@ -5421,8 +4164,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht verkaufen." - "$unit($unit) in $region($region): '$order($command)' - You cannot sell this." @@ -5430,8 +4171,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht machen." - "$unit($unit) in $region($region): '$order($command)' - You cannot produce this." @@ -5439,8 +4178,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas kann man nicht auf dem Markt kaufen." - "$unit($unit) in $region($region): '$order($command)' - You cannot buy that on a market place." @@ -5448,8 +4185,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas hat die Einheit nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have such a thing." @@ -5457,8 +4192,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Pferde kann man nur in einer Pferdezucht züchten." - "$unit($unit) in $region($region): '$order($command)' - You can only breed horses in a stable." @@ -5466,8 +4199,6 @@ - "$unit($unit) in $region($region): '$order($command)' - So etwas gibt es hier nicht." - "$unit($unit) in $region($region): '$order($command)' - That resource does not exist in this region." @@ -5475,8 +4206,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Personen können nur an Menschen übergeben werden." - "$unit($unit) in $region($region): '$order($command)' - Characters can be given only to human parties." @@ -5484,8 +4213,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ohne einen Handelsposten gibt es keinen Markt." - "$unit($unit) in $region($region): '$order($command)' - There is no marketplace without at least a tradepost." @@ -5493,8 +4220,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann die Einheit nicht herstellen." - "$unit($unit) in $region($region): '$order($command)' - This unit cannot produce that." @@ -5502,8 +4227,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Rasse kann das nicht herstellen." - "$unit($unit) in $region($region): '$order($command)' - This race cannot produce that." @@ -5511,8 +4234,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nummer kann nicht vergeben werden." - "$unit($unit) in $region($region): '$order($command)' - Number can not be assigned." @@ -5520,8 +4241,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nummer ist schon belegt." - "$unit($unit) in $region($region): '$order($command)' - Number is already in use." @@ -5529,8 +4248,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nummer ist nicht im gültigen Bereich." - "$unit($unit) in $region($region): '$order($command)' - Number is not valid." @@ -5538,8 +4255,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nichts angegeben, was wir übergeben sollen." - "$unit($unit) in $region($region): '$order($command)' - Item to be handed over was not supplied." @@ -5547,8 +4262,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Namen dürfen keine Klammern enthalten." - "$unit($unit) in $region($region): '$order($command)' - Names may not contain parenthesis." @@ -5556,8 +4269,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Nachricht zu lang - gekürzt." - "$unit($unit) in $region($region): '$order($command)' - Message has been cut (too long)." @@ -5565,8 +4276,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Region oder eine Einheit beschrieben werden soll." - "$unit($unit) in $region($region): '$order($command)' - Specify if description is for a castle, a ship, a region, or a unit." @@ -5574,8 +4283,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Man muß angeben, ob eine Burg, ein Schiff, eine Einheit, eine Region oder eine Partei benannt werden soll." - "$unit($unit) in $region($region): '$order($command)' - Specify if a castle, a ship, a region, or a unit is supposed to be named." @@ -5583,8 +4290,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es sind keine Kräuter zu finden." - "$unit($unit) in $region($region): '$order($command)' - No herbs could be found." @@ -5592,8 +4297,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Man braucht mindestens zwei Pferde, um sie zu züchten." - "$unit($unit) in $region($region): '$order($command)' - You need at least two horses to breed more." @@ -5601,8 +4304,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Magier müssen zum studieren allein sein." - "$unit($unit) in $region($region): '$order($command)' - When studying, magicians need to be alone." @@ -5610,8 +4311,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Leere Einheiten können nicht übergeben werden." - "$unit($unit) in $region($region): '$order($command)' - Empty units can not be handed over." @@ -5619,8 +4318,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Metall kann nur in einem Bergwerk abgebaut werden." - "$unit($unit) in $region($region): '$order($command)' - This metal can be excavated only in a mine." @@ -5628,8 +4325,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Keiner hier kann Straßen bauen." - "$unit($unit) in $region($region): '$order($command)' - Nobody here can build roads." @@ -5637,8 +4332,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren Güter handeln." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot trade any more goods." @@ -5646,8 +4339,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Keiner hier kann ein Gebäude errichten." - "$unit($unit) in $region($region): '$order($command)' - Nobody here can construct a building." @@ -5655,8 +4346,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Keiner hier ist gelernter Schiffbauer." - "$unit($unit) in $region($region): '$order($command)' - Nobody here is a skilled ship builder." @@ -5664,8 +4353,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit will nicht transportiert werden." - "$unit($unit) in $region($region): '$order($command)' - The unit does not want to be transported." @@ -5673,8 +4360,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Insekten können im Winter nur in Wüsten rekrutiert werden." - "$unit($unit) in $region($region): '$order($command)' - In winter, insects can be recruited only in deserts." @@ -5682,8 +4367,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In Gletschern können keine Insekten rekrutiert werden." - "$unit($unit) in $region($region): '$order($command)' - Insects cannot be recruited in glacier regions." @@ -5691,8 +4374,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Einheit gibt es niemanden, den man transferieren könnte." - "$unit($unit) in $region($region): '$order($command)' - Nobody in this unit can be transferred." @@ -5700,8 +4381,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Illusionen können eine Region nicht bewachen." - "$unit($unit) in $region($region): '$order($command)' - Illusions cannot guard a region." @@ -5709,8 +4388,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier kann man keine Straße bauen." - "$unit($unit) in $region($region): '$order($command)' - You cannot build a road here." @@ -5718,8 +4395,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier gibt es schon einen Hafen." - "$unit($unit) in $region($region): '$order($command)' - There is already a port in this region." @@ -5727,8 +4402,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Bauern." - "$unit($unit) in $region($region): '$order($command)' - There are no peasants in this region." @@ -5736,8 +4409,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier gibt es keinen normalen Wald." - "$unit($unit) in $region($region): '$order($command)' - There is no normal forest in this region." @@ -5745,8 +4416,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Hier gibt es keine Mallornbäume." - "$unit($unit) in $region($region): '$order($command)' - There are no mallorn trees here." @@ -5754,8 +4423,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit fährt nicht mit uns." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have travel with us." @@ -5763,8 +4430,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Geldgebot fehlt." - "$unit($unit) in $region($region): '$order($command)' - Money offer is missing." @@ -5772,8 +4437,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genügend Materialien für den Schiffbau." - "$unit($unit) in $region($region): '$order($command)' - The unit is lacking materials for building the ship." @@ -5781,8 +4444,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Für das Elixier benötigt man Drachenblut." - "$unit($unit) in $region($region): '$order($command)' - Dragon blood is required for this elixir." @@ -5790,8 +4451,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Falsches Passwort." - "$unit($unit) in $region($region): '$order($command)' - Wrong password." @@ -5799,8 +4458,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es wurde keine Emailadresse angegeben." - "$unit($unit) in $region($region): '$order($command)' - No email address was supplied." @@ -5808,8 +4465,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es wurde kein Name angegeben." - "$unit($unit) in $region($region): '$order($command)' - No name was supplied." @@ -5817,8 +4472,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es konnte kein Bauer gefangen werden." - "$unit($unit) in $region($region): '$order($command)' - No peasant could be caught." @@ -5826,8 +4479,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es gibt keine Abstimmung mit dieser Nummer." - "$unit($unit) in $region($region): '$order($command)' - There is no agreement with this number." @@ -5835,8 +4486,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheit muß zuerst die Region bewachen." - "$unit($unit) in $region($region): '$order($command)' - The unit must first guard the region." @@ -5844,8 +4493,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheit ist nicht bewaffnet und kampffähig." - "$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight." @@ -5853,8 +4500,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ein Schiff oder eine Burg muß angegeben werden." - "$unit($unit) in $region($region): '$order($command)' - A ship or a castle must be supplied." @@ -5862,8 +4507,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ein Fluch verhindert die Übergabe." - "$unit($unit) in $region($region): '$order($command)' - A curse prevented the transfer from happening." @@ -5871,8 +4514,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Talent wurde nicht erkannt." - "$unit($unit) in $region($region): '$order($command)' - The skill could not be recognized." @@ -5880,8 +4521,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieses Talent kann die Einheit nicht lernen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot learn this skill." @@ -5889,8 +4528,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diesen Gegenstand kann man nicht benutzen." - "$unit($unit) in $region($region): '$order($command)' - This item cannot be used." @@ -5898,8 +4535,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit nimmt niemanden an." - "$unit($unit) in $region($region): '$order($command)' - This unit does not accept anybody." @@ -5907,8 +4542,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine hungernde Einheit kann niemanden weggeben." - "$unit($unit) in $region($region): '$order($command)' - Hungry units cannot give anybody away." @@ -5916,8 +4549,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Einheit kann niemanden weggeben." - "$unit($unit) in $region($region): '$order($command)' - This unit cannot give anybody away." @@ -5927,8 +4558,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us." @@ -5937,8 +4566,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es kann hier kein Kontakt zur Astralwelt aufgenommen werden." - "$unit($unit) in $region($region): '$order($command)' - There is no connection to the astral plane here." @@ -5948,8 +4575,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen und widersteht dem Zauber." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, and resists the spell." @@ -5958,8 +4583,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) hat keinen Kontakt mit uns aufgenommen, aber widersteht dem Zauber nicht." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) did not contact us, but cannot resist the spell." @@ -5967,8 +4590,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Richtung wurde nicht erkannt." - "$unit($unit) in $region($region): '$order($command)' - The given direction was not recognized." @@ -5977,8 +4598,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Richtung '$dirname' wurde nicht erkannt." - "$unit($unit) in $region($region): '$order($command)' - Direction '$dirname' was not recognized." @@ -5986,8 +4605,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region wird von Nichtalliierten bewacht." - "$unit($unit) in $region($region): '$order($command)' - This region is guarded by a non-allied faction." @@ -5996,8 +4613,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region wird von $unit($guard), einer nichtalliierten Einheit, bewacht." - "$unit($unit) in $region($region): '$order($command)' - This region is guarded by $unit($guard), a non-allied unit." @@ -6005,8 +4620,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Pferde würden ertrinken." - "$unit($unit) in $region($region): '$order($command)' - The horses would drown." @@ -6014,8 +4627,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - The faction could not be found." @@ -6023,8 +4634,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Lernkosten können nicht bezahlt werden." - "$unit($unit) in $region($region): '$order($command)' - Tuition was too high to be paid." @@ -6032,8 +4641,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Gegenstand kann nur in der realen Welt benutzt werden." - "$unit($unit) in $region($region): '$order($command)' - This object can only be used in the real world." @@ -6041,8 +4648,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) ist nicht ausreichend getarnt." - "$unit($unit) in $region($region): '$order($command)' - $unit($unit) is not sufficiently stealthy." @@ -6050,8 +4655,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - The unit could not be found." @@ -6060,8 +4663,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Einheit kann nichts gegeben werden." - "$unit($unit) in $region($region): '$order($command)' - You cannot give anything to this unit." @@ -6070,8 +4671,6 @@ - "$unit($mage) horcht $unit($unit) über $region($tregion) aus." - "$unit($mage) questions $unit($unit) about $region($tregion)." @@ -6079,16 +4678,12 @@ - "$unit($mage) verschafft $unit($unit) einige feuchtfröhliche Stunden mit heftigen Nachwirkungen." - "$unit($mage) invites $unit($unit) for a few too many drinks and a massive hangover." - "$unit($unit) hat höllische Kopfschmerzen und kann sich an die vergangene Woche nicht mehr erinnern. Nur noch daran, wie alles mit einer fröhlichen Feier in irgendeiner Taverne anfing...." - "$unit($unit) has a splitting headache and can hardly remember last week. Except that it all started in the tavern..." @@ -6096,16 +4691,12 @@ - "$unit($mage) besänftigt $unit($unit)." - "$unit($mage) calms $unit($unit)." - "$unit($unit) verfiel dem Glücksspiel und hat fast sein ganzes Hab und gut verspielt." - "$unit($unit) gambles for high stakes and loses almost everything." @@ -6114,8 +4705,6 @@ - "$unit($unit) schenkt $unit($mage) $resources($items)." - "$unit($unit) gives $unit($mage) $resources($items)." @@ -6124,16 +4713,12 @@ - "$unit($mage) läßt $unit($target) als $race($race,$unit.size($target)) erscheinen." - "$unit($mage) makes $unit($target) appear as $race($race,$unit.size($target))." - "$unit($unit) wird kurz von einem magischen Licht umhüllt." - "$unit($unit) is briefly surrounded by a magical light." @@ -6141,15 +4726,11 @@ - "$unit($unit) konnte nur $int($ships) von $int($maxships) Schiffen verzaubern." - "$unit($unit) could only enchant $int($ships) of $int($maxships) ships." - "$unit($unit) beschwört einen magischen Wind, der die Schiffe über das Wasser treibt." - "$unit($unit) calls up a magical storm that whips the ship over the waters." @@ -6157,8 +4738,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nichts über Botanik." - "$unit($unit) in $region($region): '$order($command)' - The unit does not know anything about herbalism." @@ -6166,8 +4745,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit weiß nicht, wie man gaukelt." - "$unit($unit) in $region($region): '$order($command)' - The unit does not know how to entertain." @@ -6175,8 +4752,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit trägt zuviel Gewicht, um sich bewegen zu können." - "$unit($unit) in $region($region): '$order($command)' - The unit is too heavily loaded to move." @@ -6184,8 +4759,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann soviele Pferde nicht bändigen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot tame that many horses." @@ -6193,8 +4766,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann sich nicht fortbewegen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot move." @@ -6202,8 +4773,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht handeln." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot trade." @@ -6211,8 +4780,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine Tränke herstellen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot make potions." @@ -6220,8 +4787,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann keine weiteren langen Befehle ausführen." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot execute more long orders." @@ -6229,8 +4794,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver." @@ -6238,8 +4801,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht erfahren genug dafür." - "$unit($unit) in $region($region): '$order($command)' - The unit is not experienced enough to do this." @@ -6247,8 +4808,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht der Eigentümer." - "$unit($unit) in $region($region): '$order($command)' - The unit is not the owner." @@ -6256,8 +4815,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht geschult im Eintreiben von Steuern." - "$unit($unit) in $region($region): '$order($command)' - The unit does not now how to tax." @@ -6266,8 +4823,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist nicht bewaffnet und kampffähig." - "$unit($unit) in $region($region): '$order($command)' - The unit is not armed and ready to fight." @@ -6275,8 +4830,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist mit uns alliiert." - "$unit($unit) in $region($region): '$order($command)' - This unit is one of our allies." @@ -6284,8 +4837,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist in keiner Taverne." - "$unit($unit) in $region($region): '$order($command)' - The unit is not in a tavern." @@ -6293,8 +4844,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist eine der unsrigen." - "$unit($unit) in $region($region): '$order($command)' - This unit is one of our own." @@ -6302,8 +4851,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist auf hoher See." - "$unit($unit) in $region($region): '$order($command)' - The unit is off shore." @@ -6311,8 +4858,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat so etwas nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have this." @@ -6320,8 +4865,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Wagenlenker oder zuviel andere Fracht, um die Wagen aufzuladen." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have enough coachmen or has too much freights to lad the wagons." @@ -6329,8 +4872,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nicht genug Silber." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have enough silver." @@ -6338,8 +4879,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keinen Kontakt mit uns aufgenommen." - "$unit($unit) in $region($region): '$order($command)' - The unit did not contact us." @@ -6347,8 +4886,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Spionage gelernt." - "$unit($unit) in $region($region): '$order($command)' - The unit has not yet learned espionage." @@ -6356,8 +4893,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat keine Kräuter." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have any herbs." @@ -6365,8 +4900,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Trank nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have this potion." @@ -6374,8 +4907,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have this item." @@ -6385,8 +4916,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diesen Gegenstand zwar, aber sämtliche $int($reservation) $resource($resource,$reservation) sind reserviert." - "$unit($unit) in $region($region): '$order($command)' - The unit has this item, but all $int($reservation) $resource($resource,$reservation) are reserved." @@ -6394,8 +4923,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat diese Kräuter nicht." - "$unit($unit) in $region($region): '$order($command)' - The unit does not have these herbs." @@ -6404,8 +4931,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Einheiten dürfen nicht mehr als $int($maxsize) Personen enthalten." - "$unit($unit) in $region($region): '$order($command)' - Units may not have more than $int($maxsize) members." @@ -6413,8 +4938,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen, da sie das Schiff überladen würde." - "$unit($unit) in $region($region): '$order($command)' - The unit cannot go aboard, the ship would be overloaded." @@ -6422,8 +4945,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit darf nicht an Bord kommen." - "$unit($unit) in $region($region): '$order($command)' - This unit has no permission to come on board." @@ -6431,8 +4952,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht in unserer Burg." - "$unit($unit) in $region($region): '$order($command)' - The unit is not in our castle." @@ -6440,8 +4959,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit befindet sich nicht an Bord unseres Schiffes." - "$unit($unit) in $region($region): '$order($command)' - The unit is not on board our ship." @@ -6449,8 +4966,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Burg wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - The castle could not be found." @@ -6458,8 +4973,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Botschaft enthält keinen Text." - "$unit($unit) in $region($region): '$order($command)' - The message does not contain text." @@ -6467,8 +4980,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Bauern sind schlecht gelaunt." - "$unit($unit) in $region($region): '$order($command)' - The peasant morale is low." @@ -6476,8 +4987,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu verkaufender Produkte fehlt." - "$unit($unit) in $region($region): '$order($command)' - The amount of items for sale is missing." @@ -6485,8 +4994,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Anzahl zu kaufender Produkte fehlt." - "$unit($unit) in $region($region): '$order($command)' - The amount of items to buy is missing." @@ -6494,8 +5001,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Fluch verhindert das." - "$unit($unit) in $region($region): '$order($command)' - A curse prevents this from happening." @@ -6503,8 +5008,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht Spionage unmöglich." - "$unit($unit) in $region($region): '$order($command)' - Espionage was not possible due to siege." @@ -6512,8 +5015,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Belagerungszustand macht die Kontaktaufnahme unmöglich." - "$unit($unit) in $region($region): '$order($command)' - Contact was not possible due to siege." @@ -6521,8 +5022,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Befehl wurde nicht erkannt." - "$unit($unit) in $region($region): '$order($command)' - Unknown command." @@ -6530,8 +5029,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dazu gibt es keine Informationen." - "$unit($unit) in $region($region): '$order($command)' - There is no information available for the request." @@ -6539,8 +5036,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - The ship could not be found." @@ -6548,8 +5043,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff muß erst verlassen werden." - "$unit($unit) in $region($region): '$order($command)' - First you have to leave the ship." @@ -6557,8 +5050,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff ist zu schwer beladen, um in See zu stechen." - "$unit($unit) in $region($region): '$order($command)' - The ship is too heavily loaded to sail." @@ -6567,8 +5058,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $ship($ship) ist zu groß, um fliegen zu können." - "$unit($unit) in $region($region): '$order($command)' - $ship($ship) is too bulky to fly." @@ -6576,8 +5065,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff ist schon fertig." - "$unit($unit) in $region($region): '$order($command)' - The ship is already completed." @@ -6585,8 +5072,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff ist noch nicht fertig gebaut." - "$unit($unit) in $region($region): '$order($command)' - The ship has not yet been completed." @@ -6594,8 +5079,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff ist auf hoher See." - "$unit($unit) in $region($region): '$order($command)' - The ship is off shore." @@ -6603,8 +5086,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff hat sich bereits bewegt." - "$unit($unit) in $region($region): '$order($command)' - The ship has moved already." @@ -6612,8 +5093,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Besitzer muss das Gebäude zuerst verlassen." - "$unit($unit) in $region($region): '$order($command)' - The owner must first LEAVE the building." @@ -6621,8 +5100,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff gehört uns nicht." - "$unit($unit) in $region($region): '$order($command)' - The ship is not ours." @@ -6630,8 +5107,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht." - "$unit($unit) in $region($region): '$order($command)' - The building is not ours." @@ -6639,8 +5114,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Schiff befindet sich auf hoher See." - "$unit($unit) in $region($region): '$order($command)' - The ship is still off shore." @@ -6648,8 +5121,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das macht wenig Sinn." - "$unit($unit) in $region($region): '$order($command)' - That does not make much sense." @@ -6657,8 +5128,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das kann man nicht sabotieren." - "$unit($unit) in $region($region): '$order($command)' - That cannot be sabotaged." @@ -6666,8 +5135,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das ist sinnlos." - "$unit($unit) in $region($region): '$order($command)' - That is useless." @@ -6675,8 +5142,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das geht nicht mehr." - "$unit($unit) in $region($region): '$order($command)' - This is no longer possible." @@ -6684,8 +5149,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude wurde nicht gefunden." - "$unit($unit) in $region($region): '$order($command)' - Building could not be found." @@ -6693,8 +5156,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht." - "$unit($unit) in $region($region): '$order($command)' - The building is not ours." @@ -6702,8 +5163,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Das Gebäude ist bereits fertig." - "$unit($unit) in $region($region): '$order($command)' - The building is already completed." @@ -6711,8 +5170,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit kann nicht unterrichtet werden." - "$unit($unit) in $region($region): '$order($command)' - This unit cannot be taught." @@ -6720,8 +5177,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Beschreibung zu lang - gekürzt." - "$unit($unit) in $region($region): '$order($command)' - Description has been cut (too long)." @@ -6729,8 +5184,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auf hoher See kann man nicht bewachen." - "$unit($unit) in $region($region): '$order($command)' - You cannot guard off shore." @@ -6738,8 +5191,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auf dem Schiff befinden sich zuwenig erfahrene Seeleute." - "$unit($unit) in $region($region): '$order($command)' - There are not enough experienced sailors on board the ship." @@ -6748,16 +5199,12 @@ - "$unit($unit) in $region($region): '$order($command)' - ${error}." - "$unit($unit) in $region($region): '$order($command)' - ${error}." - "$unit($unit) benutzt $resource($potion,1)." - "$unit($unit) uses $resource($potion,1)." @@ -6765,8 +5212,6 @@ - "$unit($unit) benutzt $int($amount) $resource($item,$amount)." - "$unit($unit) uses $int($amount) $resource($item,$amount)." @@ -6774,8 +5219,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit ist noch zu erschöpft vom Einmarsch um zu attackieren." - "'$order($command)' - $unit($unit) marched into $region($region) during the last turn and is too exhausted to attack." @@ -6784,8 +5227,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) sind friedliebend und attackieren niemand." - "'$order($command)' - $race($race,0) are peace-loving and will not attack anyone." @@ -6794,8 +5235,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit steht nicht im benötigten Gebäude, $localize($building)." - "$unit($unit) in $region($region): '$order($command)' - The unit must be in a $localize($building) to produce this." @@ -6804,8 +5243,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dazu braucht man das Talent $skill($skill)." - "$unit($unit) in $region($region): '$order($command)' - This requires the skill $skill($skill)." @@ -6816,8 +5253,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu pflanzen." - "$unit($unit) in $region($region): '$order($command)' - At least $skill($skill) $int($minskill) is needed for planting $resource($product,0)." @@ -6828,15 +5263,11 @@ - "$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren." - "$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0)." - "$string" - "$string" @@ -6845,8 +5276,6 @@ - "$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),"","en") an $unit($target)." - "$unit($unit) transfers $int($amount) person$if($eq($amount,1),"","s") to $unit($target)." @@ -6855,8 +5284,6 @@ - "$unit($target) erhält $int($amount) Person$if($eq($amount,1),"","en") von $unit($unit)." - "$unit($target) receives $int($amount) person$if($eq($amount,1),"","s") from $unit($unit)." @@ -6866,8 +5293,6 @@ - "$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target)." - "$unit($unit) gives $int($amount) $resource($resource,$amount) to $unit($target)." @@ -6877,8 +5302,6 @@ - "$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit)." - "$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit)." @@ -6886,8 +5309,6 @@ - "$unit($unit) ertränkt $int($amount) Person$if($eq($amount,1),"","en")." - "$unit($unit) drowns $int($amount)." @@ -6895,8 +5316,6 @@ - "$unit($unit) übergibt $int($amount) Person$if($eq($amount,1),"","en") an die Bauern." - "$unit($unit) transfers $int($amount) person$if($eq($amount,1),"","s") to the local peasants." @@ -6905,8 +5324,6 @@ - "$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern." - "$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants." @@ -6914,8 +5331,6 @@ - "$unit($unit) bezahlt den Unterhalt von $building($building)." - "$unit($unit) pays the maintenance for $building($building)." @@ -6923,23 +5338,17 @@ - "$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building)." - "$unit($unit) lacks $resource($item,0) to operate $building($building)." - "$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen." - "$unit($unit) cannot pay the maintenance for $building($building)." - "Der Unterhalt von $building($building) konnte nicht gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig." - "The upkeep for $building($building) was not paid, the building was not operational this week." @@ -6947,15 +5356,11 @@ - "$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber." - "$unit($unit) collected $int($amount) silver trade tax in $region($region)." - "Hier wütete die Pest, und $int($dead) Bauern starben." - "The region is visited by the plague and $int($dead) peasants died." @@ -6963,8 +5368,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden." - "$unit($unit) in $region($region): '$order($command)' - You must build a tunnel before building roads through glaciers." @@ -6972,8 +5375,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIEGEBIET [1-5]." - "$unit($unit) in $region($region): '$order($command)' - Syntax: MAGIC SPHERE [1-5]." @@ -6982,30 +5383,18 @@ - "$unit($unit) in $region($region): '$order($command)' - Deine Partei muss mindestens $int($turns) alt sein, um etwas an andere Parteien übergeben zu können." - "$unit($unit) in $region($region): '$order($command)' - Your faction must be at least $int($turns) weeks old to give something to another faction." - - Deine Partei hat letzte Runde keinen Zug - abgegeben! - No orders were received for your faction! - Aucun ordre reçu pour votre faction ! - - "Bitte sende die Befehle nächste Runde ein, wenn du weiterspielen möchtest." - "Please send in orders for the next turn if you want to continue playing." - "Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe." - "Your faction is immune against assaults for $int($turns) more weeks." @@ -7013,23 +5402,17 @@ - "$faction($member) ist mit $int($votes) Stimmen aus $alliance($alliance) ausgeschlossen worden." - "$faction($member) was kicked from $alliance($alliance) by $int($votes) of the alliance's members." - "$alliance($alliance) scheidet aus dem Spiel aus, nachdem alle Tempel verloren gingen." - "$alliance($alliance) has to leave the game after all their temples were lost." - "$int($votes) Mitglieder von $alliance($alliance) haben versucht, Deine Partei aus der Allianz auszuschliessen." - "$int($votes) members of $alliance($alliance) tried to kick you out of the alliance." @@ -7037,8 +5420,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Regione können Pyramiden gebaut werden." - "$unit($unit) in $region($region): '$order($command)' - Pyramids may be build in this region." @@ -7048,8 +5429,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Auf $ship($ship) liegt beeits ein Zauber." - "$unit($unit) in $region($region): '$order($command)' - There is already a spell on $ship($ship)." @@ -7059,8 +5438,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es ist zu gefährlich, diesen Zauber auf das fliegende Schiff $ship($ship) zu legen." - "$unit($unit) in $region($region): '$order($command)' - It is far too dangerous to put this spell on the flying ship $ship($ship)." @@ -7071,8 +5448,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Region können keine Pyramiden gebaut werden. Die nächste Pyramidenregion ist zwischen $int($mindist) und $int($maxdist) Regionen entfernt." - "$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away." @@ -7080,110 +5455,80 @@ - "$unit($unit) kann in $region($region) nicht durch das Wurmloch reisen, da die Einheit entweder zu gross ist oder teure Talente besitzt." - "$unit($unit) cannot travel through the wormhole in $region($region) because the unit is either too big or has restricted skills." - "$unit($unit) reist durch ein Wurmloch nach $region($region)." - "$unit($unit) travels through a wormhole to $region($region)." - "In $region($region) erscheint ein Wurmloch." - "A wormhole appears in $region($region)." - "Das Wurmloch in $region($region) schließt sich." - "The wormhole in $region($region) disappears." - "$int($amount) Krieger von $unit($unit) benutzen ihre Flammenschwerter." - "$int($amount) fighters of $unit($unit) are using their flaming sword." - "$int($amount) Krieger von $unit($unit) feuern ihre Katapulte ab." - "$int($amount) fighters of $unit($unit) launch their catapults." - "Der Kampf wurde ausgelöst von ${factions}." - "The battle was initiated by ${factions}." - "Eine Person von $unit($unit) konnte durch einen Heiltrank überleben." - "A fighter of $unit($unit) was saved by a healing potion." - "$unit($unit) konnte dem Gegner eine Falle stellen." - "$unit($unit) lured the enemy into an ambush." - "$unit($unit) überrascht den Gegner." - "$unit($unit) surprises the enemies." - "$unit($unit) versucht $spell($spell) zu zaubern, doch der Zauber schlägt fehl!" - "$unit($unit) tries to cast $spell($spell), but the spell fails!" - "Der Kampf wurde abgebrochen, da alle Verteidiger flohen." - "The battle was aborted because all enemies escaped." - "... in der $int($row). Kampflinie:" - "... in combat rank $int($row):" - "$unit($mage) zaubert $spell($spell), aber niemand war in Reichweite." - "$unit($mage) casts $spell($spell), but nobody was in range." - "Einheiten nach dem Kampf:" - "Units after the battle:" @@ -7192,48 +5537,36 @@ - "$unit($mage) ruft $int($amount) $race($race, $amount) zu Hilfe." - "$unit($mage) calls for the help of $int($amount) $race($race, $amount)." - "$unit($mage) beschwört Trugbilder herauf." - "$unit($mage) summons a mirage." - "$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt." - "$unit($mage) mumbles arcane words. There is a sudden hubbub, but order is restored quickly." - "$unit($mage) murmelt eine düster klingende Formel. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander." - "$unit($mage) mumbles arcane words. There is a sudden hubbub and the battle order is disturbed." - "$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht, der sich jedoch schnell wieder legt." - "$unit($mage) intones a mysterious chant. There is a sudden hubbub, but order is restored quickly." - "$unit($mage) stimmt einen seltsamen Gesang an. Ein plötzlicher Tumult entsteht und bringt die Kampfaufstellung durcheinander." - "$unit($mage) begins a mysterious chant. Great confusion sweeps through the ranks of the enemy." @@ -7241,23 +5574,17 @@ - "$unit($mage) läßt die Mauern von $building($building) in einem unheimlichen magischen Licht erglühen." - "$unit($mage) causes the walls of $building($building) to glow in an eerie magic light." - "Einheiten vor der $int($turn). Runde:" - "Units before turn $int($turn):" - "In $region($region) findet ein Kampf statt." - "There is a battle in $region($region)." @@ -7265,8 +5592,6 @@ - "$unit($mage) zaubert $spell($spell): $int($dead) $if($eq($dead,1),"Krieger wurde", "Krieger wurden") getötet." - "$unit($mage) casts $spell($spell): $int($dead) $if($eq($dead,1),"enemy was", "enemies were") killed." @@ -7274,8 +5599,6 @@ - "$unit($mage) läßt die Erde in $region($region) erzittern." - "$unit($mage) makes the earth shake in $region($region)." @@ -7283,16 +5606,12 @@ - "$unit($mage) verflucht das Land in $region($region), und eine Dürreperiode beginnt." - "$unit($mage) puts a curse on the lands of $region($region) and a drought sets in." - "$unit($mage) erschafft einen Klon." - "$unit($mage) creates a clone." @@ -7301,8 +5620,6 @@ - "$unit($mage) verliert sich in die Träume von $unit($unit) und erhält einen Eindruck von $region($region)." - "$unit($mage) is lost in the dreams of $unit($unit) and gets a glimps into $region($region)." @@ -7311,8 +5628,6 @@ - "$unit($mage) verschafft $unit($unit) ein schönes Nachtleben in $region($region)." - "$unit($mage) causes $unit($unit) to have a wonderful night in $region($region)." @@ -7320,8 +5635,6 @@ - "$unit($mage) sorgt für schlechten Schlaf in $region($region)." - "$unit($mage) disturbs everyone's dreams in $region($region)." @@ -7330,8 +5643,6 @@ - "$unit($mage) beschwört $int($amount) $race($race,$amount)." - "$unit($mage) summons $int($amount) $race($race,$amount)." @@ -7340,8 +5651,6 @@ - "$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer." - "$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall victim to the flames." @@ -7349,8 +5658,6 @@ - "Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building)." - "A magic ritual by $unit($mage) binds magic energies to the walls of $building($building)." @@ -7358,8 +5665,6 @@ - "$unit($mage) weiht $building($building)." - "$unit($mage) blesses $building($building)." @@ -7367,8 +5672,6 @@ - "$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Eis schmilzt und verwandelt sich in Morast. Reißende Ströme spülen die mageren Felder weg und ersäufen Mensch und Tier. Was an Bauten nicht den Fluten zum Opfer fiel, verschlingt der Morast. Die sengende Hitze verändert die Region für immer." - "$unit($mage) calls the torching power of the sun upon $region($region). Ice melts and turns the lands into swamps. Powerful rivers wash away the fertile soil and drown people and animals alike. What buildings have not succumbed to the floods sink into the mire. The torrid sun changes the region forever." @@ -7376,8 +5679,6 @@ - "$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt." - "$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds." @@ -7385,8 +5686,6 @@ - "$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Die Felder verdorren und Pferde verdursten. Die Hungersnot kostet vielen Bauern das Leben. Vertrocknete Bäume recken ihre kahlen Zweige in den blauen Himmel, von dem erbarmungslos die sengende Sonne brennt. Die Dürre verändert die Region für immer." - "$unit($mage) calls the torching power of the sun upon $region($region). The crops wither, horses die of thirst. A famine claims the lives of many peasants. The trees die and their bald branches cannot protect from the torrid sun that mercilessly burns the grounds. The drought permanently alters the region." @@ -7394,40 +5693,28 @@ - "$unit($mage) ruft das Feuer der Sonne auf $region($region) hinab. Das Eis zerbricht und eine gewaltige Flutwelle verschlingt die Region." - "$unit($mage) calls the torching power of the sun upon $region($region). The ice melts and and the region is consumed by a tidal wave." - "Die Darbietungen eines fahrenden Gauklers begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer." - "A touring minstrel entertains the locals. The joyous and generous disposition of his songs prove infectious." - "Die Darbietungen von $unit($mage) begeistern die Leute. Die fröhliche und ausgelassene Stimmung seiner Lieder überträgt sich auf alle Zuhörer." - "$unit($mage) entertains the locals. The joyous and generous disposition of his songs prove infectious." - "In der Luft liegt ein wunderschönes Lied, dessen friedfertiger Stimmung sich niemand entziehen kann. Einige Leute werfen sogar ihre Waffen weg." - "A wondrous song fills the air and enchants the public. The song's peaceful melody makes several listeners drop their weapons." - "Die Gesangskunst von $unit($mage) begeistert die Leute. Die friedfertige Stimmung des Lieds überträgt sich auf alle Zuhörer. Einige werfen ihre Waffen weg." - "The marvelous singing of $unit($mage) enchants the public. The song's peaceful melody makes several listeners drop their weapons." - "$unit($mage) beschwört $int($number) Dämonen aus dem Reich der Schatten." - "$unit($mage) summons $int($number) demons from the realm of shadows." @@ -7435,8 +5722,6 @@ - "$unit($mage) zaubert $spell($spell)." - "$unit($mage) casts $spell($spell)." @@ -7446,8 +5731,6 @@ - "$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren Erinnerungen, $int($dead) wurden getötet." - "$unit($mage) casts $spell($spell). $int($amount) warriors lose their memories, $int($dead) were killed." @@ -7456,8 +5739,6 @@ - "$unit($mage) zaubert $spell($spell). $int($amount) Krieger verloren kurzzeitig ihr Gedächtnis." - "$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories." @@ -7465,8 +5746,6 @@ - "$unit($unit) tötete $int($dead) Krieger." - "$unit($unit) killed $int($dead) opponents." @@ -7476,8 +5755,6 @@ - "Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende." - "Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors." @@ -7485,8 +5762,6 @@ - "$unit($mage) in $region($region): '$order($command)' - Dieser Zauber kann nicht mit Stufenangabe gezaubert werden." - "$unit($mage) in $region($region): '$order($command)' - This spell cannot be cast with variable level." @@ -7494,8 +5769,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dorthin führt kein Weg." - "$unit($unit) in $region($region): '$order($command)' - There is no route leading there." @@ -7504,8 +5777,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Zu $region($target) kann kein Kontakt hergestellt werden." - "$unit($unit) in $region($region): '$order($command)' - $region($target) could not be contacted." @@ -7514,8 +5785,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit $unit($target) hat keinen Kontakt mit uns aufgenommen." - "$unit($unit) in $region($region): '$order($command)' - The unit $unit($target) did not contact us." @@ -7524,8 +5793,6 @@ - "Antimagie von $unit.dative($self) blockiert in $region($region) einen Zauber von $unit.dative($mage)." - "In $region($region), anti-magic from $unit($self) blocks the spell of $unit($mage)." @@ -7534,8 +5801,6 @@ - "$unit($self) schwächt in $region($region) einen Zauber von $unit.dative($mage) durch Antimagie ab." - "In $region($region), anti-magic from $unit($self) reduces the effect of $unit($mage)'s spell." @@ -7545,8 +5810,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $int($pacified) Regionen wurden befriedet." - "$unit($unit) in $region($region): '$order($command)' - $int($pacified) regions have been pacified." @@ -7556,8 +5819,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Keine Region konnte befriedet werden." - "$unit($unit) in $region($region): '$order($command)' - No region could be pacified." @@ -7565,8 +5826,6 @@ - "$unit($unit) in $region($region) bläst das Horn des Tanzes. In der ganzen Region breitet sich eine friedliche Feststimmmung aus." - "$unit($unit) in $region($region) blows the Horn of Dancing. Peaceful harmony spreads over the region." @@ -7574,8 +5833,6 @@ - "$unit($unit) in $region($region) bläst das Horn des Tanzes, doch niemand hier lässt sich von Stimmung anstecken." - "$unit($unit) in $region($region) blows the Horn of Dancing, but nobody here gets into the mood." @@ -7585,8 +5842,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die $ship($ship) wird jetzt schneller ihr Ziel erreichen." - "$unit($unit) in $region($region): '$order($command)' - The $ship($ship) will now be faster." @@ -7595,8 +5850,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Magier fühlt sich durch den Trank magische gestärkt." - "$unit($unit) in $region($region): '$order($command)' - The mage is magically invigorated." @@ -7606,8 +5859,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Ausser sich vor Furcht geben die Bauern dem Barden $int($money) Silber." - "$unit($unit) in $region($region): '$order($command)' - Stricken with fear the peasants give the bard $int($money) silver." @@ -7615,8 +5866,6 @@ - "$unit($unit) spielt einen Dudelsack. Ausser sich vor Furcht geben die Bauern $int($money) Silber." - "$unit($unit) plays the bagpipe. Stricken with fear the peasants give $int($money) silver." @@ -7626,8 +5875,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Region ist zu weit entfernt." - "$unit($unit) in $region($region): '$order($command)' - That region is too far away." @@ -7636,24 +5883,18 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Wege aus dieser Region sind blockiert." - "$unit($unit) in $region($region): '$order($command)' - The connections from to this regions are blocked." - "$unit($unit) erscheint plötzlich." - "$unit($unit) appears." - "$unit($unit) wird durchscheinend und verschwindet." - "$unit($unit) disappears." @@ -7663,8 +5904,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) ist zu schwer." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) is too heavy." @@ -7675,8 +5914,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Partei hat bereits $int($count) von $int($max) Helden." - "$unit($unit) in $region($region): '$order($command)' - The faction already has $int($count) of $int($max) heroes." @@ -7686,8 +5923,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) können keine Helden erwählen." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot be heroes." @@ -7695,8 +5930,6 @@ - "$unit($unit) wird mit $int($cost) Silber zum Helden ernannt." - "$unit($unit) uses $int($cost) silber for a promotion." @@ -7707,16 +5940,12 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Einheit hat nur $int($have) von $int($cost) benötigtem Silber." - "$unit($unit) in $region($region): '$order($command)' - The unit has $int($have) of $int($cost) silver required." - "Eine gewaltige Flutwelle verschlingt $region($region) und alle Bewohner." - "A tidal wave wipes out $region($region) and all who lived there." @@ -7724,8 +5953,6 @@ - "Eine gewaltige Flutwelle verschlingt $unit($unit) in $region($region)." - "A tidal wave wipes out $region($region) and kills $unit($unit)." @@ -7733,8 +5960,6 @@ - "$unit($unit) reaktiviert den astralen Schutzschild in $region($region)." - "$unit($unit) reactivates the astral protection shield in $region($region)." @@ -7744,8 +5969,6 @@ - "$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),"kehrte auf seine", "kehrten auf ihre") Felder zurück." - "$unit($unit) in $region($region): $int($number) $race($race,$number) returned to the fields." @@ -7755,8 +5978,6 @@ - "$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),"wurde zum Baum", "wurden zu Bäumen")." - "$unit($unit) in $region($region): $int($number) $race($race,$number) turned into $if($eq($number,1),"a tree", "trees")." @@ -7766,8 +5987,6 @@ - "$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),"verfaulte", "verfaulten")." - "$unit($unit) in $region($region): $int($number) $race($race,$number) whithered and died." @@ -7777,8 +5996,6 @@ - "$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),"zerfiel", "zerfielen") zu Staub." - "$unit($unit) in $region($region): $int($number) $race($race,$number) turned to dust." @@ -7788,9 +6005,6 @@ - "$unit($unit) in $region($region): $int($number) $race($race,$number) $if($eq($number,1),"verschwand", "verschwanden") über Nacht." - "$unit($unit) in $region($region): $int($number) - $race($race,$number) disappeared in the night." @@ -7799,8 +6013,6 @@ - "Der Waldbrand in $region($region) griff auch auf $region($next) über, und $int($trees) verbrannten." - "The fire in $region($region) spread to $region($next) and $int($trees) were burned." @@ -7808,8 +6020,6 @@ - "$unit($mage) ruft in $region($region) eine Pest hervor." - "$unit($mage) sends the plague on $region($region)." @@ -7819,8 +6029,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine Partei darf nicht aus mehr als $int($allowed) Einheiten bestehen." - "$unit($unit) in $region($region): '$order($command)' - A faction may not consist of more than $int($allowed) units." @@ -7830,8 +6038,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Eine Allianz darf aus nicht mehr als $int($allowed) Einheiten bestehen." - "$unit($unit) in $region($region): '$order($command)' - An alliance may not consist of more than $int($allowed) units." @@ -7841,8 +6047,6 @@ - "$unit($unit) in $region($region): $int($amount) $resource($item,$amount) zerfallen zu Staub." - "$unit($unit) in $region($region): $int($amount) $resource($item,$amount) turn to dust." @@ -7851,24 +6055,18 @@ - "Die $ship($ship) ist mit gutem Wind gesegnet$if($lt($duration,3),", doch der Zauber beginnt sich bereits aufzulösen",""). ($int36($id))" - "The $ship($ship) is blessed with favourable winds$if($lt($duration,3),", but the spell is starting to wear thin",""). ($int36($id))" - "Kräftige Stürme haben dieses Schiff in die Luft gehoben. ($int36($id))" - "Powerful storms have lifted this ship high into the air. ($int36($id))" - "Mächtige Magie verhindert den Kontakt zur Realität. ($int36($id))" - "Powerful magic disrupts our contact with reality. ($int36($id))" @@ -7876,8 +6074,6 @@ - "Ein silberner Schimmer umgibt die $ship($ship). ($int36($id))" - "A silvery shimmer surrounds the $ship($ship). ($int36($id))" @@ -7885,8 +6081,6 @@ - "Auf den Mauern von $building($building) erkennt man seltsame Runen. ($int36($id))" - "The walls of $building($building) are inscribed with strange runes. ($int36($id))" @@ -7895,8 +6089,6 @@ - "$unit($mage) erschafft $int($number) $resource($item,$number)." - "$unit($mage) creates $int($number) $resource($item,$number)." @@ -7904,8 +6096,6 @@ - "Auf den Planken von $ship($ship) erkennt man seltsame Runen. ($int36($id))" - "The plank of $ship($ship) are inscribed with strange runes. ($int36($id))" @@ -7913,8 +6103,6 @@ - "$unit($unit) wird aus der astralen Ebene nach $region($region) geschleudert." - "$unit($unit) is sent from the astral plain to $region($region)." @@ -7922,8 +6110,6 @@ - "$unit($target) wird von $unit($unit) in eine andere Welt geschleudert." - "$unit($unit) sends $unit($target) to another world." @@ -7931,16 +6117,12 @@ - "$unit($unit) versuchte erfolglos, $unit($target) in eine andere Welt zu schleudern." - "$unit($unit) tried but failed to send $unit($target) to another world." - "NUMMER PARTEI $int36($id): Diese Nummer wird von einer anderen Partei benutzt." - "NUMBER FACTION $int36($id): This number is being used by another faction." @@ -7948,21 +6130,15 @@ - "Eine Botschaft von $unit($unit): '$message'" - "A message from $unit($unit): '$message'" - "Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier." - "An angry mob forms and hunts practitioners of the dark arts." - "Vertrauter von $unit($unit)" - "Familiar of $unit($unit)" @@ -7971,37 +6147,27 @@ - "$unit($unit) rekrutiert $int($amount) $localize($archetype)." - "$unit($unit) recruits $int($amount) $localize($archetype)." - "Dein Passwort enthält Zeichen, die bei der Nachsendung von Reports Probleme bereiten können. Bitte beachte, dass Passwortenur aus Buchstaben von A bis Z und Zahlen bestehen dürfen. Dein neues Passwort ist '${newpass}'." - "Your password was changed because it contained illegal characters. Legal passwords may only contain numbers and letters from A to Z. Your new Password is '${newpass}'." - "Miiauuuuuu..." - "Meeoooooow..." - "Der Versuch, die Greifenschwingen zu benutzen, schlug fehl. $unit($unit) konnte die Ebene der Herausforderung nicht verlassen." - "The attempt to use wings of the gryphon failed. $unit($unit) could not leave the Plane of Challenge." - "$unit($unit) springt in die ewigen Feuer des Kraters." - "$unit($unit) jumps into the eternal flame of the caldera." @@ -8009,8 +6175,6 @@ - "$unit($unit) springt in die ewigen Feuer des Kraters." - "$unit($unit) jumps into the eternal flame of the caldera." @@ -8018,8 +6182,6 @@ - "In $region($region) erklingt die Stimme des Torwächters: 'Nur wer ohne materielle Güter und noch lernbegierig ist, der darf die Ebene der Herausforderung betreten. Und vergiß nicht mein Trinkgeld.'. $unit($unit) erhielt keinen Einlaß." - "$region($region) reverberates from the voice of the gate keeper: 'Only those who forgo material riches and who are willing to learn my enter the Plane of Challenge. And don't forget about my tip!'. $unit($unit) was not admitted." @@ -8027,16 +6189,12 @@ - "In $region($region) öffnet sich ein Portal. Eine Stimme ertönt, und spricht: 'Willkommen in der Ebene der Herausforderung'. $unit($unit) durchschreitet das Tor zu einer anderen Welt." - "A portal opens in $region($region). A voice calls: 'Welcome to the Plane of Challenge'. $unit($unit) walks through the gate to another world." - "$unit($unit) scheint von einer seltsamen Krankheit befallen." - "$unit($unit) is stricken by a strange disease." @@ -8045,8 +6203,6 @@ - "$unit($unit) erbeutet $int($amount) $resource($item,$amount)." - "$unit($unit) collects $int($amount) $resource($item,$amount)." @@ -8055,9 +6211,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen." - "$unit($unit) in $region($region): - '$order($command)' - It is so quiet and peaceful, nobody wants to attack anybody right now." @@ -8067,8 +6220,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) können nichts lernen." - "$unit($unit) in $region($region): '$order($command)' - $race($race,0) cannot study." @@ -8077,8 +6228,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Migranten können keine kostenpflichtigen Talente lernen." - "$unit($unit) in $region($region): '$order($command)' - Migrants cannot study this." @@ -8088,8 +6237,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Magier pro Partei geben." - "$unit($unit) in $region($region): '$order($command)' - There may not be more than $int($amount) magicians in your faction." @@ -8099,8 +6246,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Es kann maximal $int($amount) Alchemisten pro Partei geben." - "$unit($unit) in $region($region): '$order($command)' - There may not be more tha $int($amount) alchemists in your faction." @@ -8110,8 +6255,6 @@ - "$unit($unit) in $region($region): '$order($command)' - $unit($target) versteht unsere Art von Magie nicht." - "$unit($unit) in $region($region): '$order($command)' - $unit($target) does not understand our kind of magic." @@ -8122,8 +6265,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Der Kapitän muß ein Segeltalent von mindestens $int($value) haben, um $ship($ship) zu befehligen." - "$unit($unit) in $region($region): '$order($command)' - The captain needs a sailing skill of at least $int($value), to command $ship($ship)." @@ -8132,8 +6273,6 @@ - "$unit($unit) in $region($region): '$order($command)' - In dieser Richtung gibt es keine Brücken und Straßen mehr zu bauen." - "$unit($unit) in $region($region): '$order($command)' - The roads and bridges in that direction are complete." @@ -8143,8 +6282,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Um das zu bauen, braucht man ein Talent von mindestens $int($value)." - "$unit($unit) in $region($region): '$order($command)' - This requires a skill of at least $int($value) to build." @@ -8153,8 +6290,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht." - "$unit($unit) in $region($region): '$order($command)' - This unit will not fight." @@ -8163,8 +6298,6 @@ - "$unit($unit) erhielt $resources($items) von der $ship($ship)." - "$unit($unit) received $resources($items) from the $ship($ship)." @@ -8173,8 +6306,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nicht auf Untote gezaubert werden." - "$unit($unit) in $region($region): '$order($command)' - This spell cannot be cast upon undead." @@ -8182,11 +6313,6 @@ - "Achtung: $faction($faction) hat seit $int($turns) Wochen keine - Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel - ausscheiden." - "Warning: $faction($faction) has not been sending in - orders for $int($turns) turns and may be leaving the game soon." @@ -8195,8 +6321,6 @@ - "$unit($unit) in $region($region): '$order($command)' - Helden können nicht rekrutieren." - "$unit($unit) in $region($region): '$order($command)' - Heroes cannot recruit." @@ -8206,8 +6330,6 @@ - "$unit($dragon): \"$localize($growl) $if($eq($number,1), "Ich rieche", "Wir riechen") etwas in $region($target)\"." - "$unit($dragon): \"$localize($growl) $if($eq($number,1), "I smell", "We smell") something in $region($target)\"." diff --git a/src/exparse.c b/src/exparse.c index 271443c05..dfba3f5d0 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -355,7 +355,7 @@ static void start_messages(parseinfo *pi, const XML_Char *el, const XML_Char **a pi->object = mt_new(name, section); } } - else if (xml_strcmp(el, "type") != 0 && xml_strcmp(el, "text") != 0) { + else if (xml_strcmp(el, "type") != 0) { handle_bad_input(pi, el, NULL); } } From 22f6d4feed230edaa505ea149cff4b9289b5d278 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:36:10 +0200 Subject: [PATCH 215/231] fix sections handling, remove it from nrmessage. --- src/util/message.c | 42 +++++++++++++++++++++++++++++++++++++++++- src/util/message.h | 3 +++ src/util/nrmessage.c | 36 ------------------------------------ src/util/nrmessage.h | 3 --- 4 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/util/message.c b/src/util/message.c index b01993098..64c161d24 100644 --- a/src/util/message.c +++ b/src/util/message.c @@ -122,6 +122,42 @@ message_type *mt_create(message_type * mtype, const char *args[], int nparameter return mtype; } +char *sections[MAXSECTIONS]; + +const char *section_find(const char *name) +{ + int i; + + if (name == NULL) { + return NULL; + } + + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + if (strcmp(sections[i], name) == 0) { + return sections[i]; + } + } + return NULL; +} + +const char *section_add(const char *name) { + int i; + if (name == NULL) { + return NULL; + } + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + if (strcmp(sections[i], name) == 0) { + return sections[i]; + } + } + assert(i < MAXSECTIONS); + assert(sections[i] == NULL); + if (i + 1 < MAXSECTIONS) { + sections[i + 1] = NULL; + } + return sections[i] = str_strdup(name); +} + message_type *mt_new(const char *name, const char *section) { message_type *mtype; @@ -134,7 +170,10 @@ message_type *mt_new(const char *name, const char *section) mtype = (message_type *)malloc(sizeof(message_type)); mtype->key = 0; mtype->name = str_strdup(name); - mtype->section = section; + mtype->section = section_find(section); + if (!mtype->section) { + mtype->section = section_add(section); + } mtype->nparameters = 0; mtype->pnames = NULL; mtype->types = NULL; @@ -267,3 +306,4 @@ void message_done(void) { free(at); } } + diff --git a/src/util/message.h b/src/util/message.h index 40cc09086..5aa16232b 100644 --- a/src/util/message.h +++ b/src/util/message.h @@ -20,6 +20,9 @@ extern "C" { #define MSG_MAXARGS 8 #define MT_NEW_END ((const char *)0) +#define MAXSECTIONS 16 + + extern char *sections[MAXSECTIONS]; typedef struct arg_type { struct arg_type *next; diff --git a/src/util/nrmessage.c b/src/util/nrmessage.c index 047d3565b..1fdde6935 100644 --- a/src/util/nrmessage.c +++ b/src/util/nrmessage.c @@ -65,42 +65,6 @@ static nrmessage_type *nrt_find(const struct message_type * mtype) return found; } -char *sections[MAXSECTIONS]; - -const char *section_find(const char *name) -{ - int i; - - if (name == NULL) { - return NULL; - } - - for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { - if (strcmp(sections[i], name) == 0) { - return sections[i]; - } - } - return NULL; -} - -const char *section_add(const char *name) { - int i; - if (name == NULL) { - return NULL; - } - for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { - if (strcmp(sections[i], name) == 0) { - return sections[i]; - } - } - assert(i < MAXSECTIONS); - assert(sections[i] == NULL); - if (i + 1 < MAXSECTIONS) { - sections[i + 1] = NULL; - } - return sections[i] = str_strdup(name); -} - void nrt_register(const struct message_type *mtype) { diff --git a/src/util/nrmessage.h b/src/util/nrmessage.h index c0d9257aa..15914841b 100644 --- a/src/util/nrmessage.h +++ b/src/util/nrmessage.h @@ -25,9 +25,6 @@ extern "C" { struct message_type; struct nrmessage_type; -#define MAXSECTIONS 8 - extern char *sections[MAXSECTIONS]; - void free_nrmesssages(void); void nrt_register(const struct message_type *mtype); From 33a6d7fa0ed9028e801999d9314f08805237af5a Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:40:26 +0200 Subject: [PATCH 216/231] free sections memory. --- src/kernel/config.c | 1 + src/util/message.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/kernel/config.c b/src/kernel/config.c index 8eef66341..ff2457971 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -561,6 +561,7 @@ void kernel_done(void) curses_done(); crmessage_done(); translation_done(); + mt_clear(); } bool rule_stealth_other(void) diff --git a/src/util/message.c b/src/util/message.c index 64c161d24..8915dca8f 100644 --- a/src/util/message.c +++ b/src/util/message.c @@ -255,6 +255,10 @@ void mt_clear(void) { selist_free(ql); messagetypes[i] = 0; } + for (i = 0; i != MAXSECTIONS && sections[i]; ++i) { + free(sections[i]); + sections[i] = NULL; + } } const message_type *mt_find(const char *name) From 6699e8940ec6b7ea664a86b664a175c0689e580b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:44:03 +0200 Subject: [PATCH 217/231] some cleanup is good. --- src/eressea.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eressea.c b/src/eressea.c index bdb20edcc..982dfe6ee 100644 --- a/src/eressea.c +++ b/src/eressea.c @@ -53,9 +53,9 @@ void game_done(void) free_config(); free_special_directions(); free_locales(); +#endif kernel_done(); dblib_close(); -#endif } void game_init(void) From adfc4ad7ce9e2ae2bad77a0a34e7c7c4b267a6e1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 18 May 2018 21:54:46 +0200 Subject: [PATCH 218/231] add a header to po files, charset UTF-8 --- .gitignore | 1 + res/translations/messages.de.po | 13 +++++++++++++ res/translations/messages.en.po | 13 +++++++++++++ res/translations/strings-e3.de.po | 13 +++++++++++++ res/translations/strings-e3.en.po | 13 +++++++++++++ res/translations/strings.de.po | 13 +++++++++++++ res/translations/strings.en.po | 13 +++++++++++++ 7 files changed, 79 insertions(+) diff --git a/.gitignore b/.gitignore index d7c102f5a..d5e8e1b10 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ tests/data/185.dat /quicklist/ /cutest/ /critbit/ +*.mo diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po index 8e882a435..98800fd31 100644 --- a/res/translations/messages.de.po +++ b/res/translations/messages.de.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"X-Generator: Poedit 2.0.7\n" + msgid "homestone_effect" msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\"" diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po index 558b75ee9..9f11a6312 100644 --- a/res/translations/messages.en.po +++ b/res/translations/messages.en.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: Poedit 2.0.7\n" + msgid "homestone_effect" msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\"" diff --git a/res/translations/strings-e3.de.po b/res/translations/strings-e3.de.po index 2652d9436..71e9363f9 100644 --- a/res/translations/strings-e3.de.po +++ b/res/translations/strings-e3.de.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"X-Generator: Poedit 2.0.7\n" + msgid "catamaran_a" msgstr "ein Katamaran" diff --git a/res/translations/strings-e3.en.po b/res/translations/strings-e3.en.po index 169a80a68..311abcf40 100644 --- a/res/translations/strings-e3.en.po +++ b/res/translations/strings-e3.en.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: Poedit 2.0.7\n" + msgid "catamaran_a" msgstr "a catamaran" diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po index d739a0b6d..b7881b3f8 100644 --- a/res/translations/strings.de.po +++ b/res/translations/strings.de.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"X-Generator: Poedit 2.0.7\n" + msgid "rustychainmail" msgstr "Rostiges Kettenhemd" diff --git a/res/translations/strings.en.po b/res/translations/strings.en.po index 1e2dfdb1a..774874bf1 100644 --- a/res/translations/strings.en.po +++ b/res/translations/strings.en.po @@ -1,3 +1,16 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: Poedit 2.0.7\n" + msgid "rustychainmail" msgstr "rustychainmail" From 4154b1c3d911d964b0da99624165ed9d4ed3b293 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 19 May 2018 13:34:00 +0200 Subject: [PATCH 219/231] remove additional whitespace in some strings. --- res/translations/strings.de.po | 145 ++++++++++++++++----------------- res/translations/strings.en.po | 104 +++++++++++------------ src/report.c | 6 ++ src/util/strings.c | 6 +- 4 files changed, 131 insertions(+), 130 deletions(-) diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po index b7881b3f8..871a4ef70 100644 --- a/res/translations/strings.de.po +++ b/res/translations/strings.de.po @@ -17,9 +17,7 @@ msgstr "Rostiges Kettenhemd" msgctxt "spellinfo" msgid "destroy_magic" msgstr "" -"Dieser Zauber ermöglicht dem Magier, Verzauberungen " -"einer Einheit, eines Schiffes, Gebäudes oder auch " -"der Region aufzulösen." +"Dieser Zauber ermöglicht dem Magier, Verzauberungen einer Einheit, eines Schiffes, Gebäudes oder auch der Region aufzulösen." msgctxt "spell" msgid "shadowknights" @@ -168,9 +166,6 @@ msgstr "TRÄNKE" msgid "northwest" msgstr "Nordwesten" -msgid "spinx09" -msgstr "Das Schiff mit dem Stern im Wappen liegt neben dem der einen Mandelkern hat" - msgctxt "iteminfo" msgid "cookie" msgstr "Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e" @@ -216,7 +211,7 @@ msgstr "Untoter Pharaonen" msgctxt "iteminfo" msgid "magicbag" -msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." +msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." msgid "lighthouse" msgstr "Leuchtturm" @@ -280,7 +275,7 @@ msgstr "Das Schiff des Kriegers, der ein Apfel hat, liegt neben dem, der ein Kre msgctxt "spellinfo" msgid "sound_out" -msgstr " Erliegt die Einheit dem Zauber, so wird sie dem Magier alles erzählen, was sie über die gefragte Region weiß. Ist in der Region niemand ihrer Partei, so weiß sie nichts zu berichten. Auch kann sie nur das erzählen, was sie selber sehen könnte. " +msgstr "Erliegt die Einheit dem Zauber, so wird sie dem Magier alles erzählen, was sie über die gefragte Region weiß. Ist in der Region niemand ihrer Partei, so weiß sie nichts zu berichten. Auch kann sie nur das erzählen, was sie selber sehen könnte." msgctxt "spell" msgid "readmind" @@ -326,7 +321,7 @@ msgstr "Jungdrachen" msgctxt "spellinfo" msgid "calm_monster" -msgstr " Dieser einschmeichelnde Gesang kann fast jedes intelligente Monster zähmen. Es wird von Angriffen auf den Magier absehen und auch seine Begleiter nicht anrühren. Doch sollte man sich nicht täuschen, es wird dennoch ein unberechenbares Wesen bleiben. " +msgstr "Dieser einschmeichelnde Gesang kann fast jedes intelligente Monster zähmen. Es wird von Angriffen auf den Magier absehen und auch seine Begleiter nicht anrühren. Doch sollte man sich nicht täuschen, es wird dennoch ein unberechenbares Wesen bleiben." msgctxt "spell" msgid "clone" @@ -338,7 +333,7 @@ msgstr "Dieser Zauber wird die gesamte Ausrüstung der Zieleinheit für einige Z msgctxt "shipinfo" msgid "balloon" -msgstr "Der Sumpfgasballon besteht aus einem großen Weidenkorb, welcher Platz für maximal 5 Personen oder 500 Gewichtseinheiten bietet, und einer großen, mit Sumpfgas gefüllten Wyrmblase. Bei guten Winden kann sich der Ballon zwei Regionen pro Woche fortbewegen. Das Führen eines Ballons ist nicht einfach, und der Kapitän muss mindestens ein Segeltalent von 6 besitzen. Diese neue Entwicklung auf Eressea wird ausschließlich für den Xontormia-Expreß hergestellt und die Baupläne sind streng geheim. So ist es auch bisher noch niemandem gelungen, ein Exemplar nachzubauen." +msgstr "Der Sumpfgasballon besteht aus einem großen Weidenkorb, welcher Platz für maximal 5 Personen oder 500 Gewichtseinheiten bietet, und einer großen, mit Sumpfgas gefüllten Wyrmblase. Bei guten Winden kann sich der Ballon zwei Regionen pro Woche fortbewegen. Das Führen eines Ballons ist nicht einfach, und der Kapitän muss mindestens ein Segeltalent von 6 besitzen. Diese neue Entwicklung auf Eressea wird ausschließlich für den Xontormia-Expreß hergestellt und die Baupläne sind streng geheim. So ist es auch bisher noch niemandem gelungen, ein Exemplar nachzubauen." msgctxt "iteminfo" msgid "toad" @@ -359,7 +354,7 @@ msgstr "Vampire" msgctxt "spellinfo" msgid "migration" -msgstr " Dieses Ritual ermöglicht es, eine Einheit, egal welcher Art, in die eigene Partei aufzunehmen. Der um Aufnahme Bittende muss dazu willig und bereit sein, seiner alten Partei abzuschwören. Dies bezeugt er durch KONTAKTIEREn des Magiers. Auch wird er die Woche über ausschliesslich mit Vorbereitungen auf das Ritual beschäftigt sein. Das Ritual wird fehlschlagen, wenn er zu stark an seine alte Partei gebunden ist, dieser etwa Dienst für seine teuere Ausbildung schuldet. Der das Ritual leitende Magier muss für die permanente Bindung des Aufnahmewilligen an seine Partei naturgemäß auch permanente Aura aufwenden. Pro Stufe und pro 1 permanente Aura kann er eine Person aufnehmen. " +msgstr "Dieses Ritual ermöglicht es, eine Einheit, egal welcher Art, in die eigene Partei aufzunehmen. Der um Aufnahme Bittende muss dazu willig und bereit sein, seiner alten Partei abzuschwören. Dies bezeugt er durch KONTAKTIEREn des Magiers. Auch wird er die Woche über ausschliesslich mit Vorbereitungen auf das Ritual beschäftigt sein. Das Ritual wird fehlschlagen, wenn er zu stark an seine alte Partei gebunden ist, dieser etwa Dienst für seine teuere Ausbildung schuldet. Der das Ritual leitende Magier muss für die permanente Bindung des Aufnahmewilligen an seine Partei naturgemäß auch permanente Aura aufwenden. Pro Stufe und pro 1 permanente Aura kann er eine Person aufnehmen." msgctxt "race" msgid "illusion" @@ -580,7 +575,7 @@ msgid "balloon" msgstr "Ballon" msgid "nr_schemes_postfix" -msgstr " sind erkennbar." +msgstr "sind erkennbar." msgid "SILBER" msgstr "SILBER" @@ -650,7 +645,7 @@ msgstr "Flammenschwerter" msgctxt "spellinfo" msgid "raise_mob" -msgstr " Mit Hilfe dieses magischen Gesangs überzeugt der Magier die Bauern der Region, sich ihm anzuschließen. Die Bauern werden ihre Heimat jedoch nicht verlassen, und keine ihrer Besitztümer fortgeben. Jede Woche werden zudem einige der Bauern den Bann abwerfen und auf ihre Felder zurückkehren. Wie viele Bauern sich dem Magier anschließen hängt von der Kraft seines Gesangs ab. " +msgstr "Mit Hilfe dieses magischen Gesangs überzeugt der Magier die Bauern der Region, sich ihm anzuschließen. Die Bauern werden ihre Heimat jedoch nicht verlassen, und keine ihrer Besitztümer fortgeben. Jede Woche werden zudem einige der Bauern den Bann abwerfen und auf ihre Felder zurückkehren. Wie viele Bauern sich dem Magier anschließen hängt von der Kraft seines Gesangs ab." msgctxt "keyword" msgid "origin" @@ -733,7 +728,7 @@ msgstr "Wölfe" msgctxt "spellinfo" msgid "living_rock" -msgstr " Dieses kräftezehrende Ritual beschwört mit Hilfe einer Kugel aus konzentriertem Laen einen gewaltigen Erdelementar und bannt ihn in ein Gebäude. Dem Elementar kann dann befohlen werden, das Gebäude mitsamt aller Bewohner in eine Nachbarregion zu tragen. Die Stärke des beschworenen Elementars hängt vom Talent des Magiers ab: Der Elementar kann maximal [Stufe-12]*250 Größeneinheiten große Gebäude versetzen. Das Gebäude wird diese Prozedur nicht unbeschädigt überstehen. " +msgstr "Dieses kräftezehrende Ritual beschwört mit Hilfe einer Kugel aus konzentriertem Laen einen gewaltigen Erdelementar und bannt ihn in ein Gebäude. Dem Elementar kann dann befohlen werden, das Gebäude mitsamt aller Bewohner in eine Nachbarregion zu tragen. Die Stärke des beschworenen Elementars hängt vom Talent des Magiers ab: Der Elementar kann maximal [Stufe-12]*250 Größeneinheiten große Gebäude versetzen. Das Gebäude wird diese Prozedur nicht unbeschädigt überstehen." msgctxt "race" msgid "museumghost_p" @@ -904,7 +899,7 @@ msgstr "Seeschlangen" msgctxt "spellinfo" msgid "antimagiczone" -msgstr "Mit diesem Zauber kann der Magier eine Zone der astralen Schwächung erzeugen, ein lokales Ungleichgewicht im Astralen Feld. Dieses Zone wird bestrebt sein, wieder in den Gleichgewichtszustand zu gelangen. Dazu wird sie jedem in dieser Region gesprochenen Zauber einen Teil seiner Stärke entziehen, die schwächeren gar ganz absorbieren." +msgstr "Mit diesem Zauber kann der Magier eine Zone der astralen Schwächung erzeugen, ein lokales Ungleichgewicht im Astralen Feld. Dieses Zone wird bestrebt sein, wieder in den Gleichgewichtszustand zu gelangen. Dazu wird sie jedem in dieser Region gesprochenen Zauber einen Teil seiner Stärke entziehen, die schwächeren gar ganz absorbieren." msgid "villagers" msgstr "Dorfbewohner" @@ -1013,7 +1008,7 @@ msgstr "kleiner Scarabäus" msgctxt "iteminfo" msgid "nut" -msgstr "Nuß, im umgangssprachlichen Sinne alle trockenen, hartschaligen Früchte oder Samen, die eine Schale besitzen, die sich leicht vom inneren, eßbaren Kern entfernen läßt. In der botanischen Terminologie beschränkt sich die Bezeichnung Nuß auf eine einsamige Frucht, die aus einem Fruchtknoten (Ovarium) entstanden ist, dessen äußere Wände sich verholzt haben und der sich nicht öffnet, um seinen Samen zu entlassen. Solche echten Nüsse können eßbar, aber auch ungenießbar sein. Bekannte Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse. Beispiele für Früchte oder Samen, die vom Volksmund fälschlich als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im botanischen Sinne sind dies Steinfrüchte, denen die fleischige äußere Schale entfernt wurde. Andere Beispiele für unechte Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie Roßkastanien und Paranüsse, bei denen es sich um von Kapseln umhüllte Samen handelt." +msgstr "Nuß, im umgangssprachlichen Sinne alle trockenen, hartschaligen Früchte oder Samen, die eine Schale besitzen, die sich leicht vom inneren, eßbaren Kern entfernen läßt. In der botanischen Terminologie beschränkt sich die Bezeichnung Nuß auf eine einsamige Frucht, die aus einem Fruchtknoten (Ovarium) entstanden ist, dessen äußere Wände sich verholzt haben und der sich nicht öffnet, um seinen Samen zu entlassen. Solche echten Nüsse können eßbar, aber auch ungenießbar sein. Bekannte Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse. Beispiele für Früchte oder Samen, die vom Volksmund fälschlich als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im botanischen Sinne sind dies Steinfrüchte, denen die fleischige äußere Schale entfernt wurde. Andere Beispiele für unechte Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie Roßkastanien und Paranüsse, bei denen es sich um von Kapseln umhüllte Samen handelt." msgctxt "spell" msgid "sacrifice_strength" @@ -1023,7 +1018,7 @@ msgid "spice_p" msgstr "Gewürze" msgid "nr_building_inprogress" -msgstr " (im Bau)" +msgstr "(im Bau)" msgid "ring_of_levitation_p" msgstr "Ringe der Levitation" @@ -1058,7 +1053,7 @@ msgstr "Pyramide" msgctxt "spellinfo" msgid "big_recruit" -msgstr " Aus 'Wanderungen' von Firudin dem Weisen: 'In Weilersweide, nahe dem Wytharhafen, liegt ein kleiner Gasthof, der nur wenig besucht ist. Niemanden bekannt ist, das dieser Hof bis vor einigen Jahren die Bleibe des verbannten Wanderpredigers Grauwolf war. Nachdem er bei einer seiner berüchtigten flammenden Reden fast die gesammte Bauernschaft angeworben hatte, wurde er wegen Aufruhr verurteilt und verbannt. Nur zögerlich war er bereit mir das Geheimnis seiner Überzeugungskraft zu lehren.' " +msgstr "Aus 'Wanderungen' von Firudin dem Weisen: 'In Weilersweide, nahe dem Wytharhafen, liegt ein kleiner Gasthof, der nur wenig besucht ist. Niemanden bekannt ist, das dieser Hof bis vor einigen Jahren die Bleibe des verbannten Wanderpredigers Grauwolf war. Nachdem er bei einer seiner berüchtigten flammenden Reden fast die gesammte Bauernschaft angeworben hatte, wurde er wegen Aufruhr verurteilt und verbannt. Nur zögerlich war er bereit mir das Geheimnis seiner Überzeugungskraft zu lehren.'" msgid "catapultammo" msgstr "Katapultmunition" @@ -1217,11 +1212,11 @@ msgstr "Insekten" msgctxt "spellinfo" msgid "bad_dreams" -msgstr " Dieser Zauber ermöglicht es dem Träumer, den Schlaf aller nichtaliierten Einheiten (HELFE BEWACHE) in der Region so stark zu stören, das sie vorübergehend einen Teil ihrer Erinnerungen verlieren. " +msgstr "Dieser Zauber ermöglicht es dem Träumer, den Schlaf aller nichtaliierten Einheiten (HELFE BEWACHE) in der Region so stark zu stören, das sie vorübergehend einen Teil ihrer Erinnerungen verlieren." msgctxt "spellinfo" msgid "bloodthirst" -msgstr " Wie viele magischen Gesänge, so entstammt auch dieser den altem Wissen der Katzen, die schon immer um die machtvolle Wirkung der Stimme wussten. Mit diesem Lied wird die Stimmung der Krieger aufgepeitscht, sie gar in wilde Raserrei und Blutrausch versetzt. Ungeachtet eigener Schmerzen werden sie kämpfen bis zum Tode und niemals fliehen. Während ihre Attacke verstärkt ist achten sie kaum auf sich selbst. " +msgstr "Wie viele magischen Gesänge, so entstammt auch dieser den altem Wissen der Katzen, die schon immer um die machtvolle Wirkung der Stimme wussten. Mit diesem Lied wird die Stimmung der Krieger aufgepeitscht, sie gar in wilde Raserrei und Blutrausch versetzt. Ungeachtet eigener Schmerzen werden sie kämpfen bis zum Tode und niemals fliehen. Während ihre Attacke verstärkt ist achten sie kaum auf sich selbst." msgctxt "spell" msgid "nodrift" @@ -1258,7 +1253,7 @@ msgstr "Der Magier zwingt mit diesem Ritual die Elementargeister des Wassers in msgctxt "spellinfo" msgid "astral_disruption" -msgstr " Dieser Zauber bewirkt eine schwere Störung des Astralraums. Innerhalb eines astralen Radius von Stufe/5 Regionen werden alle Astralwesen, die dem Zauber nicht wiederstehen können, aus der astralen Ebene geschleudert. Der astrale Kontakt mit allen betroffenen Regionen ist für Stufe/3 Wochen gestört. " +msgstr "Dieser Zauber bewirkt eine schwere Störung des Astralraums. Innerhalb eines astralen Radius von Stufe/5 Regionen werden alle Astralwesen, die dem Zauber nicht wiederstehen können, aus der astralen Ebene geschleudert. Der astrale Kontakt mit allen betroffenen Regionen ist für Stufe/3 Wochen gestört." msgctxt "spell" msgid "earthquake" @@ -1273,7 +1268,7 @@ msgstr "Ist durch Schlagwaffen und Katapulte schwer zu verwunden." msgctxt "spellinfo" msgid "combat_speed" -msgstr " Dieser Zauber beschleunigt einige Kämpfer auf der eigenen Seite so, dass sie während des gesamten Kampfes in einer Kampfrunde zweimal angreifen können. " +msgstr "Dieser Zauber beschleunigt einige Kämpfer auf der eigenen Seite so, dass sie während des gesamten Kampfes in einer Kampfrunde zweimal angreifen können." msgctxt "keyword" msgid "claim" @@ -1333,7 +1328,7 @@ msgstr "Seeschlange" msgctxt "spellinfo" msgid "fish_shield" -msgstr " Dieser Zauber vermag dem Gegner ein geringfügig versetztes Bild der eigenen Truppen vorzuspiegeln, so wie der Fisch im Wasser auch nicht dort ist wo er zu sein scheint. Von jedem Treffer kann so die Hälfte des Schadens unschädlich abgeleitet werden. Doch hält der Schild nur einige Hundert Schwerthiebe aus, danach wird er sich auflösen. Je stärker der Magier, desto mehr Schaden hält der Schild aus. " +msgstr "Dieser Zauber vermag dem Gegner ein geringfügig versetztes Bild der eigenen Truppen vorzuspiegeln, so wie der Fisch im Wasser auch nicht dort ist wo er zu sein scheint. Von jedem Treffer kann so die Hälfte des Schadens unschädlich abgeleitet werden. Doch hält der Schild nur einige Hundert Schwerthiebe aus, danach wird er sich auflösen. Je stärker der Magier, desto mehr Schaden hält der Schild aus." msgid "section_newpotions" msgstr "Neue Tränke" @@ -1432,7 +1427,7 @@ msgstr "Lebkuchenherz mit der Aufschrift 'Erz und Stein, das ist fein'" msgctxt "iteminfo" msgid "snowglobe" -msgstr " Eine Kugel aus Kristallglas von circa drei Zoll Durchmesser, welche auf einem Sockel aus Granit ruht. Im Inneren tanzen unzählige winzige Schneeflocken munter umher. Auf der Unterseite des Sockels ist eine goldene Windrose mit den sechs Himmelsrichtungen abgebildet. Eigentlich ein sehr schöner Anblick, doch strahlt sie eine namenlose Kälte aus. Unter Magiern und anderen der arkanen Künste kundigen ist die Funktion und Wirkungsweise des Artefaktes heftig umstritten. Einig scheint man sich darüber zu sein, dass in dieser kleinen Kugel so viel Kälte gefangen ist, dass es dauerhafte Folgen für eine weiträumige Umgebung hätte wenn man sie zerstört. Größte Brände ließen sich damit wohl löschen, Vulkane besänftigen und Unmengen von Wasser zum gefrieren bringen. Doch auch in weniger extremen Umgebungen würden sich bestimmt dauerhafte Veränderungen ereignen. Es wäre sicherlich nicht zu empfehlen das Kleinod einfach fallen zu lassen. Man sollte es anstelle dessen so weit wie möglich von sich schleudern und dafür sorge tragen, dass sich am Einschlagsort kein Lebewesen aufhält. So man denn eine Benutzung tatsächlich riskieren will. (BENUTZE Schneekugel ) " +msgstr "Eine Kugel aus Kristallglas von circa drei Zoll Durchmesser, welche auf einem Sockel aus Granit ruht. Im Inneren tanzen unzählige winzige Schneeflocken munter umher. Auf der Unterseite des Sockels ist eine goldene Windrose mit den sechs Himmelsrichtungen abgebildet. Eigentlich ein sehr schöner Anblick, doch strahlt sie eine namenlose Kälte aus. Unter Magiern und anderen der arkanen Künste kundigen ist die Funktion und Wirkungsweise des Artefaktes heftig umstritten. Einig scheint man sich darüber zu sein, dass in dieser kleinen Kugel so viel Kälte gefangen ist, dass es dauerhafte Folgen für eine weiträumige Umgebung hätte wenn man sie zerstört. Größte Brände ließen sich damit wohl löschen, Vulkane besänftigen und Unmengen von Wasser zum gefrieren bringen. Doch auch in weniger extremen Umgebungen würden sich bestimmt dauerhafte Veränderungen ereignen. Es wäre sicherlich nicht zu empfehlen das Kleinod einfach fallen zu lassen. Man sollte es anstelle dessen so weit wie möglich von sich schleudern und dafür sorge tragen, dass sich am Einschlagsort kein Lebewesen aufhält. So man denn eine Benutzung tatsächlich riskieren will. (BENUTZE Schneekugel )" msgid "desert" msgstr "Wüste" @@ -1450,7 +1445,7 @@ msgstr "Goblins" msgctxt "spellinfo" msgid "song_of_slavery" -msgstr " Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft sie den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig fühlen. " +msgstr "Dieser mächtige Bann raubt dem Opfer seinen freien Willen und unterwirft sie den Befehlen des Barden. Für einige Zeit wird das Opfer sich völlig von seinen eigenen Leuten abwenden und der Partei des Barden zugehörig fühlen." msgctxt "spell" msgid "healingzone" @@ -1586,7 +1581,7 @@ msgstr "Trollhorn" msgctxt "spellinfo" msgid "great_drought" -msgstr " Dieses mächtige Ritual öffnet ein Tor in die Elementarebene der Hitze. Eine grosse Dürre kommt über das Land. Bauern, Tiere und Pflanzen der Region kämpfen um das nackte Überleben, aber eine solche Dürre überlebt wohl nur die Hälfte aller Lebewesen. Der Landstrich kann über Jahre hinaus von den Folgen einer solchen Dürre betroffen sein. " +msgstr "Dieses mächtige Ritual öffnet ein Tor in die Elementarebene der Hitze. Eine grosse Dürre kommt über das Land. Bauern, Tiere und Pflanzen der Region kämpfen um das nackte Überleben, aber eine solche Dürre überlebt wohl nur die Hälfte aller Lebewesen. Der Landstrich kann über Jahre hinaus von den Folgen einer solchen Dürre betroffen sein." msgid "fog" msgstr "Nebel" @@ -1662,7 +1657,7 @@ msgstr "Akkreditionen des Xontormia-Expreß" msgctxt "spellinfo" msgid "create_runesword" -msgstr "Mit diesem Spruch erzeugt man ein Runenschwert. Die Klinge des schwarzen Schwertes ist mit alten, magischen Runen verziert, und ein seltsames Eigenleben erfüllt die warme Klinge. Um es zu benutzen, muss man ein Schwertkämpfer von beachtlichem Talent (7) sein. Der Träger des Runenschwertes erhält einen Talentbonus von +4 im Kampf und wird so gut wie immun gegen alle Formen von Magie." +msgstr "Mit diesem Spruch erzeugt man ein Runenschwert. Die Klinge des schwarzen Schwertes ist mit alten, magischen Runen verziert, und ein seltsames Eigenleben erfüllt die warme Klinge. Um es zu benutzen, muss man ein Schwertkämpfer von beachtlichem Talent (7) sein. Der Träger des Runenschwertes erhält einen Talentbonus von +4 im Kampf und wird so gut wie immun gegen alle Formen von Magie." msgctxt "spell" msgid "magicboost" @@ -1823,7 +1818,7 @@ msgstr "Schwarz" msgctxt "spellinfo" msgid "magic_roots" -msgstr " Mit Hilfe dieses aufwändigen Rituals läßt der Druide einen Teil seiner Kraft dauerhaft in den Boden und die Wälder der Region fliessen. Dadurch wird das Gleichgewicht der Natur in der Region für immer verändert, und in Zukunft werden nur noch die anspruchsvollen, aber kräftigen Mallorngewächse in der Region gedeihen. " +msgstr "Mit Hilfe dieses aufwändigen Rituals läßt der Druide einen Teil seiner Kraft dauerhaft in den Boden und die Wälder der Region fliessen. Dadurch wird das Gleichgewicht der Natur in der Region für immer verändert, und in Zukunft werden nur noch die anspruchsvollen, aber kräftigen Mallorngewächse in der Region gedeihen." msgctxt "race" msgid "undead_d" @@ -1912,7 +1907,7 @@ msgid "castle" msgstr "Burg" msgid "nr_borderlist_infix" -msgstr ", im " +msgstr ", im" msgctxt "race" msgid "shadowbat_p" @@ -1943,15 +1938,15 @@ msgid "password" msgstr "PASSWORT" msgid "nr_mourning" -msgstr " (trauernd)" +msgstr "(trauernd)" msgctxt "spellinfo" msgid "create_chastitybelt" -msgstr "Dieses Amulett in Gestalt einer orkischen Matrone unterdrückt den Fortpflanzungstrieb eines einzelnen Orks sehr zuverlässig. Ein Ork mit Amulett der Keuschheit wird sich nicht mehr vermehren." +msgstr "Dieses Amulett in Gestalt einer orkischen Matrone unterdrückt den Fortpflanzungstrieb eines einzelnen Orks sehr zuverlässig. Ein Ork mit Amulett der Keuschheit wird sich nicht mehr vermehren." msgctxt "spellinfo" msgid "analyse_object" -msgstr " Wie Lebewesen, so haben auch Schiffe und Gebäude und sogar Regionen ihr eigenes Lied, wenn auch viel schwächer und schwerer zu hören. Und so, wie aus dem Lebenslied einer Person erkannt werden kann, ob diese unter einem Zauber steht, so ist dies auch bei Burgen, Schiffen oder Regionen möglich. " +msgstr "Wie Lebewesen, so haben auch Schiffe und Gebäude und sogar Regionen ihr eigenes Lied, wenn auch viel schwächer und schwerer zu hören. Und so, wie aus dem Lebenslied einer Person erkannt werden kann, ob diese unter einem Zauber steht, so ist dies auch bei Burgen, Schiffen oder Regionen möglich." msgctxt "race" msgid "shadowbat_x" @@ -1977,7 +1972,7 @@ msgstr "Auge des Drachen" msgctxt "spellinfo" msgid "fetch_astral" -msgstr "Ein Magier, welcher sich in der materiellen Welt befindet, kann er mit Hilfe dieses Zaubers Einheiten aus der angrenzenden Astralwelt herbeiholen. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen in die materielle Welt zwingen." +msgstr "Ein Magier, welcher sich in der materiellen Welt befindet, kann er mit Hilfe dieses Zaubers Einheiten aus der angrenzenden Astralwelt herbeiholen. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen in die materielle Welt zwingen." msgid "chainmail_p" msgstr "Kettenhemden" @@ -2039,7 +2034,7 @@ msgstr "Zuerst brate man das Gurgelkraut leicht an und würze das Zeug mit ein w msgctxt "spellinfo" msgid "eternal_walls" -msgstr "Mit dieser Formel bindet der Magier auf ewig die Kräfte der Erde in die Mauern des Gebäudes. Ein solchermaßen verzaubertes Gebäude ist gegen den Zahn der Zeit geschützt und benötigt keinen Unterhalt mehr." +msgstr "Mit dieser Formel bindet der Magier auf ewig die Kräfte der Erde in die Mauern des Gebäudes. Ein solchermaßen verzaubertes Gebäude ist gegen den Zahn der Zeit geschützt und benötigt keinen Unterhalt mehr." msgid "snowglobe_p" msgstr "Schneekugeln" @@ -2106,7 +2101,7 @@ msgstr "der Steinerne" msgctxt "spellinfo" msgid "song_suscept_magic" -msgstr " Dieses Lied, das in die magische Essenz der Region gewoben wird, schwächt die natürliche Widerstandskraft gegen eine Verzauberung einmalig um 15%. Nur die Verbündeten des Barden (HELFE BEWACHE) sind gegen die Wirkung des Gesangs gefeit. " +msgstr "Dieses Lied, das in die magische Essenz der Region gewoben wird, schwächt die natürliche Widerstandskraft gegen eine Verzauberung einmalig um 15%. Nur die Verbündeten des Barden (HELFE BEWACHE) sind gegen die Wirkung des Gesangs gefeit." msgid "dragon_postfix_13" msgstr "die Alte" @@ -2463,7 +2458,7 @@ msgstr "Dieser Ring ist ein wahres Meisterwerk. Obwohl er sehr gross ist (weil a msgctxt "spellinfo" msgid "stonegolem" -msgstr "Man befeuchte einen kluftfreien Block aus feinkristallinen Gestein mit einer Phiole des Lebenswassers bis dieses vollständig vom Gestein aufgesogen wurde. Sodann richte man seine Kraft auf die sich bildende feine Aura des Lebens und forme der ungebundenen Kraft ein Gehäuse. Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden, bevor die Aura sich verflüchtigt. Jeder Golem hat jede Runde eine Chance von 10 Prozent zu Staub zu zerfallen. Gibt man den Golems die Befehle MACHE BURG oder MACHE STRASSE, so werden pro Golem 4 Steine verbaut und der Golem löst sich auf. " +msgstr "Man befeuchte einen kluftfreien Block aus feinkristallinen Gestein mit einer Phiole des Lebenswassers bis dieses vollständig vom Gestein aufgesogen wurde. Sodann richte man seine Kraft auf die sich bildende feine Aura des Lebens und forme der ungebundenen Kraft ein Gehäuse. Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden, bevor die Aura sich verflüchtigt. Jeder Golem hat jede Runde eine Chance von 10 Prozent zu Staub zu zerfallen. Gibt man den Golems die Befehle MACHE BURG oder MACHE STRASSE, so werden pro Golem 4 Steine verbaut und der Golem löst sich auf." msgid "dolphin" msgstr "Delphin" @@ -2765,7 +2760,7 @@ msgstr "Schild" msgctxt "spellinfo" msgid "calm_riot" -msgstr " Mit Hilfe dieses magischen Gesangs kann der Magier eine Region in Aufruhr wieder beruhigen. Die Bauernhorden werden sich verlaufen und wieder auf ihre Felder zurückkehren. " +msgstr "Mit Hilfe dieses magischen Gesangs kann der Magier eine Region in Aufruhr wieder beruhigen. Die Bauernhorden werden sich verlaufen und wieder auf ihre Felder zurückkehren." msgctxt "race" msgid "stonegolem" @@ -2864,7 +2859,7 @@ msgid "Blut" msgstr "Blut" msgid "nr_guarding_prefix" -msgstr "Die Region wird von " +msgstr "Die Region wird von" msgctxt "race" msgid "giantturtle" @@ -3157,7 +3152,7 @@ msgstr "Erzeugt einen Aurafokus." msgctxt "spellinfo" msgid "earn_silver#draig" -msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll, niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 50 Silber pro Stufe ein." +msgstr "In den dunkleren Gassen gibt es sie, die Flüche und Verhexungen auf Bestellung. Aber auch Gegenzauber hat der Jünger des Draigs natürlich im Angebot. Ob nun der Sohn des Nachbarn in einen Liebesbann gezogen werden soll oder die Nebenbuhlerin Pickel und Warzen bekommen soll, niemand gibt gerne zu, zu solchen Mitteln gegriffen zu haben. Für diese Dienstleistung streicht der Magier 50 Silber pro Stufe ein." msgctxt "spell" msgid "song_of_slavery" @@ -3340,7 +3335,7 @@ msgstr "BETRETE" msgctxt "spellinfo" msgid "airship" -msgstr "Diese magischen Runen bringen ein Boot bis zu einer Kapazität von 50 Gewichtseinheiten für eine Woche zum Fliegen. Dies ermöglicht dem Boot die Überquerung von Land. Für die Farbe der Runen muss eine spezielle Tinte aus einem Windbeutel und einem Schneekristall angerührt werden." +msgstr "Diese magischen Runen bringen ein Boot bis zu einer Kapazität von 50 Gewichtseinheiten für eine Woche zum Fliegen. Dies ermöglicht dem Boot die Überquerung von Land. Für die Farbe der Runen muss eine spezielle Tinte aus einem Windbeutel und einem Schneekristall angerührt werden." msgid "ERESSEA" msgstr "ERESSEA" @@ -3380,7 +3375,7 @@ msgstr "Astraler Blick" msgctxt "iteminfo" msgid "skillpotion" -msgstr " Die Herstellung dieses Trunkes ist ein wohlgehütetes Geheimnis. Manche behaupten gar, von Sterblichen könne er gar nicht gebraut werden. Tatsache ist, dass er dem Trinkenden tiefere Einsicht in seine erlernten Talente gewährt, was ihn in der Meisterung dieser Talente voranbringt. " +msgstr "Die Herstellung dieses Trunkes ist ein wohlgehütetes Geheimnis. Manche behaupten gar, von Sterblichen könne er gar nicht gebraut werden. Tatsache ist, dass er dem Trinkenden tiefere Einsicht in seine erlernten Talente gewährt, was ihn in der Meisterung dieser Talente voranbringt." msgctxt "keyword" msgid "cast" @@ -3399,7 +3394,7 @@ msgstr "Zwerg" msgctxt "spellinfo" msgid "irongolem" -msgstr "Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden. Jeder Golem hat jede Runde eine Chance von 15 Prozent zu Staub zu zerfallen. Gibt man den Golems den Befehl MACHE SCHWERT/BIHÄNDER oder MACHE SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 4 Eisenbarren verbaut und der Golem löst sich auf. " +msgstr "Je mehr Kraft der Magier investiert, desto mehr Golems können geschaffen werden. Jeder Golem hat jede Runde eine Chance von 15 Prozent zu Staub zu zerfallen. Gibt man den Golems den Befehl MACHE SCHWERT/BIHÄNDER oder MACHE SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 4 Eisenbarren verbaut und der Golem löst sich auf." msgctxt "race" msgid "ghoul_d" @@ -3524,7 +3519,7 @@ msgstr "Mallornschößling" msgctxt "spellinfo" msgid "song_of_peace" -msgstr " Dieser mächtige Bann verhindert jegliche Attacken. Niemand in der ganzen Region ist fähig seine Waffe gegen irgendjemanden zu erheben. Die Wirkung kann etliche Wochen andauern. " +msgstr "Dieser mächtige Bann verhindert jegliche Attacken. Niemand in der ganzen Region ist fähig seine Waffe gegen irgendjemanden zu erheben. Die Wirkung kann etliche Wochen andauern." msgctxt "spell" msgid "nocostbuilding" @@ -3635,7 +3630,7 @@ msgstr "Beschleunigung" msgctxt "spellinfo" msgid "clone" -msgstr " Dieser mächtige Zauber kann einen Magier vor dem sicheren Tod bewahren. Der Magier erschafft anhand einer kleinen Blutprobe einen Klon von sich, und legt diesen in ein Bad aus Drachenblut und verdünntem Wasser des Lebens. Anschließend transferiert er in einem aufwändigen Ritual einen Teil seiner Seele in den Klon. Stirbt der Magier, reist seine Seele in den Klon und der erschaffene Körper dient nun dem Magier als neues Gefäß. Es besteht allerdings eine geringe Wahrscheinlichkeit, dass die Seele nach dem Tod zu schwach ist, das neue Gefäß zu erreichen. " +msgstr "Dieser mächtige Zauber kann einen Magier vor dem sicheren Tod bewahren. Der Magier erschafft anhand einer kleinen Blutprobe einen Klon von sich, und legt diesen in ein Bad aus Drachenblut und verdünntem Wasser des Lebens. Anschließend transferiert er in einem aufwändigen Ritual einen Teil seiner Seele in den Klon. Stirbt der Magier, reist seine Seele in den Klon und der erschaffene Körper dient nun dem Magier als neues Gefäß. Es besteht allerdings eine geringe Wahrscheinlichkeit, dass die Seele nach dem Tod zu schwach ist, das neue Gefäß zu erreichen." msgctxt "race" msgid "elf_p" @@ -3646,7 +3641,7 @@ msgstr "Elfenpferde" msgctxt "spellinfo" msgid "frighten" -msgstr " Dieser Kriegsgesang sät Panik in der Front der Gegner und schwächt so ihre Kampfkraft erheblich. Angst wird ihren Schwertarm schwächen und Furcht ihren Schildarm lähmen. " +msgstr "Dieser Kriegsgesang sät Panik in der Front der Gegner und schwächt so ihre Kampfkraft erheblich. Angst wird ihren Schwertarm schwächen und Furcht ihren Schildarm lähmen." msgctxt "keyword" msgid "ride" @@ -3684,7 +3679,7 @@ msgstr "Unbekannte Partei" msgctxt "spellinfo" msgid "wyrm_transformation" -msgstr " Mit Hilfe dieses Zaubers kann sich der Magier permanent in einen mächtigen Wyrm verwandeln. Der Magier behält seine Talente und Möglichkeiten, bekommt jedoch die Kampf- und Bewegungseigenschaften eines Wyrms. Der Odem des Wyrms wird sich mit steigendem Magie-Talent verbessern. Der Zauber ist sehr kraftraubend und der Wyrm wird einige Zeit brauchen, um sich zu erholen. " +msgstr "Mit Hilfe dieses Zaubers kann sich der Magier permanent in einen mächtigen Wyrm verwandeln. Der Magier behält seine Talente und Möglichkeiten, bekommt jedoch die Kampf- und Bewegungseigenschaften eines Wyrms. Der Odem des Wyrms wird sich mit steigendem Magie-Talent verbessern. Der Zauber ist sehr kraftraubend und der Wyrm wird einige Zeit brauchen, um sich zu erholen." msgid "questkey2_p" msgstr "Saphirne Schlüssel" @@ -3712,7 +3707,7 @@ msgid "analyse_object" msgstr "Lied des Ortes analysieren" msgid "nr_borderlist_lastfix" -msgstr " und im " +msgstr "und im" msgctxt "race" msgid "shadowknight_d" @@ -3843,7 +3838,7 @@ msgstr "Kraken" msgctxt "spellinfo" msgid "sleep" -msgstr "Dieser Zauber läßt einige feindliche Kämpfer einschlafen. Schlafende Kämpfer greifen nicht an und verteidigen sich schlechter, sie wachen jedoch auf, sobald sie im Kampf getroffen werden. " +msgstr "Dieser Zauber läßt einige feindliche Kämpfer einschlafen. Schlafende Kämpfer greifen nicht an und verteidigen sich schlechter, sie wachen jedoch auf, sobald sie im Kampf getroffen werden." msgctxt "spellinfo" msgid "tiredsoldiers" @@ -3949,7 +3944,7 @@ msgstr "Steingolems" msgctxt "spellinfo" msgid "melancholy" -msgstr " Mit diesem Gesang verbreitet der Barde eine melancholische, traurige Stimmung unter den Bauern. Einige Wochen lang werden sie sich in ihre Hütten zurückziehen und kein Silber in den Theatern und Tavernen lassen. " +msgstr "Mit diesem Gesang verbreitet der Barde eine melancholische, traurige Stimmung unter den Bauern. Einige Wochen lang werden sie sich in ihre Hütten zurückziehen und kein Silber in den Theatern und Tavernen lassen." msgctxt "spell" msgid "earn_silver#gwyrrd" @@ -4035,7 +4030,7 @@ msgstr "Schaden" msgctxt "raceinfo" msgid "songdragon" -msgstr "Singdrachen sind von der Größe eines ausgewachsenden Tigers. Ihre Färbung reicht von schillerndem Rot, über dunkles Grün bis hin zu tiefem Schwarz. Alle bekannten Drachen dieser Art weisen eine hohe Intelligenz und ein hohes Maß an magischen Fähigkeiten auf. Wie Ihre großen Verwandten verfügen sie über einen Feuerodem. Sie lieben den Gesang und das üppige Mahl. Von Zeit zu Zeit gehen sie eine engen magisches Bund zu einem Magier ein. Wenn dies geschieht, so steht dem Magier ein äußerst loyaler und lohnender Vertrauter zur Seite. " +msgstr "Singdrachen sind von der Größe eines ausgewachsenden Tigers. Ihre Färbung reicht von schillerndem Rot, über dunkles Grün bis hin zu tiefem Schwarz. Alle bekannten Drachen dieser Art weisen eine hohe Intelligenz und ein hohes Maß an magischen Fähigkeiten auf. Wie Ihre großen Verwandten verfügen sie über einen Feuerodem. Sie lieben den Gesang und das üppige Mahl. Von Zeit zu Zeit gehen sie eine engen magisches Bund zu einem Magier ein. Wenn dies geschieht, so steht dem Magier ein äußerst loyaler und lohnender Vertrauter zur Seite." msgid "axe_p" msgstr "Kriegsäxte" @@ -4088,7 +4083,7 @@ msgid "section_newspells" msgstr "Neue Zauber" msgid "nr_borderlist_prefix" -msgstr "Im " +msgstr "Im" msgctxt "race" msgid "greenscarab_d" @@ -4161,7 +4156,7 @@ msgid "seed" msgstr "Same" msgid "nr_nb_next" -msgstr ", im " +msgstr ", im" msgctxt "spellinfo" msgid "undeadhero" @@ -4238,7 +4233,7 @@ msgstr "Alraunen" msgctxt "spellinfo" msgid "seduction" -msgstr " Mit diesem Lied kann eine Einheit derartig betört werden, so dass sie dem Barden den größten Teil ihres Bargelds und ihres Besitzes schenkt. Sie behält jedoch immer soviel, wie sie zum Überleben braucht. " +msgstr "Mit diesem Lied kann eine Einheit derartig betört werden, so dass sie dem Barden den größten Teil ihres Bargelds und ihres Besitzes schenkt. Sie behält jedoch immer soviel, wie sie zum Überleben braucht." msgctxt "race" msgid "dwarf_d" @@ -4439,7 +4434,7 @@ msgid "see_lighthouse" msgstr "vom Turm erblickt" msgid "nr_schemes_prefix" -msgstr "Schemen der Regionen " +msgstr "Schemen der Regionen" msgid "aoc_p" msgstr "Katzenamulette" @@ -4461,7 +4456,7 @@ msgstr "eine mächtige Mauer" msgctxt "spellinfo" msgid "double_time" -msgstr "Diese praktische Anwendung des theoretischen Wissens um Raum und Zeit ermöglicht es, den Zeitfluß für einige Personen zu verändern. Auf diese Weise veränderte Personen bekommen für einige Wochen doppelt soviele Bewegungspunkte und doppelt soviele Angriffe pro Runde." +msgstr "Diese praktische Anwendung des theoretischen Wissens um Raum und Zeit ermöglicht es, den Zeitfluß für einige Personen zu verändern. Auf diese Weise veränderte Personen bekommen für einige Wochen doppelt soviele Bewegungspunkte und doppelt soviele Angriffe pro Runde." msgctxt "race" msgid "direwolf" @@ -4619,7 +4614,7 @@ msgstr "Wargen" msgctxt "spellinfo" msgid "ironkeeper" -msgstr "Erschafft einen Wächtergeist, der in Gletschern und Bergen Eisen- und Laenabbau durch nichtalliierte Parteien (HELFE BEWACHE) verhindert, solange er die Region bewacht. Der Bergwächter ist an den Ort der Beschwörung gebunden." +msgstr "Erschafft einen Wächtergeist, der in Gletschern und Bergen Eisen- und Laenabbau durch nichtalliierte Parteien (HELFE BEWACHE) verhindert, solange er die Region bewacht. Der Bergwächter ist an den Ort der Beschwörung gebunden." msgid "h20_p" msgstr "Schneekristalle" @@ -4802,7 +4797,7 @@ msgstr "Ghasten" msgctxt "spellinfo" msgid "mindblast" -msgstr "Mit diesem Zauber greift der Magier direkt den Geist seiner Gegner an. Ein Schlag aus astraler und elektrischer Energie trifft die Gegner, wird die Magieresistenz durchbrochen, verliert ein Opfer permanent einen Teil seiner Erinnerungen. Wird es zu oft ein Opfer dieses Zaubers kann es daran sterben. " +msgstr "Mit diesem Zauber greift der Magier direkt den Geist seiner Gegner an. Ein Schlag aus astraler und elektrischer Energie trifft die Gegner, wird die Magieresistenz durchbrochen, verliert ein Opfer permanent einen Teil seiner Erinnerungen. Wird es zu oft ein Opfer dieses Zaubers kann es daran sterben." msgid "h7_p" msgstr "Knotige Saugwurze" @@ -4828,7 +4823,7 @@ msgid "juju_d" msgstr "Juju-Zombies" msgid "nr_guarding_postfix" -msgstr " bewacht." +msgstr "bewacht." msgctxt "border" msgid "fogwall" @@ -5025,7 +5020,7 @@ msgstr "VERKAUFE" msgctxt "spellinfo" msgid "auratransfer" -msgstr " Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes oder im Verhältnis 3:1 auf einen Magier eines anderen Magiegebietes übertragen. " +msgstr "Mit Hilfe dieses Zaubers kann der Magier eigene Aura im Verhältnis 2:1 auf einen anderen Magier des gleichen Magiegebietes oder im Verhältnis 3:1 auf einen Magier eines anderen Magiegebietes übertragen." msgctxt "race" msgid "wyrm" @@ -5054,7 +5049,7 @@ msgstr "aggressiv" msgctxt "spellinfo" msgid "song_resist_magic" -msgstr " Dieses magische Lied wird, einmal mit Inbrunst gesungen, sich in der Region fortpflanzen, von Mund zu Mund springen und eine Zeitlang überall zu vernehmen sein. Nach wie vielen Wochen der Gesang aus dem Gedächtnis der Region entschwunden ist, ist von dem Geschick des Barden abhängig. Bis das Lied ganz verklungen ist, wird seine Magie allen Verbündeten des Barden (HELFE BEWACHE), und natürlich auch seinen eigenem Volk, einen einmaligen Bonus von 15% auf die natürliche Widerstandskraft gegen eine Verzauberung verleihen. " +msgstr "Dieses magische Lied wird, einmal mit Inbrunst gesungen, sich in der Region fortpflanzen, von Mund zu Mund springen und eine Zeitlang überall zu vernehmen sein. Nach wie vielen Wochen der Gesang aus dem Gedächtnis der Region entschwunden ist, ist von dem Geschick des Barden abhängig. Bis das Lied ganz verklungen ist, wird seine Magie allen Verbündeten des Barden (HELFE BEWACHE), und natürlich auch seinen eigenem Volk, einen einmaligen Bonus von 15% auf die natürliche Widerstandskraft gegen eine Verzauberung verleihen." msgctxt "keyword" msgid "contact" @@ -5100,7 +5095,7 @@ msgstr "Grauenhafte" msgctxt "spellinfo" msgid "maelstrom" -msgstr " Dieses Ritual beschört einen großen Wasserelementar aus den Tiefen des Ozeans. Der Elementar erzeugt einen gewaltigen Strudel, einen Mahlstrom, welcher alle Schiffe, die ihn passieren, schwer beschädigen kann. " +msgstr "Dieses Ritual beschört einen großen Wasserelementar aus den Tiefen des Ozeans. Der Elementar erzeugt einen gewaltigen Strudel, einen Mahlstrom, welcher alle Schiffe, die ihn passieren, schwer beschädigen kann." msgid "undead_prefix_13" msgstr "Furchtbare" @@ -5125,7 +5120,7 @@ msgstr "Schreckliche" msgctxt "spellinfo" msgid "view_reality" -msgstr " Der Magier kann mit Hilfe dieses Zaubers aus der Astral- in die materielle Ebene blicken und die Regionen und Einheiten genau erkennen. " +msgstr "Der Magier kann mit Hilfe dieses Zaubers aus der Astral- in die materielle Ebene blicken und die Regionen und Einheiten genau erkennen." msgid "vortex" msgstr "Wirbel" @@ -5499,7 +5494,7 @@ msgstr "Bihänder" msgctxt "spellinfo" msgid "show_astral" -msgstr " Der Magier kann kurzzeitig in die Astralebene blicken und erfährt so alle Einheiten innerhalb eines astralen Radius von Stufe/5 Regionen. " +msgstr "Der Magier kann kurzzeitig in die Astralebene blicken und erfährt so alle Einheiten innerhalb eines astralen Radius von Stufe/5 Regionen." msgctxt "race" msgid "demon_d" @@ -5539,11 +5534,11 @@ msgstr "Luchse" msgctxt "spellinfo" msgid "cerddor_destroymagic" -msgstr " Jede Verzauberung beeinflußt das Lebenslied, schwächt und verzerrt es. Der kundige Barde kann versuchen, das Lebenslied aufzufangen und zu verstärken und die Veränderungen aus dem Lied zu tilgen. " +msgstr "Jede Verzauberung beeinflußt das Lebenslied, schwächt und verzerrt es. Der kundige Barde kann versuchen, das Lebenslied aufzufangen und zu verstärken und die Veränderungen aus dem Lied zu tilgen." msgctxt "spellinfo" msgid "treegrow" -msgstr "Wo sonst aus einem Stecken nur ein Baum sprießen konnte, so treibt nun jeder Ast Wurzeln. " +msgstr "Wo sonst aus einem Stecken nur ein Baum sprießen konnte, so treibt nun jeder Ast Wurzeln." msgctxt "race" msgid "lynx_x" @@ -5578,7 +5573,7 @@ msgid "swamp_trail" msgstr "der Sumpf von %s" msgid "nr_nb_final" -msgstr "und im " +msgstr "und im" msgid "aoc" msgstr "Katzenamulett" @@ -5702,7 +5697,7 @@ msgstr "Erschlagene" msgctxt "spellinfo" msgid "protective_runes" -msgstr " Zeichnet man diese Runen auf die Wände eines Gebäudes oder auf die Planken eines Schiffes, so wird es schwerer durch Zauber zu beeinflussen sein. Jedes Ritual erhöht die Widerstandskraft des Gebäudes oder Schiffes gegen Verzauberung um 20%. Werden mehrere Schutzzauber übereinander gelegt, so addiert sich ihre Wirkung, doch ein hundertprozentiger Schutz läßt sich so nicht erreichen. Der Zauber hält mindestens drei Wochen an, je nach Talent des Magiers aber auch viel länger. " +msgstr "Zeichnet man diese Runen auf die Wände eines Gebäudes oder auf die Planken eines Schiffes, so wird es schwerer durch Zauber zu beeinflussen sein. Jedes Ritual erhöht die Widerstandskraft des Gebäudes oder Schiffes gegen Verzauberung um 20%. Werden mehrere Schutzzauber übereinander gelegt, so addiert sich ihre Wirkung, doch ein hundertprozentiger Schutz läßt sich so nicht erreichen. Der Zauber hält mindestens drei Wochen an, je nach Talent des Magiers aber auch viel länger." msgid "h9" msgstr "Wasserfinder" @@ -5812,7 +5807,7 @@ msgstr "Bergwächter" msgctxt "spellinfo" msgid "enterastral" -msgstr "Alte arkane Formeln ermöglichen es dem Magier, sich und andere in die astrale Ebene zu schicken. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 11 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen. " +msgstr "Alte arkane Formeln ermöglichen es dem Magier, sich und andere in die astrale Ebene zu schicken. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 11 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen." msgctxt "spell" msgid "flyingship" @@ -5857,7 +5852,7 @@ msgid "clone_of" msgstr "Klon von %s" msgid "travelthru_header" -msgstr "Die Region wurde durchquert von " +msgstr "Die Region wurde durchquert von" msgctxt "race" msgid "template_x" @@ -5926,7 +5921,7 @@ msgstr "Bannlied" msgctxt "spellinfo" msgid "earn_silver#tybied" -msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche verdienen." +msgstr "Wenn einem der Alchemist nicht weiterhelfen kann, geht man zu dem gelehrten Tybiedmagier. Seine Tränke und Tinkturen helfen gegen alles, was man sonst nicht bekommen kann. Ob nun die kryptische Formel unter dem Holzschuh des untreuen Ehemannes wirklich geholfen hat - nun, der des Lesens nicht mächtige Bauer wird es nie wissen. Dem Magier hilft es auf jeden Fall... beim Füllen seines Geldbeutels. 50 Silber pro Stufe lassen sich so in einer Woche verdienen." msgid "ANZAHL" msgstr "ANZAHL" @@ -5950,7 +5945,7 @@ msgstr "Ozean" msgctxt "spellinfo" msgid "headache" -msgstr " Aufzeichung des Vortrags von Selen Ard'Ragorn in Bar'Glingal: 'Es heisst, dieser Spruch wäre wohl in den Spelunken der Westgassen entstanden, doch es kann genausogut in jedem andern verrufenen Viertel gewesen sein. Seine wichtigste Zutat ist etwa ein Fass schlechtesten Weines, je billiger und ungesunder, desto wirkungsvoller wird die Essenz. Die Kunst, diesen Wein in pure Essenz zu destillieren, die weitaus anspruchsvoller als das einfache Rezeptmischen eines Alchemisten ist, und diese dergestalt zu binden und konservieren, das sie sich nicht gleich wieder verflüchtigt, wie es ihre Natur wäre, ja, dies ist etwas, das nur ein Meister des Cerddor vollbringen kann. Nun besitzt Ihr eine kleine Phiola mit einer rubinrotschimmernden - nun, nicht flüssig, doch auch nicht ganz Dunst - nennen wir es einfach nur Elixier. Doch nicht dies ist die wahre Herausforderung, sodann muss, da sich ihre Wirkung leicht verflüchtigt, diese innerhalb weniger Tage unbemerkt in das Getränk des Opfers geträufelt werden. Ihr Meister der Betöhrung und Verführung, hier nun könnt Ihr Eure ganze Kunst unter Beweis stellen. Doch gebt Acht, nicht unbedacht selbst von dem Elixier zu kosten, denn wer einmal gekostet hat, der kann vom Weine nicht mehr lassen, und er säuft sicherlich eine volle Woche lang. Jedoch nicht die Verführung zum Trunke ist die wahre Gefahr, die dem Elixier innewohnt, sondern das der Trunkenheit so sicher ein gar fürchterliches Leid des Kopfes folgen wird, wie der Tag auf die Nacht folgt. Und er wird gar sicherlich von seiner besten Fähigkeit einige Tage bis hin zu den Studien zweier Wochen vergessen haben. Noch ein Wort der Warnung: dieses ist sehr aufwendig, und so Ihr noch weitere Zauber in der selben Woche wirken wollt, so werden sie Euch schwerer fallen.' " +msgstr "Aufzeichung des Vortrags von Selen Ard'Ragorn in Bar'Glingal: 'Es heisst, dieser Spruch wäre wohl in den Spelunken der Westgassen entstanden, doch es kann genausogut in jedem andern verrufenen Viertel gewesen sein. Seine wichtigste Zutat ist etwa ein Fass schlechtesten Weines, je billiger und ungesunder, desto wirkungsvoller wird die Essenz. Die Kunst, diesen Wein in pure Essenz zu destillieren, die weitaus anspruchsvoller als das einfache Rezeptmischen eines Alchemisten ist, und diese dergestalt zu binden und konservieren, das sie sich nicht gleich wieder verflüchtigt, wie es ihre Natur wäre, ja, dies ist etwas, das nur ein Meister des Cerddor vollbringen kann. Nun besitzt Ihr eine kleine Phiola mit einer rubinrotschimmernden - nun, nicht flüssig, doch auch nicht ganz Dunst - nennen wir es einfach nur Elixier. Doch nicht dies ist die wahre Herausforderung, sodann muss, da sich ihre Wirkung leicht verflüchtigt, diese innerhalb weniger Tage unbemerkt in das Getränk des Opfers geträufelt werden. Ihr Meister der Betöhrung und Verführung, hier nun könnt Ihr Eure ganze Kunst unter Beweis stellen. Doch gebt Acht, nicht unbedacht selbst von dem Elixier zu kosten, denn wer einmal gekostet hat, der kann vom Weine nicht mehr lassen, und er säuft sicherlich eine volle Woche lang. Jedoch nicht die Verführung zum Trunke ist die wahre Gefahr, die dem Elixier innewohnt, sondern das der Trunkenheit so sicher ein gar fürchterliches Leid des Kopfes folgen wird, wie der Tag auf die Nacht folgt. Und er wird gar sicherlich von seiner besten Fähigkeit einige Tage bis hin zu den Studien zweier Wochen vergessen haben. Noch ein Wort der Warnung: dieses ist sehr aufwendig, und so Ihr noch weitere Zauber in der selben Woche wirken wollt, so werden sie Euch schwerer fallen.'" msgid "spear" msgstr "Speer" @@ -6011,7 +6006,7 @@ msgstr "Wiederbelebung" msgctxt "spellinfo" msgid "create_bagofholding" -msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." +msgstr "Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis zu 200 Gewichtseinheiten transportiert werden können, ohne dass sie auf das Traggewicht angerechnet werden. Pferde und andere Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können nicht in dem Beutel transportiert werden. Auch ist es nicht möglich, einen Zauberbeutel in einem anderen zu transportieren. Der Beutel selber wiegt 1 GE." msgid "questkey1" msgstr "Achatener Schlüssel" @@ -6076,7 +6071,7 @@ msgstr "Dieser schwierige, aber effektive Kampfzauber benutzt die Elementargeist msgctxt "spellinfo" msgid "armor_shield" -msgstr " Diese vor dem Kampf zu zaubernde Ritual gibt den eigenen Truppen einen zusätzlichen Bonus auf ihre Rüstung. Jeder Treffer reduziert die Kraft des Zaubers, so dass der Schild sich irgendwann im Kampf auflösen wird. " +msgstr "Diese vor dem Kampf zu zaubernde Ritual gibt den eigenen Truppen einen zusätzlichen Bonus auf ihre Rüstung. Jeder Treffer reduziert die Kraft des Zaubers, so dass der Schild sich irgendwann im Kampf auflösen wird." msgid "desert_trail" msgstr "die Wüste von %s" @@ -6146,7 +6141,7 @@ msgstr "Laen" msgctxt "spellinfo" msgid "incite_riot" -msgstr " Mit Hilfe dieses magischen Gesangs versetzt der Magier eine ganze Region in Aufruhr. Rebellierende Bauernhorden machen jedes Besteuern unmöglich, kaum jemand wird mehr für Gaukeleien Geld spenden und es können keine neuen Leute angeworben werden. Nach einigen Wochen beruhigt sich der Mob wieder. " +msgstr "Mit Hilfe dieses magischen Gesangs versetzt der Magier eine ganze Region in Aufruhr. Rebellierende Bauernhorden machen jedes Besteuern unmöglich, kaum jemand wird mehr für Gaukeleien Geld spenden und es können keine neuen Leute angeworben werden. Nach einigen Wochen beruhigt sich der Mob wieder." msgid "longboat" msgstr "Langboot" @@ -6207,7 +6202,7 @@ msgstr "durchgereist" msgctxt "spellinfo" msgid "pull_astral" -msgstr "Ein Magier, der sich in der astralen Ebene befindet, kann mit Hilfe dieses Zaubers andere Einheiten zu sich holen. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen." +msgstr "Ein Magier, der sich in der astralen Ebene befindet, kann mit Hilfe dieses Zaubers andere Einheiten zu sich holen. Der Magier kann (Stufe-3)*15 GE durch das kurzzeitig entstehende Tor schicken. Ist der Magier erfahren genug, den Zauber auf Stufen von 13 oder mehr zu zaubern, kann er andere Einheiten auch gegen ihren Willen auf die andere Ebene zwingen." msgid "smod_far" msgstr "Fernzauber" diff --git a/res/translations/strings.en.po b/res/translations/strings.en.po index 774874bf1..8629d5f5e 100644 --- a/res/translations/strings.en.po +++ b/res/translations/strings.en.po @@ -233,7 +233,7 @@ msgstr "Calm Monster" msgctxt "spellinfo" msgid "sound_out" -msgstr " Should the unit succumb to the spell, they will tell the mage everything they know about the region is question. Is no unit of their faction in that region, they'll have nothing to report. Also, they can only report, what they themselves could see. " +msgstr "Should the unit succumb to the spell, they will tell the mage everything they know about the region is question. Is no unit of their faction in that region, they'll have nothing to report. Also, they can only report, what they themselves could see." msgctxt "spell" msgid "readmind" @@ -267,7 +267,7 @@ msgstr "young dragon" msgctxt "spellinfo" msgid "calm_monster" -msgstr " This disarming chant can tame almost any intelligent monster. It will refrain from attacks on the mage and his companions. But one should not deceive oneself about the persisting unpredictable nature of the creature. " +msgstr "This disarming chant can tame almost any intelligent monster. It will refrain from attacks on the mage and his companions. But one should not deceive oneself about the persisting unpredictable nature of the creature." msgctxt "spell" msgid "clone" @@ -289,7 +289,7 @@ msgstr "mage tower" msgctxt "spellinfo" msgid "migration" -msgstr " This ritual facilitates the migration of an unit to the own faction. The candidate has to be able and willing to leave his previous faction. He attests to that by CONTACTing the mage and will otherwise be occupied with preparations for the ritual. The ritual will fail, if the candidate owes the previous faction fealty for an expensive training. The mage performing the ritual has to invest permanent aura to bind the candidate to the faction. Per level and per point of permanent aura the mage can bind one person. " +msgstr "This ritual facilitates the migration of an unit to the own faction. The candidate has to be able and willing to leave his previous faction. He attests to that by CONTACTing the mage and will otherwise be occupied with preparations for the ritual. The ritual will fail, if the candidate owes the previous faction fealty for an expensive training. The mage performing the ritual has to invest permanent aura to bind the candidate to the faction. Per level and per point of permanent aura the mage can bind one person." msgctxt "race" msgid "illusion" @@ -435,7 +435,7 @@ msgstr "laen shields" msgctxt "spellinfo" msgid "break_curse" -msgstr "This spell allows a magician to remove a specific enchantment from a unit, ship, bulding or region. " +msgstr "This spell allows a magician to remove a specific enchantment from a unit, ship, bulding or region." msgctxt "race" msgid "irongolem_x" @@ -449,7 +449,7 @@ msgid "draigfumbleshield" msgstr "This ritual, performed before a battle, causes the astral energies on the battlefield to whirl and churn and thereby makes spellcasting more difficult for the enemy mages." msgid "nr_schemes_postfix" -msgstr " can be discerned." +msgstr "can be discerned." msgid "SILBER" msgstr "SILVER" @@ -523,7 +523,7 @@ msgstr "ORIGIN" msgctxt "spellinfo" msgid "raise_mob" -msgstr " Employing this magic chant the mage convinces the peasants of the region to join him. The peasants won't leave their home region and won't give up their possessions, though. Additionally each week some peasants will shake off the spell and return to their fields. How many peasants join the mage depends on the power of his chant. " +msgstr "Employing this magic chant the mage convinces the peasants of the region to join him. The peasants won't leave their home region and won't give up their possessions, though. Additionally each week some peasants will shake off the spell and return to their fields. How many peasants join the mage depends on the power of his chant." msgid "wand" msgstr "wand" @@ -572,7 +572,7 @@ msgstr "wolves" msgctxt "spellinfo" msgid "living_rock" -msgstr " This draining ritual summons a gigantic earth elemental from a sphere of laen and binds it to a building. The elemental can then be commanded to move the building with all its occupants to a neighbouring region. The strength of the elemental depends of the mage's skill: it can move up to [level-12]*250 size units of building. The building won't remain undamaged by the process. " +msgstr "This draining ritual summons a gigantic earth elemental from a sphere of laen and binds it to a building. The elemental can then be commanded to move the building with all its occupants to a neighbouring region. The strength of the elemental depends of the mage's skill: it can move up to [level-12]*250 size units of building. The building won't remain undamaged by the process." msgctxt "race" msgid "museumghost_p" @@ -686,7 +686,7 @@ msgstr "sea serpents" msgctxt "spellinfo" msgid "antimagiczone" -msgstr "This spell allows a magician to create a local instability in the astral field. This zone needs to return to its equilibrium, soaking up part of the power of all spells cast in the region - or even all of some of the weaker ones. " +msgstr "This spell allows a magician to create a local instability in the astral field. This zone needs to return to its equilibrium, soaking up part of the power of all spells cast in the region - or even all of some of the weaker ones." msgid "villagers" msgstr "Villagers" @@ -801,7 +801,7 @@ msgid "sacrifice_strength" msgstr "Sacrifice Strength" msgid "nr_building_inprogress" -msgstr " (under construction)" +msgstr "(under construction)" msgid "ring_of_levitation_p" msgstr "rings of levitation" @@ -836,7 +836,7 @@ msgstr "pyramid" msgctxt "spellinfo" msgid "big_recruit" -msgstr " From 'Journeys' by Firudin the Wise: 'There's a small, scarcely visited inn in Weilersweide, near Wytharhafen. It is a little known fact, that it was home to the banished itinerant preacher Grauwolf until a few years ago. After he recruited almost the whole peasantry with one of his notorious speeches, he was convicted and banished for inciting unrest. Only hesitantly did he disclose the secret to his powers of persuasion to me.' " +msgstr "From 'Journeys' by Firudin the Wise: 'There's a small, scarcely visited inn in Weilersweide, near Wytharhafen. It is a little known fact, that it was home to the banished itinerant preacher Grauwolf until a few years ago. After he recruited almost the whole peasantry with one of his notorious speeches, he was convicted and banished for inciting unrest. Only hesitantly did he disclose the secret to his powers of persuasion to me.'" msgid "catapultammo" msgstr "ammunition" @@ -992,11 +992,11 @@ msgstr "insects" msgctxt "spellinfo" msgid "bad_dreams" -msgstr " This spell enables the dreamer to disturb the sleep of all non-allied units (HELP GUARD) in the region so severely they lose parts of their memories. " +msgstr "This spell enables the dreamer to disturb the sleep of all non-allied units (HELP GUARD) in the region so severely they lose parts of their memories." msgctxt "spellinfo" msgid "bloodthirst" -msgstr " Like many magic chants this one also originates from the ancient knowledge of the cats who always were aware of the powerful effect of the voice. This song inflames the temper of the warriors, enrages them even, into a murderous frenzy. Ignoring their own pain, they fight until death and will never flee from battle. They fight with little regard for themselves. " +msgstr "Like many magic chants this one also originates from the ancient knowledge of the cats who always were aware of the powerful effect of the voice. This song inflames the temper of the warriors, enrages them even, into a murderous frenzy. Ignoring their own pain, they fight until death and will never flee from battle. They fight with little regard for themselves." msgctxt "spell" msgid "nodrift" @@ -1033,7 +1033,7 @@ msgstr "While being aboard a ship, the druid uses this ritual to force the Eleme msgctxt "spellinfo" msgid "astral_disruption" -msgstr " This spell causes a severe disturbance of the atral plane. Within an astral radius of level/5 regions all astral creatures not able to resist the spell will be thrown from the astral plane. The astral contact with all affected regions will be disrupted for level/3 weeks. " +msgstr "This spell causes a severe disturbance of the atral plane. Within an astral radius of level/5 regions all astral creatures not able to resist the spell will be thrown from the astral plane. The astral contact with all affected regions will be disrupted for level/3 weeks." msgctxt "spell" msgid "earthquake" @@ -1051,7 +1051,7 @@ msgstr "Is hard to hit by blunt weapons and catapults." msgctxt "spellinfo" msgid "combat_speed" -msgstr " This spell accelerates some fighters of the own side, which empowers them to attack twice every round throughout the battle. " +msgstr "This spell accelerates some fighters of the own side, which empowers them to attack twice every round throughout the battle." msgctxt "keyword" msgid "claim" @@ -1111,7 +1111,7 @@ msgstr "sea serpent" msgctxt "spellinfo" msgid "fish_shield" -msgstr " This spell can project a slightly distorted image of the own troops, like the surface of the lake distorts the position of a fish. Half the damage of each hit can be deflected harmlessly through those means. The shield will only last a few hundred hits before it dissipates. The stronger the mage, the more damage the shield can take. " +msgstr "This spell can project a slightly distorted image of the own troops, like the surface of the lake distorts the position of a fish. Half the damage of each hit can be deflected harmlessly through those means. The shield will only last a few hundred hits before it dissipates. The stronger the mage, the more damage the shield can take." msgid "section_newpotions" msgstr "New Potions" @@ -1192,7 +1192,7 @@ msgstr "desert" msgctxt "iteminfo" msgid "snowglobe" -msgstr " A sphere with a diameter of three inches made of crystal glass, sitting on a granite base. On the inside countless tiny snowflakes dance around lively. On the bottom of the base a golden compass rose is engraved. A beautiful sight to behold, but it emanates a nameless cold. Among mages and others knowledgeable in the arcane arts the function and effect of the artefact are disputed intensely. Although there is agreement about something: upon release the intensity of the contained cold would have permanent repercussions for a large area. Gigantic fires would be extinguished, volcanos quelled and large bodies of water frozen solid. In less extreme environments permanent changes were also probable. Therefore it isn't recommended to drop the cold treasure. It should be thrown far off instead, while making sure there is no living being within the impact zone, if one is willing to risk the usage. (USE \"snow globe\" ) " +msgstr "A sphere with a diameter of three inches made of crystal glass, sitting on a granite base. On the inside countless tiny snowflakes dance around lively. On the bottom of the base a golden compass rose is engraved. A beautiful sight to behold, but it emanates a nameless cold. Among mages and others knowledgeable in the arcane arts the function and effect of the artefact are disputed intensely. Although there is agreement about something: upon release the intensity of the contained cold would have permanent repercussions for a large area. Gigantic fires would be extinguished, volcanos quelled and large bodies of water frozen solid. In less extreme environments permanent changes were also probable. Therefore it isn't recommended to drop the cold treasure. It should be thrown far off instead, while making sure there is no living being within the impact zone, if one is willing to risk the usage. (USE \"snow globe\" ) " msgctxt "race" msgid "dolphin" @@ -1207,7 +1207,7 @@ msgstr "goblins" msgctxt "spellinfo" msgid "song_of_slavery" -msgstr " This powerful spell robs the victim of their own free will and enslaves them to the commands of the bard. For some time the victim will turn their back on their own people and join the faction of the bard. " +msgstr "This powerful spell robs the victim of their own free will and enslaves them to the commands of the bard. For some time the victim will turn their back on their own people and join the faction of the bard." msgctxt "spell" msgid "healingzone" @@ -1335,7 +1335,7 @@ msgstr "troll horn" msgctxt "spellinfo" msgid "great_drought" -msgstr " This powerful ritual opens a gate to the elemental plane of fire. A great drought comes over the land. Farmers, animals and plants of the region are fighting for survival, but only half of all living things will be able to survive a drought like this. The region will suffer the consequences of such a drought for years to come. " +msgstr "This powerful ritual opens a gate to the elemental plane of fire. A great drought comes over the land. Farmers, animals and plants of the region are fighting for survival, but only half of all living things will be able to survive a drought like this. The region will suffer the consequences of such a drought for years to come." msgid "fog" msgstr "fog" @@ -1572,7 +1572,7 @@ msgstr "black " msgctxt "spellinfo" msgid "magic_roots" -msgstr " Through a elaborate ritual a druid permanently channels a fragment of his power into the soil and the forests of the region. This forever changes the equilibrium of nature in the region. From this point on only the fierce but strong mallorn trees will grow there. " +msgstr "Through a elaborate ritual a druid permanently channels a fragment of his power into the soil and the forests of the region. This forever changes the equilibrium of nature in the region. From this point on only the fierce but strong mallorn trees will grow there." msgctxt "race" msgid "undead_d" @@ -1674,11 +1674,11 @@ msgid "fetch_astral" msgstr "Call of Reality" msgid "nr_mourning" -msgstr " (in mourning)" +msgstr "(in mourning)" msgctxt "spellinfo" msgid "analyse_object" -msgstr " Like creatures ships, buildings and even regions also have their own song, even though it's faint and harder to hear. Like it can be discerned from the life song of a person, if the person is affected by a spell, it can also be done for ships, buildings and regions. " +msgstr "Like creatures ships, buildings and even regions also have their own song, even though it's faint and harder to hear. Like it can be discerned from the life song of a person, if the person is affected by a spell, it can also be done for ships, buildings and regions." msgctxt "race" msgid "shadowbat_x" @@ -1704,7 +1704,7 @@ msgstr "eye of dragon" msgctxt "spellinfo" msgid "fetch_astral" -msgstr "A magician in the material world can summon units from the adjacent part of the astral plane. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will. " +msgstr "A magician in the material world can summon units from the adjacent part of the astral plane. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will." msgid "chainmail_p" msgstr "chainmails" @@ -1816,7 +1816,7 @@ msgstr "LOCALE" msgctxt "spellinfo" msgid "song_suscept_magic" -msgstr " This song, which is woven into the magical essence of the region, weakens the natural resistance against a singular enchantment by 15%. Only the allies of the bard (HELP GUARD) are immune to the effect of the chant. " +msgstr "This song, which is woven into the magical essence of the region, weakens the natural resistance against a singular enchantment by 15%. Only the allies of the bard (HELP GUARD) are immune to the effect of the chant." msgid "plate" msgstr "platemail" @@ -2110,7 +2110,7 @@ msgstr "Rank:" msgctxt "spellinfo" msgid "stonegolem" -msgstr "'Take a flawless block of crystaline stone and humidify it with a vial of Water of Life until the potion has been soaked up completely. Then focus your power on the forming aura of life and shape a container for the unbound forces'. The more power a magician invests, the more golems can be created before the aura dissipates. Every week, there is a 10 percent chance that the golem will crumble to dust. If you command a golem to 'MAKE CASTLE' or 'MAKE ROAD', it will turn itself into 4 stones that it uses in construction, and disintegrate afterwards. " +msgstr "'Take a flawless block of crystaline stone and humidify it with a vial of Water of Life until the potion has been soaked up completely. Then focus your power on the forming aura of life and shape a container for the unbound forces'. The more power a magician invests, the more golems can be created before the aura dissipates. Every week, there is a 10 percent chance that the golem will crumble to dust. If you command a golem to 'MAKE CASTLE' or 'MAKE ROAD', it will turn itself into 4 stones that it uses in construction, and disintegrate afterwards." msgid "dolphin" msgstr "dolphin" @@ -2213,7 +2213,7 @@ msgstr "The peasant love potion enamors both Man and Woman to the same degree an msgctxt "describe" msgid "p13" -msgstr "One of the most rare and prized of all alchemist elixers, this potion grants the user a dragon's power for a few weeks. The potion increases the life-energy of a maximum of ten people fivefold. The effect is strongest right after drinking and slowly decreases over time. To brew this potion the alchemist needs an elvendear, a windbag, a piece of waterfinder and a spider ivy. Finally he dusts it with some minced bubblemorel and stirrs the powder into some dragon's blood. " +msgstr "One of the most rare and prized of all alchemist elixers, this potion grants the user a dragon's power for a few weeks. The potion increases the life-energy of a maximum of ten people fivefold. The effect is strongest right after drinking and slowly decreases over time. To brew this potion the alchemist needs an elvendear, a windbag, a piece of waterfinder and a spider ivy. Finally he dusts it with some minced bubblemorel and stirrs the powder into some dragon's blood." msgid "an_unknown_curse" msgstr "an unknown curse" @@ -2412,7 +2412,7 @@ msgstr "eagle" msgctxt "spellinfo" msgid "calm_riot" -msgstr " By means of this magical chant the mage can calm a rioting region. The peasant mobs will disperse and return to their fields. " +msgstr "By means of this magical chant the mage can calm a rioting region. The peasant mobs will disperse and return to their fields." msgctxt "race" msgid "stonegolem" @@ -2745,7 +2745,7 @@ msgstr "Song of Slavery" msgctxt "spellinfo" msgid "song_of_confusion" -msgstr "If is used before battle, this chant, taken from the ancient tunes of the cats, might give you the critical tactical advantage. Those under the spell's influence will act uncoordinated and inconsequent due to the nonsensical ideas planted into their minds through the melody. So it is supposed to have come to pass that well-organized armies found their archers up at the front (while the cavalry was back at the camp playing cards) or that even a famous general overslept a battle in his tent, as tale-tellers claim it really happened during the Great Wars in the Old World. " +msgstr "If is used before battle, this chant, taken from the ancient tunes of the cats, might give you the critical tactical advantage. Those under the spell's influence will act uncoordinated and inconsequent due to the nonsensical ideas planted into their minds through the melody. So it is supposed to have come to pass that well-organized armies found their archers up at the front (while the cavalry was back at the camp playing cards) or that even a famous general overslept a battle in his tent, as tale-tellers claim it really happened during the Great Wars in the Old World." msgctxt "border" msgid "gate_locked" @@ -2907,7 +2907,7 @@ msgstr "ERESSEA" msgctxt "spellinfo" msgid "airship" -msgstr "These magic runes allow a boat with a capacity of up to 50 weight units to fly for a week and allow the boat to cross land. The enchanted ink's components include a windbag and a snowcrystal petal. " +msgstr "These magic runes allow a boat with a capacity of up to 50 weight units to fly for a week and allow the boat to cross land. The enchanted ink's components include a windbag and a snowcrystal petal." msgid "bagpipeoffear_p" msgstr "bagpipes of fear" @@ -2944,7 +2944,7 @@ msgstr "Astral Gaze" msgctxt "iteminfo" msgid "skillpotion" -msgstr " The recipe of this potion is a well kept secret. Some even say it couldn't be brewed by mere mortals. One thing is certain though, the drinker receives further insight into any learned skills, which furthers their progress towards the mastery of those skills. " +msgstr "The recipe of this potion is a well kept secret. Some even say it couldn't be brewed by mere mortals. One thing is certain though, the drinker receives further insight into any learned skills, which furthers their progress towards the mastery of those skills." msgctxt "keyword" msgid "cast" @@ -2963,7 +2963,7 @@ msgstr "dwarf" msgctxt "spellinfo" msgid "irongolem" -msgstr "The more power a magician invests, the more golems can be created before the aura dissipates. Each golem has a 15% chance per week to turn to dust. If you command a golem to 'MAKE SWORD/MAKE CLAYMORE' or 'MAKE SHIELD/CHAINMAIL/PLATEMAIL',it will work 5 iron ingots and disintegrate afterwards. " +msgstr "The more power a magician invests, the more golems can be created before the aura dissipates. Each golem has a 15% chance per week to turn to dust. If you command a golem to 'MAKE SWORD/MAKE CLAYMORE' or 'MAKE SHIELD/CHAINMAIL/PLATEMAIL',it will work 5 iron ingots and disintegrate afterwards." msgid "cookie_p" msgstr "cookies" @@ -3087,7 +3087,7 @@ msgstr "permauras" msgctxt "spellinfo" msgid "song_of_peace" -msgstr " This powerful spell prevents any attacks. Noone in the entire region will be able to raise his weapon against another. The effect can last for weeks. " +msgstr "This powerful spell prevents any attacks. Noone in the entire region will be able to raise his weapon against another. The effect can last for weeks." msgctxt "spell" msgid "nocostbuilding" @@ -3189,7 +3189,7 @@ msgstr "Acceleration" msgctxt "spellinfo" msgid "clone" -msgstr " This powerful spell can keep the mage from certain death. The mage creates a clone of himself from a small blood sample and puts it into a bath of dragon's blood and thinned water of life. Subsequently he transfers a fragment of his soul into the clone in a complex ritual. If the mage dies afterwards, his soul takes possession of the clone which will serve as his new vessel. There is however a small chance the soul is to weak to reach the vessel in the wake of the mage's death. " +msgstr "This powerful spell can keep the mage from certain death. The mage creates a clone of himself from a small blood sample and puts it into a bath of dragon's blood and thinned water of life. Subsequently he transfers a fragment of his soul into the clone in a complex ritual. If the mage dies afterwards, his soul takes possession of the clone which will serve as his new vessel. There is however a small chance the soul is to weak to reach the vessel in the wake of the mage's death." msgctxt "race" msgid "elf_p" @@ -3200,7 +3200,7 @@ msgstr "elven horses" msgctxt "spellinfo" msgid "frighten" -msgstr " This warsong sows panic among the enemy front line and weakens their fighting strength significantly. Fear will weaken their sword arm and dread will freeze their shield arm. " +msgstr "This warsong sows panic among the enemy front line and weakens their fighting strength significantly. Fear will weaken their sword arm and dread will freeze their shield arm." msgctxt "keyword" msgid "ride" @@ -3393,7 +3393,7 @@ msgstr "krakens" msgctxt "spellinfo" msgid "sleep" -msgstr "This spell causes several enemies to fall asleep. Sleeping warriors don't attack and defend themselves worse than normal, but they'll wake up if they get hit during combat. " +msgstr "This spell causes several enemies to fall asleep. Sleeping warriors don't attack and defend themselves worse than normal, but they'll wake up if they get hit during combat." msgctxt "spellinfo" msgid "tiredsoldiers" @@ -3502,7 +3502,7 @@ msgstr "shields" msgctxt "spellinfo" msgid "melancholy" -msgstr " With this chant the bard spreads a melancholic, sad mood among the peasants. For a few weeks they will retreat to their huts and not spend any silver in the theatres and taverns. " +msgstr "With this chant the bard spreads a melancholic, sad mood among the peasants. For a few weeks they will retreat to their huts and not spend any silver in the theatres and taverns." msgctxt "spell" msgid "earn_silver#gwyrrd" @@ -3778,7 +3778,7 @@ msgstr "AFTER" msgctxt "spellinfo" msgid "seduction" -msgstr " With this song a unit can be bewitched in a manner, which compels them to bequeath a large portion of their possessions to the bard. They will keep enough for their own survival, though. " +msgstr "With this song a unit can be bewitched in a manner, which compels them to bequeath a large portion of their possessions to the bard. They will keep enough for their own survival, though." msgctxt "race" msgid "dwarf_d" @@ -3985,7 +3985,7 @@ msgstr "a solid wall" msgctxt "spellinfo" msgid "double_time" -msgstr "Abstract theories of space and time at last find practical application in this spell which warps the very fabric of time around a person. Such a person has twice as many movement points and doubles their attacks per round for a few weeks." +msgstr "Abstract theories of space and time at last find practical application in this spell which warps the very fabric of time around a person. Such a person has twice as many movement points and doubles their attacks per round for a few weeks." msgctxt "race" msgid "direwolf" @@ -4260,7 +4260,7 @@ msgstr "knotroots" msgctxt "spellinfo" msgid "mindblast" -msgstr "With this spell the mentalist directly attacks his enemies' souls. A blast of astral and electrical energy strikes the foes. If a victim fails to resist the magic, he will permanently lose part of his memories. Being the target of this spell for too many times may result in death. " +msgstr "With this spell the mentalist directly attacks his enemies' souls. A blast of astral and electrical energy strikes the foes. If a victim fails to resist the magic, he will permanently lose part of his memories. Being the target of this spell for too many times may result in death." msgid "nr_spell_description" msgstr "Description:" @@ -4378,7 +4378,7 @@ msgstr "wands" msgctxt "spellinfo" msgid "earn_silver#cerddor" -msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 50 silver per level. " +msgstr "The mages of Cerddor truly are the bards of the wizards; they love to use their sorcery to entertain the crowds and to be the center of attention. Even the apprentices study those little magic tricks, which attract and fascinate the people and thus ensnare them into leaving a few coins or more for the artist. By the end of the week, the bard will have earned 50 silver per level." msgctxt "spell" msgid "strength" @@ -4450,7 +4450,7 @@ msgstr "SELL" msgctxt "spellinfo" msgid "auratransfer" -msgstr " With this spell the mage can transfer aura of his own to a mage of the same school with a rate of 2:1 or to a mage of a different school with a rate of 3:1. " +msgstr "With this spell the mage can transfer aura of his own to a mage of the same school with a rate of 2:1 or to a mage of a different school with a rate of 3:1." msgctxt "race" msgid "wyrm" @@ -4479,7 +4479,7 @@ msgstr "aggressive" msgctxt "spellinfo" msgid "song_resist_magic" -msgstr " This magical song, once performed with vigor, will propagate in the region by wandering from mouth to mouth. It will be heard everywhere. How long the song will last in the public perception depends on the bard's skill. Until it is gone it will give him and all his allies (HELP GUARD) a bonus of 15% to their natural resistance to magic. " +msgstr "This magical song, once performed with vigor, will propagate in the region by wandering from mouth to mouth. It will be heard everywhere. How long the song will last in the public perception depends on the bard's skill. Until it is gone it will give him and all his allies (HELP GUARD) a bonus of 15% to their natural resistance to magic." msgctxt "keyword" msgid "contact" @@ -4516,7 +4516,7 @@ msgstr "Hangover" msgctxt "spellinfo" msgid "maelstrom" -msgstr " This ritual summons a mighty water elemental from the depths of the ocean. The elemental creates an enormous maelstrom which damages any passing ships. " +msgstr "This ritual summons a mighty water elemental from the depths of the ocean. The elemental creates an enormous maelstrom which damages any passing ships." msgid "dolphin_p" msgstr "dolphins" @@ -4529,7 +4529,7 @@ msgstr "NOT" msgctxt "spellinfo" msgid "view_reality" -msgstr " With this spell the mage can glance from the astral to the material plane and recognize regions and units. " +msgstr "With this spell the mage can glance from the astral to the material plane and recognize regions and units." msgid "vortex" msgstr "vortex" @@ -4735,7 +4735,7 @@ msgstr "Create A Bag of Holding" msgctxt "spellinfo" msgid "orkdream" -msgstr "This spell - whose use is forbidden in most cultures - creates an uncontrollable desire for physical love in the victim. The affected persons will rush head over heels into a love affair, unable to think of anything else. Most of them will regret this a few months later... " +msgstr "This spell - whose use is forbidden in most cultures - creates an uncontrollable desire for physical love in the victim. The affected persons will rush head over heels into a love affair, unable to think of anything else. Most of them will regret this a few months later..." msgctxt "spell" msgid "hail" @@ -4851,7 +4851,7 @@ msgstr "claymore" msgctxt "spellinfo" msgid "show_astral" -msgstr " The mage kann glance in the astral plane for a short time and perceives all units within an astral radius of level/5 regions. " +msgstr "The mage kann glance in the astral plane for a short time and perceives all units within an astral radius of level/5 regions." msgctxt "race" msgid "demon_d" @@ -4891,7 +4891,7 @@ msgstr "lynx" msgctxt "spellinfo" msgid "cerddor_destroymagic" -msgstr " Every enchantment influences the life song, weakens and distorts it. The skillful bard can try to catch the life song, to strengthen it and cleanse the alteration from the song. " +msgstr "Every enchantment influences the life song, weakens and distorts it. The skillful bard can try to catch the life song, to strengthen it and cleanse the alteration from the song." msgctxt "spellinfo" msgid "treegrow" @@ -5052,7 +5052,7 @@ msgstr "Warnings and Errors" msgctxt "spellinfo" msgid "protective_runes" -msgstr " Drawn on the walls of a building or on the planks of a ship these runes will protect it from magic influence. Every ritual increases the resistance of the building or ship against enchantments by 20%. The effect can be increased by performing the ritual multiple times, but perfect protection is unlikely. The runes last at least three weeks, depending on the mage's skill maybe much longer. " +msgstr "Drawn on the walls of a building or on the planks of a ship these runes will protect it from magic influence. Every ritual increases the resistance of the building or ship against enchantments by 20%. The effect can be increased by performing the ritual multiple times, but perfect protection is unlikely. The runes last at least three weeks, depending on the mage's skill maybe much longer." msgctxt "race" msgid "ghast" @@ -5072,7 +5072,7 @@ msgstr "RESEARCH" msgctxt "spellinfo" msgid "song_of_healing" -msgstr "The field medic isn't the only one capable of tending the wounds of battle. The bards know a number of magic melodies to enhance the natural healing process of the body. This song is able to close wounds, mend fractured bones and even regenerate lost lims. " +msgstr "The field medic isn't the only one capable of tending the wounds of battle. The bards know a number of magic melodies to enhance the natural healing process of the body. This song is able to close wounds, mend fractured bones and even regenerate lost lims." msgctxt "coast" msgid "nw" @@ -5254,7 +5254,7 @@ msgstr "ocean" msgctxt "spellinfo" msgid "headache" -msgstr " Transcript to the lecture of Selen Ard'Ragorn in Bar'Glingal: 'It is said, this spell had its beginnings in the drinking holes of the Westgassen, but every other disreputable quarter is just as likely. Its most important ingredient is about a cask of terrible wine, the cheaper and more unbecoming, the more effective will be the essence. The art to distill this wine into pure essence is far more demanding than the simple brewery of an alchemist. Even more so to bind and conserve it, preventing its natural tendency to evaporate. This can only be accomplished by a master of Cerddor. Say, you manage to produce a vial of this ruby red, shimmering - well, not fluid, but also not exactly vapor - let's call it elixir. More challenges still lie ahead. The effective properties of the elixir are quick to dissipate. Therefore it has to be dribbled into the drink of the chosen victim within days. That is when you masters of infatuation and seduction can truly proof your worth. But take care not to drink of the concoction yourselves, for one taste will ensnare you to the tastes of wine and you will spend a full week on a bender. And as sure as day follows night, a dreadful agony will claim your head afterwards. You will lose knowledge of your best skill, two weeks worth of study just gone. Another word of warning: this spell is very complex. Should you try further spells during the same week, they will be far more difficult to perform.' " +msgstr "Transcript to the lecture of Selen Ard'Ragorn in Bar'Glingal: 'It is said, this spell had its beginnings in the drinking holes of the Westgassen, but every other disreputable quarter is just as likely. Its most important ingredient is about a cask of terrible wine, the cheaper and more unbecoming, the more effective will be the essence. The art to distill this wine into pure essence is far more demanding than the simple brewery of an alchemist. Even more so to bind and conserve it, preventing its natural tendency to evaporate. This can only be accomplished by a master of Cerddor. Say, you manage to produce a vial of this ruby red, shimmering - well, not fluid, but also not exactly vapor - let's call it elixir. More challenges still lie ahead. The effective properties of the elixir are quick to dissipate. Therefore it has to be dribbled into the drink of the chosen victim within days. That is when you masters of infatuation and seduction can truly proof your worth. But take care not to drink of the concoction yourselves, for one taste will ensnare you to the tastes of wine and you will spend a full week on a bender. And as sure as day follows night, a dreadful agony will claim your head afterwards. You will lose knowledge of your best skill, two weeks worth of study just gone. Another word of warning: this spell is very complex. Should you try further spells during the same week, they will be far more difficult to perform.'" msgctxt "keyword" msgid "sabotage" @@ -5379,7 +5379,7 @@ msgstr "This complicated but effective spell uses the Elemental Spirits of Stone msgctxt "spellinfo" msgid "armor_shield" -msgstr " This ritual, to be performed before battle, gives the own troops an added bonus to their armor. Every hit reduces the strength of the spell until it dissipates during battle. " +msgstr "This ritual, to be performed before battle, gives the own troops an added bonus to their armor. Every hit reduces the strength of the spell until it dissipates during battle." msgid "desert_trail" msgstr "the deserts of %s" @@ -5440,7 +5440,7 @@ msgstr "laen" msgctxt "spellinfo" msgid "incite_riot" -msgstr " By means of this magical chant the mage incites riots in a region. Rebelling peasant mobs prevent taxation and recruiting and almost noone will pay money for entertainment. After a few weeks the mob will calm down again. " +msgstr "By means of this magical chant the mage incites riots in a region. Rebelling peasant mobs prevent taxation and recruiting and almost noone will pay money for entertainment. After a few weeks the mob will calm down again." msgid "longboat" msgstr "longboat" @@ -5504,7 +5504,7 @@ msgstr "oil" msgctxt "spellinfo" msgid "pull_astral" -msgstr "A magician in the astral plane can summon units from the material world. The magician can bring (level-3)*15 GE through the temporary portal. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will. " +msgstr "A magician in the astral plane can summon units from the material world. The magician can bring (level-3)*15 GE through the temporary portal. If he is experienced enough to cast the spell at at least level 13, he can even summon units against their will." msgid "smod_far" msgstr "far" diff --git a/src/report.c b/src/report.c index 4aee1eb2c..7e47d609b 100644 --- a/src/report.c +++ b/src/report.c @@ -1037,6 +1037,9 @@ void report_region(struct stream *out, const region * r, faction * f) if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); if (is_mourning(r, turn + 1)) { + bytes = (int)str_strlcpy(bufp, " ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_mourning"), size); if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); @@ -1877,6 +1880,9 @@ nr_building(struct stream *out, const region *r, const building *b, const factio } if (!building_finished(b)) { + bytes = (int)str_strlcpy(bufp, " ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); bytes = (int)str_strlcpy(bufp, LOC(lang, "nr_building_inprogress"), size); if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); diff --git a/src/util/strings.c b/src/util/strings.c index 8c3165bf7..e1fa3569e 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -111,7 +111,8 @@ size_t str_slprintf(char * dst, size_t size, const char * format, ...) return (size_t)result; } -void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, const char *value) +void str_replace(char *buffer, size_t size, const char *tmpl, const char *var, + const char *value) { size_t val_len = strlen(value); size_t var_len = strlen(var); @@ -154,8 +155,7 @@ int str_hash(const char *s) return key & 0x7FFFFFFF; } -const char *str_escape(const char *str, char *buffer, - size_t len) +const char *str_escape(const char *str, char *buffer, size_t len) { const char *handle_start = strchr(str, '\"'); if (!handle_start) handle_start = strchr(str, '\\'); From dfa0ff09d1256995474d3e161922f936223b8244 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 19 May 2018 20:53:51 +0200 Subject: [PATCH 220/231] Suppress some false positive coverity results. It apparently does not understand CuTest code well? Add a check for Lua eff_skill binding. --- scripts/tests/e2/e2features.lua | 10 ++++++++++ src/economy.test.c | 5 ++++- src/give.test.c | 16 ++++++++++++---- src/kernel/messages.test.c | 7 +++++-- src/kernel/order.test.c | 2 ++ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/scripts/tests/e2/e2features.lua b/scripts/tests/e2/e2features.lua index 776537671..4758fce39 100644 --- a/scripts/tests/e2/e2features.lua +++ b/scripts/tests/e2/e2features.lua @@ -486,3 +486,13 @@ function test_rising_undead() assert_equal(2, u.number) assert_equal(u.number, u:get_item('rustysword')) end + +function test_dwarf_mining() + local f = faction.create('dwarf') + local r = region.create(0, 0, 'plain') + local u = unit.create(f, r) + u.name = 'Xolgrim' + u:set_skill('mining', 2) + assert_equal(2, u:get_skill('mining')) + assert_equal(4, u:eff_skill('mining')) +end diff --git a/src/economy.test.c b/src/economy.test.c index 3b5745be4..f734c0090 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -85,13 +85,15 @@ static void test_steal_okay(CuTest * tc) { struct steal env; race *rc; struct terrain_type *ter; + message *msg; test_setup(); ter = test_create_terrain("plain", LAND_REGION); rc = test_create_race("human"); rc->flags = 0; setup_steal(&env, ter, rc); - CuAssertPtrEquals(tc, 0, steal_message(env.u, 0)); + CuAssertPtrEquals(tc, NULL, msg = steal_message(env.u, 0)); + msg_release(msg); test_teardown(); } @@ -739,6 +741,7 @@ static void test_expand_production(CuTest *tc) { CuAssertPtrEquals(tc, u, results[0]->unit); CuAssertPtrEquals(tc, u, results[1]->unit); CuAssertIntEquals(tc, 0, u->n); + free(results); test_teardown(); } diff --git a/src/give.test.c b/src/give.test.c index d02c27e6f..fb5095f06 100644 --- a/src/give.test.c +++ b/src/give.test.c @@ -40,12 +40,15 @@ static void setup_give(struct give *env) { env->r = test_create_region(0, 0, ter); env->src = test_create_unit(env->f1, env->r); - env->dst = env->f2 ? test_create_unit(env->f2, env->r) : 0; env->itype = it_get_or_create(rt_get_or_create("money")); env->itype->flags |= ITF_HERB; - if (env->f1 && env->f2) { + if (env->f2) { ally * al = ally_add(&env->f2->allies, env->f1); al->status = HELP_GIVE; + env->dst = test_create_unit(env->f2, env->r); + } + else { + env->dst = NULL; } if (env->lang) { locale_setstring(env->lang, env->itype->rtype->_name, "SILBER"); @@ -139,10 +142,12 @@ static void test_give_unit_to_ocean(CuTest * tc) { static void test_give_men(CuTest * tc) { struct give env = { 0 }; + message * msg; test_setup_ex(tc); env.f2 = env.f1 = test_create_faction(NULL); setup_give(&env); - CuAssertPtrEquals(tc, 0, give_men(1, env.src, env.dst, NULL)); + CuAssertPtrEquals(tc, NULL, msg = give_men(1, env.src, env.dst, NULL)); + msg_release(msg); CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 0, env.src->number); test_teardown(); @@ -222,10 +227,13 @@ static void test_give_men_in_ocean(CuTest * tc) { static void test_give_men_too_many(CuTest * tc) { struct give env = { 0 }; + message * msg; + test_setup_ex(tc); env.f2 = env.f1 = test_create_faction(NULL); setup_give(&env); - CuAssertPtrEquals(tc, 0, give_men(2, env.src, env.dst, NULL)); + CuAssertPtrEquals(tc, NULL, msg = give_men(2, env.src, env.dst, NULL)); + msg_release(msg); CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 0, env.src->number); test_teardown(); diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c index c017f6ec1..f068f66e7 100644 --- a/src/kernel/messages.test.c +++ b/src/kernel/messages.test.c @@ -78,6 +78,7 @@ static void test_merge_split(CuTest *tc) { static void test_noerror(CuTest *tc) { unit *u; struct locale *lang; + message *msg; test_setup(); lang = test_create_locale(); @@ -85,8 +86,10 @@ static void test_noerror(CuTest *tc) { u->thisorder = parse_order("!@move", lang); CuAssertIntEquals(tc, K_MOVE | CMD_QUIET | CMD_PERSIST, u->thisorder->command); CuAssertTrue(tc, !is_persistent(u->thisorder)); - CuAssertPtrEquals(tc, NULL, msg_error(u, u->thisorder, 100)); - CuAssertPtrEquals(tc, NULL, msg_feedback(u, u->thisorder, "error_unit_not_found", NULL)); + CuAssertPtrEquals(tc, NULL, msg = msg_error(u, u->thisorder, 100)); + msg_release(msg); + CuAssertPtrEquals(tc, NULL, msg = msg_feedback(u, u->thisorder, "error_unit_not_found", NULL)); + msg_release(msg); test_teardown(); } diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index 585b16798..3f359e834 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -239,6 +239,7 @@ static void test_is_persistent(CuTest *tc) { ord = parse_order("@invalid", lang); CuAssertPtrEquals(tc, NULL, ord); + free_order(ord); ord = parse_order("give", lang); CuAssertIntEquals(tc, K_GIVE, ord->command); @@ -290,6 +291,7 @@ static void test_is_silent(CuTest *tc) { ord = parse_order("@invalid", lang); CuAssertPtrEquals(tc, NULL, ord); + free_order(ord); ord = parse_order("// comment", lang); CuAssertTrue(tc, is_persistent(ord)); From 9a481d7e15ffbca46460e9fa48bd2cd6f9259971 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 19 May 2018 20:56:21 +0200 Subject: [PATCH 221/231] small clibs change --- clibs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clibs b/clibs index 147584ad7..f9842e07a 160000 --- a/clibs +++ b/clibs @@ -1 +1 @@ -Subproject commit 147584ad70b220abf6a4e97ca76e785729b9ac32 +Subproject commit f9842e07a442c5453c270badf25ab72633b4edf5 From b3b19e7c8327775fa191f1324d2ac5ca1af350a1 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 19 May 2018 21:01:10 +0200 Subject: [PATCH 222/231] suppress those null-reference bugs in another way, maybe? --- src/economy.test.c | 2 +- src/give.test.c | 4 ++-- src/kernel/messages.test.c | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/economy.test.c b/src/economy.test.c index f734c0090..91d462770 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -93,7 +93,7 @@ static void test_steal_okay(CuTest * tc) { rc->flags = 0; setup_steal(&env, ter, rc); CuAssertPtrEquals(tc, NULL, msg = steal_message(env.u, 0)); - msg_release(msg); + assert(!msg); test_teardown(); } diff --git a/src/give.test.c b/src/give.test.c index fb5095f06..9c07c8cd0 100644 --- a/src/give.test.c +++ b/src/give.test.c @@ -147,7 +147,7 @@ static void test_give_men(CuTest * tc) { env.f2 = env.f1 = test_create_faction(NULL); setup_give(&env); CuAssertPtrEquals(tc, NULL, msg = give_men(1, env.src, env.dst, NULL)); - msg_release(msg); + assert(!msg); CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 0, env.src->number); test_teardown(); @@ -233,7 +233,7 @@ static void test_give_men_too_many(CuTest * tc) { env.f2 = env.f1 = test_create_faction(NULL); setup_give(&env); CuAssertPtrEquals(tc, NULL, msg = give_men(2, env.src, env.dst, NULL)); - msg_release(msg); + assert(!msg); CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 0, env.src->number); test_teardown(); diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c index f068f66e7..3c9c684c6 100644 --- a/src/kernel/messages.test.c +++ b/src/kernel/messages.test.c @@ -7,6 +7,8 @@ #include #include +#include + void test_missing_message(CuTest *tc) { message *msg; @@ -87,9 +89,9 @@ static void test_noerror(CuTest *tc) { CuAssertIntEquals(tc, K_MOVE | CMD_QUIET | CMD_PERSIST, u->thisorder->command); CuAssertTrue(tc, !is_persistent(u->thisorder)); CuAssertPtrEquals(tc, NULL, msg = msg_error(u, u->thisorder, 100)); - msg_release(msg); + assert(!msg); CuAssertPtrEquals(tc, NULL, msg = msg_feedback(u, u->thisorder, "error_unit_not_found", NULL)); - msg_release(msg); + assert(!msg); test_teardown(); } From 226fa2ba08d737eeb1ba659379f1f1f7969e7136 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 20 May 2018 17:11:29 +0200 Subject: [PATCH 223/231] fix crash in region messages. --- src/report.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/report.c b/src/report.c index 7e47d609b..3976bb05b 100644 --- a/src/report.c +++ b/src/report.c @@ -723,8 +723,9 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden int k = 0; struct mlist *m = msgs->begin; while (m) { - /* messagetype * mt = m->type; */ - if (!categorized || strcmp(m->msg->type->section, section) == 0) { + /* categorized messages need a section: */ + assert(!categorized || (m->msg->type->section != NULL)); + if (!categorized || m->msg->type->section == section) { char lbuf[8192]; if (!k && categorized) { @@ -2312,11 +2313,11 @@ report_plaintext(const char *filename, report_context * ctx, message_list *mlist = r_getmessages(r, f); if (mlist) { struct mlist **split = merge_messages(mlist, r->msgs); - rp_messages(out, mlist, f, 0, true); + rp_messages(out, mlist, f, 0, false); split_messages(mlist, split); } else { - rp_messages(out, r->msgs, f, 0, true); + rp_messages(out, r->msgs, f, 0, false); } } From 60a86e7b2f6bee685db7d4a80609a6f5d8ee4720 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 21 May 2018 13:27:02 +0200 Subject: [PATCH 224/231] escaping a string for use in CR needs to only replace quotes and backslashes. --- src/creport.c | 2 +- src/kernel/order.c | 11 ++- src/kernel/order.h | 1 + src/kernel/order.test.c | 53 +++++++++++ src/modules/gmcmd.c | 2 +- src/monsters.c | 4 +- src/util/strings.c | 190 +++++++++++++++++++++++++++++++++++++--- src/util/strings.h | 3 +- src/util/strings.test.c | 22 ++++- 9 files changed, 266 insertions(+), 22 deletions(-) diff --git a/src/creport.c b/src/creport.c index 17cf60fdb..eeaa563bb 100644 --- a/src/creport.c +++ b/src/creport.c @@ -517,7 +517,7 @@ static void report_crtypes(FILE * F, const struct locale *lang) assert(hash > 0); fprintf(F, "MESSAGETYPE %d\n", hash); fputc('\"', F); - fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F); + fputs(crescape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F); fputs("\";text\n", F); fprintf(F, "\"%s\";section\n", kmt->mtype->section); } diff --git a/src/kernel/order.c b/src/kernel/order.c index b7da372c1..e660edf81 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -110,6 +110,15 @@ char* get_command(const order *ord, const struct locale *lang, char *sbuffer, si return sbuffer; } +const char *crescape(const char *str, char *buffer, size_t size) { + const char *replace = "\"\\"; + const char * pos = strpbrk(str, replace); + if (!pos) { + return str; + } + return str_escape_ex(str, buffer, size, replace); +} + int stream_order(struct stream *out, const struct order *ord, const struct locale *lang, bool escape) { const char *text; @@ -151,7 +160,7 @@ int stream_order(struct stream *out, const struct order *ord, const struct local char obuf[1024]; swrite(" ", 1, 1, out); if (escape) { - text = str_escape(text, obuf, sizeof(obuf)); + text = crescape(text, obuf, sizeof(obuf)); } swrite(text, 1, strlen(text), out); } diff --git a/src/kernel/order.h b/src/kernel/order.h index 02e03ff56..b0d771b67 100644 --- a/src/kernel/order.h +++ b/src/kernel/order.h @@ -67,6 +67,7 @@ extern "C" { bool is_exclusive(const order * ord); bool is_repeated(keyword_t kwd); bool is_long(keyword_t kwd); + const char *crescape(const char *str, char *buffer, size_t size); char *write_order(const order * ord, const struct locale *lang, char *buffer, size_t size); diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index 3f359e834..1d97578ee 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -14,6 +14,7 @@ #include #include #include +#include static void test_create_order(CuTest *tc) { char cmd[32]; @@ -484,10 +485,62 @@ static void test_study_order_unknown_quoted(CuTest *tc) { test_teardown(); } +static void test_create_order_long(CuTest *tc) { + char buffer[2048]; + order *ord; + size_t len; + struct locale *lang; + stream out; + const char * longstr = "// BESCHREIBEN EINHEIT \"In weià ƒ ƒ ƒ ƒ ƒ ƒ &#" + "131;ƒƒƒƒƒƒ?e Gewà " + "1;ƒƒƒƒƒƒƒƒƒÃƒƒƒ" + "ƒƒƒƒƒƒƒƒƒÃƒƒƒ&#" + "131;ƒƒƒƒƒƒ‚à " + "1;ƒƒƒƒ‚Ã" + "ƒ‚ÂÃ&" + "#131;ƒƒƒ‚ÂÃ&#" + "131;ƒƒ‚ÂÂÃ&#" + "130;¢‚Ã&" + "#131;ƒ‚Ã" + "31;‚Âà " + "1;ƒƒƒƒƒƒƒ‚Ã" + "ƒƒƒ‚[...]hB��2�xa�Hv$P�xa��A���A��"; + test_setup(); + lang = test_create_locale(); + ord = parse_order(longstr, lang); + len = strlen(longstr); + CuAssertIntEquals(tc, 0, ord->command); + mstream_init(&out); + stream_order(&out, ord, lang, true); + out.api->rewind(out.handle); + out.api->readln(out.handle, buffer, sizeof(buffer)); + mstream_done(&out); + free_order(ord); + test_teardown(); +} + +static void test_crescape(CuTest *tc) { + char buffer[16]; + const char *input = "12345678901234567890"; + + CuAssertStrEquals(tc, "1234", crescape("1234", buffer, 16)); + CuAssertPtrEquals(tc, (void *)input, (void *)crescape(input, buffer, 16)); + + CuAssertStrEquals(tc, "\\\"1234\\\"", crescape("\"1234\"", buffer, 16)); + CuAssertStrEquals(tc, "\\\"1234\\\"", buffer); + + CuAssertStrEquals(tc, "\\\"1234", crescape("\"1234\"", buffer, 8)); + + /* unlike in C strings, only " and \ are escaped: */ + CuAssertStrEquals(tc, "\\\"\\\\\n\r\'", crescape("\"\\\n\r\'", buffer, 16)); +} + CuSuite *get_order_suite(void) { CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_crescape); SUITE_ADD_TEST(suite, test_create_order); + SUITE_ADD_TEST(suite, test_create_order_long); SUITE_ADD_TEST(suite, test_study_orders); SUITE_ADD_TEST(suite, test_study_order); SUITE_ADD_TEST(suite, test_study_order_unknown); diff --git a/src/modules/gmcmd.c b/src/modules/gmcmd.c index 401879cd6..20e090114 100644 --- a/src/modules/gmcmd.c +++ b/src/modules/gmcmd.c @@ -46,7 +46,7 @@ static int read_permissions(variant *var, void *owner, struct gamedata *data) { - attrib *a; + attrib *a = NULL; UNUSED_ARG(var); read_attribs(data, &a, owner); a_remove(&a, a); diff --git a/src/monsters.c b/src/monsters.c index 00a733677..be4ec7525 100644 --- a/src/monsters.c +++ b/src/monsters.c @@ -172,8 +172,8 @@ static order *monster_attack(unit * u, const unit * target) if (monster_is_waiting(u)) return NULL; - if (u->region->land) { - assert(u->region->flags & RF_GUARDED); + if (u->region->land && (u->region->flags & RF_GUARDED) == 0) { + return NULL; } return create_order(K_ATTACK, u->faction->locale, "%i", target->no); } diff --git a/src/util/strings.c b/src/util/strings.c index e1fa3569e..92385a88f 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -20,9 +20,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #endif #include "strings.h" -#include "assert.h" /* libc includes */ +#include #include #include #include @@ -155,27 +155,28 @@ int str_hash(const char *s) return key & 0x7FFFFFFF; } -const char *str_escape(const char *str, char *buffer, size_t len) +const char *str_escape_wrong(const char *str, char *buffer, size_t len) { const char *handle_start = strchr(str, '\"'); if (!handle_start) handle_start = strchr(str, '\\'); assert(buffer); if (handle_start) { - const char *p; - char *o; + const char *p = str; + char *o = buffer; size_t skip = handle_start - str; if (skip > len) { skip = len; } - memcpy(buffer, str, skip); - o = buffer + skip; - p = str + skip; - len -= skip; + if (skip > 0) { + memcpy(buffer, str, skip); + o += skip; + p += skip; + len -= skip; + } do { if (*p == '\"' || *p == '\\') { if (len < 2) { - *o = '\0'; break; } (*o++) = '\\'; @@ -183,13 +184,15 @@ const char *str_escape(const char *str, char *buffer, size_t len) } else { if (len < 1) { - *o = '\0'; break; } --len; } - (*o++) = (*p); - } while (*p++); + if (len > 0) { + (*o++) = (*p); + } + } while (len > 0 && *p++); + *o = '\0'; return buffer; } return str; @@ -306,3 +309,166 @@ char *str_unescape(char *str) { } return str; } + +const char *str_escape_ex(const char *str, char *buffer, size_t size, const char *chars) +{ + const char *read = str; + char *write = buffer; + if (size < 1) return NULL; + while (size > 1 && *read) { + const char *pos = strpbrk(read, chars); + size_t len = size; + if (pos) { + len = pos - read; + } + if (len < size) { + unsigned char ch = *(const unsigned char *)pos; + if (len > 0) { + memmove(write, read, len); + write += len; + read += len; + size -= len; + } + switch (ch) { + case '\t': + if (size > 2) { + *write++ = '\\'; + *write++ = 't'; + size -= 2; + } + else size = 1; + break; + case '\n': + if (size > 2) { + *write++ = '\\'; + *write++ = 'n'; + size -= 2; + } + else size = 1; + break; + case '\r': + if (size > 2) { + *write++ = '\\'; + *write++ = 'r'; + size -= 2; + } + else size = 1; + break; + case '\"': + case '\'': + case '\\': + if (size > 2) { + *write++ = '\\'; + *write++ = ch; + size -= 2; + } + break; + default: + if (size > 5) { + int n = sprintf(write, "\\%03o", ch); + if (n > 0) { + assert(n == 5); + write += n; + size -= n; + } + else size = 1; + } + else size = 1; + } + ++read; + } else { + /* end of buffer space */ + len = size - 1; + if (len > 0) { + memmove(write, read, len); + write += len; + size -= len; + break; + } + } + } + *write = '\0'; + return buffer; +} + +const char *str_escape(const char *str, char *buffer, size_t size) { + return str_escape_ex(str, buffer, size, "\n\t\r\'\"\\"); +} + +const char *str_escape_slow(const char *str, char *buffer, size_t size) { + const char *read = str; + char *write = buffer; + if (size < 1) return NULL; + while (size > 1 && *read) { + size_t len; + const char *pos = read; + while (pos + 1 < read + size && *pos) { + unsigned char ch = *(unsigned char *)pos; + if (iscntrl(ch) || ch == '\"' || ch == '\\' || ch == '\'' || ch == '\n' || ch == '\r' || ch == '\t') { + len = pos - read; + memmove(write, read, len); + write += len; + size -= len; + switch (ch) { + case '\t': + if (size > 2) { + *write++ = '\\'; + *write++ = 't'; + size -= 2; + } + else size = 1; + break; + case '\n': + if (size > 2) { + *write++ = '\\'; + *write++ = 'n'; + size -= 2; + } + else size = 1; + break; + case '\r': + if (size > 2) { + *write++ = '\\'; + *write++ = 'r'; + size -= 2; + } + else size = 1; + break; + case '\"': + case '\'': + case '\\': + if (size > 2) { + *write++ = '\\'; + *write++ = ch; + size -= 2; + } + break; + default: + if (size > 5) { + int n = sprintf(write, "\\%03o", ch); + if (n > 0) { + assert(n == 5); + write += n; + size -= n; + } + else size = 1; + } + else size = 1; + } + assert(size > 0); + read = pos + 1; + break; + } + ++pos; + } + if (read < pos) { + len = pos - read; + memmove(write, read, len); + read = pos; + write += len; + size -= len; + } + } + *write = '\0'; + return buffer; +} diff --git a/src/util/strings.h b/src/util/strings.h index 156f41011..2d93b414e 100644 --- a/src/util/strings.h +++ b/src/util/strings.h @@ -32,7 +32,8 @@ extern "C" { size_t str_strlcat(char *dst, const char *src, size_t len); char *str_strdup(const char *s); - const char *str_escape(const char *str, char *buffer, size_t len); + const char *str_escape(const char *str, char *buffer, size_t size); + const char *str_escape_ex(const char *str, char *buffer, size_t size, const char *chars); char *str_unescape(char *str); unsigned int jenkins_hash(unsigned int a); diff --git a/src/util/strings.test.c b/src/util/strings.test.c index a04d0fe53..b6b0f9696 100644 --- a/src/util/strings.test.c +++ b/src/util/strings.test.c @@ -24,10 +24,24 @@ static void test_str_unescape(CuTest * tc) static void test_str_escape(CuTest * tc) { - char scratch[64]; - CuAssertStrEquals(tc, "12345678901234567890", str_escape("12345678901234567890", scratch, 16)); - CuAssertStrEquals(tc, "123456789\\\"12345", str_escape("123456789\"1234567890", scratch, 16)); - CuAssertStrEquals(tc, "1234567890123456", str_escape("1234567890123456\"890", scratch, 16)); + char scratch[16]; + + CuAssertPtrEquals(tc, NULL, (void *)str_escape("1234", scratch, 0)); + CuAssertStrEquals(tc, "", str_escape("1234", scratch, 1)); + CuAssertStrEquals(tc, "1", str_escape("1234", scratch, 2)); + CuAssertStrEquals(tc, "\\n", str_escape("\n234", scratch, 3)); + + CuAssertStrEquals(tc, "\\n\\r\\t\\\\\\\"\\\'", str_escape("\n\r\t\\\"\'", scratch, 16)); + CuAssertStrEquals(tc, "12345678", str_escape("12345678", scratch, 16)); + CuAssertStrEquals(tc, "123456789012345", str_escape("123456789012345", scratch, 16)); + CuAssertStrEquals(tc, "12345678901234", str_escape("12345678901234\n", scratch, 15)); + CuAssertStrEquals(tc, "123456789012345", str_escape("12345678901234567890", scratch, 16)); + + CuAssertStrEquals(tc, "\\\\\\\"234", str_escape("\\\"234567890", scratch, 8)); + CuAssertStrEquals(tc, "\\\"\\\\234", str_escape("\"\\234567890", scratch, 8)); + CuAssertStrEquals(tc, "123456789012345", str_escape("12345678901234567890", scratch, 16)); + CuAssertStrEquals(tc, "123456789\\\"1234", str_escape("123456789\"1234567890", scratch, 16)); + CuAssertStrEquals(tc, "123456789012345", str_escape("1234567890123456\"890", scratch, 16)); CuAssertStrEquals(tc, "hello world", str_escape("hello world", scratch, sizeof(scratch))); CuAssertStrEquals(tc, "hello \\\"world\\\"", str_escape("hello \"world\"", scratch, sizeof(scratch))); CuAssertStrEquals(tc, "\\\"\\\\", str_escape("\"\\", scratch, sizeof(scratch))); From e53a1caa08f6f875f2acb12506e2d2a5e4ccd327 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 21 May 2018 16:24:08 +0200 Subject: [PATCH 225/231] cleanup unused conde --- src/util/strings.c | 78 ---------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/src/util/strings.c b/src/util/strings.c index 92385a88f..61a28b814 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -394,81 +394,3 @@ const char *str_escape_ex(const char *str, char *buffer, size_t size, const char const char *str_escape(const char *str, char *buffer, size_t size) { return str_escape_ex(str, buffer, size, "\n\t\r\'\"\\"); } - -const char *str_escape_slow(const char *str, char *buffer, size_t size) { - const char *read = str; - char *write = buffer; - if (size < 1) return NULL; - while (size > 1 && *read) { - size_t len; - const char *pos = read; - while (pos + 1 < read + size && *pos) { - unsigned char ch = *(unsigned char *)pos; - if (iscntrl(ch) || ch == '\"' || ch == '\\' || ch == '\'' || ch == '\n' || ch == '\r' || ch == '\t') { - len = pos - read; - memmove(write, read, len); - write += len; - size -= len; - switch (ch) { - case '\t': - if (size > 2) { - *write++ = '\\'; - *write++ = 't'; - size -= 2; - } - else size = 1; - break; - case '\n': - if (size > 2) { - *write++ = '\\'; - *write++ = 'n'; - size -= 2; - } - else size = 1; - break; - case '\r': - if (size > 2) { - *write++ = '\\'; - *write++ = 'r'; - size -= 2; - } - else size = 1; - break; - case '\"': - case '\'': - case '\\': - if (size > 2) { - *write++ = '\\'; - *write++ = ch; - size -= 2; - } - break; - default: - if (size > 5) { - int n = sprintf(write, "\\%03o", ch); - if (n > 0) { - assert(n == 5); - write += n; - size -= n; - } - else size = 1; - } - else size = 1; - } - assert(size > 0); - read = pos + 1; - break; - } - ++pos; - } - if (read < pos) { - len = pos - read; - memmove(write, read, len); - read = pos; - write += len; - size -= len; - } - } - *write = '\0'; - return buffer; -} From 49178d8fc737dbbdddf55665ade0ae457ea0a600 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 21 May 2018 16:38:32 +0200 Subject: [PATCH 226/231] unused variable --- src/kernel/order.test.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c index 1d97578ee..37f88ae5a 100644 --- a/src/kernel/order.test.c +++ b/src/kernel/order.test.c @@ -488,7 +488,6 @@ static void test_study_order_unknown_quoted(CuTest *tc) { static void test_create_order_long(CuTest *tc) { char buffer[2048]; order *ord; - size_t len; struct locale *lang; stream out; const char * longstr = "// BESCHREIBEN EINHEIT \"In weià ƒ ƒ ƒ ƒ ƒ ƒ &#" @@ -508,7 +507,6 @@ static void test_create_order_long(CuTest *tc) { test_setup(); lang = test_create_locale(); ord = parse_order(longstr, lang); - len = strlen(longstr); CuAssertIntEquals(tc, 0, ord->command); mstream_init(&out); stream_order(&out, ord, lang, true); From 9b3b3765798cc8a8caf056f63a159b02a9dec6ea Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 24 May 2018 16:31:01 +0200 Subject: [PATCH 227/231] BUG 2443: Fehlende Leerzeile im Kampfreport. --- res/translations/messages.de.po | 4 ++-- res/translations/messages.en.po | 4 ++-- src/battle.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po index 98800fd31..13fd10c96 100644 --- a/res/translations/messages.de.po +++ b/res/translations/messages.de.po @@ -308,7 +308,7 @@ msgstr "\"$unit($mage) legt einen Schleier um die Ausrüstung von $unit.dative($ msgid "error5" msgstr "\"$unit($unit) in $region($region): '$order($command)' - Das Gebäude gehört uns nicht.\"" -msgid "tactics_lost" +msgid "para_tactics_lost" msgstr "\"$unit($unit) konnte dem Gegner eine Falle stellen.\"" msgid "error_lowstealth" @@ -1052,7 +1052,7 @@ msgstr "\"Diese Region wurde von den Göttern verflucht. Stinkende Nebel ziehen msgid "recruit_archetype" msgstr "\"$unit($unit) rekrutiert $int($amount) $localize($archetype).\"" -msgid "tactics_won" +msgid "para_tactics_won" msgstr "\"$unit($unit) überrascht den Gegner.\"" msgid "raindance_effect" diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po index 9f11a6312..fa795d0f6 100644 --- a/res/translations/messages.en.po +++ b/res/translations/messages.en.po @@ -308,7 +308,7 @@ msgstr "\"$unit($mage) shrouds the equipment of $unit($target) in shadows.\"" msgid "error5" msgstr "\"$unit($unit) in $region($region): '$order($command)' - The building is not ours.\"" -msgid "tactics_lost" +msgid "para_tactics_lost" msgstr "\"$unit($unit) lured the enemy into an ambush.\"" msgid "error_lowstealth" @@ -1052,7 +1052,7 @@ msgstr "\"This region was cursed by the gods. Stinking vapors billow over the de msgid "recruit_archetype" msgstr "\"$unit($unit) recruits $int($amount) $localize($archetype).\"" -msgid "tactics_won" +msgid "para_tactics_won" msgstr "\"$unit($unit) surprises the enemies.\"" msgid "raindance_effect" diff --git a/src/battle.c b/src/battle.c index 1e0924aee..9092718a2 100644 --- a/src/battle.c +++ b/src/battle.c @@ -2960,10 +2960,10 @@ static void print_stats(battle * b) unit *u = tf->unit; message *m = NULL; if (!is_attacker(tf)) { - m = msg_message("tactics_lost", "unit", u); + m = msg_message("para_tactics_lost", "unit", u); } else { - m = msg_message("tactics_won", "unit", u); + m = msg_message("para_tactics_won", "unit", u); } message_all(b, m); msg_release(m); From b353de43deed315cd8be6d27024ddac83ec8fd6d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 24 May 2018 16:35:39 +0200 Subject: [PATCH 228/231] BUG 2443: missing spaces in NR. --- res/translations/strings.de.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po index 871a4ef70..e56e36f55 100644 --- a/res/translations/strings.de.po +++ b/res/translations/strings.de.po @@ -2859,7 +2859,7 @@ msgid "Blut" msgstr "Blut" msgid "nr_guarding_prefix" -msgstr "Die Region wird von" +msgstr "Die Region wird von " msgctxt "race" msgid "giantturtle" @@ -4083,7 +4083,7 @@ msgid "section_newspells" msgstr "Neue Zauber" msgid "nr_borderlist_prefix" -msgstr "Im" +msgstr "Im " msgctxt "race" msgid "greenscarab_d" @@ -4156,7 +4156,7 @@ msgid "seed" msgstr "Same" msgid "nr_nb_next" -msgstr ", im" +msgstr ", im " msgctxt "spellinfo" msgid "undeadhero" @@ -4823,7 +4823,7 @@ msgid "juju_d" msgstr "Juju-Zombies" msgid "nr_guarding_postfix" -msgstr "bewacht." +msgstr " bewacht." msgctxt "border" msgid "fogwall" @@ -5852,7 +5852,7 @@ msgid "clone_of" msgstr "Klon von %s" msgid "travelthru_header" -msgstr "Die Region wurde durchquert von" +msgstr "Die Region wurde durchquert von " msgctxt "race" msgid "template_x" From 95c5c86303b3ab0247770971057b98f6c6dfba04 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 24 May 2018 16:40:50 +0200 Subject: [PATCH 229/231] Bug 2444: set default scores --- src/exparse.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/exparse.c b/src/exparse.c index dfba3f5d0..e6975fc17 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -5,6 +5,8 @@ #include "alchemy.h" +#include "modules/score.h" + #include "kernel/build.h" #include "kernel/building.h" #include "kernel/item.h" @@ -229,6 +231,9 @@ static void handle_item(parseinfo *pi, const XML_Char *el, const XML_Char **attr handle_bad_input(pi, el, attr[i]); } } + if (itype->score == 0) { + itype->score = default_score(itype); + } itype->flags = flags; } From 5af3ac1b40eef162e95d5861ec83831a9780429b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 27 May 2018 15:11:03 +0200 Subject: [PATCH 230/231] reproduce buffer overflow in str_escape_ex --- src/util/strings.test.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/util/strings.test.c b/src/util/strings.test.c index b6b0f9696..2205e538b 100644 --- a/src/util/strings.test.c +++ b/src/util/strings.test.c @@ -22,6 +22,16 @@ static void test_str_unescape(CuTest * tc) CuAssertStrEquals(tc, "\"\\\n\t\ra", scratch); } +static void test_str_escape_ex(CuTest * tc) +{ + char scratch[16]; + + CuAssertPtrEquals(tc, NULL, (void *)str_escape_ex("1234", scratch, 0, "\\\"")); + memset(scratch, 0, sizeof(scratch)); + CuAssertStrEquals(tc, "1234", (void *)str_escape_ex("1234\000abcd", scratch, 16, "\\\"")); + CuAssertIntEquals(tc, 0, scratch[5]); +} + static void test_str_escape(CuTest * tc) { char scratch[16]; @@ -149,6 +159,7 @@ CuSuite *get_strings_suite(void) CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_str_hash); SUITE_ADD_TEST(suite, test_str_escape); + SUITE_ADD_TEST(suite, test_str_escape_ex); SUITE_ADD_TEST(suite, test_str_unescape); SUITE_ADD_TEST(suite, test_str_replace); SUITE_ADD_TEST(suite, test_str_slprintf); From 034872c44e96d3c6cc38633e27dcb36bf2ef28b4 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 27 May 2018 15:15:31 +0200 Subject: [PATCH 231/231] respect the input length when copying in str_escape_ex. --- src/util/strings.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/util/strings.c b/src/util/strings.c index 61a28b814..f4bbd54a5 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -312,10 +312,13 @@ char *str_unescape(char *str) { const char *str_escape_ex(const char *str, char *buffer, size_t size, const char *chars) { + size_t slen = strlen(str); const char *read = str; char *write = buffer; - if (size < 1) return NULL; - while (size > 1 && *read) { + if (size < 1) { + return NULL; + } + while (slen > 0 && size > 1 && *read) { const char *pos = strpbrk(read, chars); size_t len = size; if (pos) { @@ -324,7 +327,11 @@ const char *str_escape_ex(const char *str, char *buffer, size_t size, const char if (len < size) { unsigned char ch = *(const unsigned char *)pos; if (len > 0) { + if (len > slen) { + len = slen; + } memmove(write, read, len); + slen -= len; write += len; read += len; size -= len; @@ -376,13 +383,18 @@ const char *str_escape_ex(const char *str, char *buffer, size_t size, const char else size = 1; } ++read; + --slen; } else { /* end of buffer space */ len = size - 1; if (len > 0) { + if (len > slen) { + len = slen; + } memmove(write, read, len); write += len; size -= len; + slen -= len; break; } }