From a62541a17ea010a6dfb263d3f3bd2e4f48f851c6 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 11 Jun 2018 20:42:28 +0200 Subject: [PATCH 1/3] =?UTF-8?q?BUG=202443:=20Stra=C3=9Fen=20ohne=20kompliz?= =?UTF-8?q?ierte=20String-Bastelei.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/core/messages.xml | 10 ++++++-- res/translations/messages.de.po | 7 ++++-- res/translations/messages.en.po | 7 ++++-- res/translations/strings.de.po | 6 ----- res/translations/strings.en.po | 6 ----- src/kernel/connection.c | 8 +++--- src/kernel/connection.h | 2 +- src/report.c | 43 +++++++++------------------------ 8 files changed, 34 insertions(+), 55 deletions(-) diff --git a/res/core/messages.xml b/res/core/messages.xml index 0f62ccc0c..d566c82e6 100644 --- a/res/core/messages.xml +++ b/res/core/messages.xml @@ -698,10 +698,16 @@ - + - + + + + + + + diff --git a/res/translations/messages.de.po b/res/translations/messages.de.po index 13fd10c96..3413ffc2c 100644 --- a/res/translations/messages.de.po +++ b/res/translations/messages.de.po @@ -1355,8 +1355,11 @@ msgstr "\"Es herrscht eine fröhliche und ausgelassene Stimmung. ($int36($id))\" msgid "buildroad" msgstr "\"$unit($unit) erweitert in $region($region) das Straßennetz um $int($size).\"" -msgid "nr_borderlist_postfix" -msgstr "\"$if($transparent,\" befindet sich\",\" versperrt\") ${object}$if($transparent,\"\",\" die Sicht\").\"" +msgid "nr_border_opaque" +msgstr "Im $direction($dir) verperrt ${object} die Sicht." + +msgid "nr_border_transparent" +msgstr "Im $direction($dir) befindet sich ${object}." msgid "effectstrength" msgstr "\"$unit($mage) erhöht die Körperkraft von $unit.dative($target) beträchtlich.\"" diff --git a/res/translations/messages.en.po b/res/translations/messages.en.po index fa795d0f6..6eaf6f258 100644 --- a/res/translations/messages.en.po +++ b/res/translations/messages.en.po @@ -1355,8 +1355,11 @@ msgstr "\"Everyone in this region seems to be having a very good time. ($int36($ msgid "buildroad" msgstr "\"$unit($unit) extends the road network in $region($region) by $int($size).\"" -msgid "nr_borderlist_postfix" -msgstr "\"$if($transparent,\" there is\",\" sight is blocked by \") ${object}.\"" +msgid "nr_border_opaque" +msgstr "To the $direction($dir), ${object} is blocking the view." + +msgid "nr_border_transparent" +msgstr "To the $direction($dir) is ${object}." msgid "effectstrength" msgstr "\"$unit($mage) increases the strength of $unit($target) dramatically.\"" diff --git a/res/translations/strings.de.po b/res/translations/strings.de.po index 622f4a536..afcceb94b 100644 --- a/res/translations/strings.de.po +++ b/res/translations/strings.de.po @@ -1906,9 +1906,6 @@ msgstr "Mallorn" msgid "castle" msgstr "Burg" -msgid "nr_borderlist_infix" -msgstr ", im " - msgctxt "race" msgid "shadowbat_p" msgstr "Todesflattern" @@ -3706,9 +3703,6 @@ msgctxt "spell" msgid "analyse_object" msgstr "Lied des Ortes analysieren" -msgid "nr_borderlist_lastfix" -msgstr "und im " - msgctxt "race" msgid "shadowknight_d" msgstr "Schattenrittern" diff --git a/res/translations/strings.en.po b/res/translations/strings.en.po index 8629d5f5e..c8bd637db 100644 --- a/res/translations/strings.en.po +++ b/res/translations/strings.en.po @@ -1642,9 +1642,6 @@ msgstr "mallorn" msgid "castle" msgstr "castle" -msgid "nr_borderlist_infix" -msgstr ", to the " - msgctxt "race" msgid "shadowbat_p" msgstr "darkbats" @@ -3261,9 +3258,6 @@ msgctxt "spell" msgid "analyse_object" msgstr "Analysis" -msgid "nr_borderlist_lastfix" -msgstr ", and to the " - msgctxt "race" msgid "shadowknight_d" msgstr "shadow knights" diff --git a/src/kernel/connection.c b/src/kernel/connection.c index 014fce9d8..213700fe1 100644 --- a/src/kernel/connection.c +++ b/src/kernel/connection.c @@ -188,7 +188,7 @@ border_type *find_bordertype(const char *name) { border_type *bt = bordertypes; - while (bt && strcmp(bt->__name, name)!=0) + while (bt && strcmp(bt->_name, name)!=0) bt = bt->next; return bt; } @@ -563,7 +563,7 @@ void write_borders(struct storage *store) for (b = bhash; b != NULL; b = b->next) { if (b->type->valid && !b->type->valid(b)) continue; - WRITE_TOK(store, b->type->__name); + WRITE_TOK(store, b->type->_name); WRITE_INT(store, b->id); WRITE_INT(store, b->from->uid); WRITE_INT(store, b->to->uid); @@ -614,7 +614,7 @@ int read_borders(gamedata *data) if (to == from && from) { direction_t dir = (direction_t)(rng_int() % MAXDIRECTIONS); region *r = rconnect(from, dir); - log_error("[read_borders] invalid %s in %s\n", type->__name, regionname(from, NULL)); + log_error("[read_borders] invalid %s in %s\n", type->_name, regionname(from, NULL)); if (r != NULL) to = r; } @@ -633,5 +633,5 @@ int read_borders(gamedata *data) } const char * border_name(const connection *co, const struct region * r, const struct faction * f, int flags) { - return (co->type->name) ? co->type->name(co, r, f, flags) : co->type->__name; + return (co->type->name) ? co->type->name(co, r, f, flags) : co->type->_name; } diff --git a/src/kernel/connection.h b/src/kernel/connection.h index c847f690f..af412b036 100644 --- a/src/kernel/connection.h +++ b/src/kernel/connection.h @@ -45,7 +45,7 @@ extern "C" { } connection; typedef struct border_type { - const char *__name; /* internal use only */ + const char *_name; /* internal use only */ variant_type datatype; bool(*transparent) (const connection *, const struct faction *); /* is it possible to see through this? */ diff --git a/src/report.c b/src/report.c index 3976bb05b..2a0e9eb3a 100644 --- a/src/report.c +++ b/src/report.c @@ -769,11 +769,11 @@ static void rp_battles(struct stream *out, faction * f) while (bm) { char buf[256]; RENDER(f, buf, sizeof(buf), ("header_battle", "region", bm->r)); - newline(out); centre(out, buf, true); newline(out); rp_messages(out, bm->msgs, f, 0, false); bm = bm->next; + newline(out); } } } @@ -1237,39 +1237,17 @@ void report_region(struct stream *out, const region * r, faction * f) if (edges) newline(out); for (e = edges; e; e = e->next) { - bool first = true; message *msg; - bufp = buf; - size = sizeof(buf) - 1; for (d = 0; d != MAXDIRECTIONS; ++d) { - if (!e->exist[d]) - continue; - /* this localization might not work for every language but is fine for de and en */ - if (first) - bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_borderlist_prefix"), size); - else if (e->lastd == d) - bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_borderlist_lastfix"), size); - else - bytes = (int)str_strlcpy(bufp, LOC(f->locale, "nr_borderlist_infix"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)str_strlcpy(bufp, LOC(f->locale, directions[d]), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - first = false; + if (e->exist[d]) { + msg = msg_message(e->transparent ? "nr_border_transparent" : "nr_border_opaque", + "object dir", e->name, d); + nr_render(msg, f->locale, buf, sizeof(buf), f); + msg_release(msg); + paragraph(out, buf, 0, 0, 0); + } } - /* TODO name is localized? Works for roads anyway... */ - /* TODO: creating messages during reporting makes them not show up in CR? */ - msg = msg_message("nr_borderlist_postfix", "transparent object", - e->transparent, e->name); - bytes = (int)nr_render(msg, f->locale, bufp, size, f); - msg_release(msg); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - *bufp = 0; - paragraph(out, buf, 0, 0, 0); } if (edges) { while (edges) { @@ -1299,7 +1277,6 @@ static void statistics(struct stream *out, const region * r, const faction * f) } } /* print */ - newline(out); m = msg_message("nr_stat_header", "region", r); nr_render(m, f->locale, buf, sizeof(buf), f); msg_release(m); @@ -2305,8 +2282,10 @@ report_plaintext(const char *filename, report_context * ctx, report_travelthru(out, r, f); } - if (wants_stats && r->seen.mode >= seen_unit) + if (wants_stats && r->seen.mode >= seen_unit) { statistics(out, r, f); + newline(out); + } /* Nachrichten an REGION in der Region */ if (r->seen.mode >= seen_travel) { From 34d0b56c68f9f85d67021c3fd8e019eb8782e812 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 11 Jun 2018 21:36:59 +0200 Subject: [PATCH 2/3] BUG 2448: Default-Attacken respektieren! --- src/exparse.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/exparse.c b/src/exparse.c index ed6452e40..07acb090e 100644 --- a/src/exparse.c +++ b/src/exparse.c @@ -1092,9 +1092,13 @@ static void start_races(parseinfo *pi, const XML_Char *el, const XML_Char **attr name = attr_get(attr, "name"); if (name) { + int i; + assert(!rc); pi->object = rc = rc_get_or_create(name); - int i; + while (AT_NONE != rc->attack[nattacks].type) { + ++nattacks; + } for (i = 0; attr[i]; i += 2) { const XML_Char *key = attr[i], *val = attr[i + 1]; From 6d10ee8fa568bdd8b2f7907c8b33b7618d6d7fee Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 24 Jun 2018 18:08:19 +0200 Subject: [PATCH 3/3] =?UTF-8?q?BUG=202453:=20Erstausstattung=20und=20Defau?= =?UTF-8?q?lt-Befehle=20f=C3=BCr=20neue=20Parteien.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/eressea/e2/init.lua | 1 + scripts/eressea/init.lua | 1 + scripts/map.lua | 1 + src/kernel/config.c | 36 ++++++++++++------------------------ src/kernel/config.test.c | 15 +++++++++++---- src/kernel/faction.c | 8 +++++++- src/kernel/faction.test.c | 23 +++++++++++++++++++++++ 7 files changed, 56 insertions(+), 29 deletions(-) diff --git a/scripts/eressea/e2/init.lua b/scripts/eressea/e2/init.lua index 52636d207..9df7a1062 100644 --- a/scripts/eressea/e2/init.lua +++ b/scripts/eressea/e2/init.lua @@ -4,6 +4,7 @@ eressea.log.debug('rules for game E2') math.randomseed(rng.random()) local equipment = require('eressea.equipment') + local sets = { ['seed_faction'] = { ['items'] = { diff --git a/scripts/eressea/init.lua b/scripts/eressea/init.lua index 1af37d2d5..d840fe899 100644 --- a/scripts/eressea/init.lua +++ b/scripts/eressea/init.lua @@ -1,5 +1,6 @@ require 'eressea.path' require 'eressea.resources' +require 'eressea.equipment' require 'eressea.spells' local self = {} diff --git a/scripts/map.lua b/scripts/map.lua index cad3ae1fd..98579924f 100644 --- a/scripts/map.lua +++ b/scripts/map.lua @@ -6,5 +6,6 @@ package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua' require 'eressea.path' require 'eressea' require 'eressea.xmlconf' + eressea.read_game(get_turn() .. ".dat") gmtool.editor() diff --git a/src/kernel/config.c b/src/kernel/config.c index ff2457971..ec45ddd0d 100644 --- a/src/kernel/config.c +++ b/src/kernel/config.c @@ -631,28 +631,24 @@ void kernel_init(void) translation_init(); } -static order * defaults[MAXLOCALES]; - order *default_order(const struct locale *lang) { int i = locale_index(lang); + keyword_t kwd; + const char * str; order *result = 0; - assert(i < MAXLOCALES); - result = defaults[i]; - if (!result) { - const char * str; - keyword_t kwd = NOKEYWORD; - str = config_get("orders.default"); - if (str) { - kwd = findkeyword(str); - } - if (kwd != NOKEYWORD) { - result = create_order(kwd, lang, NULL); - defaults[i] = result; - } + assert(i < MAXLOCALES); + kwd = keyword_disabled(K_WORK) ? NOKEYWORD : K_WORK; + str = config_get("orders.default"); + if (str) { + kwd = findkeyword(str); } - return result ? copy_order(result) : 0; + if (kwd != NOKEYWORD) { + result = create_order(kwd, lang, NULL); + return copy_order(result); + } + return NULL; } int rule_give(void) @@ -760,14 +756,6 @@ void free_config(void) { */ void free_gamedata(void) { - int i; - - for (i = 0; i != MAXLOCALES; ++i) { - if (defaults[i]) { - free_order(defaults[i]); - defaults[i] = 0; - } - } free(forbidden_ids); forbidden_ids = NULL; diff --git a/src/kernel/config.test.c b/src/kernel/config.test.c index 7a2097ce4..e99ba9d08 100644 --- a/src/kernel/config.test.c +++ b/src/kernel/config.test.c @@ -180,15 +180,22 @@ static void test_default_order(CuTest *tc) { test_setup(); loc = test_create_locale(); - ord = default_order(loc); - CuAssertPtrEquals(tc, 0, ord); - free_order(ord); - config_set("orders.default", "work"); ord = default_order(loc); CuAssertPtrNotNull(tc, ord); CuAssertIntEquals(tc, K_WORK, getkeyword(ord)); free_order(ord); + + enable_keyword(K_WORK, false); + ord = default_order(loc); + CuAssertPtrEquals(tc, NULL, ord); + free_order(ord); + + config_set("orders.default", "entertain"); + ord = default_order(loc); + CuAssertPtrNotNull(tc, ord); + CuAssertIntEquals(tc, K_ENTERTAIN, getkeyword(ord)); + free_order(ord); test_teardown(); } diff --git a/src/kernel/faction.c b/src/kernel/faction.c index bc08ba010..16c0c789c 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -29,6 +29,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "group.h" #include "item.h" #include "messages.h" +#include "order.h" #include "plane.h" #include "race.h" #include "region.h" @@ -294,8 +295,13 @@ unit *addplayer(region * r, faction * f) assert(f->units == NULL); faction_setorigin(f, 0, r->x, r->y); u = create_unit(r, f, 1, f->race, 0, NULL, NULL); + u->thisorder = default_order(f->locale); + unit_addorder(u, copy_order(u->thisorder)); name = config_get("rules.equip_first"); - equip_unit(u, name ? name : "first_unit"); + if (!equip_unit(u, name ? name : "first_unit")) { + /* give every unit enough money to survive the first turn */ + i_change(&u->items, get_resourcetype(R_SILVER)->itype, maintenance_cost(u)); + } u->hp = unit_max_hp(u) * u->number; fset(u, UFL_ISNEW); if (f->race == get_race(RC_DAEMON)) { diff --git a/src/kernel/faction.test.c b/src/kernel/faction.test.c index 7748f693d..37ec70e50 100644 --- a/src/kernel/faction.test.c +++ b/src/kernel/faction.test.c @@ -3,8 +3,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -298,9 +300,30 @@ static void test_save_special_items(CuTest *tc) { test_teardown(); } +static void test_addplayer(CuTest *tc) { + unit *u; + region *r; + faction *f; + item_type *itype; + test_setup(); + callbacks.equip_unit = NULL; + itype = test_create_silver(); + r = test_create_plain(0, 0); + f = test_create_faction(NULL); + u = addplayer(r, f); + CuAssertPtrNotNull(tc, u); + CuAssertPtrEquals(tc, r, u->region); + CuAssertPtrEquals(tc, f, u->faction); + CuAssertIntEquals(tc, i_get(u->items, itype), 10); + CuAssertPtrNotNull(tc, u->orders); + CuAssertIntEquals(tc, K_WORK, getkeyword(u->orders)); + test_teardown(); +} + CuSuite *get_faction_suite(void) { CuSuite *suite = CuSuiteNew(); + SUITE_ADD_TEST(suite, test_addplayer); SUITE_ADD_TEST(suite, test_max_migrants); SUITE_ADD_TEST(suite, test_addfaction); SUITE_ADD_TEST(suite, test_remove_empty_factions);