anchor.diff:  /datum/controller/subsystem/persistence/proc/LoadSatchels()
   	var/placed_satchel = 0
   	var/path
  -	var/obj/item/storage/backpack/satchel/flat/F = new()
  -	if(fexists("data/npc_saves/SecretSatchels.sav")) //legacy compatability to convert old format to new
  +	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")
  -		var/sav_text
  -		secret_satchels[SSmapping.config.map_name] >> sav_text
  -		fdel("data/npc_saves/SecretSatchels.sav")
  -		if(sav_text)
  -			old_secret_satchels = splittext(sav_text,"#")
  -			if(old_secret_satchels.len >= 20)
  -				var/satchel_string = pick_n_take(old_secret_satchels)
  +		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)
  -					F.x = text2num(chosen_satchel[1])
  -					F.y = text2num(chosen_satchel[2])
  -					F.z = ZLEVEL_STATION_PRIMARY
  -					path = text2path(chosen_satchel[3])
  -	else
  -		var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json")
  -		if(!fexists(json_file))
  -			return
  -		var/list/json = json_decode(file2text(json_file))
  -		old_secret_satchels = json["data"]
  -		if(old_secret_satchels.len)
  -			if(old_secret_satchels.len >= 20) //guards against low drop pools assuring that one player cannot reliably find his own gear.
  -				var/pos = rand(1, old_secret_satchels.len)
  -				old_secret_satchels.Cut(pos, pos+1)
  -				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(!ispath(path))
  -		return
  -	if(isfloorturf(F.loc) && !istype(F.loc, /turf/open/floor/plating/))
  -		F.hide(1)
  -	new path(F)
  -	placed_satchel++
  -	var/list/free_satchels = list()
  +					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/))
  -			free_satchels += new /obj/item/storage/backpack/satchel/flat/secret(T)
  -			if(!isemptylist(free_satchels) && ((free_satchels.len + placed_satchel) >= (50 - old_secret_satchels.len) * 0.1)) //up to six tiles, more than enough to kill anything that moves
  +			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()
  
positive.code: 	CollectRoundtype()
  
  /datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
  	var/list/satchels = list()
  	satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar))
  	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)
  
negative.code: 		data["x"] = F.x
  		data["y"] = F.y
  		data["saved_obj"] = pick(savable_obj)
  		satchels_to_add += list(data)
  
  	var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json")
  	var/list/file_data = list()
  	fdel(json_file)
  	file_data["data"] = old_secret_satchels + satchels_to_add
  	WRITE_FILE(json_file, json_encode(file_data))
  
  /datum/controller/subsystem/persistence/proc/CollectChiselMessages()
  