[MIRROR] Transit space refactor (#7130)
* Transit space refactor * Update bitfields.dm
This commit is contained in:
committed by
kevinz000
parent
389e9584a3
commit
03a22ca16d
@@ -21,6 +21,11 @@ SUBSYSTEM_DEF(mapping)
|
||||
var/list/areas_in_z = list()
|
||||
|
||||
var/loading_ruins = FALSE
|
||||
var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs)
|
||||
var/list/datum/turf_reservations //list of turf reservations
|
||||
var/list/used_turfs = list() //list of turf = datum/turf_reservation
|
||||
|
||||
var/clearing_reserved_turfs = FALSE
|
||||
|
||||
// Z-manager stuff
|
||||
var/station_start // should only be used for maploading-related tasks
|
||||
@@ -41,6 +46,8 @@ SUBSYSTEM_DEF(mapping)
|
||||
|
||||
|
||||
/datum/controller/subsystem/mapping/Initialize(timeofday)
|
||||
if(initialized)
|
||||
return
|
||||
if(config.defaulted)
|
||||
to_chat(world, "<span class='boldannounce'>Unable to load next map config, defaulting to Box Station</span>")
|
||||
loader = new
|
||||
@@ -58,12 +65,13 @@ SUBSYSTEM_DEF(mapping)
|
||||
++space_levels_so_far
|
||||
empty_space = add_new_zlevel("Empty Area [space_levels_so_far]", list(ZTRAIT_LINKAGE = CROSSLINKED))
|
||||
// and the transit level
|
||||
transit = add_new_zlevel("Transit", list(ZTRAIT_TRANSIT = TRUE))
|
||||
transit = add_new_zlevel("Transit/Reserved", list(ZTRAIT_RESERVED = TRUE))
|
||||
|
||||
// Pick a random away mission.
|
||||
if(CONFIG_GET(flag/roundstart_away))
|
||||
createRandomZlevel()
|
||||
|
||||
|
||||
// Generate mining ruins
|
||||
loading_ruins = TRUE
|
||||
var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS)
|
||||
@@ -83,12 +91,42 @@ SUBSYSTEM_DEF(mapping)
|
||||
setup_map_transitions()
|
||||
generate_station_area_list()
|
||||
QDEL_NULL(loader)
|
||||
initialize_reserved_level()
|
||||
..()
|
||||
|
||||
/* Nuke threats, for making the blue tiles on the station go RED
|
||||
Used by the AI doomsday and the self destruct nuke.
|
||||
*/
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/wipe_reservations(wipe_safety_delay = 100)
|
||||
if(clearing_reserved_turfs || !initialized) //in either case this is just not needed.
|
||||
return
|
||||
clearing_reserved_turfs = TRUE
|
||||
SSshuttle.transit_requesters.Cut()
|
||||
message_admins("Clearing dynamic reservation space.")
|
||||
var/list/obj/docking_port/mobile/in_transit = list()
|
||||
for(var/i in SSshuttle.transit)
|
||||
var/obj/docking_port/stationary/transit/T = i
|
||||
if(!istype(T))
|
||||
continue
|
||||
in_transit[T] = T.get_docked()
|
||||
var/go_ahead = world.time + wipe_safety_delay
|
||||
if(in_transit.len)
|
||||
message_admins("Shuttles in transit detected. Attempting to fast travel. Timeout is [wipe_safety_delay/10] seconds.")
|
||||
var/list/cleared = list()
|
||||
for(var/i in in_transit)
|
||||
INVOKE_ASYNC(src, .proc/safety_clear_transit_dock, i, in_transit[i], cleared)
|
||||
UNTIL((go_ahead < world.time) || (cleared.len == in_transit.len))
|
||||
do_wipe_turf_reservations()
|
||||
clearing_reserved_turfs = FALSE
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/safety_clear_transit_dock(obj/docking_port/stationary/transit/T, obj/docking_port/mobile/M, list/returning)
|
||||
M.setTimer(0)
|
||||
var/error = M.initiate_docking(M.destination, M.preferred_direction)
|
||||
if(!error)
|
||||
returning += M
|
||||
qdel(T, TRUE)
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/add_nuke_threat(datum/nuke)
|
||||
nuke_threats[nuke] = TRUE
|
||||
check_nuke_threats()
|
||||
@@ -108,16 +146,22 @@ SUBSYSTEM_DEF(mapping)
|
||||
|
||||
/datum/controller/subsystem/mapping/Recover()
|
||||
flags |= SS_NO_INIT
|
||||
initialized = SSmapping.initialized
|
||||
map_templates = SSmapping.map_templates
|
||||
ruins_templates = SSmapping.ruins_templates
|
||||
space_ruins_templates = SSmapping.space_ruins_templates
|
||||
lava_ruins_templates = SSmapping.lava_ruins_templates
|
||||
shuttle_templates = SSmapping.shuttle_templates
|
||||
shelter_templates = SSmapping.shelter_templates
|
||||
unused_turfs = SSmapping.unused_turfs
|
||||
turf_reservations = SSmapping.turf_reservations
|
||||
used_turfs = SSmapping.used_turfs
|
||||
|
||||
config = SSmapping.config
|
||||
next_map_config = SSmapping.next_map_config
|
||||
|
||||
clearing_reserved_turfs = SSmapping.clearing_reserved_turfs
|
||||
|
||||
z_list = SSmapping.z_list
|
||||
|
||||
#define INIT_ANNOUNCE(X) to_chat(world, "<span class='boldannounce'>[X]</span>"); log_world(X)
|
||||
@@ -328,7 +372,6 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
shelter_templates[S.shelter_id] = S
|
||||
map_templates[S.shelter_id] = S
|
||||
|
||||
|
||||
//Manual loading of away missions.
|
||||
/client/proc/admin_away()
|
||||
set name = "Load Away Mission"
|
||||
@@ -381,4 +424,58 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
break
|
||||
//Link station gate with away gate and remove wait time.
|
||||
GLOB.the_gateway.awaygate = new_gate
|
||||
GLOB.the_gateway.wait = world.time
|
||||
GLOB.the_gateway.wait = world.time
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override)
|
||||
UNTIL(initialized && !clearing_reserved_turfs)
|
||||
var/datum/turf_reservation/reserve = new type
|
||||
if(turf_type_override)
|
||||
reserve.turf_type = turf_type_override
|
||||
if(!z)
|
||||
for(var/i in levels_by_trait(ZTRAIT_RESERVED))
|
||||
if(reserve.Reserve(width, height, i))
|
||||
return reserve
|
||||
else
|
||||
if(!level_trait(z, ZTRAIT_RESERVED))
|
||||
qdel(reserve)
|
||||
return
|
||||
else
|
||||
if(reserve.Reserve(width, height, z))
|
||||
return reserve
|
||||
QDEL_NULL(reserve)
|
||||
|
||||
//This is not for wiping reserved levels, use wipe_reservations() for that.
|
||||
/datum/controller/subsystem/mapping/proc/initialize_reserved_level()
|
||||
UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case.
|
||||
clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it.
|
||||
for(var/i in levels_by_trait(ZTRAIT_RESERVED))
|
||||
var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,i))
|
||||
var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,i))
|
||||
reserve_turfs(block(A, B))
|
||||
clearing_reserved_turfs = FALSE
|
||||
|
||||
/datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs)
|
||||
for(var/i in turfs)
|
||||
var/turf/T = i
|
||||
T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE)
|
||||
LAZYINITLIST(unused_turfs["[T.z]"])
|
||||
unused_turfs["[T.z]"] |= T
|
||||
T.flags_1 |= UNUSED_RESERVATION_TURF_1
|
||||
CHECK_TICK
|
||||
|
||||
//DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations().
|
||||
/datum/controller/subsystem/mapping/proc/do_wipe_turf_reservations()
|
||||
UNTIL(initialized) //This proc is for AFTER init, before init turf reservations won't even exist and using this will likely break things.
|
||||
for(var/i in turf_reservations)
|
||||
var/datum/turf_reservation/TR = i
|
||||
if(!QDELETED(TR))
|
||||
qdel(TR, TRUE)
|
||||
UNSETEMPTY(turf_reservations)
|
||||
var/list/clearing = list()
|
||||
for(var/l in unused_turfs) //unused_turfs is a assoc list by z = list(turfs)
|
||||
if(islist(unused_turfs[l]))
|
||||
clearing |= unused_turfs[l]
|
||||
clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already.
|
||||
unused_turfs.Cut()
|
||||
used_turfs.Cut()
|
||||
reserve_turfs(clearing)
|
||||
|
||||
Reference in New Issue
Block a user