anchor.diff:  	CollectRoundtype()
   
   /datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
  -	var/list/satchels = list()
   	satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar))
  +	var/list/satchels_to_add = list()
   	for(var/A in new_secret_satchels)
   		var/obj/item/storage/backpack/satchel/flat/F = A
   		if(QDELETED(F) || F.z != ZLEVEL_STATION_PRIMARY || F.invisibility != INVISIBILITY_MAXIMUM)
  
positive.code: 		data["x"] = F.x
  		data["y"] = F.y
  		data["saved_obj"] = pick(savable_obj)
  		satchels += list(data)
  	var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json")
  	var/list/file_data = list()
  	file_data["data"] = satchels
  	fdel(json_file)
  	WRITE_FILE(json_file, json_encode(file_data))
  
  /datum/controller/subsystem/persistence/proc/CollectChiselMessages()
  
negative.code: /datum/controller/subsystem/persistence/proc/LoadSatchels()
  	var/placed_satchel = 0
  	var/path
  	if(fexists("data/npc_saves/SecretSatchels.sav")) //legacy conversion. Will only ever run once.
  		var/savefile/secret_satchels = new /savefile("data/npc_saves/SecretSatchels.sav")
  		for(var/map in secret_satchels)
  			var/json_file = file("data/npc_saves/SecretSatchels[map].json")
  			var/list/legacy_secret_satchels = splittext(secret_satchels[map],"#")
  			var/list/satchels = list()
  			for(var/i=1,i<=legacy_secret_satchels.len,i++)
  				var/satchel_string = legacy_secret_satchels[i]
  				var/list/chosen_satchel = splittext(satchel_string,"|")
  				if(chosen_satchel.len == 3)
  					var/list/data = list()
  					data["x"] = text2num(chosen_satchel[1])
  					data["y"] = text2num(chosen_satchel[2])
  					data["saved_obj"] = chosen_satchel[3]
  					satchels += list(data)
  			var/list/file_data = list()
  			file_data["data"] = satchels
  			WRITE_FILE(json_file, json_encode(file_data))
  		fdel("data/npc_saves/SecretSatchels.sav")
  
  	var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json")
  	var/list/json = list()
  	if(fexists(json_file))
  		json = json_decode(file2text(json_file))
  
  	old_secret_satchels = json["data"]
  	var/obj/item/storage/backpack/satchel/flat/F
  	if(old_secret_satchels && old_secret_satchels.len >= 10) //guards against low drop pools assuring that one player cannot reliably find his own gear.
  		var/pos = rand(1, old_secret_satchels.len)
  		F = new()
  		old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len)
  		F.x = old_secret_satchels[pos]["x"]
  		F.y = old_secret_satchels[pos]["y"]
  		F.z = ZLEVEL_STATION_PRIMARY
  		path = text2path(old_secret_satchels[pos]["saved_obj"])
  
  	if(F)
  		if(isfloorturf(F.loc) && !istype(F.loc, /turf/open/floor/plating/))
  			F.hide(1)
  		if(ispath(path))
  			new path(F)
  		placed_satchel++
  	var/free_satchels = 0
  	for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,ZLEVEL_STATION_PRIMARY), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,ZLEVEL_STATION_PRIMARY)))) //Nontrivially expensive but it's roundstart only
  		if(isfloorturf(T) && !istype(T, /turf/open/floor/plating/))
  			new /obj/item/storage/backpack/satchel/flat/secret(T)
  			free_satchels++
  			if((free_satchels + placed_satchel) == 10) //ten tiles, more than enough to kill anything that moves
  				break
  
  /datum/controller/subsystem/persistence/proc/LoadPoly()
  