| 
						
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -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)
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |