diff --git a/scripts/exportlegends.lua b/scripts/exportlegends.lua
index a0a04d9a2..2fb95d382 100644
--- a/scripts/exportlegends.lua
+++ b/scripts/exportlegends.lua
@@ -13,6 +13,7 @@ The 'info' option exports more data than is possible in vanilla, to a
Options:
:info: Exports the world/gen info, the legends XML, and a custom XML with more information
+:custom Exports a custom XML with more information
:sites: Exports all available site maps
:maps: Exports all seventeen detailed maps
:all: Equivalent to calling all of the above, in that order
@@ -99,6 +100,28 @@ function export_more_legends_xml()
file:write(""..dfhack.df2utf(dfhack.TranslateName(df.global.world.world_data.name)).."\n")
file:write(""..dfhack.df2utf(dfhack.TranslateName(df.global.world.world_data.name,1)).."\n")
+ file:write("\n")
+ for landmassK, landmassV in ipairs(df.global.world.world_data.landmasses) do
+ file:write("\t\n")
+ file:write("\t\t"..landmassV.index.."\n")
+ file:write("\t\t"..dfhack.df2utf(dfhack.TranslateName(landmassV.name,1)).."\n")
+ file:write("\t\t"..landmassV.min_x..","..landmassV.min_y.."\n")
+ file:write("\t\t"..landmassV.max_x..","..landmassV.max_y.."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
+ file:write("\n")
+ for mountainK, mountainV in ipairs(df.global.world.world_data.mountain_peaks) do
+ file:write("\t\n")
+ file:write("\t\t"..mountainK.."\n")
+ file:write("\t\t"..dfhack.df2utf(dfhack.TranslateName(mountainV.name,1)).."\n")
+ file:write("\t\t"..mountainV.pos.x..","..mountainV.pos.y.."\n")
+ file:write("\t\t"..mountainV.height.."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
file:write("\n")
for regionK, regionV in ipairs(df.global.world.world_data.regions) do
file:write("\t\n")
@@ -127,28 +150,39 @@ function export_more_legends_xml()
file:write("\n")
for siteK, siteV in ipairs(df.global.world.world_data.sites) do
- if (#siteV.buildings > 0) then
- file:write("\t\n")
- for k,v in pairs(siteV) do
- if (k == "id") then
- file:write("\t\t<"..k..">"..tostring(v)..""..k..">\n")
- elseif (k == "buildings") then
+ file:write("\t\n")
+ for k,v in pairs(siteV) do
+ if (k == "id" or k == "civ_id" or k == "cur_owner_id") then
+ file:write("\t\t<"..k..">"..tostring(v)..""..k..">\n")
+ elseif (k == "buildings") then
+ if (#siteV.buildings > 0) then
file:write("\t\t\n")
for buildingK, buildingV in ipairs(siteV.buildings) do
file:write("\t\t\t\n")
file:write("\t\t\t\t"..buildingV.id.."\n")
file:write("\t\t\t\t"..df.abstract_building_type[buildingV:getType()]:lower().."\n")
if (df.abstract_building_type[buildingV:getType()]:lower() ~= "underworld_spire") then
+ -- if spire: unk_50 should be name and unk_bc some kind of flag
file:write("\t\t\t\t"..dfhack.df2utf(dfhack.TranslateName(buildingV.name, 1)).."\n")
file:write("\t\t\t\t"..dfhack.df2utf(dfhack.TranslateName(buildingV.name)).."\n")
end
+ if (buildingV:getType() == df.abstract_building_type.TEMPLE) then
+ file:write("\t\t\t\t"..buildingV.deity.."\n")
+ file:write("\t\t\t\t"..buildingV.religion.."\n")
+ end
+ if (buildingV:getType() == df.abstract_building_type.DUNGEON) then
+ file:write("\t\t\t\t"..buildingV.dungeon_type.."\n")
+ end
+ for inhabitabntK,inhabitabntV in pairs(buildingV.inhabitants) do
+ file:write("\t\t\t\t"..inhabitabntV.anon_2.."\n")
+ end
file:write("\t\t\t\n")
end
file:write("\t\t\n")
end
end
- file:write("\t\n")
end
+ file:write("\t\n")
end
file:write("\n")
@@ -176,6 +210,18 @@ function export_more_legends_xml()
if (artifactV.item:getSubtype() ~= -1) then
file:write("\t\t"..artifactV.item.subtype.name.."\n")
end
+ for improvementK,impovementV in pairs(artifactV.item.improvements) do
+ if impovementV:getType() == df.improvement_type.WRITING then
+ for writingk,writingV in pairs(impovementV["itemimprovement_writingst.anon_1"]) do
+ file:write("\t\t"..writingV.."\n")
+ end
+ elseif impovementV:getType() == df.improvement_type.PAGES then
+ file:write("\t\t"..impovementV.count.."\n")
+ for writingk,writingV in pairs(impovementV.contents) do
+ file:write("\t\t"..writingV.."\n")
+ end
+ end
+ end
end
if (table.containskey(artifactV.item,"description")) then
file:write("\t\t"..dfhack.df2utf(artifactV.item.description:lower()).."\n")
@@ -187,7 +233,15 @@ function export_more_legends_xml()
end
file:write("\n")
- file:write("\n\n")
+ file:write("\n")
+ for hfK, hfV in ipairs(df.global.world.history.figures) do
+ file:write("\t\n")
+ file:write("\t\t"..hfV.id.."\n")
+ file:write("\t\t"..hfV.sex.."\n")
+ if hfV.race >= 0 then file:write("\t\t"..df.global.world.raws.creatures.all[hfV.race].name[0].."\n") end
+ file:write("\t\n")
+ end
+ file:write("\n")
file:write("\n")
for entityPopK, entityPopV in ipairs(df.global.world.entity_populations) do
@@ -211,11 +265,10 @@ function export_more_legends_xml()
end
file:write("\t\t"..(df.historical_entity_type[entityV.type]):lower().."\n")
if entityV.type == df.historical_entity_type.Religion then -- Get worshipped figure
- if (entityV.unknown1b ~= nil and entityV.unknown1b.worship ~= nil and
- #entityV.unknown1b.worship == 1) then
- file:write("\t\t"..entityV.unknown1b.worship[0].."\n")
- else
- print(entityV.unknown1b, entityV.unknown1b.worship, #entityV.unknown1b.worship)
+ if (entityV.unknown1b ~= nil and entityV.unknown1b.worship ~= nil) then
+ for k,v in pairs(entityV.unknown1b.worship) do
+ file:write("\t\t"..v.."\n")
+ end
end
end
for id, link in pairs(entityV.entity_links) do
@@ -229,13 +282,107 @@ function export_more_legends_xml()
end
file:write("\t\t\n")
end
+ for positionK,positionV in pairs(entityV.positions.own) do
+ file:write("\t\t\n")
+ file:write("\t\t\t"..positionV.id.."\n")
+ if positionV.name[0] ~= "" then file:write("\t\t\t"..positionV.name[0].."\n") end
+ if positionV.name_male[0] ~= "" then file:write("\t\t\t"..positionV.name_male[0].."\n") end
+ if positionV.name_female[0] ~= "" then file:write("\t\t\t"..positionV.name_female[0].."\n") end
+ if positionV.spouse[0] ~= "" then file:write("\t\t\t"..positionV.spouse[0].."\n") end
+ if positionV.spouse_male[0] ~= "" then file:write("\t\t\t"..positionV.spouse_male[0].."\n") end
+ if positionV.spouse_female[0] ~= "" then file:write("\t\t\t"..positionV.spouse_female[0].."\n") end
+ file:write("\t\t\n")
+ end
+ for assignmentK,assignmentV in pairs(entityV.positions.assignments) do
+ file:write("\t\t\n")
+ for k, v in pairs(assignmentV) do
+ if (k == "id" or k == "histfig" or k == "position_id" or k == "squad_id") then
+ file:write("\t\t\t<"..k..">"..v..""..k..">\n")
+ end
+ end
+ file:write("\t\t\n")
+ end
+ for idx,id in pairs(entityV.histfig_ids) do
+ file:write("\t\t"..id.."\n")
+ end
for id, link in ipairs(entityV.children) do
file:write("\t\t"..link.."\n")
end
+ file:write("\t\t")
+ for xK, xVal in ipairs(entityV.claims.unk2.x) do
+ file:write(xVal..","..entityV.claims.unk2.y[xK].."|")
+ end
+ file:write("\n")
file:write("\t\n")
end
file:write("\n")
+ file:write("\n")
+ for formK, formV in ipairs(df.global.world.poetic_forms.all) do
+ file:write("\t\n")
+ file:write("\t\t"..formV.id.."\n")
+ file:write("\t\t"..dfhack.df2utf(dfhack.TranslateName(formV.name,1)).."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
+ file:write("\n")
+ for formK, formV in ipairs(df.global.world.musical_forms.all) do
+ file:write("\t\n")
+ file:write("\t\t"..formV.id.."\n")
+ file:write("\t\t"..dfhack.df2utf(dfhack.TranslateName(formV.name,1)).."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
+ file:write("\n")
+ for formK, formV in ipairs(df.global.world.dance_forms.all) do
+ file:write("\t\n")
+ file:write("\t\t"..formV.id.."\n")
+ file:write("\t\t"..dfhack.df2utf(dfhack.TranslateName(formV.name,1)).."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
+ file:write("\n")
+ for wcK, wcV in ipairs(df.global.world.written_contents.all) do
+ file:write("\t\n")
+ file:write("\t\t"..wcV.id.."\n")
+ file:write("\t\t"..wcV.title.."\n")
+ file:write("\t\t"..wcV.page_start.."\n")
+ file:write("\t\t"..wcV.page_end.."\n")
+ for refK, refV in pairs(wcV.refs) do
+ file:write("\t\t\n")
+ file:write("\t\t\t"..df.general_ref_type[refV:getType()].."\n")
+ if refV:getType() == df.general_ref_type.ARTIFACT then file:write("\t\t\t"..refV.artifact_id.."\n") -- artifact
+ elseif refV:getType() == df.general_ref_type.ENTITY then file:write("\t\t\t"..refV.entity_id.."\n") -- entity
+ elseif refV:getType() == df.general_ref_type.HISTORICAL_EVENT then file:write("\t\t\t"..refV.event_id.."\n") -- event
+ elseif refV:getType() == df.general_ref_type.SITE then file:write("\t\t\t"..refV.site_id.."\n") -- site
+ elseif refV:getType() == df.general_ref_type.SUBREGION then file:write("\t\t\t"..refV.region_id.."\n") -- region
+ elseif refV:getType() == df.general_ref_type.HISTORICAL_FIGURE then file:write("\t\t\t"..refV.hist_figure_id.."\n") -- hist figure
+ elseif refV:getType() == df.general_ref_type.WRITTEN_CONTENT then file:write("\t\t\t"..refV.anon_1.."\n")
+ elseif refV:getType() == df.general_ref_type.POETIC_FORM then file:write("\t\t\t"..refV.poetic_form_id.."\n") -- poetic form
+ elseif refV:getType() == df.general_ref_type.MUSICAL_FORM then file:write("\t\t\t"..refV.musical_form_id.."\n") -- musical form
+ elseif refV:getType() == df.general_ref_type.DANCE_FORM then file:write("\t\t\t"..refV.dance_form_id.."\n") -- dance form
+ elseif refV:getType() == df.general_ref_type.INTERACTION then -- TODO INTERACTION
+ elseif refV:getType() == df.general_ref_type.KNOWLEDGE_SCHOLAR_FLAG then -- TODO KNOWLEDGE_SCHOLAR_FLAG
+ elseif refV:getType() == df.general_ref_type.VALUE_LEVEL then -- TODO VALUE_LEVEL
+ elseif refV:getType() == df.general_ref_type.LANGUAGE then -- TODO LANGUAGE
+ else
+ print("unknown reference",refV:getType(),df.general_ref_type[refV:getType()])
+ --for k,v in pairs(refV) do print(k,v) end
+ end
+ file:write("\t\t\n")
+ end
+ file:write("\t\t"..(df.written_content_type[wcV.type] or wcV.type).."\n")
+ for styleK, styleV in pairs(wcV.styles) do
+ file:write("\t\t\n")
+ end
+ file:write("\t\t"..wcV.author.."\n")
+ file:write("\t\n")
+ end
+ file:write("\n")
+
file:write("\n")
for ID, event in ipairs(df.global.world.history.events) do
if event:getType() == df.history_event_type.ADD_HF_ENTITY_LINK
@@ -246,7 +393,9 @@ function export_more_legends_xml()
or event:getType() == df.history_event_type.TOPICAGREEMENT_REJECTED
or event:getType() == df.history_event_type.TOPICAGREEMENT_MADE
or event:getType() == df.history_event_type.BODY_ABUSED
+ or event:getType() == df.history_event_type.CHANGE_CREATURE_TYPE
or event:getType() == df.history_event_type.CHANGE_HF_JOB
+ or event:getType() == df.history_event_type.CHANGE_HF_STATE
or event:getType() == df.history_event_type.CREATED_BUILDING
or event:getType() == df.history_event_type.CREATURE_DEVOURED
or event:getType() == df.history_event_type.HF_DOES_INTERACTION
@@ -393,15 +542,15 @@ function export_more_legends_xml()
file:write("\t\t"..tostring(df.meeting_topic[v]):lower().."\n")
elseif event:getType() == df.history_event_type.MASTERPIECE_CREATED_ITEM_IMPROVEMENT and k == "improvement_type" then
file:write("\t\t"..df.improvement_type[v]:lower().."\n")
- elseif ((event:getType() == df.history_event_type.HIST_FIGURE_REACH_SUMMIT and k == "figures") or
- (event:getType() == df.history_event_type.HIST_FIGURE_NEW_PET and k == "group")
+ elseif ((event:getType() == df.history_event_type.HIST_FIGURE_REACH_SUMMIT and k == "group")
+ or (event:getType() == df.history_event_type.HIST_FIGURE_NEW_PET and k == "group")
or (event:getType() == df.history_event_type.BODY_ABUSED and k == "bodies")) then
for detailK,detailV in pairs(v) do
file:write("\t\t<"..k..">"..detailV..""..k..">\n")
end
elseif event:getType() == df.history_event_type.HIST_FIGURE_NEW_PET and k == "pets" then
for detailK,detailV in pairs(v) do
- file:write("\t\t<"..k..">"..(df.global.world.raws.creatures.all[detailV].creature_id):lower()..""..k..">\n")
+ file:write("\t\t<"..k..">"..df.global.world.raws.creatures.all[detailV].name[0]..""..k..">\n")
end
elseif event:getType() == df.history_event_type.BODY_ABUSED and (k == "props") then
file:write("\t\t<"..k.."_item_type>"..tostring(df.item_type[event.props.item.item_type]):lower()..""..k.."_item_type>\n")
@@ -438,7 +587,7 @@ function export_more_legends_xml()
end
elseif k == "race" then
if v > -1 then
- file:write("\t\t"..(df.global.world.raws.creatures.all[v].creature_id):lower().."\n")
+ file:write("\t\t"..df.global.world.raws.creatures.all[v].name[0].."\n")
end
elseif k == "caste" then
if v > -1 then
@@ -458,7 +607,7 @@ function export_more_legends_xml()
if (thisItem ~= nil) then
if (thisItem.flags.artifact == true) then
for refk,refv in pairs(thisItem.general_refs) do
- if (refv:getType() == 1) then
+ if (refv:getType() == df.general_ref_type.IS_ARTIFACT) then
file:write("\t\t"..refv.artifact_id.."\n")
break
end
@@ -488,7 +637,7 @@ function export_more_legends_xml()
if thisItem ~= nil then
if (thisItem.flags.artifact == true) then
for refk,refv in pairs(thisItem.general_refs) do
- if (refv:getType() == 1) then
+ if (refv:getType() == df.general_ref_type.IS_ARTIFACT) then
file:write("\t\t"..refv.artifact_id.."\n")
break
end
@@ -520,6 +669,8 @@ function export_more_legends_xml()
file:write("\t\t<"..k..">"..df.death_type[v]:lower()..""..k..">\n")
elseif event:getType() == df.history_event_type.CHANGE_HF_JOB and (k == "new_job" or k == "old_job") then
file:write("\t\t<"..k..">"..df.profession[v]:lower()..""..k..">\n")
+ elseif event:getType() == df.history_event_type.CHANGE_CREATURE_TYPE and (k == "old_race" or k == "new_race") and v >= 0 then
+ file:write("\t\t<"..k..">"..df.global.world.raws.creatures.all[v].name[0]..""..k..">\n")
else
file:write("\t\t<"..k..">"..tostring(v)..""..k..">\n")
end
@@ -601,6 +752,8 @@ if dfhack.gui.getCurFocus() == "legends" or dfhack.gui.getCurFocus() == "dfhack/
wait_for_legends_vs()
elseif args[1] == "info" then
export_legends_info()
+ elseif args[1] == "custom" then
+ export_more_legends_xml()
elseif args[1] == "maps" then
wait_for_legends_vs()
elseif args[1] == "sites" then