Merge pull request #754 from PeridexisErrant/better-gamelog
Merge gamelog scripts to modtools/extra-gamelogdevelop
commit
0a2cb08dba
@ -1,50 +0,0 @@
|
||||
-- On map load writes information about the loaded region to gamelog.txt
|
||||
-- By Kurik Amudnil and Warmist (http://www.bay12forums.com/smf/index.php?topic=91166.msg4467072#msg4467072)
|
||||
--[[=begin
|
||||
|
||||
log-region
|
||||
==========
|
||||
When enabled in :file:`dfhack.init`, each time a fort is loaded identifying information
|
||||
will be written to the gamelog. Assists in parsing the file if you switch
|
||||
between forts, and adds information for story-building.
|
||||
|
||||
=end]]
|
||||
|
||||
local function write_gamelog(msg)
|
||||
local log = io.open('gamelog.txt', 'a')
|
||||
log:write(msg.."\n")
|
||||
log:close()
|
||||
end
|
||||
|
||||
local function fullname(item)
|
||||
return dfhack.TranslateName(item.name)..' ('..dfhack.TranslateName(item.name ,true)..')'
|
||||
end
|
||||
|
||||
local args = {...}
|
||||
if args[1] == 'disable' then
|
||||
dfhack.onStateChange[_ENV] = nil
|
||||
else
|
||||
dfhack.onStateChange[_ENV] = function(op)
|
||||
if op == SC_WORLD_LOADED then
|
||||
if df.world_site.find(df.global.ui.site_id) ~= nil then -- added this check, now only attempts write in fort mode
|
||||
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 world = df.global.world
|
||||
-- site positions
|
||||
-- site .pos.x .pos.y
|
||||
-- site .rgn_min_x .rgn_min_y .rgn_max_x .rgn_max.y
|
||||
-- site .global_min_x .global_min_y .global_max_x .global_max_y
|
||||
--site.name
|
||||
--fort_ent.name
|
||||
--civ_ent.name
|
||||
|
||||
write_gamelog('Loaded '..world.cur_savegame.save_dir..', '..fullname(world.world_data)..
|
||||
' at coordinates ('..site.pos.x..','..site.pos.y..')'..NEWLINE..
|
||||
'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 '')..'.'..NEWLINE)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -0,0 +1,192 @@
|
||||
-- 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
|
||||
'Spring',
|
||||
'Summer',
|
||||
'Autumn',
|
||||
'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
|
@ -1,34 +0,0 @@
|
||||
-- On map load writes the current season to gamelog.txt
|
||||
--[[=begin
|
||||
|
||||
soundsense-season
|
||||
=================
|
||||
It is a well known issue that Soundsense cannot detect the correct
|
||||
current season when a savegame is loaded and has to play random
|
||||
season music until a season switch occurs.
|
||||
|
||||
This script registers a hook that prints the appropriate string
|
||||
to :file:`gamelog.txt` on every map load to fix this. For best results
|
||||
call the script from :file:`dfhack.init`.
|
||||
|
||||
=end]]
|
||||
|
||||
local seasons = {
|
||||
[-1] = 'Nothing', -- worldgen
|
||||
[0] = 'Spring',
|
||||
[1] = 'Summer',
|
||||
[2] = 'Autumn',
|
||||
[3] = 'Winter',
|
||||
}
|
||||
|
||||
local args = {...}
|
||||
|
||||
if args[1] == 'disable' then
|
||||
dfhack.onStateChange[_ENV] = nil
|
||||
else
|
||||
dfhack.onStateChange[_ENV] = function(op)
|
||||
if op == SC_WORLD_LOADED then
|
||||
dfhack.gui.writeToGamelog(seasons[df.global.cur_season]..' has arrived on the calendar.')
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue