From 12222c6562a8d7b11504ac845086746a33d279ac Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 23 Jul 2017 09:08:03 +0200 Subject: [PATCH 1/9] first unit should get money and wood --- conf/e2/rules.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conf/e2/rules.xml b/conf/e2/rules.xml index 7bde2205f..45b9030d3 100644 --- a/conf/e2/rules.xml +++ b/conf/e2/rules.xml @@ -20,6 +20,11 @@ + + + + + From a5d350fe3a5ea68e246e3c1e1e059696b48b1256 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 23 Jul 2017 09:15:23 +0200 Subject: [PATCH 2/9] seed a single faction from newplayers file. --- src/gmtool.c | 64 ++++++++++++++++++++++++++++++++-------------------- src/gmtool.h | 1 - 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/gmtool.c b/src/gmtool.c index 674e139f7..6db857ad9 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -1,4 +1,4 @@ -/* +/* * +-------------------+ Christian Schlittchen * | | Enno Rehling * | Eressea PBEM host | Katja Zedel @@ -81,7 +81,7 @@ int gm_codepage = -1; static void unicode_remove_diacritics(const char *rp, char *wp) { while (*rp) { - if (gm_codepage >=0 && *rp & 0x80) { + if (gm_codepage >= 0 && *rp & 0x80) { size_t sz = 0; unsigned char ch; switch (gm_codepage) { @@ -115,7 +115,7 @@ int umvwprintw(WINDOW *win, int y, int x, const char *format, ...) { va_start(args, format); memset(buffer, 0, sizeof(buffer)); - vsnprintf(buffer, sizeof(buffer)-1, format, args); + vsnprintf(buffer, sizeof(buffer) - 1, format, args); va_end(args); simplify(buffer, buffer); @@ -344,7 +344,7 @@ map_region *cursor_region(const view * v, const coordinate * c) static void draw_cursor(WINDOW * win, selection * s, const view * v, const coordinate * c, -int show) + int show) { int lines = getmaxy(win) / THEIGHT; int xp, yp, nx, ny; @@ -814,7 +814,7 @@ static void select_regions(state * st, int selectmode) st->wnd_map->update |= 3; } -void loaddata(state *st) { +static void loaddata(state *st) { char datafile[MAX_PATH]; askstring(st->wnd_status->handle, "save as:", datafile, sizeof(datafile)); @@ -824,7 +824,7 @@ void loaddata(state *st) { } } -void savedata(state *st) { +static void savedata(state *st) { char datafile[MAX_PATH]; askstring(st->wnd_status->handle, "save as:", datafile, sizeof(datafile)); @@ -835,6 +835,20 @@ void savedata(state *st) { } } +static void seed_player(state *st, const newfaction *player) { + if (player) { + region *r; + int nx = st->cursor.x; + int ny = st->cursor.y; + + pnormalize(&nx, &ny, st->cursor.pl); + r = findregion(nx, ny); + if (r) { + addplayer(r, addfaction(player->email, player->password, player->race, + player->lang, player->subscription)); + } + } +} static void handlekey(state * st, int c) { window *wnd; @@ -897,10 +911,6 @@ static void handlekey(state * st, int c) loaddata(st); break; case 'B': - if (!new_players) { - join_path(basepath(), "newfactions", sbuffer, sizeof(sbuffer)); - new_players = read_newfactions(sbuffer); - } cnormalize(&st->cursor, &nx, &ny); minpop = config_get_int("editor.population.min", 8); maxpop = config_get_int("editor.population.max", minpop); @@ -1111,13 +1121,15 @@ static void handlekey(state * st, int c) else tag_region(st->selected, nx, ny); break; - case 'A': - if (!new_players) { - join_path(basepath(), "newfactions", sbuffer, sizeof(sbuffer)); - new_players = read_newfactions(sbuffer); + case 's': /* seed */ + if (new_players) { + newfaction * next = new_players->next; + seed_player(st, new_players); + free(new_players->email); + free(new_players->password); + free(new_players); + new_players = next; } - seed_players(&new_players, false); - st->wnd_map->update |= 1; break; case '/': statusline(st->wnd_status->handle, "find-"); @@ -1289,13 +1301,15 @@ void run_mapper(void) int split = 20; state *st; point tl; -/* FIXME: dsiable logging - int old_flags = log_flags; - log_flags &= ~(LOG_CPERROR | LOG_CPWARNING); -*/ + char sbuffer[512]; + + if (!new_players) { + join_path(basepath(), "newfactions", sbuffer, sizeof(sbuffer)); + new_players = read_newfactions(sbuffer); + } + init_curses(); curs_set(1); - set_readline(curses_readline); assert(stdscr); getbegyx(stdscr, x, y); @@ -1384,15 +1398,15 @@ void run_mapper(void) set_readline(NULL); curs_set(1); endwin(); -/* FIXME: reset logging - log_flags = old_flags; -*/ + /* FIXME: reset logging + log_flags = old_flags; + */ state_close(st); } int curses_readline(struct lua_State *L, char *buffer, size_t size, -const char *prompt) + const char *prompt) { UNUSED_ARG(L); askstring(hstatus, prompt, buffer, size); diff --git a/src/gmtool.h b/src/gmtool.h index 3a682f453..04f062f4b 100644 --- a/src/gmtool.h +++ b/src/gmtool.h @@ -22,7 +22,6 @@ extern "C" { struct terrain_type; struct newfaction; - int gmmain(int argc, char *argv[]); int curses_readline(struct lua_State *L, char *buffer, size_t size, const char *prompt); From 3151fe9f9bc8396d058c316b665375010f58c2f2 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 23 Jul 2017 09:27:28 +0200 Subject: [PATCH 3/9] ignore comments in newfactions --- src/modules/autoseed.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index ffab4ca46..66013149c 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -157,9 +157,13 @@ newfaction *read_newfactions(const char *filename) password[0] = '\0'; if (sscanf(buf, "%54s %20s %8s %d %d %16s %d", email, race, lang, &bonus, - &subscription, password, &alliance) < 3) + &subscription, password, &alliance) < 3) { break; - if (email[0] == '\0') + } + if (email[0] == '#') { + continue; + } + if (email[0] == '\0') break; if (password[0] == '\0') { size_t sz; From 822292c99a68a235925dd6381be55e4c2c3358c8 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 27 Jul 2017 16:16:54 +0200 Subject: [PATCH 4/9] do not seed factions when creating islands with 'B'. --- src/gmtool.c | 2 +- src/modules/autoseed.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gmtool.c b/src/gmtool.c index 6db857ad9..3e33203ce 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -920,7 +920,7 @@ static void handlekey(state * st, int c) else { n = minpop; } - build_island_e3(&new_players, nx, ny, n, n * 3); + build_island_e3(NULL, nx, ny, n, n * 3); st->modified = 1; st->wnd_info->update |= 1; st->wnd_status->update |= 1; diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index ffab4ca46..6ec945a09 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -784,13 +784,15 @@ const terrain_type * (*terraformer) (direction_t)) direction_t dir; for (dir = 0; dir != MAXDIRECTIONS; ++dir) { region *rn = rconnect(r, dir); - if (rn == NULL) { + if (rn == NULL || !rn->land) { const terrain_type *terrain = terraformer(dir); - plane *pl = rplane(r); - int x = r->x + delta_x[dir]; - int y = r->y + delta_y[dir]; - pnormalize(&x, &y, pl); - rn = new_region(x, y, pl, 0); + if (!rn) { + plane *pl = rplane(r); + int x = r->x + delta_x[dir]; + int y = r->y + delta_y[dir]; + pnormalize(&x, &y, pl); + rn = new_region(x, y, pl, 0); + } terraform_region(rn, terrain); regionqueue_push(rlist, rn); if (rn->land) { @@ -946,7 +948,7 @@ int build_island_e3(newfaction ** players, int x, int y, int numfactions, int mi get_neighbours(r, rn); q = region_quality(r, rn); - if (q >= MIN_QUALITY && nfactions < numfactions && *players) { + if (q >= MIN_QUALITY && nfactions < numfactions && players && *players) { starting_region(players, r, rn); minq = MIN(minq, q); maxq = MAX(maxq, q); @@ -961,7 +963,7 @@ int build_island_e3(newfaction ** players, int x, int y, int numfactions, int mi region *rn[MAXDIRECTIONS]; get_neighbours(r, rn); q = region_quality(r, rn); - if (q >= MIN_QUALITY * 4 / 3 && nfactions < numfactions && *players) { + if (q >= MIN_QUALITY * 4 / 3 && nfactions < numfactions && players && *players) { starting_region(players, r, rn); minq = MIN(minq, q); maxq = MAX(maxq, q); From 847e6f3e43d7d7a905b583d704892b42204e6516 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 27 Jul 2017 16:36:45 +0200 Subject: [PATCH 5/9] limit island size from configuration, deal with existing units. --- src/bind_gmtool.c | 5 ++--- src/gmtool.c | 6 +++--- src/modules/autoseed.c | 21 ++++++++++++--------- src/modules/autoseed.h | 3 +-- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/bind_gmtool.c b/src/bind_gmtool.c index e4ae939f9..18efbd994 100644 --- a/src/bind_gmtool.c +++ b/src/bind_gmtool.c @@ -150,10 +150,9 @@ static int tolua_make_island(lua_State * L) int x = (int)tolua_tonumber(L, 1, 0); int y = (int)tolua_tonumber(L, 2, 0); int s = (int)tolua_tonumber(L, 3, 0); - int n = (int)tolua_tonumber(L, 4, s / 3); - n = build_island_e3(NULL, x, y, n, s); - lua_pushinteger(L, n); + s = build_island_e3(x, y, s, NULL, 0); + lua_pushinteger(L, s); return 1; } diff --git a/src/gmtool.c b/src/gmtool.c index 3e33203ce..d9afd738e 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -912,15 +912,15 @@ static void handlekey(state * st, int c) break; case 'B': cnormalize(&st->cursor, &nx, &ny); - minpop = config_get_int("editor.population.min", 8); - maxpop = config_get_int("editor.population.max", minpop); + minpop = config_get_int("editor.island.min", 8); + maxpop = config_get_int("editor.island.max", minpop); if (maxpop > minpop) { n = rng_int() % (maxpop - minpop) + minpop; } else { n = minpop; } - build_island_e3(NULL, nx, ny, n, n * 3); + build_island_e3(nx, ny, n, NULL, 0); st->modified = 1; st->wnd_info->update |= 1; st->wnd_status->update |= 1; diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 6ec945a09..a23c0554d 100644 --- a/src/modules/autoseed.c +++ b/src/modules/autoseed.c @@ -776,15 +776,15 @@ const terrain_type *random_terrain_e3(direction_t dir) return random_terrain(terrainarr, distribution, GEOMAX); } -int +static int random_neighbours(region * r, region_list ** rlist, -const terrain_type * (*terraformer) (direction_t)) +const terrain_type * (*terraformer) (direction_t), int n) { int nsize = 0; direction_t dir; for (dir = 0; dir != MAXDIRECTIONS; ++dir) { region *rn = rconnect(r, dir); - if (rn == NULL || !rn->land) { + if (rn == NULL || (!rn->units && !rn->land)) { const terrain_type *terrain = terraformer(dir); if (!rn) { plane *pl = rplane(r); @@ -796,7 +796,9 @@ const terrain_type * (*terraformer) (direction_t)) terraform_region(rn, terrain); regionqueue_push(rlist, rn); if (rn->land) { - ++nsize; + if (++nsize >= n) { + break; + } } } } @@ -906,7 +908,7 @@ static void starting_region(newfaction ** players, region * r, region * rn[]) } /* E3A island generation */ -int build_island_e3(newfaction ** players, int x, int y, int numfactions, int minsize) +int build_island_e3(int x, int y, int minsize, newfaction ** players, int numfactions) { #define MIN_QUALITY 1000 int nfactions = 0; @@ -917,9 +919,10 @@ int build_island_e3(newfaction ** players, int x, int y, int numfactions, int mi int nsize = 1; int q, maxq = INT_MIN, minq = INT_MAX; - if (!r) + if (r && r->units) return 0; + if (!r) { r = new_region(x, y, pl, 0); - assert(!r->units); + } do { terraform_region(r, random_terrain_e3(NODIRECTION)); } while (!r->land); @@ -928,10 +931,10 @@ int build_island_e3(newfaction ** players, int x, int y, int numfactions, int mi fset(r, RF_MARK); if (r->land) { if (nsize < minsize) { - nsize += random_neighbours(r, &rlist, &random_terrain_e3); + nsize += random_neighbours(r, &rlist, &random_terrain_e3, minsize-nsize); } else { - nsize += random_neighbours(r, &rlist, &get_ocean); + nsize += random_neighbours(r, &rlist, &get_ocean, minsize - nsize); } } regionqueue_push(&island, r); diff --git a/src/modules/autoseed.h b/src/modules/autoseed.h index 06ce646c2..65bdccb7f 100644 --- a/src/modules/autoseed.h +++ b/src/modules/autoseed.h @@ -38,8 +38,7 @@ extern "C" { extern const struct terrain_type *random_terrain(const struct terrain_type *terrains[], int distribution[], int size); - extern int seed_adamantium(struct region *r, int base); - extern int build_island_e3(newfaction **players, int x, int y, int numfactions, int minsize); + extern int build_island_e3(int x, int y, int minsize, newfaction **players, int numfactions); #ifdef __cplusplus } From 594cbc4a05c6c81ef06f332f547d655823ba894b Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Jul 2017 11:10:06 +0200 Subject: [PATCH 6/9] Neuer Email Body, mit Patreon Link. --- etc/report-mail.de.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/etc/report-mail.de.txt b/etc/report-mail.de.txt index e40d86b53..42f7503d2 100644 --- a/etc/report-mail.de.txt +++ b/etc/report-mail.de.txt @@ -1,10 +1,7 @@ -Freust Du Dich, dass es diese Woche wieder einen Eressea-Report gibt? -Möchtest Du dazu beitragen, dass das auch nächste Woche wieder passiert? -Eressea ist ein freiwilliges gratis-Angebot, und die Spielleitung bezahlt -seit Jahren die Entwicklung und das Hosting aus eigener Tasche. Wenn Dir -das etwas wert ist, kannst Du das auf -https://flattr.com/thing/681354/Eressea zum Ausdruck bringen. - Diese Mail enthält ein Attachment mit Deinem Eressea-Report in komprimierter Form. Um ihn zu entpacken benötigst Du ein Programm, das ZIP-Archive öffnen kann, wie z.B. 7-Zip (http://www.7-zip.org/) + +Eressea ist ein kostenloses Angebot von Freiwilligen, und die Spielleitung bezahlt +seit Jahren die Entwicklung und den Betrieb aus eigener Tasche. Wenn Dir +das etwas wert ist, kannst Du das Spiel auf https://www.patreon.com/enno unterstützen. From 4675cf1d05834c4018e69385b899383b4be2e790 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 30 Jul 2017 14:05:33 +0200 Subject: [PATCH 7/9] allow config to override first unit equipment --- src/kernel/faction.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kernel/faction.c b/src/kernel/faction.c index ae60ce439..e804534c4 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -286,12 +286,14 @@ faction *addfaction(const char *email, const char *password, unit *addplayer(region * r, faction * f) { unit *u; + const char * name; const struct equipment* eq; assert(f->units == NULL); faction_setorigin(f, 0, r->x, r->y); u = create_unit(r, f, 1, f->race, 0, NULL, NULL); - eq = get_equipment("first_unit"); + name = config_get("rules.equip_first"); + eq = get_equipment(name ? name : "first_unit"); if (eq) { equip_items(&u->items, eq); } From c387e985b8c02a87cf9ea60caef3ce85e0aaa325 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 7 Aug 2017 18:38:10 +0200 Subject: [PATCH 8/9] gmtool can clear regions --- src/chaos.c | 13 +++++++++++++ src/chaos.h | 1 + src/gmtool.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/chaos.c b/src/chaos.c index 58cd7af73..abd74b5d9 100644 --- a/src/chaos.c +++ b/src/chaos.c @@ -53,6 +53,19 @@ attrib_type at_chaoscount = { ATF_UNIQUE }; +void set_chaoscount(struct region *r, int deaths) +{ + if (deaths==0) { + a_removeall(&r->attribs, &at_chaoscount); + } else { + attrib *a = a_find(r->attribs, &at_chaoscount); + if (!a) { + a = a_add(&r->attribs, a_new(&at_chaoscount)); + } + a->data.i = deaths; + } +} + int get_chaoscount(const region * r) { attrib *a = a_find(r->attribs, &at_chaoscount); diff --git a/src/chaos.h b/src/chaos.h index 6e62a0d17..0c2667083 100644 --- a/src/chaos.h +++ b/src/chaos.h @@ -29,6 +29,7 @@ extern "C" { void chaos_register(void); void chaos_update(void); + void set_chaoscount(struct region *r, int deaths); int get_chaoscount(const struct region * r); void add_chaoscount(struct region * r, int deaths); diff --git a/src/gmtool.c b/src/gmtool.c index d9afd738e..24c1735e8 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -15,6 +15,7 @@ #include "gmtool.h" #include "gmtool_structs.h" +#include "chaos.h" #include "console.h" #include "listbox.h" #include "wormhole.h" @@ -45,6 +46,7 @@ #include #include +#include #include #include #include @@ -515,6 +517,46 @@ static void statusline(WINDOW * win, const char *str) wnoutrefresh(win); } +static void reset_region(region *r) { + set_chaoscount(r, 0); + r->flags = 0; + a_removeall(&r->attribs, NULL); + while (r->units) { + remove_unit(&r->units, r->units); + } + while (r->ships) { + remove_ship(&r->ships, r->ships); + } + while (r->buildings) { + remove_building(&r->buildings, r->buildings); + } +} + +static void reset_cursor(state *st) { + int nx = st->cursor.x; + int ny = st->cursor.y; + region *r; + pnormalize(&nx, &ny, st->cursor.pl); + if ((r = findregion(nx, ny)) != NULL) { + reset_region(r); + } +} + +static void reset_rect(state *st) { + int x, y, bs = 3; + for (x=0;x!=bs;++x) { + for (y = 0; y != bs; ++y) { + region *r; + int nx = st->cursor.x + x; + int ny = st->cursor.y + y; + pnormalize(&nx, &ny, st->cursor.pl); + if ((r = findregion(nx, ny)) != NULL) { + reset_region(r); + } + } + } +} + static void terraform_at(coordinate * c, const terrain_type * terrain) { if (terrain != NULL) { @@ -934,6 +976,12 @@ static void handlekey(state * st, int c) st->wnd_status->update |= 1; st->wnd_map->update |= 1; break; + case 'c': /* clear/reset */ + reset_cursor(st); + break; + case 'C': /* clear/reset */ + reset_rect(st); + break; case 0x09: /* tab = next selected */ if (regions != NULL) { map_region *mr = cursor_region(&st->display, cursor); From 2aab736b5911e1f53f0412082a3347d297db4329 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 7 Aug 2017 18:58:39 +0200 Subject: [PATCH 9/9] try giving new factions a name --- src/gmtool.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gmtool.c b/src/gmtool.c index 24c1735e8..a07feab43 100644 --- a/src/gmtool.c +++ b/src/gmtool.c @@ -886,8 +886,20 @@ static void seed_player(state *st, const newfaction *player) { pnormalize(&nx, &ny, st->cursor.pl); r = findregion(nx, ny); if (r) { - addplayer(r, addfaction(player->email, player->password, player->race, - player->lang, player->subscription)); + const char *at = strchr(player->email, '@'); + faction *f; + addplayer(r, f = addfaction(player->email, player->password, + player->race, player->lang, + player->subscription)); + if (at) { + char fname[64]; + size_t len = at - player->email; + if (len>4 && lenemail, len); + fname[len]=0; + faction_setname(f, fname); + } + } } } }