v50 Steam/Premium information for editors
- v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
- Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.
User:Fleeting Frames/max-wave
Jump to navigation
Jump to search
Usage: Save into /hack/scripts folder as max-wave.lua script, put 'repeat -time 1 -timeUnits months -command [ max-wave 10 80 ]' in onMapLoad.init
(Original written by Loci here.)
--Dynamically limit the next immigration wave
--[[=begin
max-wave.lua
============
Set the population cap to the lesser of current_pop + wave_size or max_pop.
Use with the `repeat` command to set a rolling immigration limit.
Usage examples::
max-wave wave_size (max_pop)
repeat -time 1 -timeUnits months -command [ max-wave 10 200 ]
The first example is abstract and only sets the population cap once;
the second will update the population cap monthly, allowing a
maximum of 10 immigrants per wave, up to a total population of 200.
=end]]
local args = {...}
local wave_size = tonumber(args[1])
local max_pop = tonumber(args[2])
local current_pop = 0
if not wave_size then
print('max-wave: wave_size required')
return
end
--One would think the game would track this value somewhere...
for k,v in ipairs(df.global.world.units.active) do
if dfhack.units.isCitizen(v) or
(dfhack.units.isOwnCiv(v) and
dfhack.units.isAlive(v) and
df.global.world.raws.creatures.all[v.race].caste[v.caste].flags.CAN_LEARN and
not (dfhack.units.isMerchant(v) or dfhack.units.isForest(v) or v.flags1.diplomat or v.flags2.visitor)
)
then
current_pop = current_pop + 1
end
end
local new_limit = current_pop + wave_size
if max_pop and new_limit > max_pop then new_limit = max_pop end
df.global.d_init.population_cap = new_limit
print('max-wave: Population cap set to '.. new_limit)