diff --git a/scripts/eressea/autoseed.lua b/scripts/eressea/autoseed.lua index e5cd2e478..e948705c0 100644 --- a/scripts/eressea/autoseed.lua +++ b/scripts/eressea/autoseed.lua @@ -1,8 +1,8 @@ local autoseed = {} -- minimum required resources in the 7-hex neighborhood: -local peasants = 20000 -local trees = 1000 +local peasants = 10000 +local trees = 800 -- number of starters per region: local per_region = 2 @@ -23,8 +23,12 @@ local function select_regions(regions, peasants, trees) local sel = {} for r in regions do if not r.plane and r.terrain~="ocean" and not r.units() then - if score(r, "peasant") >= peasants and score(r, "tree") >= trees then - table.insert(sel, r) + sp = score(r, "peasant") + st = score(r, "tree") + if sp >= peasants then + if st >= trees then + table.insert(sel, r) + end end end end @@ -47,8 +51,11 @@ local function read_players() end local function seed(r, email, race, lang) + assert(r) local f = faction.create(email, race, lang) + assert(f) local u = unit.create(f, r) + assert(u) equip_unit(u, "new_faction") equip_unit(u, "first_unit") equip_unit(u, "first_" .. race, 7) -- disable old callbacks @@ -69,31 +76,38 @@ end function autoseed.init() -- local newbs = {} - local num_seeded = per_region + local num_seeded = 0 local start = nil eressea.log.info('autoseed new players') players = read_players() + if players then + print('autoseed ' .. #players .. ' new players') + end if players and #players >= per_region then local sel eressea.log.info(#players .. ' new players') sel = select_regions(regions(), peasants, trees) - for _, p in ipairs(players) do - if num_seeded == per_region then - while not start or start.units() do - local index = 1 + (rng_int() % #sel) - start = sel[index] + if #sel == 0 then + eressea.log.error("autoseed could not select regions for new factions") + else + for _, p in ipairs(players) do + if num_seeded == per_region then + local index = rng_int() % #sel + while not start do + start = sel[index + 1] + index = (index + 1) % #sel + end + num_seeded = 0 + end + local dupe = get_faction_by_email(p.email) + if dupe then + eressea.log.warning("seed: duplicate email " .. p.email .. " already used by " .. tostring(dupe)) + else + print("new faction ".. p.email .. " starts in ".. tostring(start)) + local f = seed(start, p.email, p.race or "human", p.lang or "de") + num_seeded = num_seeded + 1 end - num_seeded = 0 - end - local dupe = get_faction_by_email(p.email) - if dupe then - eressea.log.warning("seed: duplicate email " .. p.email .. " already used by " .. tostring(dupe)) - else - local f = seed(start, p.email, p.race or "human", p.lang or "de") - num_seeded = num_seeded + 1 - print("new faction ".. tostring(f) .. " starts in ".. tostring(start)) - -- table.insert(newbs, f) end end end diff --git a/src/bind_unit.c b/src/bind_unit.c index 29c2d287a..353bd4667 100755 --- a/src/bind_unit.c +++ b/src/bind_unit.c @@ -889,19 +889,15 @@ static int tolua_unit_create(lua_State * L) { faction *f = (faction *)tolua_tousertype(L, 1, 0); region *r = (region *)tolua_tousertype(L, 2, 0); + const char *rcname = tolua_tostring(L, 4, NULL); int num = (int)tolua_tonumber(L, 3, 1); - if (f && r) { - const race *rc = f->race; - const char *rcname = tolua_tostring(L, 4, NULL); - if (rcname) - rc = rc_find(rcname); - if (rc) { - unit *u = create_unit(r, f, num, rc, 0, NULL, NULL); - tolua_pushusertype(L, u, TOLUA_CAST "unit"); - return 1; - } - } - return 0; + const race *rc; + assert(f && r); + rc = rcname ? rc_find(rcname) : f->race; + assert(rc); + unit *u = create_unit(r, f, num, rc, 0, NULL, NULL); + tolua_pushusertype(L, u, TOLUA_CAST "unit"); + return 1; } static int tolua_unit_tostring(lua_State * L) diff --git a/src/bindings.c b/src/bindings.c index b2db9d761..b95b1f9f0 100755 --- a/src/bindings.c +++ b/src/bindings.c @@ -448,7 +448,7 @@ 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(mask > 0); + assert(u && mask > 0); equip_unit_mask(u, get_equipment(eqname), mask); return 0; } diff --git a/src/kernel/save.c b/src/kernel/save.c index 12afb6909..fd82bed96 100644 --- a/src/kernel/save.c +++ b/src/kernel/save.c @@ -174,7 +174,7 @@ static unit *unitorders(FILE * F, int enc, struct faction *f) if (s[0] != '@') { char token[128]; const char *stok = s; - stok = parse_token(&stok, token, sizeof(token)); + stok = parse_token(&stok, token, 64); // FIXME: use sizeof, but parse_token overwrites the buffer if (stok) { bool quit = false;