Merge pull request #523 from ennorehling/feature/bug-2207

fix seeding new players (bug 2207)
This commit is contained in:
Enno Rehling 2016-07-30 22:54:51 +02:00 committed by GitHub
commit 0a9cbc308b
4 changed files with 44 additions and 34 deletions

View File

@ -1,8 +1,8 @@
local autoseed = {} local autoseed = {}
-- minimum required resources in the 7-hex neighborhood: -- minimum required resources in the 7-hex neighborhood:
local peasants = 20000 local peasants = 10000
local trees = 1000 local trees = 800
-- number of starters per region: -- number of starters per region:
local per_region = 2 local per_region = 2
@ -23,11 +23,15 @@ local function select_regions(regions, peasants, trees)
local sel = {} local sel = {}
for r in regions do for r in regions do
if not r.plane and r.terrain~="ocean" and not r.units() then if not r.plane and r.terrain~="ocean" and not r.units() then
if score(r, "peasant") >= peasants and score(r, "tree") >= trees then sp = score(r, "peasant")
st = score(r, "tree")
if sp >= peasants then
if st >= trees then
table.insert(sel, r) table.insert(sel, r)
end end
end end
end end
end
return sel return sel
end end
@ -47,8 +51,11 @@ local function read_players()
end end
local function seed(r, email, race, lang) local function seed(r, email, race, lang)
assert(r)
local f = faction.create(email, race, lang) local f = faction.create(email, race, lang)
assert(f)
local u = unit.create(f, r) local u = unit.create(f, r)
assert(u)
equip_unit(u, "new_faction") equip_unit(u, "new_faction")
equip_unit(u, "first_unit") equip_unit(u, "first_unit")
equip_unit(u, "first_" .. race, 7) -- disable old callbacks equip_unit(u, "first_" .. race, 7) -- disable old callbacks
@ -69,20 +76,27 @@ end
function autoseed.init() function autoseed.init()
-- local newbs = {} -- local newbs = {}
local num_seeded = per_region local num_seeded = 0
local start = nil local start = nil
eressea.log.info('autoseed new players') eressea.log.info('autoseed new players')
players = read_players() players = read_players()
if players then
print('autoseed ' .. #players .. ' new players')
end
if players and #players >= per_region then if players and #players >= per_region then
local sel local sel
eressea.log.info(#players .. ' new players') eressea.log.info(#players .. ' new players')
sel = select_regions(regions(), peasants, trees) sel = select_regions(regions(), peasants, trees)
if #sel == 0 then
eressea.log.error("autoseed could not select regions for new factions")
else
for _, p in ipairs(players) do for _, p in ipairs(players) do
if num_seeded == per_region then if num_seeded == per_region then
while not start or start.units() do local index = rng_int() % #sel
local index = 1 + (rng_int() % #sel) while not start do
start = sel[index] start = sel[index + 1]
index = (index + 1) % #sel
end end
num_seeded = 0 num_seeded = 0
end end
@ -90,10 +104,10 @@ function autoseed.init()
if dupe then if dupe then
eressea.log.warning("seed: duplicate email " .. p.email .. " already used by " .. tostring(dupe)) eressea.log.warning("seed: duplicate email " .. p.email .. " already used by " .. tostring(dupe))
else else
print("new faction ".. p.email .. " starts in ".. tostring(start))
local f = seed(start, p.email, p.race or "human", p.lang or "de") local f = seed(start, p.email, p.race or "human", p.lang or "de")
num_seeded = num_seeded + 1 num_seeded = num_seeded + 1
print("new faction ".. tostring(f) .. " starts in ".. tostring(start)) end
-- table.insert(newbs, f)
end end
end end
end end

View File

@ -889,19 +889,15 @@ static int tolua_unit_create(lua_State * L)
{ {
faction *f = (faction *)tolua_tousertype(L, 1, 0); faction *f = (faction *)tolua_tousertype(L, 1, 0);
region *r = (region *)tolua_tousertype(L, 2, 0); region *r = (region *)tolua_tousertype(L, 2, 0);
int num = (int)tolua_tonumber(L, 3, 1);
if (f && r) {
const race *rc = f->race;
const char *rcname = tolua_tostring(L, 4, NULL); const char *rcname = tolua_tostring(L, 4, NULL);
if (rcname) int num = (int)tolua_tonumber(L, 3, 1);
rc = rc_find(rcname); const race *rc;
if (rc) { assert(f && r);
rc = rcname ? rc_find(rcname) : f->race;
assert(rc);
unit *u = create_unit(r, f, num, rc, 0, NULL, NULL); unit *u = create_unit(r, f, num, rc, 0, NULL, NULL);
tolua_pushusertype(L, u, TOLUA_CAST "unit"); tolua_pushusertype(L, u, TOLUA_CAST "unit");
return 1; return 1;
}
}
return 0;
} }
static int tolua_unit_tostring(lua_State * L) static int tolua_unit_tostring(lua_State * L)

View File

@ -448,7 +448,7 @@ static int tolua_equipunit(lua_State * L)
unit *u = (unit *)tolua_tousertype(L, 1, 0); unit *u = (unit *)tolua_tousertype(L, 1, 0);
const char *eqname = tolua_tostring(L, 2, 0); const char *eqname = tolua_tostring(L, 2, 0);
int mask = (int)tolua_tonumber(L, 3, EQUIP_ALL); int mask = (int)tolua_tonumber(L, 3, EQUIP_ALL);
assert(mask > 0); assert(u && mask > 0);
equip_unit_mask(u, get_equipment(eqname), mask); equip_unit_mask(u, get_equipment(eqname), mask);
return 0; return 0;
} }

View File

@ -174,7 +174,7 @@ static unit *unitorders(FILE * F, int enc, struct faction *f)
if (s[0] != '@') { if (s[0] != '@') {
char token[128]; char token[128];
const char *stok = s; 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) { if (stok) {
bool quit = false; bool quit = false;