|
|
|
@ -1,8 +1,29 @@
|
|
|
|
|
-- a graphical mod manager for df
|
|
|
|
|
local gui=require 'gui'
|
|
|
|
|
local widgets=require 'gui.widgets'
|
|
|
|
|
|
|
|
|
|
local entity_file=dfhack.getDFPath().."/raw/objects/entity_default.txt"
|
|
|
|
|
local init_file=dfhack.getDFPath().."/raw/init.lua"
|
|
|
|
|
local mod_dir=dfhack.getDFPath().."/hack/mods"
|
|
|
|
|
--[[ mod format: lua script that defines:
|
|
|
|
|
name - a name that is displayed in list
|
|
|
|
|
author - mod author, also displayed
|
|
|
|
|
description - mod description
|
|
|
|
|
OPTIONAL:
|
|
|
|
|
raws_list - a list (table) of file names that need to be copied over to df raws
|
|
|
|
|
patch_entity - a chunk of text to patch entity TODO: add settings to which entities to add
|
|
|
|
|
patch_init - a chunk of lua to add to lua init
|
|
|
|
|
patch_dofile - a list (table) of files to add to lua init as "dofile"
|
|
|
|
|
patch_files - a table of files to patch:
|
|
|
|
|
filename - a filename (in raws folder) to patch
|
|
|
|
|
patch - what to add
|
|
|
|
|
after - a string after which to insert
|
|
|
|
|
MORE OPTIONAL:
|
|
|
|
|
guard - a token that is used in raw files to find editions and remove them on uninstall
|
|
|
|
|
guard_init - a token for lua file
|
|
|
|
|
[pre|post]_(un)install - callback functions. Can trigger more complicated behavior
|
|
|
|
|
]]
|
|
|
|
|
|
|
|
|
|
function fileExists(filename)
|
|
|
|
|
local file=io.open(filename,"rb")
|
|
|
|
|
if file==nil then
|
|
|
|
@ -12,6 +33,10 @@ function fileExists(filename)
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not fileExists(init_file) then
|
|
|
|
|
local initFile=io.open(initFileName,"a")
|
|
|
|
|
initFile:close()
|
|
|
|
|
end
|
|
|
|
|
function copyFile(from,to) --oh so primitive
|
|
|
|
|
local filefrom=io.open(from,"rb")
|
|
|
|
|
local fileto=io.open(to,"w+b")
|
|
|
|
@ -27,6 +52,16 @@ function patchInit(initFileName,patch_guard,code)
|
|
|
|
|
code,patch_guard[2]))
|
|
|
|
|
initFile:close()
|
|
|
|
|
end
|
|
|
|
|
function patchDofile( initFileName,patch_guard,dofile_list )
|
|
|
|
|
local initFile=io.open(initFileName,"a")
|
|
|
|
|
initFile:write(patch_guard[1].."\n")
|
|
|
|
|
for _,v in ipairs(dofile_list) do
|
|
|
|
|
local fixed_path=mod_dir:gsub("\\","/")
|
|
|
|
|
initFile:write(string.format("dofile('%s/%s')\n",fixed_path,v))
|
|
|
|
|
end
|
|
|
|
|
initFile:write(patch_guard[2].."\n")
|
|
|
|
|
initFile:close()
|
|
|
|
|
end
|
|
|
|
|
function patchFile(file_name,patch_guard,after_string,code)
|
|
|
|
|
local input_lines=patch_guard[1].."\n"..code.."\n"..patch_guard[2]
|
|
|
|
|
|
|
|
|
@ -109,15 +144,19 @@ manager=defclass(manager,gui.FramedScreen)
|
|
|
|
|
function manager:init(args)
|
|
|
|
|
self.mods={}
|
|
|
|
|
local mods=self.mods
|
|
|
|
|
local mlist=dfhack.internal.getDir("mods")
|
|
|
|
|
local mlist=dfhack.internal.getDir(mod_dir)
|
|
|
|
|
|
|
|
|
|
if #mlist==0 then
|
|
|
|
|
qerror("Mod directory not found! Are you sure it is in:"..mod_dir)
|
|
|
|
|
end
|
|
|
|
|
for k,v in ipairs(mlist) do
|
|
|
|
|
if v~="." and v~=".." then
|
|
|
|
|
local f,modData=pcall(dofile,"mods/".. v .. "/init.lua")
|
|
|
|
|
local f,modData=pcall(dofile,mod_dir.."/".. v .. "/init.lua")
|
|
|
|
|
if f then
|
|
|
|
|
mods[modData.name]=modData
|
|
|
|
|
modData.guard=modData.guard or {">>"..modData.name.." patch","<<End "..modData.name.." patch"}
|
|
|
|
|
modData.guard_init={"--"..modData.guard[1],"--"..modData.guard[2]}
|
|
|
|
|
modData.path=dfhack.getDFPath()..'/mods/'..v..'/'
|
|
|
|
|
modData.path=mod_dir.."/"..v..'/'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@ -254,7 +293,9 @@ function manager:install(trgMod,force)
|
|
|
|
|
if trgMod.patch_init then
|
|
|
|
|
patchInit(init_file,trgMod.guard_init,trgMod.patch_init)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if trgMod.patch_dofile then
|
|
|
|
|
patchDofile(init_file,trgMod.guard_init,trgMod.patch_dofile)
|
|
|
|
|
end
|
|
|
|
|
trgMod.installed=true
|
|
|
|
|
|
|
|
|
|
if trgMod.post_install then
|
|
|
|
@ -281,9 +322,10 @@ function manager:uninstall(trgMod)
|
|
|
|
|
unPatchFile(dfhack.getDFPath().."/raw/objects/"..v.filename,trgMod.guard)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if trgMod.patch_init then
|
|
|
|
|
if trgMod.patch_init or trgMod.patch_dofile then
|
|
|
|
|
unPatchFile(init_file,trgMod.guard_init)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
trgMod.installed=false
|
|
|
|
|
if trgMod.post_uninstall then
|
|
|
|
|
trgMod.post_uninstall(args)
|
|
|
|
|