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).."\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).."\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.."\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.."\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().."\n") + file:write("\t\t<"..k..">"..df.global.world.raws.creatures.all[detailV].name[0].."\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().."\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().."\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().."\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].."\n") else file:write("\t\t<"..k..">"..tostring(v).."\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