-- Weltentor portal module local tunnels = {} local buildings = {} local targets = {} local function tunnel_travelers(b) local units = nil for u in b.units do if units==nil then units = {} end units[u] = u end return units end local function get_target(param) local ntargets = #targets if ntargets == 0 then eressea.log.error("Zero tunnel targets for [" .. param .. "]") return nil end local rn = math.fmod(rng_int(), ntargets) local t = targets[rn + 1] if not t then eressea.log.error("NULL target for [" .. param .. "]" .. " at index " .. rn) end return t end local function tunnel_action(b, param) local units = tunnel_travelers(b) local rto = get_target(param) eressea.log.info("Tunnel from " .. tostring(b) .. " [" .. param .. "]") if rto and units then for _, u in pairs(units) do u.region = rto eressea.log.info("teleported " .. tostring(u) .. " to " .. tostring(rto)) end elseif not units then eressea.log.info("No units in tunnel " .. tostring(b) .. " [" .. param .. "]") elseif not rto then eressea.log.error("No target for tunnel " .. tostring(b) .. " [" .. param .. "]") end -- debug code to find bugs: for u in b.region.units do if u.building == b then eressea.log.error("Did not teleport " .. tostring(u) .. " from tunnel " .. tostring(b)) end end end function tunnels.init() local r, b for r in regions() do if r:get_key('tnnL') then table.insert(targets, r) if (r:get_flag(0)) then -- target region is chaotic? nope. r:set_flag(0, false) end if (r.terrain=="ocean") then eressea.log.warning("tunnel target at " .. r.x .. "," .. r.y .. " is an ocean, terraforming") r = region.create(r.x, r.y, "plain") end end for b in r.buildings do if b.type == 'portal' then table.insert(buildings, b) end end end eressea.log.info("Found " .. #targets .. " tunnel targets") end function tunnels.update() for i, b in ipairs(buildings) do tunnel_action(b, 'tnnL') end end return tunnels