server/scripts/eressea/autoseed.lua
Enno Rehling 4c67e0603b remove attribs from rtype (it's only in rtype->construction that we use it?)
test to verify that mine bonus for iron works as advertised.
change the oder of arguments for faction.create (race is the only thing not optional).
2017-03-17 22:46:10 +01:00

127 lines
3.8 KiB
Lua

if not config.autoseed then return nil end
local autoseed = {}
-- minimum required resources in the 7-hex neighborhood:
local peasants = 10000
local trees = 800
-- minimum resources in the region itself:
local min_peasants = 2000
-- number of starters per region:
local per_region = 2
local function score(r, res)
assert(r)
res = res or "peasant"
local x, y, rn
local peas = r:get_resource(res)
for _, rn in pairs(r.adj) do
if rn and not rn.units() then
peas = peas + rn:get_resource(res)
end
end
return peas
end
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 r:get_resource("peasant") >= min_peasants then
sp = score(r, "peasant")
st = score(r, "tree")
if sp >= peasants then
if st >= trees then
table.insert(sel, r)
end
end
end
end
end
return sel
end
local function read_players()
-- return {{ email = "noreply@mailinator.com", race = "dwarf", lang = "de" }}
local players = {}
local input = io.open("newfactions", "r")
if input then
local str = input:read("*line")
while str do
if str==nil then break end
local email, race, lang = str:match("([^ ]*) ([^ ]*) ([^ ]*)")
if email and string.char(string.byte(email, 1))~='#' then
table.insert(players, { race = race, lang = lang, email = email })
end
str = input:read("*line")
end
input:close()
end
return players
end
local function seed(r, email, race, lang)
assert(r)
local f = faction.create(race, email, lang)
assert(f)
local u = unit.create(f, r)
assert(u)
equip_unit(u, "autoseed_faction")
equip_unit(u, "autoseed_unit")
equip_unit(u, "autoseed_" .. race, 7)
unit.create(f, r, 5):set_skill("mining", 30)
unit.create(f, r, 5):set_skill("quarrying", 30)
f:set_origin(r)
return f
end
local function get_faction_by_email(email)
for f in factions() do
if f.email == email then
return f
end
end
return nil
end
function autoseed.init()
-- local newbs = {}
local num_seeded = per_region
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)
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
start = nil
while not start do
start = sel[index + 1]
sel[index+1] = nil
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
end
end
end
end
return autoseed