80 lines
3.0 KiB
Plaintext
80 lines
3.0 KiB
Plaintext
/**
|
|
* Secret satchel persistence - allows storing of items in underfloor satchels that's loaded later.
|
|
*/
|
|
/datum/controller/subsystem/persistence
|
|
var/list/satchel_blacklist = list() //this is a typecache
|
|
var/list/new_secret_satchels = list() //these are objects
|
|
var/list/old_secret_satchels = list()
|
|
|
|
/datum/controller/subsystem/persistence/LoadGamePersistence()
|
|
. = ..()
|
|
LoadSatchels()
|
|
|
|
/datum/controller/subsystem/persistence/SaveGamePersistence()
|
|
. = ..()
|
|
CollectSecretSatchels()
|
|
|
|
/datum/controller/subsystem/persistence/proc/LoadSatchels()
|
|
var/placed_satchel = 0
|
|
var/path
|
|
|
|
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 = SSmapping.station_start
|
|
path = text2path(old_secret_satchels[pos]["saved_obj"])
|
|
|
|
if(F)
|
|
if(isfloorturf(F.loc) && !isplatingturf(F.loc))
|
|
F.hide(1)
|
|
if(ispath(path))
|
|
var/spawned_item = new path(F)
|
|
spawned_objects[spawned_item] = TRUE
|
|
placed_satchel++
|
|
var/free_satchels = 0
|
|
for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only
|
|
if(isfloorturf(T) && !isplatingturf(T))
|
|
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/CollectSecretSatchels()
|
|
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 != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM)
|
|
continue
|
|
var/list/savable_obj = list()
|
|
for(var/obj/O in F)
|
|
if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1))
|
|
continue
|
|
if(O.persistence_replacement)
|
|
savable_obj += O.persistence_replacement
|
|
else
|
|
savable_obj += O.type
|
|
if(isemptylist(savable_obj))
|
|
continue
|
|
var/list/data = list()
|
|
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))
|