|  |  | @ -366,11 +366,28 @@ function dfhack.getSavePath() | 
			
		
	
		
		
			
				
					
					|  |  |  | end |  |  |  | end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | if dfhack.is_core_context then |  |  |  | if dfhack.is_core_context then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     local function loadInitFile(path, name) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local env = setmetatable({ SAVE_PATH = path }, { __index = base_env }) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         local f,perr = loadfile(name, 't', env) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if f == nil then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if not string.match(perr, 'No such file or directory') then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 dfhack.printerr(perr) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         elseif safecall(f) then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if not internal.save_init then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 internal.save_init = {} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             table.insert(internal.save_init, env) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     dfhack.onStateChange.DFHACK_PER_SAVE = function(op) |  |  |  |     dfhack.onStateChange.DFHACK_PER_SAVE = function(op) | 
			
		
	
		
		
			
				
					
					|  |  |  |         if op == SC_WORLD_LOADED or op == SC_WORLD_UNLOADED then |  |  |  |         if op == SC_WORLD_LOADED or op == SC_WORLD_UNLOADED then | 
			
		
	
		
		
			
				
					
					|  |  |  |             if internal.save_init then |  |  |  |             if internal.save_init then | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if internal.save_init.onUnload then |  |  |  |                 for k,v in ipairs(internal.save_init) do | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     safecall(internal.save_init.onUnload) |  |  |  |                     if v.onUnload then | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         safecall(v.onUnload) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     end | 
			
		
	
		
		
			
				
					
					|  |  |  |                 end |  |  |  |                 end | 
			
		
	
		
		
			
				
					
					|  |  |  |                 internal.save_init = nil |  |  |  |                 internal.save_init = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |             end |  |  |  |             end | 
			
		
	
	
		
		
			
				
					|  |  | @ -378,18 +395,24 @@ if dfhack.is_core_context then | 
			
		
	
		
		
			
				
					
					|  |  |  |             local path = dfhack.getSavePath() |  |  |  |             local path = dfhack.getSavePath() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if path and op == SC_WORLD_LOADED then |  |  |  |             if path and op == SC_WORLD_LOADED then | 
			
		
	
		
		
			
				
					
					|  |  |  |                 local env = setmetatable({ SAVE_PATH = path }, { __index = base_env }) |  |  |  |                 loadInitFile(path, path..'/raw/init.lua') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 local f,perr = loadfile(path..'/raw/init.lua', 't', env) |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 if f == nil then |  |  |  |                 local dirlist = dfhack.internal.getDir(path..'/raw/init.d/') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                     if not string.match(perr, 'No such file or directory') then |  |  |  |                 if dirlist then | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                         dfhack.printerr(perr) |  |  |  |                     table.sort(dirlist) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     for i,name in ipairs(dirlist) do | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         if string.match(name,'%.lua$') then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                             loadInitFile(path, path..'/raw/init.d/'..name) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                         end | 
			
		
	
		
		
			
				
					
					|  |  |  |                     end |  |  |  |                     end | 
			
		
	
		
		
			
				
					
					|  |  |  |                 elseif safecall(f) then |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                     internal.save_init = env |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 end |  |  |  |                 end | 
			
		
	
		
		
			
				
					
					|  |  |  |             end |  |  |  |             end | 
			
		
	
		
		
			
				
					
					|  |  |  |         elseif internal.save_init and internal.save_init.onStateChange then |  |  |  |         elseif internal.save_init then | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             safecall(internal.save_init.onStateChange, op) |  |  |  |             for k,v in ipairs(internal.save_init) do | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if v.onStateChange then | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     safecall(v.onStateChange, op) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             end | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  |     end |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  | end |  |  |  | end | 
			
		
	
	
		
		
			
				
					|  |  | 
 |