Files
Bubberstation/code/controllers/subsystem/persistence/engravings.dm
Profakos 52ccdf20cd Prevents persistence from trying to load more engravings than exists (#86065)
## About The Pull Request

During initializing persistent wall engravings, the game picked a number
between 15 and 25, and attempted to load that many. However, if there
were less engravings than that, the loop went on even after the list it
was calling `pick_n_take` on was empty, and multiple times it has logged
a runtime claiming that the engraving was in an incorrect format when it
tried to parse the returned nulls.

This PR ensures that the game will not attempt to load more engravings
than the amount that exists in the persistence files, ensuring less
incorrect error messages during initialization.

## Why It's Good For The Game

Less incorrect lines during initialization on maps that have not
received enough engravings.

## Changelog

Nothing player facing.
2024-09-05 22:58:54 -06:00

85 lines
2.7 KiB
Plaintext

///Loads all engravings, and places a select amount in maintenance and the prison.
/datum/controller/subsystem/persistence/proc/load_wall_engravings()
var/json_file = file(ENGRAVING_SAVE_FILE)
if(!fexists(json_file))
return
var/list/json = json_decode(file2text(json_file))
if(!json)
return
if(json["version"] < ENGRAVING_PERSISTENCE_VERSION)
update_wall_engravings(json)
saved_engravings = json["entries"]
if(!saved_engravings.len)
log_world("Failed to load engraved messages on map [SSmapping.config.map_name]")
return
var/list/viable_turfs = get_area_turfs(/area/station/maintenance, subtypes = TRUE) + get_area_turfs(/area/station/security/prison, subtypes = TRUE)
var/list/turfs_to_pick_from = list()
for(var/turf/T as anything in viable_turfs)
if(!isclosedturf(T))
continue
turfs_to_pick_from += T
var/successfully_loaded_engravings = 0
for(var/iteration in 1 to min(rand(MIN_PERSISTENT_ENGRAVINGS, MAX_PERSISTENT_ENGRAVINGS), saved_engravings.len))
var/engraving = pick_n_take(saved_engravings)
if(!islist(engraving))
stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!")
continue
var/turf/closed/engraved_wall = pick(turfs_to_pick_from)
if(HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE))
continue
engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"])
successfully_loaded_engravings++
turfs_to_pick_from -= engraved_wall
log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.config.map_name]")
///Saves all new engravings in the world.
/datum/controller/subsystem/persistence/proc/save_wall_engravings()
var/list/saved_data = list()
saved_data["version"] = ENGRAVING_PERSISTENCE_VERSION
saved_data["entries"] = list()
var/json_file = file(ENGRAVING_SAVE_FILE)
if(fexists(json_file))
var/list/old_json = json_decode(file2text(json_file))
if(old_json)
saved_data["entries"] = old_json["entries"]
for(var/datum/component/engraved/engraving in wall_engravings)
if(!engraving.persistent_save)
continue
var/area/engraved_area = get_area(engraving.parent)
if(!(engraved_area.area_flags & PERSISTENT_ENGRAVINGS))
continue
saved_data["entries"] += engraving.save_persistent()
fdel(json_file)
WRITE_FILE(json_file, json_encode(saved_data))
///This proc can update entries if the format has changed at some point.
/datum/controller/subsystem/persistence/proc/update_wall_engravings(json)
for(var/engraving_entry in json["entries"])
continue //no versioning yet
//Save it to the file
var/json_file = file(ENGRAVING_SAVE_FILE)
fdel(json_file)
WRITE_FILE(json_file, json_encode(json))
return json