dfhack/scripts/modtools/extra-gamelog.lua

193 lines
5.7 KiB
Lua

-- Regularly writes extra info to gamelog.txt
local help = [[=begin
modtools/extra-gamelog
======================
This script writes extra information to the gamelog.
This is useful for tools like :forums:`Soundsense <106497>`.
=end]]
msg = dfhack.gui.writeToGamelog
function log_on_load(op)
if op ~= SC_WORLD_LOADED then return end
-- Seasons fix for Soundsense
local seasons = {
[-1] = 'Nothing', -- worldgen
[0] = 'Spring',
[1] = 'Summer',
[2] = 'Autumn',
[3] = 'Winter'}
msg(seasons[df.global.cur_season]..' has arrived on the calendar.')
-- Weather fix for Soundsense
local raining = false
local snowing = false
for _, row in ipairs(df.global.current_weather) do
for _, weather in ipairs(row) do
raining = raining or weather == 1
snowing = snowing or weather == 2
end
end
if (not snowing and not raining) then msg("The weather has cleared.")
elseif raining then msg("It has started raining.")
elseif snowing then msg("A snow storm has come.")
end
-- Log site information for forts
if df.world_site.find(df.global.ui.site_id) == nil then return end
local site = df.world_site.find(df.global.ui.site_id)
local fort_ent = df.global.ui.main.fortress_entity
local civ_ent = df.historical_entity.find(df.global.ui.civ_id)
local function fullname(item)
return dfhack.TranslateName(item.name)..' ('..dfhack.TranslateName(item.name ,true)..')'
end
msg('Loaded '..df.global.world.cur_savegame.save_dir..', '..fullname(df.global.world.world_data)..
' at coordinates ('..site.pos.x..','..site.pos.y..')')
msg('Loaded the fortress '..fullname(site)..
(fort_ent and ', colonized by the group '..fullname(fort_ent) or '')..
(civ_ent and ' of the civilization '..fullname(civ_ent)..'.' or '.'))
end
old_expedition_leader = nil
old_mayor = nil
function log_nobles()
local expedition_leader = nil
local mayor = nil
local function check(unit)
if not dfhack.units.isCitizen(unit) then return end
for _, pos in ipairs(dfhack.units.getNoblePositions(unit) or {}) do
if pos.position.name[0] == "expedition leader" then
expedition_leader = unit
elseif pos.position.name[0] == "mayor" then
mayor = unit
end
end
end
for _, unit in ipairs(df.global.world.units.active) do
check(unit)
end
if old_mayor == nil and expedition_leader == nil and mayor ~= nil and old_expedition_leader ~= nil then
msg("Expedition leader was replaced by mayor.")
end
if expedition_leader ~= old_expedition_leader then
if expedition_leader == nil then
msg("Expedition leader position is now vacant.")
else
msg(dfhack.TranslateName(dfhack.units.getVisibleName(expedition_leader)).." became expedition leader.")
end
end
if mayor ~= old_mayor then
if mayor == nil then
msg("Mayor position is now vacant.")
else
msg(dfhack.TranslateName(dfhack.units.getVisibleName(mayor)).." became mayor.")
end
end
old_mayor = mayor
old_expedition_leader = expedition_leader
end
siege = false
function log_siege()
local function cur_siege()
for _, unit in ipairs(df.global.world.units.active) do
if unit.flags1.active_invader then return true end
end
return false
end
local old_siege = siege
siege = cur_siege()
if siege ~= old_siege and siege then
msg("A vile force of darkness has arrived!")
elseif siege ~= old_siege and not siege then
msg("Siege was broken.")
end
end
local workshopTypes = {
[0]="Carpenters Workshop",
"Farmers Workshop",
"Masons Workshop",
"Craftsdwarfs Workshop",
"Jewelers Workshop",
"Metalsmiths Forge",
"Magma Forge",
"Bowyers Workshop",
"Mechanics Workshop",
"Siege Workshop",
"Butchers Workshop",
"Leatherworks Workshop",
"Tanners Workshop",
"Clothiers Workshop",
"Fishery",
"Still",
"Loom",
"Quern",
"Kennels",
"Kitchen",
"Ashery",
"Dyers Workshop",
"Millstone",
"Custom",
"Tool",
}
local furnaceTypes = {
[0]="Wood Furnace",
"Smelter",
"Glass Furnace",
"Kiln",
"Magma Smelter",
"Magma Glass Furnace",
"Magma Kiln",
"Custom Furnace",
}
buildStates = {}
function log_buildings()
for _, building in ipairs(df.global.world.buildings.all) do
if getmetatable(building) == "building_workshopst" or getmetatable(building) == "building_furnacest" then
buildStates[building.id] = buildStates[building.id] or building.flags.exists
if buildStates[building.id] ~= building.flags.exists then
buildStates[building.id] = building.flags.exists
if building.flags.exists then
if getmetatable(building) == "building_workshopst" then
msg(workshopTypes[building.type].." was built.")
elseif getmetatable(building) == "building_furnacest" then
msg(furnaceTypes[building.type].." was built.")
end
end
end
end
end
end
local function event_loop()
log_nobles()
log_siege()
log_buildings()
if extra_gamelog_enabled then dfhack.timeout(50, 'ticks', event_loop) end
end
extra_gamelog_enabled = false
local args = {...}
if args[1] == 'disable' then
dfhack.onStateChange[_ENV] = nil
extra_gamelog_enabled = false
elseif args[1] == 'enable' then
dfhack.onStateChange[_ENV] = log_on_load
extra_gamelog_enabled = true
event_loop()
else
print(help)
end