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. 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/chaos.c b/src/chaos.c index 5628b68f4..67cdb356d 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 6db857ad9..db556bb0a 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) { @@ -844,11 +886,24 @@ 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); + } + } } } } + static void handlekey(state * st, int c) { window *wnd; @@ -912,15 +967,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(&new_players, 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; @@ -934,6 +989,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); diff --git a/src/kernel/faction.c b/src/kernel/faction.c index d8d7f6f1c..938519da9 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); } diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c index 6e2599763..dbdd201b9 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 (email[0] == '#') break; @@ -778,25 +782,29 @@ 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) { + if (rn == NULL || (!rn->units && !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) { - ++nsize; + if (++nsize >= n) { + break; + } } } } @@ -906,7 +914,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 +925,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 +937,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); @@ -948,7 +957,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); @@ -963,7 +972,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); 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 }