"
@@ -350,14 +350,14 @@ body
else if(isicon(value))
#ifdef VARSICON
- html += "[name] = /icon ([value]) [bicon(value)]"
+ html += "[name] = /icon ([value]) [bicon(value, use_class=0)]"
#else
html += "[name] = /icon ([value])"
#endif
else if(istype(value, /image))
#ifdef VARSICON
- html += "[name] \ref[value] = /image ([value]) [bicon(value)]"
+ html += "[name] \ref[value] = /image ([value]) [bicon(value, use_class=0)]"
#else
html += "[name] \ref[value] = /image ([value])"
#endif
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 4bef4896cc8..b97ce1f5c7f 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -406,7 +406,8 @@ var/list/advance_cures = list(
AD.Refresh()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
- if(H.z != 1)
+ // TODO: Tie into space manager
+ if(H.z != ZLEVEL_STATION)
continue
if(!H.HasDisease(D))
H.ForceContractDisease(D)
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index 83b3a4a226a..172c4b63757 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -43,11 +43,11 @@ Bonus
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1)
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5))
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm
index eb7afcaf6be..cba4d4a4cd0 100644
--- a/code/datums/diseases/advance/symptoms/damage_converter.dm
+++ b/code/datums/diseases/advance/symptoms/damage_converter.dm
@@ -45,9 +45,11 @@ Bonus
if(!parts.len)
return
- M.heal_overall_damage(get_damage, get_damage)
+ for(var/obj/item/organ/external/E in parts)
+ E.heal_damage(get_damage, get_damage, 0, 0)
M.adjustToxLoss(get_damage*parts.len)
+
else
if(M.getFireLoss() > 0 || M.getBruteLoss() > 0)
M.adjustFireLoss(-get_damage)
diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm
index 3ec0f16358a..9234b54b088 100644
--- a/code/datums/diseases/advance/symptoms/sensory.dm
+++ b/code/datums/diseases/advance/symptoms/sensory.dm
@@ -21,7 +21,7 @@ Bonus
resistance = -4
stage_speed = -4
transmittable = -3
- level = 6
+ level = 5
severity = 0
/datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A)
@@ -38,12 +38,12 @@ Bonus
M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10))
to_chat(M, "You feel sober.")
if(4)
- if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10)
- M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5))
+ if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10)
+ M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaphydramine"=5))
to_chat(M, "You feel focused.")
if(5)
- if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10)
- M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10))
+ if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10)
+ M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaphydramine"=10))
to_chat(M, "Your mind feels relaxed.")
return
diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm
index 03fe8602281..8b61be7d12b 100644
--- a/code/datums/helper_datums/map_template.dm
+++ b/code/datums/helper_datums/map_template.dm
@@ -48,7 +48,7 @@
// This system will metaphorically snap in half (not postpone init everywhere)
// if given a multi-z template
// it might need to be adapted for that when that time comes
- zlevels.add_dirt(placement.z)
+ space_manager.add_dirt(placement.z)
var/list/bounds = maploader.load_map(get_file(), min_x, min_y, placement.z, cropMap = 1)
if(!bounds)
return 0
@@ -65,7 +65,7 @@
late_setup_level(
block(bot_left, top_right),
block(ST_bot_left, ST_top_right))
- zlevels.remove_dirt(placement.z)
+ space_manager.remove_dirt(placement.z)
log_game("[name] loaded at [min_x],[min_y],[placement.z]")
return 1
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index c7aa3dfd9a0..63b9405f73e 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -67,6 +67,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
caster.reset_view(0)
return 0
+ // TODO: Tie into space manager
if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
return 0
if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
@@ -363,6 +364,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list))
return 0
+ // TODO: Tie into space manager
if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
return 0
if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
@@ -400,4 +402,4 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
return 0
if(isbrain(user) || ispAI(user))
return 0
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index cafbb579f34..022d2dc128b 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -309,6 +309,14 @@ var/list/uplink_items = list()
item = /obj/item/clothing/under/contortionist
cost = 6
job = list("Life Support Specialist")
+
+/datum/uplink_item/dangerous/energizedfireaxe
+ name = "Energized Fire Axe"
+ desc = "A fire axe with a massive electrical charge built into it. It can release this charge on its first victim and will be rather plain after that."
+ reference = "EFA"
+ item = /obj/item/weapon/twohanded/energizedfireaxe
+ cost = 10
+ job = list("Life Support Specialist")
//Stimulants
diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm
index 07735e85968..bf942b7ceba 100644
--- a/code/datums/weather/weather_types.dm
+++ b/code/datums/weather/weather_types.dm
@@ -1,4 +1,5 @@
//Different types of weather.
+// TODO: Tie into space manager
/datum/weather/floor_is_lava //The Floor is Lava: Makes all turfs damage anyone on them unless they're standing on a solid object.
name = "the floor is lava"
diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm
index b13cfe9ca05..b78345b0638 100644
--- a/code/defines/procs/radio.dm
+++ b/code/defines/procs/radio.dm
@@ -47,6 +47,7 @@
/proc/get_receiver_reception(var/receiver, var/datum/signal/signal)
if(receiver && check_signal(signal))
var/turf/pos = get_turf(receiver)
+ // Maybe should get tie-in to the space manager?
if(pos && (pos.z in signal.data["level"]))
return TELECOMMS_RECEPTION_RECEIVER
return TELECOMMS_RECEPTION_NONE
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 3992f97fd0b..07ad5956002 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -67,6 +67,7 @@ var/list/teleportlocs = list()
if(AR.no_teleportlocs) continue
if(teleportlocs.Find(AR.name)) continue
var/turf/picked = safepick(get_area_turfs(AR.type))
+ // TODO: Tie into space manager
if(picked && (picked.z == ZLEVEL_STATION))
teleportlocs += AR.name
teleportlocs[AR.name] = AR
@@ -2632,4 +2633,3 @@ var/list/the_station_areas = list (
/area/turret_protected/ai_upload_foyer,
/area/turret_protected/ai,
)
-
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 43540f347de..5963d461daf 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -376,6 +376,7 @@
return 1
else
// There's a gravity generator on our z level
+ // This would do well when integrated with the z level manager
if(T && gravity_generators["[T.z]"] && length(gravity_generators["[T.z]"]))
return 1
return 0
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7e5c26b52e5..e4332ac78c0 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -41,6 +41,7 @@
if(!T)
return 0
+ // TODO: Tie into space manager
if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother
return 0
@@ -58,6 +59,7 @@
if(!T)
return 0
+ // TODO: Tie into space manager
if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother
return 0
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index cb612eec455..a903e4ea8ed 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -44,8 +44,8 @@
// at which point object creations are a fair toss more seldom
/atom/movable/proc/attempt_init()
var/turf/T = get_turf(src)
- if(T && zlevels.is_zlevel_dirty(T.z))
- zlevels.postpone_init(T.z, src)
+ if(T && space_manager.is_zlevel_dirty(T.z))
+ space_manager.postpone_init(T.z, src)
else if(auto_init)
initialize()
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 1dc7985d648..7d9aed3d442 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -80,6 +80,7 @@
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob)
+ // TODO: Tie into space manager
if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den..
to_chat(user, "You should probably wait until you reach the station.")
return
@@ -135,4 +136,4 @@
veil_msg = "You sense an adorable presence \
lurking just beyond the veil..."
objective_verb = "Hug and Tickle"
- demon_type = /mob/living/simple_animal/slaughter/laughter
\ No newline at end of file
+ demon_type = /mob/living/simple_animal/slaughter/laughter
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 35b469258ef..ebab12dc0f2 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -118,6 +118,7 @@ var/list/blob_nodes = list()
if(directory[ckey(blob.key)])
blob_client = directory[ckey(blob.key)]
location = get_turf(C)
+ // TODO: Tie into space manager
if(location.z != ZLEVEL_STATION || istype(location, /turf/space))
if(!warned)
to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!")
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index c6d3bd13e0f..e74a0677942 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -23,6 +23,7 @@
var/nukecode = rand(10000, 99999)
for(var/obj/machinery/nuclearbomb/bomb in world)
if(bomb && bomb.r_code)
+ // TODO: Tie into space manager
if(bomb.z == ZLEVEL_STATION)
bomb.r_code = nukecode
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index e2f4fc50c12..5b0884788b9 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -36,7 +36,6 @@
melee_damage_upper = 4
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
- del_on_death = 1
speak_emote = list("pulses")
var/obj/effect/blob/factory/factory = null
var/list/human_overlays = list()
@@ -92,6 +91,7 @@
loc.visible_message("The corpse of [H.name] suddenly rises!")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
+ ..()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
@@ -108,7 +108,7 @@
S.attach(location)
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
- ..()
+ qdel(src)
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
if(factory)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 7ad1e33b747..dc12c64fbed 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -14,7 +14,8 @@ var/list/sacrificed = list()
for(var/obj/effect/rune/R in world)
if(R == src)
continue
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2)
+ // TODO: Tie into space manager
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != ZLEVEL_CENTCOMM)
index++
allrunesloc.len = index
allrunesloc[index] = R.loc
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index fd384e61d1f..123ca75a78a 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -2,6 +2,7 @@
//command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
+ // TODO: Tie into space manager
if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 7d2ae88fe2a..77f503a1db2 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -427,6 +427,7 @@ proc/get_nt_opposed()
/proc/get_nuke_code()
var/nukecode = "ERROR"
for(var/obj/machinery/nuclearbomb/bomb in world)
+ // TODO: Tie into space manager
if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION)
nukecode = bomb.r_code
return nukecode
@@ -452,6 +453,7 @@ proc/get_nt_opposed()
else
text += " survived"
if(fleecheck && ply.current.z > ZLEVEL_STATION)
+ // TODO: Tie into space manager
text += " while fleeing the station"
if(ply.current.real_name != ply.name)
text += " as [ply.current.real_name]"
@@ -468,4 +470,4 @@ proc/get_nt_opposed()
else
text += " Objective #[count]: [objective.explanation_text] Fail."
count++
- return text
\ No newline at end of file
+ return text
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 7d6ea9b4e7d..4fd8c5a452b 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -266,7 +266,8 @@ var/round_start_time = 0
M.client.screen += cinematic
if(M.stat != DEAD)
var/turf/T = get_turf(M)
- if(T && T.z == 1)
+ // TODO: Tie into space manager
+ if(T && T.z == ZLEVEL_STATION)
M.death(0) //no mercy
//Now animate the cinematic
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index c6b65472c2e..40d78c131ae 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -69,6 +69,7 @@ rcd light flash thingy on matter drain
src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets
for(var/obj/machinery/porta_turret/turret in machines)
var/turf/T = get_turf(turret)
+ // TODO: Tie into space manager
if(T.z in config.station_levels)
// Increase health by 37.5% of original max, decrease delays between shots to 66%
turret.health += initial(turret.health) * 3 / 8
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 77c45956eb4..fb85a0a1606 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -141,6 +141,7 @@
/datum/game_mode/proc/check_ai_loc()
for(var/datum/mind/AI_mind in malf_ai)
var/turf/ai_location = get_turf(AI_mind.current)
+ // TODO: Tie into space manager
if(ai_location && (ai_location.z == ZLEVEL_STATION))
return 1
return 0
@@ -343,4 +344,4 @@
text += module_text_temp
to_chat(world, text)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 2f7af290229..a2ff0f4e1d8 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -36,7 +36,8 @@
var/Me = pickweight(meteortypes)
var/obj/effect/meteor/M = new Me(pickedstart)
M.dest = pickedgoal
- M.z_original = 1
+ // TODO: Tie into space manager
+ M.z_original = ZLEVEL_STATION
spawn(0)
walk_towards(M, M.dest, 1)
return
@@ -102,6 +103,7 @@
var/dropamt = 2
/obj/effect/meteor/Move()
+ // TODO: Tie into space manager
if(z != z_original || loc == dest)
qdel(src)
return
@@ -309,5 +311,3 @@
/obj/effect/meteor/goreops/Bump(atom/A)
A.ex_act(hitpwr)
get_hit()
-
-
diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm
index ed096526d10..28a0282487d 100644
--- a/code/game/gamemodes/miniantags/borer/borer_event.dm
+++ b/code/game/gamemodes/miniantags/borer/borer_event.dm
@@ -17,6 +17,7 @@
/datum/event/borer_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ // TODO: Tie into space manager
if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
//Stops cortical borers getting stuck in small networks. See: Security, Virology
if(temp_vent.parent.other_atmosmch.len > 50)
@@ -33,4 +34,3 @@
spawncount--
successSpawn = 1
-
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index d5541f70e0d..ed84f211e53 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -290,6 +290,7 @@
/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)
if(target != src)
to_chat(src, "Attempting to remove this being from our presence.")
+ // TODO: Tie into space manager
if(src.z != ZLEVEL_STATION)
to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.")
return
@@ -512,4 +513,3 @@
for(var/mob/M in mob_list)
if(isswarmer(M) || (M in dead_mob_list))
to_chat(M, "Swarm communication - [src] states: [message]")
-
diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm
index ca867028585..5f729e4484e 100644
--- a/code/game/gamemodes/nations/nations.dm
+++ b/code/game/gamemodes/nations/nations.dm
@@ -142,6 +142,7 @@ datum/game_mode/nations
/datum/game_mode/nations/proc/remove_access()
for(var/obj/machinery/door/airlock/W in airlocks)
+ // TODO: Tie into space manager
if(W.z in config.station_levels)
W.req_access = list()
@@ -253,4 +254,4 @@ datum/game_mode/nations
/datum/game_mode/proc/update_nations_icons_removed(datum/mind/nations_mind)
var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS]
nations_hud.leave_hud(nations_mind)
- set_nations_hud(nations_mind, null)
\ No newline at end of file
+ set_nations_hud(nations_mind, null)
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index a70074a919e..ef0edffd5f8 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -651,7 +651,7 @@ datum
return 10
else
return 20
-
+
/*burger
steal_target = /obj/item/weapon/reagent_containers/food/snacks/human/burger
@@ -1358,6 +1358,7 @@ datum
var/turf/T = get_turf(target.current)
if(target.current.stat == 2)
return 1
+ // TODO: Tie into space manager
else if((T) && !(T.z in config.station_levels))//If they leave the station they count as dead for this
return 2
else
@@ -1413,4 +1414,4 @@ datum/objective/silence
#undef LENIENT
#undef NORMAL
#undef HARD
-#undef IMPOSSIBLE
\ No newline at end of file
+#undef IMPOSSIBLE
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index c11b43f81ec..15a4c8ec246 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -19,6 +19,7 @@
if(player_list.len < MIN_CHALLENGE_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return
+ // TODO: Tie into space manager
if(user.z != ZLEVEL_CENTCOMM)
to_chat(user, "You have to be at your base to use this.")
return
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 18791cd15f0..ae22e0ec458 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -353,6 +353,7 @@ var/bomb_set
var/off_station = 0
var/turf/bomb_location = get_turf(src)
+ // TODO: Tie into space manager
if( bomb_location && (bomb_location.z in config.station_levels) )
if( (bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)) )
off_station = 1
@@ -363,7 +364,8 @@ var/bomb_set
if(ticker.mode && ticker.mode.name == "nuclear emergency")
var/obj/docking_port/mobile/syndie_shuttle = shuttle_master.getShuttle("syndicate")
if(syndie_shuttle)
- ticker.mode:syndies_didnt_escape = (syndie_shuttle.z > 1 ? 0 : 1) //muskets will make me change this, but it will do for now
+ // TODO: Tie into space manager
+ ticker.mode:syndies_didnt_escape = (syndie_shuttle.z > ZLEVEL_STATION ? 0 : 1) //muskets will make me change this, but it will do for now
ticker.mode:nuke_off_station = off_station
ticker.station_explosion_cinematic(off_station,null)
if(ticker.mode)
@@ -401,6 +403,7 @@ var/bomb_set
/obj/item/weapon/disk/nuclear/process()
var/turf/disk_loc = get_turf(src)
+ // TODO: Tie into space manager
if(disk_loc.z != ZLEVEL_STATION && disk_loc.z != ZLEVEL_CENTCOMM)
var/holder = get(src, /mob)
if(holder)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 825e1183529..b6b1094b103 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -77,7 +77,8 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
+ // TODO: Tie into space manager
+ if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > ZLEVEL_DERELICT || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
return 0
return 1
@@ -109,6 +110,7 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
return 1
var/turf/T = get_turf(target.current)
+ // TODO: Tie into space manager
if(T && !(T.z in config.station_levels)) //If they leave the station they count as dead for this
return 2
return 0
@@ -144,6 +146,7 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
if(target in ticker.mode:head_revolutionaries)
return 1
var/turf/T = get_turf(target.current)
+ // TODO: Tie into space manager
if(T && !(T.z in config.station_levels)) //If they leave the station they count as dead for this
rval = 2
return 0
@@ -170,8 +173,10 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
+ // TODO: Tie into space manager
+ if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > ZLEVEL_DERELICT || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
+ // TODO: Tie into space manager
if((target.current.z in config.admin_levels))
return 0
return 1
@@ -572,7 +577,8 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey)
+ // TODO: Tie into space manager
+ if(target.current.stat == DEAD || target.current.z > ZLEVEL_DERELICT || !target.current.ckey)
return 1
return 0
return 1
@@ -861,4 +867,4 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \
/datum/objective/wizchaos
explanation_text = "Wreak havoc upon the station as much you can. Send those wandless Nanotrasen scum a message!"
- completed = 1
\ No newline at end of file
+ completed = 1
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index b3f889377c8..9e74459dadd 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -314,6 +314,7 @@
/datum/game_mode/revolution/proc/check_heads_victory()
for(var/datum/mind/rev_mind in head_revolutionaries)
var/turf/T = get_turf(rev_mind.current)
+ // TODO: Tie into space manager
if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != 2) && rev_mind.current.client && T && (T.z == ZLEVEL_STATION))
if(ishuman(rev_mind.current))
return 0
@@ -448,4 +449,4 @@
dat += "Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * 10000] Points) "
dat += " "
- return dat
\ No newline at end of file
+ return dat
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index 298f71bc991..8ee145e8759 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -21,11 +21,13 @@
// Who is alive/dead, who escaped
for(var/mob/living/silicon/ai/I in mob_list)
+ // TODO: Tie into space manager
if(I.stat == DEAD && (I.z in config.station_levels))
score_deadaipenalty++
score_deadcrew++
for(var/mob/living/carbon/human/I in mob_list)
+ // TODO: Tie into space manager
if(I.stat == DEAD && (I.z in config.station_levels))
score_deadcrew++
@@ -79,6 +81,7 @@
// Check station's power levels
for(var/obj/machinery/power/apc/A in machines)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels)) continue
for(var/obj/item/weapon/stock_parts/cell/C in A.contents)
@@ -88,6 +91,7 @@
// Check how much uncleaned mess is on the station
for(var/obj/effect/decal/cleanable/M in world)
+ // TODO: Tie into space manager
if(!(M.z in config.station_levels)) continue
if(istype(M, /obj/effect/decal/cleanable/blood/gibs))
score_mess += 3
@@ -244,4 +248,4 @@
if(50000 to INFINITY) score_rating = "Nanotrasen's Finest"
dat += "RATING: [score_rating]"
- src << browse(dat, "window=roundstats;size=500x600")
\ No newline at end of file
+ src << browse(dat, "window=roundstats;size=500x600")
diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index 9c6989cb1b9..fd3ad379fe0 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -19,9 +19,6 @@
var/list/all_items = owner.current.get_contents()
for(var/obj/I in all_items) //Check for items
if(istype(I, typepath) && check_special_completion(I))
- //Stealing the cheap autoinjector doesn't count
- if(istype(I, /obj/item/weapon/reagent_containers/hypospray/autoinjector))
- continue
return 1
return 0
@@ -111,7 +108,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C)
/datum/theft_objective/hypospray
name = "a hypospray"
- typepath = /obj/item/weapon/reagent_containers/hypospray
+ typepath = /obj/item/weapon/reagent_containers/hypospray/CMO
protected_jobs = list("Chief Medical Officer")
/datum/theft_objective/ablative
diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm
index 37e9b39ce11..4d3fc5bfae8 100644
--- a/code/game/gamemodes/xenos/xenos.dm
+++ b/code/game/gamemodes/xenos/xenos.dm
@@ -122,6 +122,7 @@
command_announcement.Announce("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert")
set_security_level("gamma")
var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world
+ // TODO: Tie into space manager
if(V && (V.z in config.station_levels))
V.locked = 0
V.update_icon()
@@ -142,6 +143,7 @@
var/list/livingplayers = list()
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
+ // TODO: Tie into space manager
if((M) && (M.stat != 2) && M.client && T && ((T.z in config.station_levels) || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE && ((T.z in config.station_levels) || (T.z in config.admin_levels))))
if(ishuman(M))
livingplayers += 1
@@ -182,4 +184,4 @@
to_chat(world, text)
..()
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 1de4ecef264..982d2be445f 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -339,7 +339,8 @@
equip(var/mob/living/carbon/human/H)
- if(!H) return 0
+ if(!H)
+ return 0
switch(H.backbag)
if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
@@ -348,12 +349,10 @@
H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
+ H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
+ H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store)
H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- else
- H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
+ H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
/datum/job/barber
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 3ea08ee842c..ac95e1b2a05 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -769,6 +769,7 @@
var/turf/pos = get_turf(src)
data["x"] = pos.x
data["y"] = pos.y
+ // TODO: Tie into space manager
data["z"] = pos.z
return data
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index 89cf4cd3610..a75c3afac88 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -113,6 +113,7 @@
scrubber.update_icon()
proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj )
+ // TODO: Tie into space manager
if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z)
return 0
@@ -176,4 +177,4 @@
if(!found)
status = "ERROR: No scrubber found!"
- src.updateUsrDialog()
\ No newline at end of file
+ src.updateUsrDialog()
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index aa32db20688..cccc7e52f91 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -1,6 +1,7 @@
/mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf)
if(!T)
return 1
+ // TODO: Tie into space manager
if((T.z in config.admin_levels))
return 1
if(T.z > MAX_Z)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 81b2c6b86a4..a9b1e3ff31c 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -75,6 +75,7 @@
var/list/cameras = list()
for(var/obj/machinery/camera/C in cameranet.cameras)
+ // TODO: Tie into space manager
if((z > MAX_Z || C.z > MAX_Z) && (C.z != z)) //can only recieve away mission cameras on away missions
continue
if(!can_access_camera(C))
@@ -313,4 +314,4 @@
icon_keyboard = "power_key"
icon_screen = "engie_cams"
light_color = "#FAC54B"
- network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")
\ No newline at end of file
+ network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index e87802f728c..790c516fc95 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -54,6 +54,7 @@
if(..(href, href_list))
return 1
+ // TODO: Tie into space manager
if((!(src.z in config.station_levels) && !(src.z in config.admin_levels)))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 1
@@ -303,6 +304,7 @@
if(stat & (NOPOWER|BROKEN))
return
+ // TODO: Tie into space manager
if(!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM)))
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index 2f26663395e..75880d41975 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -20,6 +20,7 @@
/obj/machinery/computer/HONKputer/Topic(href, href_list)
if(..())
return 1
+ // TODO: Tie into space manager
if(!(src.z in config.station_levels))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
@@ -68,7 +69,8 @@
/obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob)
if(..())
return
- if(src.z > 6)
+ // TODO: Tie into space manager
+ if(src.z > ZLEVEL_DERELICT)
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index d50edbfd0cb..a6f1a0e6c26 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -29,7 +29,8 @@
attackby(obj/item/weapon/O as obj, mob/user as mob, params)
- if(user.z > 6)
+ // TODO: Tie into space manager
+ if(user.z > ZLEVEL_DERELICT)
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
if(istype(O, /obj/item/weapon/aiModule))
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index ebc0db47c32..e3683361ef2 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -65,6 +65,7 @@
health_display = "DEAD"
else if(total_loss)
health_display = "HURT ([total_loss])"
+ // TODO: Tie into space manager
if((M.z in config.station_levels) && !istype(M.loc, /turf/space))
loc_display = "[get_area(M)]"
dat += "ID: [T.id] Subject: [M] Location: [loc_display] Health: [health_display] "
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 7ab400823b1..c7c23dbc724 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -41,11 +41,12 @@
/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
if(..())
return
- if(src.z > 6)
+ // TODO: Tie into space manager
+ if(src.z > ZLEVEL_DERELICT)
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
-
+
// search javascript
var/head_content = {"
@@ -89,7 +90,7 @@
//body tag start + onload and onkeypress (onkeyup) javascript event calls
dat += ""
-
+
dat += {"
"}
dat += text("New Record ", src)
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 2f039841cc3..7c0680f26d3 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -40,7 +40,9 @@
/obj/machinery/computer/skills/attack_hand(mob/user as mob)
if(..())
return
- if(src.z > 6)
+
+ // TODO: Tie into space manager
+ if(src.z > ZLEVEL_DERELICT)
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 257c583814b..3732c68d623 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -335,7 +335,7 @@
job_master.FreeRole(job)
if(occupant.mind.objectives.len)
- qdel(occupant.mind.objectives)
+ occupant.mind.objectives.Cut()
occupant.mind.special_role = null
else
if(ticker.mode.name == "AutoTraitor")
@@ -458,7 +458,7 @@
// Book keeping!
log_admin("[key_name(M)] has entered a stasis pod.")
- message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)")
+ message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP)")
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm
deleted file mode 100644
index e94a975b91f..00000000000
--- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm
+++ /dev/null
@@ -1,180 +0,0 @@
-//a docking port based on an airlock
-/obj/machinery/embedded_controller/radio/airlock/docking_port
- name = "docking port controller"
- var/datum/computer/file/embedded_program/airlock/docking/airlock_program
- var/datum/computer/file/embedded_program/docking/airlock/docking_program
- tag_secure = 1
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/initialize()
- ..()
- airlock_program = new/datum/computer/file/embedded_program/airlock/docking(src)
- docking_program = new/datum/computer/file/embedded_program/docking/airlock(src, airlock_program)
- program = docking_program
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- var/data[0]
-
- data = list(
- "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]),
- "exterior_status" = airlock_program.memory["exterior_status"],
- "interior_status" = airlock_program.memory["interior_status"],
- "processing" = airlock_program.memory["processing"],
- "docking_status" = docking_program.get_docking_status(),
- "airlock_disabled" = !(docking_program.undocked() || docking_program.override_enabled),
- "override_enabled" = docking_program.override_enabled,
- )
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
-
- if(!ui)
- ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/Topic(href, href_list)
- if(..())
- return
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- var/clean = 0
- switch(href_list["command"]) //anti-HTML-hacking checks
- if("cycle_ext")
- clean = 1
- if("cycle_int")
- clean = 1
- if("force_ext")
- clean = 1
- if("force_int")
- clean = 1
- if("abort")
- clean = 1
- if("toggle_override")
- clean = 1
-
- if(clean)
- program.receive_user_command(href_list["command"])
-
- return 1
-
-
-
-//A docking controller for an airlock based docking port
-/datum/computer/file/embedded_program/docking/airlock
- var/datum/computer/file/embedded_program/airlock/docking/airlock_program
-
-/datum/computer/file/embedded_program/docking/airlock/New(var/obj/machinery/embedded_controller/M, var/datum/computer/file/embedded_program/airlock/docking/A)
- ..(M)
- airlock_program = A
- airlock_program.master_prog = src
-
-/datum/computer/file/embedded_program/docking/airlock/receive_user_command(command)
- if(command == "toggle_override")
- if(override_enabled)
- disable_override()
- else
- enable_override()
- return
-
- ..(command)
- airlock_program.receive_user_command(command) //pass along to subprograms
-
-/datum/computer/file/embedded_program/docking/airlock/process()
- airlock_program.process()
- ..()
-
-/datum/computer/file/embedded_program/docking/airlock/receive_signal(datum/signal/signal, receive_method, receive_param)
- airlock_program.receive_signal(signal, receive_method, receive_param) //pass along to subprograms
- ..(signal, receive_method, receive_param)
-
-//tell the docking port to start getting ready for docking - e.g. pressurize
-/datum/computer/file/embedded_program/docking/airlock/prepare_for_docking()
- airlock_program.begin_cycle_in()
-
-//are we ready for docking?
-/datum/computer/file/embedded_program/docking/airlock/ready_for_docking()
- return airlock_program.done_cycling()
-
-//we are docked, open the doors or whatever.
-/datum/computer/file/embedded_program/docking/airlock/finish_docking()
- airlock_program.enable_mech_regulators()
- airlock_program.open_doors()
-
-//tell the docking port to start getting ready for undocking - e.g. close those doors.
-/datum/computer/file/embedded_program/docking/airlock/prepare_for_undocking()
- airlock_program.stop_cycling()
- airlock_program.close_doors()
- airlock_program.disable_mech_regulators()
-
-//are we ready for undocking?
-/datum/computer/file/embedded_program/docking/airlock/ready_for_undocking()
- var/ext_closed = airlock_program.check_exterior_door_secured()
- var/int_closed = airlock_program.check_interior_door_secured()
- return (ext_closed || int_closed)
-
-//An airlock controller to be used by the airlock-based docking port controller.
-//Same as a regular airlock controller but allows disabling of the regular airlock functions when docking
-/datum/computer/file/embedded_program/airlock/docking
- var/datum/computer/file/embedded_program/docking/airlock/master_prog
-
-/datum/computer/file/embedded_program/airlock/docking/receive_user_command(command)
- if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
- ..(command)
-
-/datum/computer/file/embedded_program/airlock/docking/proc/enable_mech_regulators()
- enable_mech_regulation()
-
-/datum/computer/file/embedded_program/airlock/docking/proc/disable_mech_regulators()
- disable_mech_regulation()
-
-/datum/computer/file/embedded_program/airlock/docking/proc/open_doors()
- toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open")
- toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
-
-/datum/computer/file/embedded_program/airlock/docking/cycleDoors(var/target)
- if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
- ..(target)
-
-/*** DEBUG VERBS ***
-
-/datum/computer/file/embedded_program/docking/proc/print_state()
- to_chat(world, "id_tag: [id_tag]")
- to_chat(world, "dock_state: [dock_state]")
- to_chat(world, "control_mode: [control_mode]")
- to_chat(world, "tag_target: [tag_target]")
- to_chat(world, "response_sent: [response_sent]")
-
-/datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line)
- to_chat(world, "Program [id_tag] sent a message!")
- print_state()
- to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"")
- ..(signal)
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/view_state()
- set category = "Debug"
- set src in view(1)
- src.program:print_state()
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/spoof_signal(var/command as text, var/sender as text)
- set category = "Debug"
- set src in view(1)
- var/datum/signal/signal = new
- signal.data["tag"] = sender
- signal.data["command"] = command
- signal.data["recipient"] = id_tag
-
- src.program:receive_signal(signal)
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_dock(var/target as text)
- set category = "Debug"
- set src in view(1)
- src.program:initiate_docking(target)
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_undock()
- set category = "Debug"
- set src in view(1)
- src.program:initiate_undocking()
-
-*/
\ No newline at end of file
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
deleted file mode 100644
index 8eeb93b8a8e..00000000000
--- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
+++ /dev/null
@@ -1,153 +0,0 @@
-//a controller for a docking port with multiple independent airlocks
-//this is the master controller, that things will try to dock with.
-/obj/machinery/embedded_controller/radio/docking_port_multi
- name = "docking port controller"
-
- var/child_tags_txt
- var/child_names_txt
- var/list/child_names = list()
-
- var/datum/computer/file/embedded_program/docking/multi/docking_program
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/initialize()
- ..()
- docking_program = new/datum/computer/file/embedded_program/docking/multi(src)
- program = docking_program
-
- var/list/names = splittext(child_names_txt, ";")
- var/list/tags = splittext(child_tags_txt, ";")
-
- if(names.len == tags.len)
- for(var/i = 1; i <= tags.len; i++)
- child_names[tags[i]] = names[i]
-
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- var/data[0]
-
- var/list/airlocks[child_names.len]
- var/i = 1
- for(var/child_tag in child_names)
- airlocks[i++] = list("name"=child_names[child_tag], "override_enabled"=(docking_program.children_override[child_tag] == "enabled"))
-
- data = list(
- "docking_status" = docking_program.get_docking_status(),
- "airlocks" = airlocks,
- )
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
-
- if(!ui)
- ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/Topic(href, href_list)
- return
-
-
-
-//a docking port based on an airlock
-/obj/machinery/embedded_controller/radio/airlock/docking_port_multi
- name = "docking port controller"
- var/master_tag //for mapping
- var/datum/computer/file/embedded_program/airlock/multi_docking/airlock_program
- tag_secure = 1
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/initialize()
- ..()
- airlock_program = new/datum/computer/file/embedded_program/airlock/multi_docking(src)
- program = airlock_program
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- var/data[0]
-
- data = list(
- "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]),
- "exterior_status" = airlock_program.memory["exterior_status"],
- "interior_status" = airlock_program.memory["interior_status"],
- "processing" = airlock_program.memory["processing"],
- "docking_status" = airlock_program.master_status,
- "airlock_disabled" = (airlock_program.docking_enabled && !airlock_program.override_enabled),
- "override_enabled" = airlock_program.override_enabled,
- )
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
-
- if(!ui)
- ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/Topic(href, href_list)
- if(..())
- return
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- var/clean = 0
- switch(href_list["command"]) //anti-HTML-hacking checks
- if("cycle_ext")
- clean = 1
- if("cycle_int")
- clean = 1
- if("force_ext")
- clean = 1
- if("force_int")
- clean = 1
- if("abort")
- clean = 1
- if("toggle_override")
- clean = 1
-
- if(clean)
- program.receive_user_command(href_list["command"])
-
- return 1
-
-
-
-/*** DEBUG VERBS ***
-
-/datum/computer/file/embedded_program/docking/multi/proc/print_state()
- to_chat(world, "id_tag: [id_tag]")
- to_chat(world, "dock_state: [dock_state]")
- to_chat(world, "control_mode: [control_mode]")
- to_chat(world, "tag_target: [tag_target]")
- to_chat(world, "response_sent: [response_sent]")
-
-/datum/computer/file/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line)
- to_chat(world, "Program [id_tag] sent a message!")
- print_state()
- to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"")
- ..(signal)
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/verb/view_state()
- set category = "Debug"
- set src in view(1)
- src.program:print_state()
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/verb/spoof_signal(var/command as text, var/sender as text)
- set category = "Debug"
- set src in view(1)
- var/datum/signal/signal = new
- signal.data["tag"] = sender
- signal.data["command"] = command
- signal.data["recipient"] = id_tag
-
- src.program:receive_signal(signal)
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/verb/debug_init_dock(var/target as text)
- set category = "Debug"
- set src in view(1)
- src.program:initiate_docking(target)
-
-/obj/machinery/embedded_controller/radio/docking_port_multi/verb/debug_init_undock()
- set category = "Debug"
- set src in view(1)
- src.program:initiate_undocking()
-
-*/
diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm
deleted file mode 100644
index 725ec6a337b..00000000000
--- a/code/game/machinery/embedded_controller/docking_program.dm
+++ /dev/null
@@ -1,286 +0,0 @@
-
-#define STATE_UNDOCKED 0
-#define STATE_DOCKING 1
-#define STATE_UNDOCKING 2
-#define STATE_DOCKED 3
-
-#define MODE_NONE 0
-#define MODE_SERVER 1
-#define MODE_CLIENT 2 //The one who initiated the docking, and who can initiate the undocking. The server cannot initiate undocking, and is the one responsible for deciding to accept a docking request and signals when docking and undocking is complete. (Think server == station, client == shuttle)
-
-#define MESSAGE_RESEND_TIME 5 //how long (in seconds) do we wait before resending a message
-
-/*
- *** STATE TABLE ***
-
- MODE_CLIENT|STATE_UNDOCKED sent a request for docking and now waiting for a reply.
- MODE_CLIENT|STATE_DOCKING server told us they are OK to dock, waiting for our docking port to be ready.
- MODE_CLIENT|STATE_DOCKED idle - docked as client.
- MODE_CLIENT|STATE_UNDOCKING we are either waiting for our docking port to be ready or for the server to give us the OK to finish undocking.
-
- MODE_SERVER|STATE_UNDOCKED should never happen.
- MODE_SERVER|STATE_DOCKING someone requested docking, we are waiting for our docking port to be ready.
- MODE_SERVER|STATE_DOCKED idle - docked as server
- MODE_SERVER|STATE_UNDOCKING client requested undocking, we are waiting for our docking port to be ready.
-
- MODE_NONE|STATE_UNDOCKED idle - not docked.
- MODE_NONE|anything else should never happen.
-
- *** Docking Signals ***
-
- Docking
- Client sends request_dock
-
- Server sends confirm_dock to say that yes, we will serve your request
- When client is ready, sends confirm_dock
- Server sends confirm_dock back to indicate that docking is complete
-
- Undocking
- Client sends request_undock
- When client is ready, sends confirm_undock
- Server sends confirm_undock back to indicate that docking is complete
-
- Note that in both cases each side exchanges confirm_dock before the docking operation is considered done.
- The client first sends a confirm message to indicate it is ready, and then finally the server will send it's
- confirm message to indicate that the operation is complete.
-
- Note also that when docking, the server sends an additional confirm message. This is because before docking,
- the server and client do not have a defined relationship. Before undocking, the server and client are already
- related to each other, thus the extra confirm message is not needed.
-
- *** Override, what is it? ***
-
- The purpose of enabling the override is to prevent the docking program from automatically doing things with the docking port when docking or undocking.
- Maybe the shuttle is full of plasma for some reason, and you don't want the door to automatically open, or the airlock to cycle.
- This means that the prepare_for_docking/undocking and finish_docking/undocking procs don't get called.
-
- The docking controller will still check the state of the docking port, and thus prevent the shuttle from launching unless they force the launch (handling forced
- launches is not the docking controller's responsibility). In this case it is up to the players to manually get the docking port into a good state to undock
- (which usually just means closing and locking the doors).
-
- In line with this, docking controllers should prevent players from manually doing things when the override is NOT enabled.
-*/
-
-
-/datum/computer/file/embedded_program/docking
- var/tag_target //the tag of the docking controller that we are trying to dock with
- var/dock_state = STATE_UNDOCKED
- var/control_mode = MODE_NONE
- var/response_sent = 0 //so we don't spam confirmation messages
- var/resend_counter = 0 //for periodically resending confirmation messages in case they are missed
-
- var/override_enabled = 0 //when enabled, do not open/close doors or cycle airlocks and wait for the player to do it manually
- var/received_confirm = 0 //for undocking, whether the server has recieved a confirmation from the client
-
-/datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param)
- var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id
- var/command = signal.data["command"]
- var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
-
- if(recipient != id_tag)
- return //this signal is not for us
-
- switch(command)
- if("confirm_dock")
- if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKED && receive_tag == tag_target)
- dock_state = STATE_DOCKING
- broadcast_docking_status()
- if(!override_enabled)
- prepare_for_docking()
-
- else if(control_mode == MODE_CLIENT && dock_state == STATE_DOCKING && receive_tag == tag_target)
- dock_state = STATE_DOCKED
- broadcast_docking_status()
- if(!override_enabled)
- finish_docking() //client done docking!
- response_sent = 0
- else if(control_mode == MODE_SERVER && dock_state == STATE_DOCKING && receive_tag == tag_target) //client just sent us the confirmation back, we're done with the docking process
- received_confirm = 1
-
- if("request_dock")
- if(control_mode == MODE_NONE && dock_state == STATE_UNDOCKED)
- control_mode = MODE_SERVER
-
- dock_state = STATE_DOCKING
- broadcast_docking_status()
-
- tag_target = receive_tag
- if(!override_enabled)
- prepare_for_docking()
- send_docking_command(tag_target, "confirm_dock") //acknowledge the request
-
- if("confirm_undock")
- if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
- if(!override_enabled)
- finish_undocking()
- reset() //client is done undocking!
- else if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
- received_confirm = 1
-
- if("request_undock")
- if(control_mode == MODE_SERVER && dock_state == STATE_DOCKED && receive_tag == tag_target)
- dock_state = STATE_UNDOCKING
- broadcast_docking_status()
-
- if(!override_enabled)
- prepare_for_undocking()
-
- if("dock_error")
- if(receive_tag == tag_target)
- reset()
-
-/datum/computer/file/embedded_program/docking/process()
- switch(dock_state)
- if(STATE_DOCKING) //waiting for our docking port to be ready for docking
- if(ready_for_docking())
- if(control_mode == MODE_CLIENT)
- if(!response_sent)
- send_docking_command(tag_target, "confirm_dock") //tell the server we're ready
- response_sent = 1
-
- else if(control_mode == MODE_SERVER && received_confirm)
- send_docking_command(tag_target, "confirm_dock") //tell the client we are done docking.
-
- dock_state = STATE_DOCKED
- broadcast_docking_status()
-
- if(!override_enabled)
- finish_docking() //server done docking!
- response_sent = 0
- received_confirm = 0
-
- if(STATE_UNDOCKING)
- if(ready_for_undocking())
- if(control_mode == MODE_CLIENT)
- if(!response_sent)
- send_docking_command(tag_target, "confirm_undock") //tell the server we are OK to undock.
- response_sent = 1
-
- else if(control_mode == MODE_SERVER && received_confirm)
- send_docking_command(tag_target, "confirm_undock") //tell the client we are done undocking.
- if(!override_enabled)
- finish_undocking()
- reset() //server is done undocking!
-
- if(response_sent || resend_counter > 0)
- resend_counter++
-
- if(resend_counter >= MESSAGE_RESEND_TIME || (dock_state != STATE_DOCKING && dock_state != STATE_UNDOCKING))
- response_sent = 0
- resend_counter = 0
-
- //handle invalid states
- if(control_mode == MODE_NONE && dock_state != STATE_UNDOCKED)
- if(tag_target)
- send_docking_command(tag_target, "dock_error")
- reset()
- if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKED)
- control_mode = MODE_NONE
-
-
-/datum/computer/file/embedded_program/docking/proc/initiate_docking(var/target)
- if(dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake
- return
-
- tag_target = target
- control_mode = MODE_CLIENT
-
- send_docking_command(tag_target, "request_dock")
-
-/datum/computer/file/embedded_program/docking/proc/initiate_undocking()
- if(dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking
- return
-
- dock_state = STATE_UNDOCKING
- broadcast_docking_status()
-
- if(!override_enabled)
- prepare_for_undocking()
-
- send_docking_command(tag_target, "request_undock")
-
-//tell the docking port to start getting ready for docking - e.g. pressurize
-/datum/computer/file/embedded_program/docking/proc/prepare_for_docking()
- return
-
-//are we ready for docking?
-/datum/computer/file/embedded_program/docking/proc/ready_for_docking()
- return 1
-
-//we are docked, open the doors or whatever.
-/datum/computer/file/embedded_program/docking/proc/finish_docking()
- return
-
-//tell the docking port to start getting ready for undocking - e.g. close those doors.
-/datum/computer/file/embedded_program/docking/proc/prepare_for_undocking()
- return
-
-//we are docked, open the doors or whatever.
-/datum/computer/file/embedded_program/docking/proc/finish_undocking()
- return
-
-//are we ready for undocking?
-/datum/computer/file/embedded_program/docking/proc/ready_for_undocking()
- return 1
-
-/datum/computer/file/embedded_program/docking/proc/enable_override()
- override_enabled = 1
-
-/datum/computer/file/embedded_program/docking/proc/disable_override()
- override_enabled = 0
-
-/datum/computer/file/embedded_program/docking/proc/reset()
- dock_state = STATE_UNDOCKED
- broadcast_docking_status()
-
- control_mode = MODE_NONE
- tag_target = null
- response_sent = 0
- received_confirm = 0
-
-/datum/computer/file/embedded_program/docking/proc/force_undock()
-// to_chat(world, "[id_tag]: forcing undock")
- if(tag_target)
- send_docking_command(tag_target, "dock_error")
- reset()
-
-/datum/computer/file/embedded_program/docking/proc/docked()
- return (dock_state == STATE_DOCKED)
-
-/datum/computer/file/embedded_program/docking/proc/undocked()
- return (dock_state == STATE_UNDOCKED)
-
-//returns 1 if we are saftely undocked (and the shuttle can leave)
-/datum/computer/file/embedded_program/docking/proc/can_launch()
- return undocked()
-
-/datum/computer/file/embedded_program/docking/proc/send_docking_command(var/recipient, var/command)
- var/datum/signal/signal = new
- signal.data["tag"] = id_tag
- signal.data["command"] = command
- signal.data["recipient"] = recipient
- post_signal(signal)
-
-/datum/computer/file/embedded_program/docking/proc/broadcast_docking_status()
- var/datum/signal/signal = new
- signal.data["tag"] = id_tag
- signal.data["dock_status"] = get_docking_status()
- post_signal(signal)
-
-//this is mostly for NanoUI
-/datum/computer/file/embedded_program/docking/proc/get_docking_status()
- switch(dock_state)
- if(STATE_UNDOCKED) return "undocked"
- if(STATE_DOCKING) return "docking"
- if(STATE_UNDOCKING) return "undocking"
- if(STATE_DOCKED) return "docked"
-
-
-#undef STATE_UNDOCKED
-#undef STATE_DOCKING
-#undef STATE_UNDOCKING
-#undef STATE_DOCKED
-
-#undef MODE_NONE
-#undef MODE_SERVER
-#undef MODE_CLIENT
\ No newline at end of file
diff --git a/code/game/machinery/embedded_controller/docking_program_multi.dm b/code/game/machinery/embedded_controller/docking_program_multi.dm
deleted file mode 100644
index 0a3d9228435..00000000000
--- a/code/game/machinery/embedded_controller/docking_program_multi.dm
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- These programs are for docking controllers that consist of multiple independent airlocks
- Each airlock has an airlock controller running the child program, and there is one docking controller running the master program
-*/
-
-/*
- the master program
-*/
-/datum/computer/file/embedded_program/docking/multi
- var/list/children_tags
- var/list/children_ready
- var/list/children_override
-
-/datum/computer/file/embedded_program/docking/multi/New(var/obj/machinery/embedded_controller/M)
- ..(M)
-
- if(istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
- var/obj/machinery/embedded_controller/radio/docking_port_multi/controller = M
- //parse child_tags_txt and create child tags
- children_tags = splittext(controller.child_tags_txt, ";")
-
- children_ready = list()
- children_override = list()
- for(var/child_tag in children_tags)
- children_ready[child_tag] = 0
- children_override[child_tag] = "disabled"
-
-/datum/computer/file/embedded_program/docking/multi/proc/clear_children_ready_status()
- for(var/child_tag in children_tags)
- children_ready[child_tag] = 0
-
-/datum/computer/file/embedded_program/docking/multi/receive_signal(datum/signal/signal, receive_method, receive_param)
- var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id
- var/command = signal.data["command"]
- var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
-
- if(receive_tag in children_tags)
-
- //track children status
- if(signal.data["override_status"])
- children_override[receive_tag] = signal.data["override_status"]
-
- if(recipient == id_tag)
- switch(command)
- if("ready_for_docking")
- children_ready[receive_tag] = 1
- if("ready_for_undocking")
- children_ready[receive_tag] = 1
- if("status_override_enabled")
- children_override[receive_tag] = 1
- if("status_override_disabled")
- children_override[receive_tag] = 0
-
- ..(signal, receive_method, receive_param)
-
-/datum/computer/file/embedded_program/docking/multi/prepare_for_docking()
- //clear children ready status
- clear_children_ready_status()
-
- //tell children to prepare for docking
- for(var/child_tag in children_tags)
- send_docking_command(child_tag, "prepare_for_docking")
-
-/datum/computer/file/embedded_program/docking/multi/ready_for_docking()
- //check children ready status
- for(var/child_tag in children_tags)
- if(!children_ready[child_tag])
- return 0
- return 1
-
-/datum/computer/file/embedded_program/docking/multi/finish_docking()
- //tell children to finish docking
- for(var/child_tag in children_tags)
- send_docking_command(child_tag, "finish_docking")
-
- //clear ready flags
- clear_children_ready_status()
-
-/datum/computer/file/embedded_program/docking/multi/prepare_for_undocking()
- //clear children ready status
- clear_children_ready_status()
-
- //tell children to prepare for undocking
- for(var/child_tag in children_tags)
- send_docking_command(child_tag, "prepare_for_undocking")
-
-/datum/computer/file/embedded_program/docking/multi/ready_for_undocking()
- //check children ready status
- for(var/child_tag in children_tags)
- if(!children_ready[child_tag])
- return 0
- return 1
-
-/datum/computer/file/embedded_program/docking/multi/finish_undocking()
- //tell children to finish undocking
- for(var/child_tag in children_tags)
- send_docking_command(child_tag, "finish_undocking")
-
- //clear ready flags
- clear_children_ready_status()
-
-
-
-
-/*
- the child program
- technically should be "slave" but eh... I'm too politically correct.
-*/
-/datum/computer/file/embedded_program/airlock/multi_docking
- var/master_tag
-
- var/master_status = "undocked"
- var/override_enabled = 0
- var/docking_enabled = 0
- var/docking_mode = 0 //0 = docking, 1 = undocking
- var/response_sent = 0
-
-/datum/computer/file/embedded_program/airlock/multi_docking/New(var/obj/machinery/embedded_controller/M)
- ..(M)
-
- if(istype(M, /obj/machinery/embedded_controller/radio/airlock/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
- var/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/controller = M
- src.master_tag = controller.master_tag
-
-/datum/computer/file/embedded_program/airlock/multi_docking/receive_user_command(command)
- if(command == "toggle_override")
- if(override_enabled)
- override_enabled = 0
- broadcast_override_status()
- else
- override_enabled = 1
- broadcast_override_status()
- return
-
- if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
- ..(command)
-
-/datum/computer/file/embedded_program/airlock/multi_docking/receive_signal(datum/signal/signal, receive_method, receive_param)
- ..()
-
- var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id
- var/command = signal.data["command"]
- var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
-
- if(receive_tag != master_tag)
- return //only respond to master
-
- //track master's status
- if(signal.data["dock_status"])
- master_status = signal.data["dock_status"]
-
- if(recipient != id_tag)
- return //this signal is not for us
-
- switch(command)
- if("prepare_for_docking")
- docking_enabled = 1
- docking_mode = 0
- response_sent = 0
-
- if(!override_enabled)
- begin_cycle_in()
-
- if("prepare_for_undocking")
- docking_mode = 1
- response_sent = 0
-
- if(!override_enabled)
- stop_cycling()
- close_doors()
- disable_mech_regulation()
-
- if("finish_docking")
- if(!override_enabled)
- enable_mech_regulation()
- open_doors()
-
- if("finish_undocking")
- docking_enabled = 0
-
-/datum/computer/file/embedded_program/airlock/multi_docking/process()
- ..()
-
- if(docking_enabled && !response_sent)
-
- switch(docking_mode)
- if(0) //docking
- if(ready_for_docking())
- send_signal_to_master("ready_for_docking")
- response_sent = 1
- if(1) //undocking
- if(ready_for_undocking())
- send_signal_to_master("ready_for_undocking")
- response_sent = 1
-
-//checks if we are ready for docking
-/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_docking()
- return done_cycling()
-
-//checks if we are ready for undocking
-/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_undocking()
- return check_doors_secured()
-
-/datum/computer/file/embedded_program/airlock/multi_docking/proc/open_doors()
- toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open")
- toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
-
-/datum/computer/file/embedded_program/airlock/multi_docking/cycleDoors(var/target)
- if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
- ..(target)
-
-/datum/computer/file/embedded_program/airlock/multi_docking/proc/send_signal_to_master(var/command)
- var/datum/signal/signal = new
- signal.data["tag"] = id_tag
- signal.data["command"] = command
- signal.data["recipient"] = master_tag
- post_signal(signal)
-
-/datum/computer/file/embedded_program/airlock/multi_docking/proc/broadcast_override_status()
- var/datum/signal/signal = new
- signal.data["tag"] = id_tag
- signal.data["override_status"] = override_enabled? "enabled" : "disabled"
- post_signal(signal)
diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm
deleted file mode 100644
index 996a56b92ac..00000000000
--- a/code/game/machinery/embedded_controller/simple_docking_controller.dm
+++ /dev/null
@@ -1,158 +0,0 @@
-//a docking port that uses a single door
-/obj/machinery/embedded_controller/radio/simple_docking_controller
- name = "docking hatch controller"
- var/tag_door
- var/datum/computer/file/embedded_program/docking/simple/docking_program
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/initialize()
- ..()
- docking_program = new/datum/computer/file/embedded_program/docking/simple(src)
- program = docking_program
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- var/data[0]
-
- data = list(
- "docking_status" = docking_program.get_docking_status(),
- "override_enabled" = docking_program.override_enabled,
- "door_state" = docking_program.memory["door_status"]["state"],
- "door_lock" = docking_program.memory["door_status"]["lock"],
- )
-
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
-
- if(!ui)
- ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290)
- ui.set_initial_data(data)
- ui.open()
- ui.set_auto_update(1)
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/Topic(href, href_list)
- if(..())
- return 1
-
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
- var/clean = 0
- switch(href_list["command"]) //anti-HTML-hacking checks
- if("force_door")
- clean = 1
- if("toggle_override")
- clean = 1
-
- if(clean)
- program.receive_user_command(href_list["command"])
-
- return 0
-
-
-//A docking controller program for a simple door based docking port
-/datum/computer/file/embedded_program/docking/simple
- var/tag_door
-
-/datum/computer/file/embedded_program/docking/simple/New(var/obj/machinery/embedded_controller/M)
- ..(M)
- memory["door_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in
-
- if(istype(M, /obj/machinery/embedded_controller/radio/simple_docking_controller))
- var/obj/machinery/embedded_controller/radio/simple_docking_controller/controller = M
-
- tag_door = controller.tag_door? controller.tag_door : "[id_tag]_hatch"
-
- spawn(10)
- signal_door("update") //signals connected doors to update their status
-
-
-/datum/computer/file/embedded_program/docking/simple/receive_signal(datum/signal/signal, receive_method, receive_param)
- var/receive_tag = signal.data["tag"]
-
- if(!receive_tag) return
-
- if(receive_tag==tag_door)
- memory["door_status"]["state"] = signal.data["door_status"]
- memory["door_status"]["lock"] = signal.data["lock_status"]
-
- ..(signal, receive_method, receive_param)
-
-/datum/computer/file/embedded_program/docking/simple/receive_user_command(command)
- switch(command)
- if("force_door")
- if(override_enabled)
- if(memory["door_status"]["state"] == "open")
- close_door()
- else
- open_door()
- if("toggle_override")
- if(override_enabled)
- disable_override()
- else
- enable_override()
-
-
-/datum/computer/file/embedded_program/docking/simple/proc/signal_door(var/command)
- var/datum/signal/signal = new
- signal.data["tag"] = tag_door
- signal.data["command"] = command
- post_signal(signal)
-
-/datum/computer/file/embedded_program/docking/simple/proc/open_door()
- if(memory["door_status"]["state"] == "closed")
- signal_door("secure_open")
- else if(memory["door_status"]["lock"] == "unlocked")
- signal_door("lock")
-
-/datum/computer/file/embedded_program/docking/simple/proc/close_door()
- if(memory["door_status"]["state"] == "open")
- signal_door("secure_close")
- else if(memory["door_status"]["lock"] == "unlocked")
- signal_door("lock")
-
-//tell the docking port to start getting ready for docking - e.g. pressurize
-/datum/computer/file/embedded_program/docking/simple/prepare_for_docking()
- return //don't need to do anything
-
-//are we ready for docking?
-/datum/computer/file/embedded_program/docking/simple/ready_for_docking()
- return 1 //don't need to do anything
-
-//we are docked, open the doors or whatever.
-/datum/computer/file/embedded_program/docking/simple/finish_docking()
- open_door()
-
-//tell the docking port to start getting ready for undocking - e.g. close those doors.
-/datum/computer/file/embedded_program/docking/simple/prepare_for_undocking()
- close_door()
-
-//are we ready for undocking?
-/datum/computer/file/embedded_program/docking/simple/ready_for_undocking()
- return (memory["door_status"]["state"] == "closed" && memory["door_status"]["lock"] == "locked")
-
-/*** DEBUG VERBS ***
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/view_state()
- set category = "Debug"
- set src in view(1)
- src.program:print_state()
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/spoof_signal(var/command as text, var/sender as text)
- set category = "Debug"
- set src in view(1)
- var/datum/signal/signal = new
- signal.data["tag"] = sender
- signal.data["command"] = command
- signal.data["recipient"] = id_tag
-
- src.program:receive_signal(signal)
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_dock(var/target as text)
- set category = "Debug"
- set src in view(1)
- src.program:initiate_docking(target)
-
-/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_undock()
- set category = "Debug"
- set src in view(1)
- src.program:initiate_undocking()
-
-*/
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 45b515734f7..9b2e0bdf957 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -293,6 +293,8 @@ FIRE ALARM
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
+ // TODO: Tie into space manager
+ // also hwat
if(z == ZLEVEL_STATION || ZLEVEL_ASTEROID == 5)
if(security_level)
src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]")
diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm
index 3b55d8423f7..caf0c9c67d9 100644
--- a/code/game/machinery/supply_display.dm
+++ b/code/game/machinery/supply_display.dm
@@ -5,6 +5,7 @@
/obj/machinery/status_display/supply_display/update()
if(!..() && mode == STATUS_DISPLAY_CUSTOM)
if(shuttle_master.supply.mode == SHUTTLE_IDLE)
+ // TODO: Tie into space manager
if(shuttle_master.supply.z == ZLEVEL_STATION)
message1 = "CARGO"
message2 = "Docked"
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 4d90971f003..7ddb0f4b963 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -439,6 +439,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(data == 1)
for(var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
+ // TODO: Tie into space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq, level)
@@ -451,6 +452,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(istype(R, /obj/item/device/radio/headset))
continue
var/turf/position = get_turf(R)
+ // TODO: Tie into space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq)
@@ -462,6 +464,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq)
for(var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
+ // TODO: Tie into space manager
if(position && position.z == level)
receive |= R.send_hear(freq)
@@ -471,6 +474,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else
for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
+ // TODO: Tie into space manager
if(position && position.z == level)
receive |= R.send_hear(display_freq)
@@ -597,6 +601,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/atom/proc/test_telecomms()
var/datum/signal/signal = src.telecomms_process()
var/turf/position = get_turf(src)
+ // TODO: Tie into space manager
return (position.z in signal.data["level"]) && signal.data["done"]
/atom/proc/telecomms_process(var/do_sleep = 1)
@@ -615,6 +620,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
"type" = 4, // determines what type of radio input it is: test broadcast
"reject" = 0,
"done" = 0,
+ // TODO: Tie into space manager
"level" = pos.z // The level it is being broadcasted at.
)
signal.frequency = PUB_FREQ// Common channel
@@ -630,4 +636,3 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
//log_to_dd("Level: [signal.data["level"]] - Done: [signal.data["done"]]")
return signal
-
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index da9fe5a046e..0c0dfd178fe 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -180,6 +180,7 @@
var/turf/position = get_turf(src)
// Toggle on/off getting signals from the station or the current Z level
+ // TODO: Tie into space manager
if(src.listening_level == ZLEVEL_STATION) // equals the station
src.listening_level = position.z
return 1
@@ -393,4 +394,3 @@
if(issilicon(user) || in_range(user, src))
return 1
return 0
-
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 787483ac45d..f4c2d973f7d 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -56,6 +56,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
continue
if(amount && send_count >= amount)
break
+ // TODO: Tie into space manager
if(machine.loc.z != listening_level)
if(long_range_link == 0 && machine.long_range_link == 0)
continue
@@ -142,6 +143,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(!listening_level)
//Defaults to our Z level!
var/turf/position = get_turf(src)
+ // TODO: Tie into space manager
listening_level = position.z
/obj/machinery/telecomms/initialize()
@@ -167,6 +169,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
/obj/machinery/telecomms/proc/add_link(var/obj/machinery/telecomms/T)
var/turf/position = get_turf(src)
var/turf/T_position = get_turf(T)
+ // TODO: Tie into space manager
if((position.z == T_position.z) || (src.long_range_link && T.long_range_link))
for(var/x in autolinkers)
if(T.autolinkers.Find(x))
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 63aeb4e25ee..6ecc675fdef 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -182,7 +182,8 @@
var/turf/T = get_turf(R)
if(!T)
continue
- if((T.z in config.admin_levels) || T.z > 7)
+ // TODO: Tie into space manager
+ if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
continue
if(R.syndicate == 1 && emagged == 0)
continue
@@ -203,6 +204,7 @@
continue
var/turf/T = get_turf(M)
if(!T) continue
+ // TODO: Tie into space manager
if((T.z in config.admin_levels)) continue
var/tmpname = M.real_name
if(areaindex[tmpname])
@@ -225,7 +227,8 @@
var/turf/T = get_turf(R)
if(!T || !R.teleporter_hub || !R.teleporter_console)
continue
- if((T.z in config.admin_levels) || T.z > 7)
+ // TODO: Tie into space manager
+ if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
continue
var/tmpname = T.loc.name
if(areaindex[tmpname])
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index bef015cb7fa..cb55c783005 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -382,6 +382,7 @@
range = RANGED
action(atom/target)
+ // TODO: Tie into space manager
if(!action_checks(target) || (src.loc.z in config.admin_levels)) return
var/turf/T = get_turf(target)
if(T)
@@ -403,6 +404,7 @@
action(atom/target)
+ // TODO: Tie into space manager
if(!action_checks(target) || (src.loc.z in config.admin_levels)) return
var/list/theareas = list()
for(var/area/AR in orange(100, chassis))
@@ -1144,4 +1146,4 @@
if(do_after_cooldown(target))
new /obj/structure/barricade/mime/mrcd(target)
chassis.spark_system.start()
- chassis.use_power(energy_drain*2)
\ No newline at end of file
+ chassis.use_power(energy_drain*2)
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 974835b6a2d..dec4f4c75fb 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -61,6 +61,7 @@
return null
var/turf/T = get_turf(user.loc)
+ // TODO: Tie into space manager
if(T.z != current.z || !current.can_use())
to_chat(user, "[src] has lost the signal.")
current = null
@@ -225,6 +226,7 @@
to_chat(usr, "Something's wrong with that camera. You can't get a feed.")
return
var/turf/T = get_turf(loc)
+ // TODO: Tie into space manager
if(!T || C.z != T.z)
to_chat(usr, "You can't get a signal.")
return
@@ -284,4 +286,4 @@
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
-#undef BUGMODE_TRACK
\ No newline at end of file
+#undef BUGMODE_TRACK
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 455a0f7098c..a8623b17f56 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -124,6 +124,7 @@
return -1
if(!(0 in level))
var/turf/position = get_turf(src)
+ // TODO: Tie into space manager
if(isnull(position) || !(position.z in level))
return -1
if(!src.listening)
diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm
index 665ad549bd2..98f3fc1709b 100644
--- a/code/game/objects/items/weapons/bee_briefcase.dm
+++ b/code/game/objects/items/weapons/bee_briefcase.dm
@@ -64,6 +64,7 @@
//Play sound through the station intercomms, so everyone knows the doom you have wrought.
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
+ // TODO: Tie into space manager
if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms
continue
if(!I.on) //Only broadcast to active intercoms (powered, switched on)
@@ -75,4 +76,4 @@
var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null)
B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood
B.forceMove(get_turf(user)) //RELEASE THE BEES!
- bees_left -= 5
\ No newline at end of file
+ bees_left -= 5
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index fa8de4f51bf..323131845d2 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -22,7 +22,7 @@
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
- ..()
+ return ..()
/*
* Backpack Types
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 66cb11a9dd6..af4d9aa6008 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -375,7 +375,7 @@
max_combined_w_class = 21
max_w_class = 3
w_class = 4 //Bigger than a book because physics
- can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase
+ can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
/*
* Trays - Agouri
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 4728e8c730e..decfa424872 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -48,6 +48,7 @@ Frequency:
return 1
var/turf/current_location = get_turf(usr)//What turf is the user on?
+ // TODO: Tie into space manager
if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2.
to_chat(usr, "\The [src] is malfunctioning.")
return 1
@@ -61,6 +62,7 @@ Frequency:
for(var/obj/item/device/radio/beacon/W in beacons)
if(W.frequency == frequency && !W.syndicate)
+ // TODO: Tie into space manager
if(W && W.z == z)
var/turf/TB = get_turf(W)
temp += "[W.code]: [TB.x], [TB.y], [TB.z] "
@@ -107,7 +109,8 @@ Frequency:
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = get_turf(user)//What turf is the user on?
- if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
+ // TODO: Tie into space manager
+ if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=ZLEVEL_EMPTY)//If turf was not found or they're on z level 2 or >7 which does not currently exist.
to_chat(user, "\The [src] is malfunctioning.")
return
var/list/L = list( )
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 88138657270..3b9974130e4 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -693,3 +693,55 @@
Z.ex_act(2)
charged = 3
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
+
+// Energized Fire axe
+/obj/item/weapon/twohanded/energizedfireaxe
+ name = "energized fire axe"
+ desc = "Someone with a love for fire axes decided to turn one into a single-charge energy weapon. Seems excessive."
+ icon_state = "fireaxe0"
+ force = 5
+ throwforce = 15
+ sharp = 1
+ edge = 1
+ w_class = 5
+ armour_penetration = 20
+ slot_flags = SLOT_BACK
+ force_unwielded = 5
+ force_wielded = 30
+ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ var/charged = 1
+
+/obj/item/weapon/twohanded/energizedfireaxe/update_icon()
+ if(wielded)
+ icon_state = "fireaxe2"
+ else
+ icon_state = "fireaxe0"
+
+/obj/item/weapon/twohanded/energizedfireaxe/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
+ if(wielded)
+ if(istype(A, /mob/living))
+ var/mob/living/Z = A
+ if(charged)
+ charged--
+ Z.take_organ_damage(0,30)
+ user.visible_message("[user] slams the charged axe into [Z.name] with all their might!")
+ playsound(loc, 'sound/magic/lightningbolt.ogg', 5, 1)
+ var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+
+ if(A && wielded && (istype(A, /obj/structure/window) || istype(A, /obj/structure/grille)))
+ if(istype(A, /obj/structure/window))
+ var/obj/structure/window/W = A
+ W.destroy()
+ if(prob(4))
+ charged++
+ user.visible_message("The axe starts to emit an electric buzz!")
+ else
+ qdel(A)
+ if(prob(4))
+ charged++
+ user.visible_message("The axe starts to emit an electric buzz!")
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index de0ef28d255..4fe639160d4 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -192,6 +192,7 @@
return
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
+ // TODO: Tie into space manager
if(!(src.z in config.contact_levels))
to_chat(user, "The rapid-crate-sender can't locate any telepads!")
return
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index c4178baec15..f9b32b071f7 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -84,6 +84,7 @@
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
+ // TODO: Tie into space manager
if(!(src.z in config.player_levels))
to_chat(user, "The rapid-crate-sender can't locate any telepads!")
return
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index abd4f0fcffa..5f8543ca934 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -422,7 +422,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
@@ -442,7 +442,7 @@ var/ert_request_answered = 0
if("Security")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -460,7 +460,7 @@ var/ert_request_answered = 0
if("Medic")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses)
@@ -479,7 +479,7 @@ var/ert_request_answered = 0
if("Commander")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
@@ -507,7 +507,7 @@ var/ert_request_answered = 0
switch(officer_type)
if("Engineer")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index a7fc809aa88..8a9e8dea103 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1565,53 +1565,7 @@
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
- if(!ismob(M))
- to_chat(usr, "This can only be used on instances of type /mob")
- return
-
- var/location_description = ""
- var/special_role_description = ""
- var/health_description = ""
- var/gender_description = ""
- var/turf/T = get_turf(M)
-
- //Location
- if(isturf(T))
- if(isarea(T.loc))
- location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z] in area [T.loc])"
- else
- location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z])"
-
- //Job + antagonist
- if(M.mind)
- special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
- else
- special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;"
-
- //Health
- if(isliving(M))
- var/mob/living/L = M
- var/status
- switch(M.stat)
- if(0) status = "Alive"
- if(1) status = "Unconscious"
- if(2) status = "Dead"
- health_description = "Status = [status]"
- health_description += " Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
- else
- health_description = "This mob type has no health to speak of."
-
- //Gener
- switch(M.gender)
- if(MALE,FEMALE) gender_description = "[M.gender]"
- else gender_description = "[M.gender]"
-
- to_chat(src.owner, "Info about [M.name]: ")
- to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]")
- to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];")
- to_chat(src.owner, "Location = [location_description];")
- to_chat(src.owner, "[special_role_description]")
- to_chat(src.owner, "(PM) (PP) (VV) (SM) (FLW) (CA)")
+ admin_mob_info(M)
else if(href_list["adminspawncookie"])
if(!check_rights(R_ADMIN|R_EVENT)) return
@@ -2025,6 +1979,7 @@
return
else
for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
+ // TODO: Tie into space manager
if((F.z in config.station_levels))
spawn(0)
if(!F.receivefax(P))
@@ -2372,6 +2327,7 @@
for(var/mob/living/carbon/human/H in mob_list)
var/turf/loc = find_loc(H)
var/security = 0
+ // TODO: Tie into space manager
if(!(loc.z in config.station_levels) || prisonwarped.Find(H))
//don't warp them if they aren't ready or are already there
@@ -2609,6 +2565,7 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","EgL")
for(var/obj/machinery/door/airlock/W in world)
+ // TODO: Tie into space manager
if((W.z in config.station_levels) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 1cc723ab903..dd685a37a0b 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -373,6 +373,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/I in singularities)
var/obj/singularity/S = I
+ // TODO: Tie into space manager
if(S.z == ZLEVEL_CENTCOMM || S.z >= MAX_Z)
continue
qdel(S)
@@ -593,17 +594,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"tournament janitor",
"pirate",
"space pirate",
+ "soviet tourist",
+ "soviet soldier",
"soviet admiral",
"tunnel clown",
+ "mime assassin",
"survivor",
+ "greytide",
+ "greytide leader",
+ "greytide xeno",
"masked killer",
"singuloth knight",
"dark lord",
"assassin",
"spy",
+ "vox",
"death commando",
"syndicate agent",
"syndicate operative",
+ "syndicate bomber",
"syndicate strike team",
"syndicate officer",
"chrono legionnaire",
@@ -746,30 +755,29 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,get_all_accesses(), "Pirate", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id)
- if("space pirate")
+ if("space pirate") // not spaceworthy, just has fancier coat.
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
- equip_special_id(M,get_all_accesses(), "Space Pirate", /obj/item/weapon/card/id)
-
- if("soviet soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
- equip_special_id(M,get_all_accesses(), "Soviet Soldier", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id)
if("tunnel clown")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
@@ -780,25 +788,106 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
- equip_special_id(M,get_all_accesses(), "Tunnel Clown", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
+
+ if("mime assassin")
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back)
+ if(M.gender == FEMALE)
+ M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask)
+ else
+ M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ var/obj/item/device/pda/mime/pda = new(M)
+ pda.owner = M.real_name
+ pda.ownjob = "Mime"
+ pda.name = "PDA-[M.real_name] ([pda.ownjob])"
+ M.equip_to_slot_or_del(pda, slot_wear_pda)
+ equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+
if("survivor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- equip_special_id(M,get_all_accesses(), "Survivor", /obj/item/weapon/card/id)
+ equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id)
for(var/obj/item/carried_item in M.contents)
if(!istype(carried_item, /obj/item/weapon/implant))
carried_item.add_blood(M)
+ if("greytide")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id)
+
+ if("greytide leader")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id)
+
+ if("greytide xeno")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id)
+
if("masked killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
@@ -809,7 +898,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
- equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
+ equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
@@ -821,6 +910,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
@@ -841,6 +931,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)
@@ -880,14 +971,39 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
DUST.implant(M)
- var/obj/item/weapon/implant/dust/STOR = new /obj/item/weapon/implant/storage(M)
- STOR.implant(M)
+ M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Spy"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_belt)
- equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
+ equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
+
+
+ if("vox")
+ if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear!
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie")
+ else
+ M.equip_vox_raider()
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand)
+ M.regenerate_icons()
if("death commando")
M.equip_death_commando()
@@ -909,15 +1025,31 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
U.hidden_uplink.uses = 20
M.equip_to_slot_or_del(U, slot_r_store)
+ if("syndicate bomber")
+ M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie")
+
if("syndicate operative")
M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
- M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
@@ -948,8 +1080,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
@@ -974,6 +1106,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda)
@@ -989,6 +1122,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
@@ -1007,6 +1141,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
@@ -1051,6 +1186,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
@@ -1078,6 +1214,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
@@ -1117,7 +1254,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("red wizard")
@@ -1130,7 +1267,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("marisa wizard")
@@ -1143,20 +1280,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
+ if("soviet tourist")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id)
+
+ if("soviet soldier")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id)
+
if("soviet admiral")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander")
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander")
//W.icon_state = "commander"
if("chrono legionnaire")
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 6578898a0bd..d58e51971dd 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -139,7 +139,9 @@ var/list/admin_verbs_show_debug_verbs = list(
/client/proc/print_jobban_old_filter,
/client/proc/forceEvent,
/client/proc/nanomapgen_DumpImage,
- /client/proc/reload_nanoui_resources
+ /client/proc/reload_nanoui_resources,
+ /client/proc/admin_redo_space_transitions,
+ /client/proc/make_turf_space_map
)
/client/proc/enable_debug_verbs()
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 47c7da15724..660a1c8f199 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -81,6 +81,7 @@ var/list/sounds_cache = list()
for(var/O in global_intercoms)
var/obj/item/device/radio/intercom/I = O
+ // TODO: Tie into space manager
if(I.z != ZLEVEL_STATION && !ignore_z)
continue
if(!I.on && !ignore_power)
diff --git a/code/modules/admin/verbs/space_transitions.dm b/code/modules/admin/verbs/space_transitions.dm
new file mode 100644
index 00000000000..eda17996c65
--- /dev/null
+++ b/code/modules/admin/verbs/space_transitions.dm
@@ -0,0 +1,41 @@
+/client/proc/admin_redo_space_transitions()
+ set name = "Remake Space Transitions"
+ set desc = "Re-assigns all space transitions"
+ set category = "Debug"
+
+ if(!check_rights(R_ADMIN|R_DEBUG))
+ return
+
+ var/choice = alert("Do you want to rebuild space transitions?",,"Yes", "No")
+
+ if(choice == "No")
+ return
+
+
+ message_admins("[key_name_admin(usr)] re-assigned all space transitions")
+ space_manager.do_transition_setup()
+ log_admin("[key_name(usr)] re-assigned all space transitions")
+
+ feedback_add_details("admin_verb","SPCRST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+
+
+/client/proc/make_turf_space_map()
+ set name = "Make Space Map"
+ set desc = "Create a map of the space levels as turfs at your feet"
+ set category = "Debug"
+
+ if(!check_rights(R_ADMIN|R_DEBUG))
+ return
+
+ var/choice = alert("Are you sure you want to make a space map out of turfs?",,"Yes","No")
+
+ if(choice == "No")
+ return
+
+ message_admins("[key_name_admin(usr)] made a space map")
+
+
+ space_manager.map_as_turfs(get_turf(usr))
+ log_admin("[key_name(usr)] made a space map")
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
index fcfd8d2e600..ea59dd1d518 100644
--- a/code/modules/awaymissions/maploader/reader.dm
+++ b/code/modules/awaymissions/maploader/reader.dm
@@ -96,7 +96,7 @@ var/global/dmm_suite/preloader/_preloader = new
if(cropMap)
continue
else
- zlevels.increase_max_zlevel_to(zcrd) //create a new z_level if needed
+ space_manager.increase_max_zlevel_to(zcrd) //create a new z_level if needed
bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrdStart)
bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd)
diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm
index 7115cfcbf13..fab504b150d 100644
--- a/code/modules/awaymissions/maploader/swapmaps.dm
+++ b/code/modules/awaymissions/maploader/swapmaps.dm
@@ -326,7 +326,7 @@ swapmap
x2+=x1-1
y2+=y1-1
z2+=z1-1
- zlevels.increase_max_zlevel_to(z2) // stretch z if necessary
+ space_manager.increase_max_zlevel_to(z2) // stretch z if necessary
if(!ischunk)
swapmaps_loaded[src]=null
swapmaps_byname[id]=src
@@ -373,7 +373,7 @@ swapmap
mz=max(mz,M.z2)
world.maxx=mx
world.maxy=my
- zlevels.cut_levels_downto(mz)
+ space_manager.cut_levels_downto(mz)
// save and delete
proc/Unload()
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 7fff68cf031..da6515a591d 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -59,15 +59,13 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
- var/zlev = zlevels.add_new_zlevel()
- zlevels.add_dirt(zlev)
+ var/zlev = space_manager.add_new_zlevel(AWAY_MISSION, linkage = UNAFFECTED)
+ space_manager.add_dirt(zlev)
maploader.load_map(file, z_offset = zlev)
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
- zlevels.remove_dirt(zlev)
+ space_manager.remove_dirt(zlev)
log_to_dd(" Away mission loaded: [map]")
- //map_transition_config.Add(AWAY_MISSION_LIST)
-
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name != "awaystart")
continue
@@ -91,11 +89,11 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/file = file(map)
if(isfile(file))
log_startup_progress("Loading away mission: [map]")
- var/zlev = zlevels.add_new_zlevel()
- zlevels.add_dirt(zlev)
+ var/zlev = space_manager.add_new_zlevel()
+ space_manager.add_dirt(zlev)
maploader.load_map(file, z_offset = zlev)
late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
- zlevels.remove_dirt(zlev)
+ space_manager.remove_dirt(zlev)
log_to_dd(" Away mission loaded: [map]")
//map_transition_config.Add(AWAY_MISSION_LIST)
@@ -151,8 +149,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/initialbudget = budget
var/watch = start_watch()
- log_startup_progress("Loading ruins...")
-
while(budget > 0 && overall_sanity > 0)
// Pick a ruin
var/datum/map_template/ruin/ruin = ruins[pick(ruins)]
@@ -187,7 +183,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
ruins -= ruin.name
break
- to_chat(world, " Loaded ruins. Or not.") //So the players don't know if we loaded ruins, but we do have a message
if(initialbudget == budget) //Kill me
log_to_dd(" No ruins loaded.")
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index 40e64add719..c50e9b1c6d3 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -115,6 +115,7 @@
to_chat(H, "You cannot teleport into solid walls.")
return 0*///Who the fuck cares? Ninjas in walls are cool.
+ // TODO: Tie into space manager
if(T.z in config.admin_levels)
to_chat(H, "You cannot use your teleporter on this Z-level.")
return 0
diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm
index cb31379a59f..070015f4dc4 100644
--- a/code/modules/computer3/computers/camera.dm
+++ b/code/modules/computer3/computers/camera.dm
@@ -181,7 +181,8 @@
//proc/camera_list(var/datum/file/camnet_key/key)
get_machines(var/datum/file/camnet_key/key)
- if(!computer || computer.z > 6)
+ // TODO: Tie into space manager
+ if(!computer || computer.z > ZLEVEL_DERELICT)
return null
var/list/L = list()
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index 2f02bdcfdb3..d6575d3c143 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -59,6 +59,7 @@
Topic(var/href, var/list/href_list)
if(!interactable() || !computer.radio || ..(href,href_list) )
return
+ // TODO: Tie into space manager
if(!(computer.z in config.station_levels))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm
index d75a016f680..7534aa65932 100644
--- a/code/modules/computer3/computers/law.dm
+++ b/code/modules/computer3/computers/law.dm
@@ -24,7 +24,8 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- if(user.z > 6)
+ // TODO: Tie into space manager
+ if(user.z > ZLEVEL_DERELICT)
to_chat(user, "Unable to establish a connection: You're too far away from the station!")
return
if(istype(module, /obj/item/weapon/aiModule))
diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm
index 27002c264c2..6e96b6728e7 100644
--- a/code/modules/computer3/computers/medical.dm
+++ b/code/modules/computer3/computers/medical.dm
@@ -49,7 +49,8 @@
scan = computer.cardslot.reader
if(!interactable())
return
- if(computer.z > 6)
+ // TODO: Tie into space manager
+ if(computer.z > ZLEVEL_DERELICT)
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm
index b38b376abf5..75b2302991f 100644
--- a/code/modules/computer3/computers/prisoner.dm
+++ b/code/modules/computer3/computers/prisoner.dm
@@ -43,6 +43,7 @@
if(!T.implanted) continue
var/loc_display = "Unknown"
var/mob/living/carbon/M = T.imp_in
+ // TODO: Tie into space manager
if(M.z == ZLEVEL_STATION && !istype(M.loc, /turf/space))
var/turf/mob_loc = get_turf(M)
loc_display = mob_loc.loc
@@ -98,5 +99,3 @@
interact()
return
-
-
diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm
index 9e9e4b29fac..a728c8993bf 100644
--- a/code/modules/computer3/computers/robot.dm
+++ b/code/modules/computer3/computers/robot.dm
@@ -31,7 +31,8 @@
interact()
- if(!interactable() || computer.z > 6)
+ // TODO: Tie into space manager
+ if(!interactable() || computer.z > ZLEVEL_DERELICT)
return
var/dat
if(src.temp)
@@ -206,6 +207,3 @@
interact()
return
-
-
-
diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm
index ce6184178bf..d974101b33f 100644
--- a/code/modules/computer3/computers/security.dm
+++ b/code/modules/computer3/computers/security.dm
@@ -57,7 +57,8 @@
if(!interactable())
return
- if(computer.z > 6)
+ // TODO: Tie into space manager
+ if(computer.z > ZLEVEL_DERELICT)
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return
var/dat
diff --git a/code/modules/computer3/networking.dm b/code/modules/computer3/networking.dm
index f31f4516c2c..0fc1c966d1c 100644
--- a/code/modules/computer3/networking.dm
+++ b/code/modules/computer3/networking.dm
@@ -105,6 +105,7 @@
for(var/obj/O in radio_connection.devices)
if(istype(O,typekey))
T = get_turf(O)
+ // TODO: Tie into space manager
if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels
result |= O
return result
@@ -232,4 +233,3 @@
if(C.d1 == 0 && (C.powernet == P))
return 1
return 0
-
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 5ea69f25c55..cc07dd248b4 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -125,6 +125,7 @@ log transactions
if(get_dist(src,user) <= 1)
//check to see if the user has low security enabled
scan_user(user)
+ add_fingerprint(user)
//js replicated from obj/machinery/computer/card
var/dat = {" Nanotrasen Automatic Teller Machine
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 927db3c3668..b6313a77a40 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -17,6 +17,7 @@
/datum/event/alien_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ // TODO: Tie into space manager
if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
@@ -34,4 +35,3 @@
spawncount--
successSpawn = 1
-
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 13d7478aab3..f7db50694d6 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -19,6 +19,7 @@
var/obj/item/device/radio/beacon/chosen
var/list/possible = list()
for(var/obj/item/device/radio/beacon/W in world)
+ // TODO: Tie into space manager
if(!(W.z in config.station_levels))
continue
possible += W
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 05110a7f0ce..e51ad46f61a 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -18,7 +18,8 @@
/datum/event/brand_intelligence/start()
for(var/obj/machinery/vending/V in machines)
- if(V.z != 1) continue
+ // TODO: Tie into space manager
+ if(V.z != ZLEVEL_STATION) continue
vendingMachines.Add(V)
if(!vendingMachines.len)
@@ -62,4 +63,4 @@
rebel.shoot_inventory = 1
if(IsMultiple(activeFor, 8))
- originMachine.speak(pick(rampant_speeches))
\ No newline at end of file
+ originMachine.speak(pick(rampant_speeches))
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index ce6e214053d..0f44bf586ee 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -21,7 +21,8 @@
var/turf/T = get_turf(H)
if(!T)
continue
- if(T.z != 1)
+ // TODO: Tie into space manager
+ if(T.z != ZLEVEL_STATION)
continue
var/foundAlready = 0 // don't infect someone that already has the virus
for(var/datum/disease/D in H.viruses)
@@ -34,4 +35,4 @@
D = new virus_type()
D.carrier = 1
H.AddDisease(D)
- break
\ No newline at end of file
+ break
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 20f7f9955eb..17b529f9bda 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -62,7 +62,7 @@
goal = locate(endx, endy, 1)
src.x = startx
src.y = starty
- src.z = 1
+ src.z = ZLEVEL_STATION
spawn(0)
walk_towards(src, goal, 1)
return
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 5955d60cbec..deaa1b85aa8 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -149,7 +149,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
- //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index ca675306ffa..282c8daab9e 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -22,6 +22,7 @@
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
+ // TODO: Tie into space manager
if(current_area.type in skipped_areas || !(S.z in config.station_levels))
continue
S.last_charge = S.charge
@@ -35,6 +36,7 @@
for(var/obj/machinery/power/apc/C in world)
var/area/current_area = get_area(C)
+ // TODO: Tie into space manager
if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels))
continue
if(C.cell)
@@ -48,12 +50,14 @@
command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in machines)
var/area/current_area = get_area(C)
+ // TODO: Tie into space manager
if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels))
continue
if(C.cell)
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in machines)
var/area/current_area = get_area(S)
+ // TODO: Tie into space manager
if(current_area.type in skipped_areas || !(S.z in config.station_levels))
continue
S.charge = S.last_charge
@@ -66,7 +70,8 @@
if(announce)
command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in machines)
- if(S.z != 1)
+ // TODO: Tie into space manager
+ if(S.z != ZLEVEL_STATION)
continue
S.charge = S.capacity
S.output_level = S.output_level_max
@@ -74,4 +79,3 @@
S.input_attempt = 1
S.update_icon()
S.power_change()
-
\ No newline at end of file
diff --git a/code/modules/events/holidays/Christmas.dm b/code/modules/events/holidays/Christmas.dm
index 10a46b0cf51..b9e23d406ef 100644
--- a/code/modules/events/holidays/Christmas.dm
+++ b/code/modules/events/holidays/Christmas.dm
@@ -1,5 +1,6 @@
/proc/Christmas_Game_Start()
for(var/obj/structure/flora/tree/pine/xmas in world)
+ // TODO: Tie into space manager
if(!(xmas.z in config.station_levels)) continue
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
@@ -40,7 +41,7 @@
"What do you get from eating tree decorations?\n\nTinsilitis!",
"What do snowmen wear on their heads?\n\nIce caps!",
"Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.",
- "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.")
+ "Why doesn�t Santa have any children?\n\nBecause he only comes down the chimney.")
new /obj/item/clothing/head/festive(target.loc)
user.update_icons()
cracked = 1
@@ -59,4 +60,3 @@
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 5afddd49d23..54a2bb41bb9 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -24,6 +24,7 @@
command_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
for(var/area/A in world)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels) || is_safe_zone(A))
continue
A.radiation_alert()
@@ -42,6 +43,7 @@
var/turf/T = get_turf(H)
if(!T)
continue
+ // TODO: Tie into space manager
if(!(T.z in config.station_levels) || is_safe_zone(T.loc))
continue
@@ -61,6 +63,7 @@
command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
for(var/area/A in world)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels) || is_safe_zone(A))
continue
A.reset_radiation_alert()
diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm
index 7837bd61d7c..455312baa99 100644
--- a/code/modules/events/rogue_drones.dm
+++ b/code/modules/events/rogue_drones.dm
@@ -41,7 +41,7 @@
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread()
sparks.set_up(3, 0, D.loc)
sparks.start()
- D.z = 2
+ D.z = ZLEVEL_CENTCOMM
D.has_loot = 0
qdel(D)
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index a628e3130ed..2c46fc8dffa 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -16,6 +16,7 @@
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ // TODO: Tie into space manager
if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
@@ -26,4 +27,4 @@
if(prob(66))
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse
vents -= vent
- spawncount--
\ No newline at end of file
+ spawncount--
diff --git a/code/modules/events/undead.dm b/code/modules/events/undead.dm
index 2ff8d05c20a..3399c69c979 100644
--- a/code/modules/events/undead.dm
+++ b/code/modules/events/undead.dm
@@ -2,13 +2,14 @@
var/spawn_prob = 10
startWhen = 2
announceWhen = 3
-
+
/datum/event/undead/start()
var/datum/event/electrical_storm/RS = new
RS.lightsoutAmount = pick(2,2,3)
RS.start()
RS.kill()
for(var/area/A)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels)) continue //Spook on main station only.
if(A.luminosity) continue
// if(A.lighting_space) continue
@@ -34,7 +35,7 @@
80;/mob/living/simple_animal/hostile/retaliate/zombie,
60;/mob/living/simple_animal/hostile/retaliate/ghost)
new undeadtype(T)
-
+
/datum/event/undead/announce()
for(var/mob/living/M in player_list)
to_chat(M, "You feel [pick("a chill","a deathly chill","the undead","dirty", "creeped out","afraid","fear")]!")
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index fae640a73cb..de4e62215a8 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -11,6 +11,7 @@
/datum/event/vent_clog/setup()
endWhen = rand(25, 100)
for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines)
+ // TODO: Tie into space manager
if((temp_vent.loc.z in config.station_levels))
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 16daa8fe7c9..b022527094d 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -13,6 +13,7 @@
/datum/event/wormholes/start()
for(var/turf/simulated/floor/T in world)
+ // TODO: Tie into space manager
if((T.z in config.station_levels))
pick_turfs += T
@@ -62,4 +63,4 @@
if(P && isturf(P.loc))
target = P.loc
if(!target) return
- do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon
\ No newline at end of file
+ do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index 7dccff585d8..c90e97d60c1 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -1,5 +1,6 @@
/datum/holiday/xmas/celebrate()
for(var/obj/structure/flora/tree/pine/xmas in world)
+ // TODO: Tie into space manager
if(!(xmas.z in config.station_levels)) continue
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
@@ -43,7 +44,7 @@
"What do you get from eating tree decorations?\n\nTinsilitis!",
"What do snowmen wear on their heads?\n\nIce caps!",
"Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.",
- "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.")
+ "Why doesn�t Santa have any children?\n\nBecause he only comes down the chimney.")
new /obj/item/clothing/head/festive(target.loc)
user.update_icons()
cracked = 1
@@ -62,4 +63,3 @@
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
-
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 57ad87ecbbe..ec7a5aca25f 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -376,6 +376,7 @@
// Bluespace tomato code copied over from grown.dm.
if(get_trait(TRAIT_TELEPORTING))
+ // TODO: Tie into space manager
if(target.z in config.admin_levels)
return 1
@@ -828,4 +829,4 @@
display_name = "modified [base_name]"
if(2) //Enhanced
seed_name = "enhanced [base_name]"
- display_name = "enhanced [base_name]"
\ No newline at end of file
+ display_name = "enhanced [base_name]"
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 4d58fee8e11..aa7d9ea4607 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -20,26 +20,32 @@
opacity = 1
var/health = 50
var/tmp/busy = 0
- var/list/valid_types = list(/obj/item/weapon/book, \
- /obj/item/weapon/tome, \
- /obj/item/weapon/spellbook, \
- /obj/item/weapon/storage/bible)
+ var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/bible, /obj/item/weapon/tome) //Things allowed in the bookcase
/obj/structure/bookcase/initialize()
..()
for(var/obj/item/I in loc)
- if(is_type_in_list(I, valid_types))
+ if(is_type_in_list(I, allowed_books))
I.forceMove(src)
update_icon()
/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params)
if(busy) //So that you can't mess with it while deconstructing
return 1
- if(is_type_in_list(O, valid_types))
- user.drop_item()
+ if(is_type_in_list(O, allowed_books))
+ if(!user.drop_item())
+ return
O.forceMove(src)
update_icon()
return 1
+ else if(istype(O, /obj/item/weapon/storage/bag/books))
+ var/obj/item/weapon/storage/bag/books/B = O
+ for(var/obj/item/T in B.contents)
+ if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook) || istype(T, /obj/item/weapon/tome) || istype(T, /obj/item/weapon/storage/bible))
+ B.remove_from_storage(T, src)
+ to_chat(user, "You empty [O] into [src].")
+ update_icon()
+ return 1
else if(istype(O, /obj/item/weapon/wrench))
user.visible_message("[user] starts disassembling \the [src].", \
"You start disassembling \the [src].")
@@ -51,8 +57,6 @@
user.visible_message("[user] disassembles \the [src].", \
"You disassemble \the [src].")
busy = 0
- for(var/i = 1 to 5)
- new /obj/item/stack/sheet/wood(get_turf(src))
density = 0
qdel(src)
else
@@ -72,9 +76,6 @@
else
if(health <= 0)
visible_message("The bookcase is smashed apart!")
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
qdel(src)
return ..()
@@ -110,10 +111,10 @@
return
/obj/structure/bookcase/Destroy()
- for(var/i = 1 to 3)
+ for(var/i in 1 to 5)
new /obj/item/stack/sheet/wood(get_turf(src))
for(var/obj/item/I in contents)
- if(is_type_in_list(I, valid_types))
+ if(is_type_in_list(I, allowed_books))
I.forceMove(get_turf(src))
return ..()
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index d3a65e3c0bf..211914afcbb 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -528,7 +528,8 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user as mob)
var/turf/device_turf = get_turf(user)
- if(!device_turf||device_turf.z==2||device_turf.z>=7)
+ // TODO: Tie into space manager
+ if(!device_turf||device_turf.z==ZLEVEL_CENTCOMM||device_turf.z>=ZLEVEL_EMPTY)
to_chat(user, "You're having difficulties getting the [src.name] to work.")
return
else
@@ -536,6 +537,7 @@
var/list/L = list()
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
+ // TODO: Tie into space manager
if(T.z == ZLEVEL_STATION)
L += B
if(!L.len)
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index f5e0f2349be..2a6f5555555 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -240,6 +240,7 @@
/obj/item/weapon/ore/New()
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
+ // TODO: Tie into space manager
if(src.z == ZLEVEL_ASTEROID)
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 69a32f2c285..c67879f0457 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -18,6 +18,7 @@
var/turf/T = get_turf(src)
if(!T)
return 0
+ // TODO: Tie into space manager
if(T.z == ZLEVEL_CENTCOMM) //dont detect mobs on centcomm
return 0
if(T.z >= MAX_Z)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 842b03c4bbd..7870e3a91fc 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -640,13 +640,14 @@ var/list/ai_verbs_default = list(
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
return
- var/ai_allowed_Zlevel = list(1,3,5)
+ var/ai_allowed_Zlevel = list(ZLEVEL_STATION,ZLEVEL_TELECOMMS,ZLEVEL_ASTEROID)
var/d
var/area/bot_area
d += "Query network status "
d += "Name | Status | Location | Control | "
for(var/mob/living/simple_animal/bot/Bot in simple_animal_list)
+ // TODO: Tie into space manager
if((Bot.z in ai_allowed_Zlevel) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
bot_area = get_area(Bot)
d += "| [Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model]) | "
diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm
index 585c484a73a..0859acc1cb2 100644
--- a/code/modules/mob/living/silicon/ai/latejoin.dm
+++ b/code/modules/mob/living/silicon/ai/latejoin.dm
@@ -34,7 +34,7 @@ var/global/list/empty_playable_ai_cores = list()
job_master.FreeRole(job)
if(mind.objectives.len)
- qdel(mind.objectives)
+ mind.objectives.Cut()
mind.special_role = null
else
if(ticker.mode.name == "AutoTraitor")
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 3e15e7118d9..6d4c3a45150 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -499,6 +499,7 @@
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
+ // TODO: Tie into space manager
if(!T || !(T.z in config.contact_levels))
break
if(T.loc)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 383f75b757f..682abdb383d 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -402,7 +402,7 @@
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
/mob/new_player/proc/LateChoices()
- var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
+ var/mills = ROUND_TIME // 1/10 of a second, not real milliseconds but whatever
//var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something
var/mins = (mills % 36000) / 600
var/hours = mills / 36000
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index a97c693ec94..50c2bd79143 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -41,6 +41,7 @@
// Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras)
// unless it's on the same level as the object it's interacting with.
var/turf/T = get_turf(src_object)
+ // TODO: Tie into space manager
if(!T || !(z == T.z || (T.z in config.player_levels)))
return STATUS_CLOSE
@@ -102,4 +103,4 @@
. = shared_nano_interaction(src_object)
if(. != STATUS_CLOSE)
if(!(src_object in contents))
- . = STATUS_CLOSE
\ No newline at end of file
+ . = STATUS_CLOSE
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index a587295b582..65f5a9299ee 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -2,9 +2,10 @@
name = "Crew monitor"
/datum/nano_module/crew_monitor/Topic(href, href_list)
- if(..())
+ if(..())
return 1
var/turf/T = get_turf(nano_host())
+ // TODO: Tie into space manager
if(!T || !(T.z in config.player_levels))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 0
@@ -38,4 +39,3 @@
// should make the UI auto-update; doesn't seem to?
ui.set_auto_update(1)
-
\ No newline at end of file
diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm
index 55acf9b70eb..1c407bd223c 100644
--- a/code/modules/pda/cart_apps.dm
+++ b/code/modules/pda/cart_apps.dm
@@ -316,6 +316,7 @@
if(shuttle_master.supply.mode == SHUTTLE_CALL)
supplyData["shuttle_moving"] = 1
+ // TODO: Tie into space manager
if(shuttle_master.supply.z != ZLEVEL_STATION)
supplyData["shuttle_loc"] = "station"
else
@@ -418,4 +419,4 @@
JaniData["buckets"] = BucketData
JaniData["cleanbots"] = CbotData
JaniData["carts"] = CartData
- data["janitor"] = JaniData
\ No newline at end of file
+ data["janitor"] = JaniData
diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm
index 88d6024ba1b..2a8ca83b218 100644
--- a/code/modules/pda/messenger.dm
+++ b/code/modules/pda/messenger.dm
@@ -158,6 +158,7 @@
if(signal.data["done"])
useTC = 1
var/turf/pos = get_turf(P)
+ // TODO: Tie into space manager
if(pos.z in signal.data["level"])
useTC = 2
//Let's make this barely readable
@@ -211,4 +212,4 @@
return plist
/datum/data/pda/app/messenger/proc/can_receive()
- return pda.owner && !toff && !hidden
\ No newline at end of file
+ return pda.owner && !toff && !hidden
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 87ce338afd1..5cbb8837c68 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -170,6 +170,7 @@
apcs -= src
if(malfai && operating)
if(ticker.mode.config_tag == "malfunction")
+ // TODO: Tie into space manager
if(src.z == ZLEVEL_STATION)
ticker.mode:apcs--
area.power_light = 0
@@ -995,6 +996,7 @@
malfai.malfhacking = 0
locked = 1
if(ticker.mode.config_tag == "malfunction")
+ // TODO: Tie into space manager
if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs++
if(usr:parent)
@@ -1027,6 +1029,7 @@
if(malfai)
if(ticker.mode.config_tag == "malfunction")
+ // TODO: Tie into space manager
if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
operating ? ticker.mode:apcs++ : ticker.mode:apcs--
@@ -1042,6 +1045,7 @@
if(!malf.can_shunt)
to_chat(malf, "You cannot shunt.")
return
+ // TODO: Tie into space manager
if(!(src.z in config.station_levels))
return
src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1)
@@ -1091,6 +1095,7 @@
/obj/machinery/power/apc/proc/ion_act()
//intended to be exactly the same as an AI malf attack
+ // TODO: Tie into space manager
if(!src.malfhack && (src.z in config.station_levels))
if(prob(3))
src.locked = 1
@@ -1366,6 +1371,7 @@
/obj/machinery/power/apc/proc/set_broken()
if(malfai && operating)
if(ticker.mode.config_tag == "malfunction")
+ // TODO: Tie into space manager
if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs--
stat |= BROKEN
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 8833e047a7e..ea633c7e78f 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -124,6 +124,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
O.main_part = null
qdel(O)
for(var/area/A in world)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels)) continue
A.gravitychange(0,A)
shake_everyone()
@@ -301,6 +302,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
message_admins("The gravity generator was brought online. ([area.name])")
for(var/area/A in world)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels)) continue
A.gravitychange(1,A)
else
@@ -309,6 +311,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. ([area.name])")
for(var/area/A in world)
+ // TODO: Tie into space manager
if(!(A.z in config.station_levels)) continue
A.gravitychange(0,A)
@@ -377,6 +380,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
shake_camera(M, 15, 1)
M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5)
+// TODO: Tie into space manager
/obj/machinery/gravity_generator/main/proc/gravity_in_level()
var/turf/T = get_turf(src)
if(!T)
@@ -385,6 +389,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
return length(gravity_generators["[T.z]"])
return 0
+// TODO: Tie into space manager
/obj/machinery/gravity_generator/main/proc/update_list()
var/turf/T = get_turf(src.loc)
if(T)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 66e2e5d68b4..75f88f9b751 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -433,6 +433,7 @@
return 1
/obj/machinery/power/smes/proc/ion_act()
+ // TODO: Tie into space manager
if(src.z in config.station_levels)
if(prob(1)) //explosion
for(var/mob/M in viewers(src))
diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm
index 2155a1cf0a1..c280fe59903 100644
--- a/code/modules/projectiles/guns/energy/telegun.dm
+++ b/code/modules/projectiles/guns/energy/telegun.dm
@@ -23,7 +23,8 @@
var/turf/T = get_turf(R)
if(!T)
continue
- if((T.z in config.admin_levels) || T.z > 7)
+ // TODO: Tie into space manager
+ if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY)
continue
if(R.syndicate == 1)
continue
diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm
index 6f8e7fd6308..def94ba9a2c 100644
--- a/code/modules/reagents/newchem/disease.dm
+++ b/code/modules/reagents/newchem/disease.dm
@@ -122,6 +122,25 @@
qdel(ate_heart)
..()
+//virus-specific symptom reagents
+
+/datum/reagent/synaphydramine
+ name = "Diphen-Synaptizine"
+ id = "synaphydramine"
+ description = "Reduces drowsiness and hallucinations while also purging histamine from the body."
+ color = "#EC536D" // rgb: 236, 83, 109
+
+/datum/reagent/synaphydramine/on_mob_life(mob/living/M)
+ M.drowsyness = max(M.drowsyness-5, 0)
+ if(holder.has_reagent("lsd"))
+ holder.remove_reagent("lsd", 5)
+ if(holder.has_reagent("histamine"))
+ holder.remove_reagent("histamine", 5)
+ M.hallucination = max(0, M.hallucination - 10)
+ if(prob(30))
+ M.adjustToxLoss(1)
+ ..()
+
//virus food
/datum/reagent/virus_food
name = "Virus Food"
diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm
index 61b0d3ce0dc..b340e14d356 100644
--- a/code/modules/security_levels/security levels.dm
+++ b/code/modules/security_levels/security levels.dm
@@ -37,6 +37,7 @@
CC.post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
@@ -53,6 +54,7 @@
CC.post_status("alert", "outline")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
@@ -65,6 +67,7 @@
security_level = SEC_LEVEL_RED
var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world
+ // TODO: Tie into space manager
if(R && (R.z in config.station_levels))
R.locked = 0
R.update_icon()
@@ -74,6 +77,7 @@
CC.post_status("alert", "redalert")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_red")
@@ -86,11 +90,13 @@
if(security_level < SEC_LEVEL_RED)
for(var/obj/machinery/door/airlock/highsecurity/red/R in world)
+ // TODO: Tie into space manager
if((R.z in config.station_levels))
R.locked = 0
R.update_icon()
for(var/obj/machinery/door/airlock/hatch/gamma/H in world)
+ // TODO: Tie into space manager
if((H.z in config.station_levels))
H.locked = 0
H.update_icon()
@@ -100,6 +106,7 @@
CC.post_status("alert", "gammaalert")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma")
@@ -114,6 +121,7 @@
CC.post_status("alert", "epsilonalert")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon")
@@ -127,6 +135,7 @@
CC.post_status("alert", "deltaalert")
for(var/obj/machinery/firealarm/FA in world)
+ // TODO: Tie into space manager
if((FA.z in config.contact_levels))
FA.overlays = list()
FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta")
@@ -189,4 +198,4 @@
set_security_level(2)
/mob/verb/set_thing3()
set_security_level(3)
-*/
\ No newline at end of file
+*/
diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm
index fe3d059a08a..40e7aa05aa0 100644
--- a/code/modules/shuttle/assault_pod.dm
+++ b/code/modules/shuttle/assault_pod.dm
@@ -6,6 +6,7 @@
height = 7
/obj/docking_port/mobile/assault_pod/request()
+ // TODO: Tie into space manager
if(z == initial(src.z)) //No launching pods that have already launched
return ..()
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 8516d3e1dec..1224f5719b9 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -202,6 +202,7 @@
if(time_left <= 0 && !shuttle_master.emergencyNoEscape)
//move each escape pod to its corresponding transit dock
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
+ // TODO: Tie into space manager
if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet
M.enterTransit()
//now move the actual emergency shuttle to its transit dock
diff --git a/code/modules/space_management/heap_space_level.dm b/code/modules/space_management/heap_space_level.dm
new file mode 100644
index 00000000000..8d5a3971ba1
--- /dev/null
+++ b/code/modules/space_management/heap_space_level.dm
@@ -0,0 +1,15 @@
+// This represents a level we can carve up as we please, and hand out
+// chunks of to whatever requests it
+/datum/space_level/heap
+ var/datum/space_chunk/top
+ linkage = UNAFFECTED
+
+/datum/space_level/heap/New()
+ ..()
+ top = new
+
+/datum/space_level/heap/proc/request(width, height)
+ return 1 // All are welcome! At least until I add code for this
+
+/datum/zlevel/heap/proc/allocate(width, height)
+ return
diff --git a/code/modules/space_management/space_chunk.dm b/code/modules/space_management/space_chunk.dm
new file mode 100644
index 00000000000..b7764e5673e
--- /dev/null
+++ b/code/modules/space_management/space_chunk.dm
@@ -0,0 +1,24 @@
+/datum/space_chunk
+ var/x
+ var/y
+ var/width
+ var/height
+ var/zpos
+
+/datum/space_chunk/New(w, h, z, new_x, new_y)
+ x = new_x
+ y = new_y
+ zpos = z
+ width = w
+ height = h
+
+/datum/space_chunk/proc/check_sanity()
+ var/i_am_sane = 1
+ i_am_sane |= (x > 0)
+ i_am_sane |= (y > 0)
+ i_am_sane |= (x <= world.maxx)
+ i_am_sane |= (y <= world.maxy)
+ return i_am_sane
+
+/datum/space_chunk/proc/return_turfs()
+ return
diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm
new file mode 100644
index 00000000000..6b7654cd504
--- /dev/null
+++ b/code/modules/space_management/space_level.dm
@@ -0,0 +1,125 @@
+/datum/space_level
+ var/name = "Your config settings failed, you need to fix this for the datum space levels to work"
+ var/zpos = 1
+ var/flags = 0 // We'll use this to keep track of whether you can teleport/etc
+
+ // Map transition stuff
+ var/list/neighbors = list()
+ // # How this level connects with others. See __MAP_DEFINES.dm for defines
+ var/linkage = SELFLOOPING
+ // # imaginary placements on the grid - these reflect the point it is linked to
+ var/xi
+ var/yi
+ var/list/transit_north = list()
+ var/list/transit_south = list()
+ var/list/transit_east = list()
+ var/list/transit_west = list()
+
+ // Init deferral stuff
+ var/dirt_count = 0
+ var/list/init_list = list()
+
+/datum/space_level/New(z, name, transition_type = SELFLOOPING)
+ zpos = z
+ set_linkage(transition_type)
+ build_space_destination_arrays()
+
+/datum/space_level/proc/build_space_destination_arrays()
+ var/timer = start_watch()
+ log_debug("Starting to build space destination arrays for z level '[zpos]'...")
+ for(var/turf/space/S in get_turfs())
+
+ // Bottom border
+ if(S.y <= TRANSITIONEDGE)
+ transit_south |= S
+ continue
+
+ // Top border
+ if(S.y >= (world.maxy - TRANSITIONEDGE - 1))
+ transit_north |= S
+ continue
+
+ // Left border
+ if(S.x <= TRANSITIONEDGE)
+ transit_west |= S
+ continue
+
+ // Right border
+ if(S.x >= (world.maxx - TRANSITIONEDGE - 1))
+ transit_east |= S
+ continue
+ log_debug("Building space destination arrays complete, took [stop_watch(timer)]s.")
+
+/datum/space_level/proc/get_turfs()
+ return block(locate(1, 1, zpos), locate(world.maxx, world.maxy, zpos))
+
+/datum/space_level/proc/set_linkage(transition_type)
+ linkage = transition_type
+ if(transition_type == SELFLOOPING)
+ link_to_self() // `link_to_self` is defined in space_transitions.dm
+
+
+/datum/space_level/proc/resume_init()
+ if(dirt_count > 0)
+ throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'")
+ log_debug("Releasing freeze on z-level '[zpos]'!")
+ log_debug("Beginning initialization!")
+ var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack)
+ init_list = list()
+ var/list/late_maps = list()
+ var/list/pipes = list()
+ var/list/cables = list()
+ var/watch = start_watch()
+ for(var/schmoo in our_atoms)
+ var/atom/movable/AM = schmoo
+ if(AM) // to catch stuff like the nuke disk that no longer exists
+
+ // This can mess with our state - we leave these for last
+ if(istype(AM, /obj/effect/landmark/map_loader))
+ late_maps.Add(AM)
+ continue
+ AM.initialize()
+ if(istype(AM, /obj/machinery/atmospherics))
+ pipes.Add(AM)
+ else if(istype(AM, /obj/structure/cable))
+ cables.Add(AM)
+ log_debug("Primary initialization finished in [stop_watch(watch)]s.")
+ our_atoms.Cut()
+ if(pipes.len)
+ do_pipes(pipes)
+ if(cables.len)
+ do_cables(cables)
+ if(late_maps.len)
+ do_late_maps(late_maps)
+
+/datum/space_level/proc/do_pipes(list/pipes)
+ var/watch = start_watch()
+ log_debug("Building pipenets on z-level '[zpos]'!")
+ for(var/schmoo in pipes)
+ var/obj/machinery/atmospherics/machine = schmoo
+ if(machine)
+ machine.build_network()
+ pipes.Cut()
+ log_debug("Took [stop_watch(watch)]s")
+
+/datum/space_level/proc/do_cables(list/cables)
+ var/watch = start_watch()
+ log_debug("Building powernets on z-level '[zpos]'!")
+ for(var/schmoo in cables)
+ var/obj/structure/cable/C = schmoo
+ if(C)
+ makepowernet_for(C)
+ cables.Cut()
+ log_debug("Took [stop_watch(watch)]s")
+
+/datum/space_level/proc/do_late_maps(list/late_maps)
+ var/watch = start_watch()
+ log_debug("Loading map templates on z-level '[zpos]'!")
+ space_manager.add_dirt(zpos) // Let's not repeatedly resume init for each template
+ for(var/schmoo in late_maps)
+ var/obj/effect/landmark/map_loader/ML = schmoo
+ if(ML)
+ ML.initialize()
+ late_maps.Cut()
+ space_manager.remove_dirt(zpos)
+ log_debug("Took [stop_watch(watch)]s")
diff --git a/code/modules/space_management/space_transition.dm b/code/modules/space_management/space_transition.dm
new file mode 100644
index 00000000000..469365e4023
--- /dev/null
+++ b/code/modules/space_management/space_transition.dm
@@ -0,0 +1,412 @@
+//This is realisation of the working torus-looping randomized-per-round space map, this kills the cube
+
+#define Z_LEVEL_NORTH "1"
+#define Z_LEVEL_SOUTH "2"
+#define Z_LEVEL_EAST "4"
+#define Z_LEVEL_WEST "8"
+
+/proc/get_opposite_direction(direction)
+ switch(direction)
+ if(Z_LEVEL_NORTH)
+ return Z_LEVEL_SOUTH
+ if(Z_LEVEL_SOUTH)
+ return Z_LEVEL_NORTH
+ if(Z_LEVEL_EAST)
+ return Z_LEVEL_WEST
+ if(Z_LEVEL_WEST)
+ return Z_LEVEL_EAST
+
+/datum/space_level
+ var/list/direction_cache = list()
+
+/datum/space_level/proc/link_to_self()
+ neighbors = list()
+ var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST)
+ for(var/A in L)
+ neighbors[A] = src
+
+// This proc takes another space level, and establishes a connection between the
+// two depending on how the `xi` and the `yi` values compare
+/datum/space_level/proc/link_levels(datum/space_level/S)
+ if(S.xi == xi)
+ if(S.yi == yi+1)
+ add_connection(S, Z_LEVEL_NORTH)
+ else if(S.yi == yi-1)
+ add_connection(S, Z_LEVEL_SOUTH)
+ else if(S.yi == yi)
+ if(S.xi == xi+1)
+ add_connection(S, Z_LEVEL_EAST)
+ else if(S.xi == xi-1)
+ add_connection(S, Z_LEVEL_WEST)
+ else // yell about evil wizards, this shouldn't happen
+ log_debug("Two z levels attempted to link, but were not adjacent! Our z:([xi],[yi]). Other z:([S.xi],[S.yi])")
+
+// Do this before setting up new connections, or the old ones will haunt you
+/datum/space_level/proc/reset_connections()
+ neighbors.Cut()
+ direction_cache.Cut()
+
+// `direction` here is the direction from `src` to `S`
+/datum/space_level/proc/add_connection(datum/space_level/S, direction)
+ var/oppose = get_opposite_direction(direction)
+ neighbors[direction] = S
+ S.neighbors[oppose] = src
+
+
+// The "direction cache" will need updating if a
+/datum/space_level/proc/get_connection(direction)
+ if(direction in neighbors)
+ return neighbors[direction]
+ var/use_direction_cache = 0
+ if(use_direction_cache)
+ if(direction in direction_cache)
+ return direction_cache[direction]
+
+ // It's in a direction that loops - so we step as far in the opposite direction to get where to wrap to
+ var/datum/space_level/S = src
+ var/oppose = get_opposite_direction(direction)
+ // Loop all the way in the other direction that we can
+ while(S.neighbors[oppose])
+ if(S.neighbors[oppose] == src) // we've got a tesseract, boys
+ CRASH("Tesseract formed when routing connections between z levels. Culprit: z level '[S.zpos]' to '[src.zpos]', direction [oppose]")
+ S = S.neighbors[oppose]
+
+ if(use_direction_cache)
+ direction_cache[direction] = S
+ return S
+
+
+/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else
+ var/list/neighbors = list()
+ var/x
+ var/y
+ var/datum/space_level/spl
+
+/datum/point/New(nx, ny)
+ x = nx
+ y = ny
+
+/datum/point/proc/hash()
+ return "([x],[y])"
+
+// This is called only on `filled_nodes` - meaning we have a guarantee that
+// it is already surrounded on all sides
+/datum/point/proc/set_neighbors(datum/spacewalk_grid/SW)
+ neighbors.Cut()
+ neighbors |= SW.get(x+1, y, allow_empty = 1)
+ neighbors |= SW.get(x-1, y, allow_empty = 1)
+ neighbors |= SW.get(x, y+1, allow_empty = 1)
+ neighbors |= SW.get(x, y-1, allow_empty = 1)
+
+// Updates variables of the space level
+/datum/point/proc/set_space_level(datum/space_level/S)
+ spl = S
+ S.xi = x
+ S.yi = y
+ for(var/datum/point/P in neighbors)
+ if(istype(P.spl))
+ // Since each time this proc is called, it is the first time
+ // that the z level is added to the grid, we know for certain
+ // that no other z level has this as its neighbor
+ spl.link_levels(P.spl)
+
+// Returns a list of all neighbors that don't have a space level yet
+// If a node doesn't exist yet, it will create it
+// This is only called for nodes within the `available_nodes` list
+/datum/point/proc/get_empty_neighbors(datum/spacewalk_grid/SW)
+ var/list/result
+ var/datum/point/up = SW.get(x, y+1, allow_empty = 1)
+ var/datum/point/down = SW.get(x, y-1, allow_empty = 1)
+ var/datum/point/left = SW.get(x-1, y, allow_empty = 1)
+ var/datum/point/right = SW.get(x+1, y, allow_empty = 1)
+ if(isnull(up))
+ up = new(x, y+1)
+ SW.add_available_node(up)
+
+ if(isnull(down))
+ down = new(x, y-1)
+ SW.add_available_node(down)
+
+ if(isnull(left))
+ left = new(x-1, y)
+ SW.add_available_node(left)
+
+ if(isnull(right))
+ right = new(x+1, y)
+ SW.add_available_node(right)
+
+ // Nodes with a space datum are not empty
+ result = list(up, down, left, right)
+ for(var/datum/point/thing in result)
+ if(!isnull(thing.spl))
+ result -= thing
+ return result
+
+// This looks around itself to see if it has any active nodes within the cardinal directions
+/datum/point/proc/has_no_neighbors(datum/spacewalk_grid/SW)
+ var/result = 1
+ if(spl)
+ return 1
+ if(!isnull(SW.get(x+1,y)))
+ result = 0
+ if(!isnull(SW.get(x-1,y)))
+ result = 0
+ if(!isnull(SW.get(x,y+1)))
+ result = 0
+ if(!isnull(SW.get(x,y-1)))
+ result = 0
+ return result
+
+
+/datum/point/proc/deactivate()
+ if(!spl)
+ throw EXCEPTION("Attempted to deactivate inactive point")
+ for(var/direction in spl.neighbors)
+ var/datum/space_level/S = spl.neighbors[direction]
+ var/oppose = get_opposite_direction(direction)
+ S.neighbors.Remove(oppose)
+ spl.reset_connections()
+ spl = initial(spl)
+
+// This is like the old algorithm, except this one
+// can expand indefinitely and add new points on the fly
+
+// The algorithm is: Start in the center, and add all adjacent points to a list of things to select
+// Then repeatedly do the cycle of choosing a node next to any previously-selected node, then
+// add all points next to your chosen node to the list of things to select
+/datum/spacewalk_grid
+ // This is a list of fully initialized nodes - these have their neighbors
+ // assigned, and are surrounded
+ var/list/filled_nodes = list()
+ // These nodes are not fully initialized - their neighbors field is empty,
+ // and they do not correspond to a space level
+ var/list/available_nodes = list()
+ var/list/all_nodes = list() // filled_nodes | available_nodes
+ var/min_x = 0
+ var/min_y = 0
+ var/max_x = 0
+ var/max_y = 0
+
+/datum/spacewalk_grid/New()
+ var/datum/point/P = new(0,0)
+ add_available_node(P)
+
+/datum/spacewalk_grid/proc/add_available_node(datum/point/P)
+ var/hash = P.hash()
+ if(hash in all_nodes)
+ log_debug("Hash overlap! [hash]")
+ all_nodes[P.hash()] = P
+ available_nodes |= P
+
+// We call this to flag a node as in use - all required variables will be
+// ready after this is called
+/datum/spacewalk_grid/proc/consume_node(datum/point/P)
+ filled_nodes |= P
+ available_nodes -= P
+ // This proc adds any new neighbors to the list of available nodes
+ P.get_empty_neighbors(src)
+ if(min_x > P.x)
+ min_x = P.x
+ else if(max_x < P.x)
+ max_x = P.x
+ if(min_y > P.y)
+ min_y = P.y
+ else if(max_y < P.y)
+ max_y = P.y
+ P.set_neighbors(src)
+
+// You can call this with an active point, to remove it from the grid -
+// this is important if you want to separate a z level from the network
+/datum/spacewalk_grid/proc/release_node(datum/point/P)
+ filled_nodes -= P
+ available_nodes |= P
+ // Go through each neighbor node, and delete it if it's not
+ // next to any other active nodes
+ for(var/datum/point/P2 in P.neighbors)
+ var/isolated = P2.has_no_neighbors(src)
+ if(isolated)
+ available_nodes -= P2
+ all_nodes -= P2.hash()
+ qdel(P)
+ P.deactivate()
+ P.neighbors.Cut()
+
+ // Now that we've cleaned out inactive nodes, we will update the bounds
+ var/datum/point/outer_bound
+ if(P.x == max_x)
+ for(var/i = min_y, i <= max_y, i++)
+ outer_bound = get(P.x, i)
+ if(!isnull(outer_bound)) // There is still an active node in this column
+ break
+ if(isnull(outer_bound))
+ max_x--
+
+ if(P.x == min_x)
+ for(var/i = min_y, i <= max_y, i++)
+ outer_bound = get(P.x, i)
+ if(!isnull(outer_bound)) // There is still an active node in this column
+ break
+ if(isnull(outer_bound))
+ min_x++
+
+ if(P.y == max_y)
+ for(var/i = min_x, i <= max_x, i++)
+ outer_bound = get(i, P.y)
+ if(!isnull(outer_bound)) // There is still an active node in this column
+ break
+ if(isnull(outer_bound))
+ max_y--
+
+ if(P.y == min_y)
+ for(var/i = min_x, i <= max_x, i++)
+ outer_bound = get(i, P.y)
+ if(!isnull(outer_bound)) // There is still an active node in this column
+ break
+ if(isnull(outer_bound))
+ min_y++
+
+
+// If the node isn't in the grid, this will return null
+/datum/spacewalk_grid/proc/get(x,y, allow_empty = 0)
+ var/datum/point/P = all_nodes["([x],[y])"]
+ if(!allow_empty && !(P in filled_nodes))
+ P = null // active nodes only
+ return P
+
+/datum/spacewalk_grid/proc/get_width()
+ return 1 + max_x - min_x
+
+/datum/spacewalk_grid/proc/get_height()
+ return 1 + max_y - min_y
+
+// This function is called repeatedly to build the map
+/datum/spacewalk_grid/proc/get_empty_node()
+ var/datum/point/P = pick(available_nodes)
+ if(isnull(P))
+ throw EXCEPTION("The `available_nodes` list was either empty or contained a null entry")
+ consume_node(P)
+ return P
+
+// This proc substantiates the grid of points used to determine routes between levels
+// Separating this from initialization gives us time in which we can add more crosslink z levels
+// before we bake in all our connections
+/datum/zlev_manager/proc/route_linkage()
+ var/list/crosslinks = list()
+ var/datum/space_level/D
+ for(var/A in z_list)
+ D = z_list[A]
+ if(D.linkage == CROSSLINKED)
+ crosslinks.Add(D)
+ D.reset_connections()
+
+ // We create an imaginary, square, grid, with dimensions that are
+ // twice the number of z levels, plus one, per side
+
+ // This is big enough to hold a straight line from the center to any side
+ // `point_grid` is indexed as a 2 way matrix of these points
+ // `grid` is a flat list of these same above points
+
+ // Each point represents a possible z level position
+ var/datum/spacewalk_grid/point_grid = new
+ // We do this so we can display the way the levels connect later
+ linkage_map = point_grid
+ var/datum/point/P
+
+ // Now, we pop entries in a random order from our list of space levels
+ // and assign its connections based on the grid
+ while(crosslinks.len)
+ D = pick(crosslinks)
+ crosslinks.Remove(D)
+ // We now choose a point in our imaginary grid adjacent to our current location
+ P = point_grid.get_empty_node()
+ // Let our z level know where in the imaginary grid it is
+ // This will also handle establishing neighborship with other z levels
+ P.set_space_level(D)
+
+// A heavy proc - loops through all space turfs and sets its destination
+// based on its space level's linkage
+// Takes 0.6 seconds per call on my machine - could have each z level
+// have its own space turf cache, but I don't want to complicate this more
+// than is necessary
+/datum/zlev_manager/proc/setup_space_destinations()
+ var/timer = start_watch()
+ log_debug("Assigning space turf destinations...")
+ var/datum/space_level/D
+ var/datum/space_level/E
+ var/turf/space/S
+ for(var/A in z_list) //Define the transistions of the z levels
+ D = z_list[A]
+ if(!D.neighbors.len)
+ continue
+ // Left border
+ for(var/B in D.transit_west)
+ S = B
+ E = D.get_connection(Z_LEVEL_WEST)
+ S.destination_z = E.zpos
+ S.destination_x = world.maxx - TRANSITIONEDGE - 2
+ S.destination_y = S.y
+
+ // Right border
+ for(var/B in D.transit_east)
+ S = B
+ E = D.get_connection(Z_LEVEL_EAST)
+ S.destination_x = TRANSITIONEDGE + 2
+ S.destination_y = S.y
+ S.destination_z = E.zpos
+
+ // Bottom border
+ for(var/B in D.transit_south)
+ S = B
+ E = D.get_connection(Z_LEVEL_SOUTH)
+ S.destination_x = S.x
+ S.destination_y = world.maxy - TRANSITIONEDGE - 2
+ S.destination_z = E.zpos
+
+ // Top border
+ for(var/B in D.transit_north)
+ S = B
+ E = D.get_connection(Z_LEVEL_NORTH)
+ S.destination_x = S.x
+ S.destination_y = TRANSITIONEDGE + 2
+ S.destination_z = E.zpos
+
+ log_debug("Assigning space turf destinations complete. Took [stop_watch(timer)]s.")
+
+// Nothing fancy, just does it all at once
+/datum/zlev_manager/proc/do_transition_setup()
+ route_linkage()
+ setup_space_destinations()
+
+// A debugging proc that expresses the map's shape as a bunch of turfs
+/datum/zlev_manager/proc/map_as_turfs(turf/center)
+ // size is odd
+ // -1, /2 to get distance from the center
+ // center - radius = bottom left coordinate
+ var/datum/point/P
+ var/turf/our_spot
+ var/grid_desc = ""
+ for(var/i = linkage_map.min_x, i <= linkage_map.max_x, i++)
+ for(var/j = linkage_map.min_y, j <= linkage_map.max_y, j++)
+ P = linkage_map.get(i, j)
+ our_spot = locate(center.x + i, center.y + j, center.z)
+ grid_desc = "([i],[j])"
+ if(!isnull(P))
+ our_spot = our_spot.ChangeTurf(/turf/simulated/floor/plating/snow)
+ grid_desc += ": Z level [P.spl.zpos]. "
+ var/datum/space_level/up = P.spl.get_connection(Z_LEVEL_NORTH)
+ var/datum/space_level/down = P.spl.get_connection(Z_LEVEL_SOUTH)
+ var/datum/space_level/right = P.spl.get_connection(Z_LEVEL_EAST)
+ var/datum/space_level/left = P.spl.get_connection(Z_LEVEL_WEST)
+ grid_desc += "Up: [up.zpos], "
+ grid_desc += "Down: [down.zpos], "
+ grid_desc += "Right: [right.zpos], "
+ grid_desc += "Left: [left.zpos]"
+ else
+ our_spot = our_spot.ChangeTurf(/turf/simulated/floor/fakespace)
+ our_spot.desc = grid_desc
+
+
+#undef Z_LEVEL_NORTH
+#undef Z_LEVEL_SOUTH
+#undef Z_LEVEL_EAST
+#undef Z_LEVEL_WEST
diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm
new file mode 100644
index 00000000000..8f83c0ab5e4
--- /dev/null
+++ b/code/modules/space_management/zlevel_manager.dm
@@ -0,0 +1,131 @@
+var/global/datum/zlev_manager/space_manager = new
+
+/datum/zlev_manager
+ // A list of z-levels
+ var/list/z_list = list()
+ var/list/heaps = list()
+
+ var/datum/spacewalk_grid/linkage_map
+
+// Populate our space level list
+// and prepare space transitions
+/datum/zlev_manager/proc/initialize()
+ var/num_official_z_levels = map_transition_config.len
+ var/k = 1
+
+ // First take care of "Official" z levels, without visiting levels outside of the list
+ for(var/A in map_transition_config)
+ // `A` is the name
+ // `map_transition_config[A]` is the transition type
+ z_list["[k]"] = new /datum/space_level(k, A, transition_type = map_transition_config[A])
+ if(k > world.maxz)
+ CRASH("More map transitions defined than existent z levels - [num_official_z_levels]")
+ k++
+
+ // Then, we take care of unmanaged z levels
+ // They get the default linkage of SELFLOOPING
+ for(var/i = k, i <= world.maxz, i++)
+ z_list["[i]"] = new /datum/space_level(i)
+
+
+/datum/zlev_manager/proc/get_zlev(z)
+ if(!("[z]" in z_list))
+ throw EXCEPTION("Unmanaged z level: '[z]'")
+ else
+ return z_list["[z]"]
+
+/*
+* "Dirt" management
+* "Dirt" is used to keep track of whether a z level should automatically have
+* stuff on it initialize or not - If you're loading a map, place
+* a freeze on the z levels it touches so as to prevent atmos from exploding,
+* among other things
+*/
+
+
+// Returns whether the given z level has a freeze on initialization
+/datum/zlev_manager/proc/is_zlevel_dirty(z)
+ var/datum/space_level/our_z = get_zlev(z)
+ return (our_z.dirt_count > 0)
+
+
+// Increases the dirt count on a z level
+/datum/zlev_manager/proc/add_dirt(z)
+ var/datum/space_level/our_z = get_zlev(z)
+ if(our_z.dirt_count == 0)
+ log_debug("Placing an init freeze on z-level '[our_z.zpos]'!")
+ our_z.dirt_count++
+
+
+// Decreases the dirt count on a z level
+/datum/zlev_manager/proc/remove_dirt(z)
+ var/datum/space_level/our_z = get_zlev(z)
+ our_z.dirt_count--
+ if(our_z.dirt_count == 0)
+ our_z.resume_init()
+ if(our_z.dirt_count < 0)
+ log_debug("WARNING: Imbalanced dirt removal")
+ our_z.dirt_count = 0
+
+/datum/zlev_manager/proc/postpone_init(z, thing)
+ var/datum/space_level/our_z = get_zlev(z)
+ our_z.init_list.Add(thing)
+
+
+/**
+*
+* SPACE ALLOCATION
+*
+*/
+
+
+// For when you need the z-level to be at a certain point
+/datum/zlev_manager/proc/increase_max_zlevel_to(new_maxz)
+ if(world.maxz>=new_maxz)
+ return
+ while(world.maxznew_maxz)
+ kill_topmost_zlevel()
+
+// Decrements the max z-level by one
+// not normally used, but hey the swapmap loader wanted it
+/datum/zlev_manager/proc/kill_topmost_zlevel()
+ var/our_z = world.maxz
+ var/datum/space_level/S = get_zlev(our_z)
+ z_list.Remove(S)
+ qdel(S)
+ world.maxz--
+
+
+// An internally-used proc used for heap-zlevel management
+/datum/zlev_manager/proc/add_new_heap()
+ world.maxz++
+ var/our_z = world.maxz
+ var/datum/space_level/yup = new /datum/space_level/heap(our_z)
+ z_list["[our_z]"] = yup
+ return yup
+
+// This is what you can call to allocate a section of space
+// Later, I'll add an argument to let you define the flags on the region
+/datum/zlev_manager/proc/allocate_space(width, height)
+ if(!heaps.len)
+ heaps.len++
+ heaps[heaps.len] = add_new_heap()
+ var/datum/space_level/heap/our_heap
+ for(our_heap in heaps)
+ var/weve_got_vacancy = our_heap.request(width, height)
+ if(weve_got_vacancy)
+ break // We're sticking with the present value of `our_heap` - it's got room
diff --git a/code/modules/space_transition/space_transition.dm b/code/modules/space_transition/space_transition.dm
deleted file mode 100644
index fe63154b017..00000000000
--- a/code/modules/space_transition/space_transition.dm
+++ /dev/null
@@ -1,187 +0,0 @@
-//This is realisation of the working torus-looping randomized-per-round space map, this kills the cube
-
-#define Z_LEVEL_NORTH "1"
-#define Z_LEVEL_SOUTH "2"
-#define Z_LEVEL_EAST "4"
-#define Z_LEVEL_WEST "8"
-
-
-var/list/z_levels_list = list()
-
-/datum/space_level
- var/name = "Your config settings failed, you need to fix this for the datum space levels to work"
- var/list/neigbours
- var/z_value = 1 //actual z placement
- var/linked = 1
- var/xi
- var/yi //imaginary placements on the grid
-
-/datum/space_level/New()
- neigbours = list()
- var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST)
- for(var/A in L)
- neigbours[A] = src
-
-/datum/space_level/proc/set_neigbours(list/L)
- for(var/datum/point/P in L)
- if(P.x == xi)
- if(P.y == yi+1)
- neigbours[Z_LEVEL_NORTH] = P.spl
- P.spl.neigbours[Z_LEVEL_SOUTH] = src
- else if(P.y == yi-1)
- neigbours[Z_LEVEL_SOUTH] = P.spl
- P.spl.neigbours[Z_LEVEL_NORTH] = src
- else if(P.y == yi)
- if(P.x == xi+1)
- neigbours[Z_LEVEL_EAST] = P.spl
- P.spl.neigbours[Z_LEVEL_WEST] = src
- else if(P.x == xi-1)
- neigbours[Z_LEVEL_WEST] = P.spl
- P.spl.neigbours[Z_LEVEL_EAST] = src
-
-/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else
- var/list/neigbours = list()
- var/x
- var/y
- var/datum/space_level/spl
-
-/datum/point/New(nx, ny, list/point_grid)
- if(!point_grid)
- qdel(src)
- return
- var/list/L = point_grid[1]
- if(nx > point_grid.len || ny > L.len)
- qdel(src)
- return
- x = nx
- y = ny
- if(point_grid[x][y])
- return
- point_grid[x][y] = src
-
-/datum/point/proc/set_neigbours(list/grid)
- var/max_X = grid.len
- var/list/max_Y = grid[1]
- max_Y = max_Y.len
- neigbours.Cut()
- if(x+1 <= max_X)
- neigbours |= grid[x+1][y]
- if(x-1 >= 1)
- neigbours |= grid[x-1][y]
- if(y+1 <= max_Y)
- neigbours |= grid[x][y+1]
- if(y-1 >= 1)
- neigbours |= grid[x][y-1]
-
-
-//config/space_levels.txt is where you define your zlevel datum names, their connection to actual z levels and if you want them connected to one another or not
-//Grammar: Name;z value;linked/unlinked
-//Name is the name of the datum, just for the sake of it
-//z value is to what actual map z level this datum is pointing
-//linked/unlinked decide if you want the z level in the general map or not, for example centcomm is not reachable
-//Each entry must be separated with a single empty line, no spaces outside the name
-//No comments in the file allowed
-
-/proc/setup_map_transitions() //listamania
- var/list/SLS = file2list("config/space_levels.txt", "\n\n")
- var/datum/space_level/D
- var/list/config_settings[SLS.len][]
- for(var/A in SLS)
- config_settings[SLS.Find(A)] = splittext(A, ";")
- var/conf_set_len = SLS.len
- SLS.Cut()
- for(var/A in config_settings)
- D = new()
- D.name = A[1]
- D.z_value = text2num(A[2])
- if(A[3] != "linked")
- D.linked = 0
- z_levels_list["[D.z_value]"] = D
- else
- SLS.Add(D)
- var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1]
- var/list/grid = list()
- var/datum/point/P
- for(var/i = 1, i<=conf_set_len*2+1, i++)
- for(var/j = 1, j<=conf_set_len*2+1, j++)
- P = new/datum/point(i,j, point_grid)
- point_grid[i][j] = P
- grid.Add(P)
- for(var/datum/point/pnt in grid)
- pnt.set_neigbours(point_grid)
- P = point_grid[conf_set_len][conf_set_len]
- var/list/possible_points = list()
- var/list/used_points = list()
- grid.Cut()
- while(SLS.len)
- D = pick(SLS)
- SLS.Remove(D)
- D.xi = P.x
- D.yi = P.y
- P.spl = D
- possible_points |= P.neigbours
- used_points |= P
- possible_points.Remove(used_points)
- D.set_neigbours(used_points)
- P = pick(possible_points)
- grid["[D.z_value]"] = D
-
- for(var/A in z_levels_list)
- grid[A] = z_levels_list[A]
-
- for(var/turf/space/S in world) //Define the transistions of the z levels
- if(S.x <= TRANSITIONEDGE)
- D = grid["[S.z]"]
- if(D.neigbours[Z_LEVEL_WEST] != D)
- D = D.neigbours[Z_LEVEL_WEST]
- S.destination_z = D.z_value
- else
- while(D.neigbours[Z_LEVEL_EAST] != D)
- D = D.neigbours[Z_LEVEL_EAST]
- S.destination_z = D.z_value
- S.destination_x = world.maxx - TRANSITIONEDGE - 2
- S.destination_y = S.y
-
- if(S.x >= (world.maxx - TRANSITIONEDGE - 1))
- D = grid["[S.z]"]
- if(D.neigbours[Z_LEVEL_EAST] != D)
- D = D.neigbours[Z_LEVEL_EAST]
- S.destination_z = D.z_value
- else
- while(D.neigbours[Z_LEVEL_WEST] != D)
- D = D.neigbours[Z_LEVEL_WEST]
- S.destination_z = D.z_value
- S.destination_x = TRANSITIONEDGE + 2
- S.destination_y = S.y
-
- if(S.y <= TRANSITIONEDGE)
- D = grid["[S.z]"]
- if(D.neigbours[Z_LEVEL_SOUTH] != D)
- D = D.neigbours[Z_LEVEL_SOUTH]
- S.destination_z = D.z_value
- else
- while(D.neigbours[Z_LEVEL_NORTH] != D)
- D = D.neigbours[Z_LEVEL_NORTH]
- S.destination_z = D.z_value
- S.destination_x = S.x
- S.destination_y = world.maxy - TRANSITIONEDGE - 2
-
- if(S.y >= (world.maxy - TRANSITIONEDGE - 1))
- D = grid["[S.z]"]
- if(D.neigbours[Z_LEVEL_NORTH] != D)
- D = D.neigbours[Z_LEVEL_NORTH]
- S.destination_z = D.z_value
- else
- while(D.neigbours[Z_LEVEL_SOUTH] != D)
- D = D.neigbours[Z_LEVEL_SOUTH]
- S.destination_z = D.z_value
- S.destination_x = S.x
- S.destination_y = TRANSITIONEDGE + 2
-
- for(var/A in grid)
- z_levels_list[A] = grid[A]
-
-#undef Z_LEVEL_NORTH
-#undef Z_LEVEL_SOUTH
-#undef Z_LEVEL_EAST
-#undef Z_LEVEL_WEST
diff --git a/code/modules/spacial_allocator/zlevel.dm b/code/modules/spacial_allocator/zlevel.dm
deleted file mode 100644
index 8b8bec70b87..00000000000
--- a/code/modules/spacial_allocator/zlevel.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-/datum/zlevel
- var/flags = 0
- var/dirt_count = 0
- var/zpos
- var/list/init_list = list()
-
-/datum/zlevel/New(z)
- zpos = z
-
-/datum/zlevel/proc/resume_init()
- if(dirt_count > 0)
- throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'")
- log_debug("Releasing freeze on z-level '[zpos]'!")
- log_debug("Beginning initialization!")
- var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack)
- init_list = list()
- var/list/late_maps = list()
- var/list/pipes = list()
- var/list/cables = list()
- var/watch = start_watch()
- for(var/schmoo in our_atoms)
- var/atom/movable/AM = schmoo
- if(AM) // to catch stuff like the nuke disk that no longer exists
-
- // This can mess with our state - we leave these for last
- if(istype(AM, /obj/effect/landmark/map_loader))
- late_maps.Add(AM)
- continue
- AM.initialize()
- if(istype(AM, /obj/machinery/atmospherics))
- pipes.Add(AM)
- else if(istype(AM, /obj/structure/cable))
- cables.Add(AM)
- log_debug("Primary initialization finished in [stop_watch(watch)]s.")
- our_atoms.Cut()
- if(pipes.len)
- do_pipes(pipes)
- if(cables.len)
- do_cables(cables)
- if(late_maps.len)
- do_late_maps(late_maps)
-
-/datum/zlevel/proc/do_pipes(list/pipes)
- var/watch = start_watch()
- log_debug("Building pipenets on z-level '[zpos]'!")
- for(var/schmoo in pipes)
- var/obj/machinery/atmospherics/machine = schmoo
- if(machine)
- machine.build_network()
- pipes.Cut()
- log_debug("Took [stop_watch(watch)]s")
-
-/datum/zlevel/proc/do_cables(list/cables)
- var/watch = start_watch()
- log_debug("Building powernets on z-level '[zpos]'!")
- for(var/schmoo in cables)
- var/obj/structure/cable/C = schmoo
- if(C)
- makepowernet_for(C)
- cables.Cut()
- log_debug("Took [stop_watch(watch)]s")
-
-/datum/zlevel/proc/do_late_maps(list/late_maps)
- var/watch = start_watch()
- log_debug("Loading map templates on z-level '[zpos]'!")
- zlevels.add_dirt(zpos) // Let's not repeatedly resume init for each template
- for(var/schmoo in late_maps)
- var/obj/effect/landmark/map_loader/ML = schmoo
- if(ML)
- ML.initialize()
- late_maps.Cut()
- zlevels.remove_dirt(zpos)
- log_debug("Took [stop_watch(watch)]s")
diff --git a/code/modules/spacial_allocator/zlevel_manager.dm b/code/modules/spacial_allocator/zlevel_manager.dm
deleted file mode 100644
index 3c6fb0a0048..00000000000
--- a/code/modules/spacial_allocator/zlevel_manager.dm
+++ /dev/null
@@ -1,89 +0,0 @@
-var/global/datum/zlev_manager/zlevels = new
-
-/datum/zlev_manager
- // A list of z-levels
- var/list/z_list = list()
-
-
-// Populate our z level list
-/datum/zlev_manager/proc/initialize()
- z_list.len = world.maxz
- for(var/i = 1, i <= world.maxz, i++)
- z_list[i] = new /datum/zlevel(i)
-
-
-
-/datum/zlev_manager/proc/get_zlev(z)
- if(z < 1)
- throw EXCEPTION("Non-positive z level given!")
- else if(z > z_list.len)
- throw EXCEPTION("Untracked z level: '[z]'")
- else
- return z_list[z]
-
-// For when you need the z-level to be at a certain point
-/datum/zlev_manager/proc/increase_max_zlevel_to(new_maxz)
- if(world.maxz>=new_maxz)
- return
- while(world.maxznew_maxz)
- kill_topmost_zlevel()
-
-// Decrements the max z-level by one
-// not normally used, but hey the swapmap loader wanted it
-/datum/zlev_manager/proc/kill_topmost_zlevel()
- var/our_z = world.maxz
- qdel(z_list[our_z])
- z_list.len--
- world.maxz--
-
-/*
-* "Dirt" management
-* "Dirt" is used to keep track of whether a z level should automatically have
-* stuff on it initialize or not - the map loaders, when set to defer init, place
-* a freeze on the z levels they touch so as to prevent atmos from exploding,
-* among other things
-*/
-
-
-// Returns whether the given z level has a freeze on initialization
-/datum/zlev_manager/proc/is_zlevel_dirty(z)
- var/datum/zlevel/our_z = get_zlev(z)
- return (our_z.dirt_count > 0)
-
-
-// Increases the dirt count on a z level
-/datum/zlev_manager/proc/add_dirt(z)
- var/datum/zlevel/our_z = get_zlev(z)
- if(our_z.dirt_count == 0)
- log_debug("Placing an init freeze on z-level '[our_z.zpos]'!")
- our_z.dirt_count++
-
-
-// Decreases the dirt count on a z level
-/datum/zlev_manager/proc/remove_dirt(z)
- var/datum/zlevel/our_z = get_zlev(z)
- our_z.dirt_count--
- if(our_z.dirt_count == 0)
- our_z.resume_init()
- if(our_z.dirt_count < 0)
- log_debug("WARNING: Imbalanced dirt removal")
- our_z.dirt_count = 0
-
-/datum/zlev_manager/proc/postpone_init(z, thing)
- var/datum/zlevel/our_z = get_zlev(z)
- our_z.init_list.Add(thing)
diff --git a/code/modules/store/store.dm b/code/modules/store/store.dm
index f0199089704..7d5fc1e527d 100644
--- a/code/modules/store/store.dm
+++ b/code/modules/store/store.dm
@@ -48,6 +48,7 @@ var/global/datum/store/centcomm_store=new
/datum/store/proc/reconnect_database()
for(var/obj/machinery/computer/account_database/DB in world)
+ // TODO: Tie into space manager
if((DB.z in config.station_levels))
linked_db = DB
break
@@ -62,4 +63,4 @@ var/global/datum/store/centcomm_store=new
return 0
// Give them the item.
item.deliver(usr)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index f226edc08eb..431d9e2958e 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -22,6 +22,7 @@
qdel(src)
/obj/item/weapon/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L)
+ // TODO: Tie into space manager
if(L.z in config.admin_levels)
src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.")
qdel(src)
@@ -59,4 +60,4 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st
..()
recipes = bluespace_crystal_recipes
pixel_x = rand(0,4)-4
- pixel_y = rand(0,4)-4
\ No newline at end of file
+ pixel_y = rand(0,4)-4
diff --git a/code/world.dm b/code/world.dm
index c82b00b8e9a..508591604f0 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -20,6 +20,8 @@ var/global/datum/global_init/init = new ()
#define RECOMMENDED_VERSION 510
+var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
+
/world/New()
//logs
var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day")
@@ -51,7 +53,7 @@ var/global/datum/global_init/init = new ()
// Create robolimbs for chargen.
populate_robolimb_list()
- setup_map_transitions() //Before the MC starts up
+ space_manager.initialize() //Before the MC starts up
processScheduler = new
master_controller = new /datum/controller/game_controller()
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index b0aad73286d..66bbc5fad86 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -171,7 +171,8 @@ var/list/chatResources = list(
var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "")
-/proc/bicon(var/obj)
+/proc/bicon(var/obj, var/use_class = 1)
+ var/class = use_class ? "class='icon misc'" : null
if (!obj)
return
@@ -179,7 +180,7 @@ var/list/chatResources = list(
if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it.
bicon_cache["\ref[obj]"] = icon2base64(obj)
- return " "
+ return " "
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
var/atom/A = obj
@@ -191,12 +192,10 @@ var/list/chatResources = list(
I = icon()
I.Insert(temp, dir = SOUTH)
bicon_cache[key] = icon2base64(I, key)
+ if(use_class)
+ class = "class='icon [A.icon_state]'"
- return " "
-
-//Aliases for bicon
-/proc/bi(obj)
- bicon(obj)
+ return " "
var/to_chat_filename
var/to_chat_line
diff --git a/html/changelog.html b/html/changelog.html
index 27fe9b5f57f..674ceedea5f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,128 @@
-->
+ 28 July 2016
+ A Giant-Ass Mountain of Salt updated:
+
+ Crazylemon64 updated:
+
+ - Adds an explosion buildmode
+ - "Drop Everything" in VV no longer causes limbs to fall to the ground.
+
+ FlattestGuitar updated:
+
+ - IAAs can now select the classic secHUD in loadouts
+ - adds bananas and suit jackets to the loadout system
+ - adds dress shoes and fancy sandals to the loadout system
+ - Miners can now get the mining coat from loadouts
+
+ Fox McCloud updated:
+
+ - Fixes organ repair surgery saying an organ wasn't damaged when it actually was
+ - Removes the 1 burn heal from regular ointment
+ - Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)
+ - Fixes a few crafting recipes not having the proper category
+ - Fixes laser slugs not firing lasers
+ - Adjusts the damage/consistency of improvised slugs
+ - Adds in craftable bolas; throw them at someone to slow them down
+ - Secvend starts off with e-bolas
+ - Can make spears with personal crafting now
+ - Fixes teacups and some other drinks having no sprite, in-hand, or object
+ - adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies
+ - Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand
+ - Fixes cablecuffs not having a unique in-hand icon
+ - Fixes cable coils not having a unique in-hand icon
+ - All cablecuffs will be red, regardless of what they're produced from
+ - Fixes an unlimited metal exploit
+ - IV Drip sprites updated; has visual feedback for if it's injecting or taking blood
+ - IV Drip injection rate dramatically increased
+ - Warning ping for when someone is low on blood
+ - Support for species with exotic blood type
+ - Alt-Click to toggle between modes
+ - Sensory restoration virology symptom no longer has anti-stun properties nor heals brain damage, but has a lower acquisition level
+ - Damage convert heals individual limbs instead of healing overall damage (actual impact is low)
+ - Librarian now starts off with a bookbag
+ - Bookbag can now hold Bibles, cult tomes, books, and spellbooks
+ - Can empty a bookbag into a bookshelf
+ - Fixes an exploit where you could generate wood out of thin air
+ - Fixes blobspores doing more damage than intended
+
+ Fox-McCloud updated:
+
+ - Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws
+ - Fixes some personal crafting behaving as other than intended
+
+ FreeStylaLT updated:
+
+ - Fixed brig cell block APCs not getting power
+ - Fixed space buggery Kyet made :angry:
+ - Fixed missing light near labor shuttle dock
+ - Fixed wrongly placed cobweb in solitary
+ - Fixed basketball court not having a basketball
+ - Added windows to brig processing entrance
+ - Re-added the missing EOD and biohazard lockers in Armory
+ - 6 gas masks from Armory
+ - Added grid check into random events.
+
+ Krausus updated:
+
+ - The voting panel now uses the browser datum, which means it looks nicer.
+ - The voting panel now updates while a vote is in progress.
+ - When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in "vote".
+ - Custom votes will now show full voting results upon completion.
+ - Admins should no longer lose the "cancel vote" link in the voting panel.
+ - View Variables should probably stop crashing admins.
+ - The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen.
+ - Admins now have click shortcuts for opening a player panel, showing mob info, and viewing variables. Specifics are in Hotkey Help.
+
+ Kyep updated:
+
+ - Admins can now see attacks against SSD players more easily.
+ - Clarified the text you get when examining a SSD player.
+ - It is now possible for admins to remove a person's vamp thrall status.
+ - Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
+ - Fixes an issue with spy loadouts, and excessive access on loadouts in general
+
+ Spacemanspark updated:
+
+ - Cardboard boxes now have their own specific name in the cardboard sheets menu.
+
+ TheDZD updated:
+
+ - Fixes tempgun not recharging.
+ - Fixes tempgun beams costing one tenth of what they are supposed to.
+ - Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should.
+ - Mentors should no longer get spammed by the library checkout computer on occasion.
+ - Mentors should no longer get spammed by mirrors due to body accessories.
+
+ TullyBurnalot updated:
+
+ - AI Integrity Restorers now destroy any AIs inside if they get EMP'd
+ - AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside
+
+ Twinmold updated:
+
+ - Can no longer destroy pods with anything other than brute and burn weapons.
+ - Can no longer pull someone out of a pod when no one is actually in the pod.
+ - Can now melee attack pods with weapons when harm intent is on.
+ - Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete.
+
+ Ty-Omaha updated:
+
+ - Gives Combat Gloves to Code Red ERT agents.
+ - Gives Code Gamma Engineering ERT agents Combat Gloves.
+
+ monster860, clusterfack, and DeityLink updated:
+
+ tigercat2000 updated:
+
+ - Removes space parallax, due to server overhead, input lag & bugs
+
+
21 July 2016
Alffd updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 1309d5211dd..ff1c0d89d1e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2433,3 +2433,112 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
and Xenomorph Larva Whack-A-Mole
monster860:
- bugfix: Brig timer UI reopening after being closed fixed.
+2016-07-28:
+ A Giant-Ass Mountain of Salt:
+ - rscadd: Re-adds PDA slot.
+ Crazylemon64:
+ - rscadd: Adds an explosion buildmode
+ - bugfix: '"Drop Everything" in VV no longer causes limbs to fall to the ground.'
+ FlattestGuitar:
+ - tweak: IAAs can now select the classic secHUD in loadouts
+ - rscadd: adds bananas and suit jackets to the loadout system
+ - rscadd: adds dress shoes and fancy sandals to the loadout system
+ - bugfix: Miners can now get the mining coat from loadouts
+ Fox McCloud:
+ - bugfix: Fixes organ repair surgery saying an organ wasn't damaged when it actually
+ was
+ - tweak: Removes the 1 burn heal from regular ointment
+ - tweak: Regular bandages will now disinfect (in addition to stopping bleeding as
+ they previously did)
+ - bugfix: Fixes a few crafting recipes not having the proper category
+ - bugfix: Fixes laser slugs not firing lasers
+ - tweak: Adjusts the damage/consistency of improvised slugs
+ - rscadd: Adds in craftable bolas; throw them at someone to slow them down
+ - rscadd: Secvend starts off with e-bolas
+ - rscadd: Can make spears with personal crafting now
+ - bugfix: Fixes teacups and some other drinks having no sprite, in-hand, or object
+ - rscadd: adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters,
+ and windoor assemblies
+ - tweak: Cablecuffs are now made by opening the cable stack's crafting menu by using
+ it in your hand
+ - bugfix: Fixes cablecuffs not having a unique in-hand icon
+ - bugfix: Fixes cable coils not having a unique in-hand icon
+ - tweak: All cablecuffs will be red, regardless of what they're produced from
+ - bugfix: Fixes an unlimited metal exploit
+ - rscadd: IV Drip sprites updated; has visual feedback for if it's injecting or
+ taking blood
+ - tweak: IV Drip injection rate dramatically increased
+ - rscadd: Warning ping for when someone is low on blood
+ - rscadd: Support for species with exotic blood type
+ - rscadd: Alt-Click to toggle between modes
+ - tweak: Sensory restoration virology symptom no longer has anti-stun properties
+ nor heals brain damage, but has a lower acquisition level
+ - tweak: Damage convert heals individual limbs instead of healing overall damage
+ (actual impact is low)
+ - rscadd: Librarian now starts off with a bookbag
+ - tweak: Bookbag can now hold Bibles, cult tomes, books, and spellbooks
+ - rscadd: Can empty a bookbag into a bookshelf
+ - bugfix: Fixes an exploit where you could generate wood out of thin air
+ - bugfix: Fixes blobspores doing more damage than intended
+ Fox-McCloud:
+ - rscadd: 'Adds in a few makeshift items/weapons: molotovs, grenade lances, golden
+ bikehorn, paper bags, and DIY chainsaws'
+ - bugfix: Fixes some personal crafting behaving as other than intended
+ FreeStylaLT:
+ - bugfix: Fixed brig cell block APCs not getting power
+ - bugfix: 'Fixed space buggery Kyet made :angry:'
+ - bugfix: Fixed missing light near labor shuttle dock
+ - bugfix: Fixed wrongly placed cobweb in solitary
+ - bugfix: Fixed basketball court not having a basketball
+ - rscadd: Added windows to brig processing entrance
+ - rscadd: Re-added the missing EOD and biohazard lockers in Armory
+ - rscdel: 6 gas masks from Armory
+ - rscadd: Added grid check into random events.
+ Krausus:
+ - tweak: The voting panel now uses the browser datum, which means it looks nicer.
+ - tweak: The voting panel now updates while a vote is in progress.
+ - tweak: When a vote is started, it will now include a link to open the vote panel,
+ as an alternative to typing in "vote".
+ - tweak: Custom votes will now show full voting results upon completion.
+ - bugfix: Admins should no longer lose the "cancel vote" link in the voting panel.
+ - bugfix: View Variables should probably stop crashing admins.
+ - tweak: The RnD console now shows an overlay while you're waiting for it to do
+ work, rather than using a separate wait screen.
+ - rscadd: Admins now have click shortcuts for opening a player panel, showing mob
+ info, and viewing variables. Specifics are in Hotkey Help.
+ Kyep:
+ - rscadd: Admins can now see attacks against SSD players more easily.
+ - tweak: Clarified the text you get when examining a SSD player.
+ - bugfix: It is now possible for admins to remove a person's vamp thrall status.
+ - rscadd: Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
+ - bugfix: Fixes an issue with spy loadouts, and excessive access on loadouts in
+ general
+ Spacemanspark:
+ - bugfix: Cardboard boxes now have their own specific name in the cardboard sheets
+ menu.
+ TheDZD:
+ - bugfix: Fixes tempgun not recharging.
+ - bugfix: Fixes tempgun beams costing one tenth of what they are supposed to.
+ - bugfix: Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related
+ tools should.
+ - bugfix: Mentors should no longer get spammed by the library checkout computer
+ on occasion.
+ - bugfix: Mentors should no longer get spammed by mirrors due to body accessories.
+ TullyBurnalot:
+ - tweak: AI Integrity Restorers now destroy any AIs inside if they get EMP'd
+ - tweak: AI Integrity Restorers can be deconstructed if broken via explosions. This
+ kills the AI inside
+ Twinmold:
+ - bugfix: Can no longer destroy pods with anything other than brute and burn weapons.
+ - bugfix: Can no longer pull someone out of a pod when no one is actually in the
+ pod.
+ - tweak: Can now melee attack pods with weapons when harm intent is on.
+ - tweak: Vox Objective 4 now calculates the kills vox raiders actually have, instead
+ of always complete.
+ Ty-Omaha:
+ - tweak: Gives Combat Gloves to Code Red ERT agents.
+ - tweak: Gives Code Gamma Engineering ERT agents Combat Gloves.
+ monster860, clusterfack, and DeityLink:
+ - rscadd: Adds space parallax
+ tigercat2000:
+ - rscdel: Removes space parallax, due to server overhead, input lag & bugs
diff --git a/html/changelogs/AutoChangeLog-pr-4996.yml b/html/changelogs/AutoChangeLog-pr-4996.yml
deleted file mode 100644
index c6079f72ff3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4996.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: TullyBurnalot
-delete-after: True
-changes:
- - tweak: "AI Integrity Restorers now destroy any AIs inside if they get EMP'd"
- - tweak: "AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside"
diff --git a/html/changelogs/AutoChangeLog-pr-5100.yml b/html/changelogs/AutoChangeLog-pr-5100.yml
deleted file mode 100644
index 4da76e20694..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5100.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: A Giant-Ass Mountain of Salt
-delete-after: True
-changes:
- - rscadd: "Re-adds PDA slot."
diff --git a/html/changelogs/AutoChangeLog-pr-5108.yml b/html/changelogs/AutoChangeLog-pr-5108.yml
deleted file mode 100644
index 91ad159673c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5108.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Twinmold
-delete-after: True
-changes:
- - bugfix: "Can no longer destroy pods with anything other than brute and burn weapons."
- - bugfix: "Can no longer pull someone out of a pod when no one is actually in the pod."
- - tweak: "Can now melee attack pods with weapons when harm intent is on."
diff --git a/html/changelogs/AutoChangeLog-pr-5137.yml b/html/changelogs/AutoChangeLog-pr-5137.yml
deleted file mode 100644
index ec2f850e681..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5137.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - rscadd: "Admins can now see attacks against SSD players more easily."
- - tweak: "Clarified the text you get when examining a SSD player."
diff --git a/html/changelogs/AutoChangeLog-pr-5138.yml b/html/changelogs/AutoChangeLog-pr-5138.yml
deleted file mode 100644
index c6c227bb522..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5138.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: FreeStylaLT
-delete-after: True
-changes:
- - bugfix: "Fixed brig cell block APCs not getting power"
- - bugfix: "Fixed space buggery Kyet made :angry:"
- - bugfix: "Fixed missing light near labor shuttle dock"
- - bugfix: "Fixed wrongly placed cobweb in solitary"
- - bugfix: "Fixed basketball court not having a basketball"
- - rscadd: "Added windows to brig processing entrance"
- - rscadd: "Re-added the missing EOD and biohazard lockers in Armory"
- - rscdel: "6 gas masks from Armory"
diff --git a/html/changelogs/AutoChangeLog-pr-5144.yml b/html/changelogs/AutoChangeLog-pr-5144.yml
deleted file mode 100644
index e0805cd23d4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5144.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes organ repair surgery saying an organ wasn't damaged when it actually was"
- - tweak: "Removes the 1 burn heal from regular ointment"
- - tweak: "Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)"
diff --git a/html/changelogs/AutoChangeLog-pr-5155.yml b/html/changelogs/AutoChangeLog-pr-5155.yml
deleted file mode 100644
index 2d79019ec97..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5155.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Twinmold
-delete-after: True
-changes:
- - tweak: "Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete."
diff --git a/html/changelogs/AutoChangeLog-pr-5159.yml b/html/changelogs/AutoChangeLog-pr-5159.yml
deleted file mode 100644
index f61ea6e1943..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5159.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes a few crafting recipes not having the proper category"
- - bugfix: "Fixes laser slugs not firing lasers"
- - tweak: "Adjusts the damage/consistency of improvised slugs"
- - rscadd: "Adds in craftable bolas; throw them at someone to slow them down"
- - rscadd: "Secvend starts off with e-bolas"
- - rscadd: "Can make spears with personal crafting now"
diff --git a/html/changelogs/AutoChangeLog-pr-5161.yml b/html/changelogs/AutoChangeLog-pr-5161.yml
deleted file mode 100644
index a40bea35861..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5161.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes teacups and some other drinks having no sprite, in-hand, or object"
diff --git a/html/changelogs/AutoChangeLog-pr-5162.yml b/html/changelogs/AutoChangeLog-pr-5162.yml
deleted file mode 100644
index ea046aab6ce..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5162.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - rscadd: "Adds an explosion buildmode"
diff --git a/html/changelogs/AutoChangeLog-pr-5164.yml b/html/changelogs/AutoChangeLog-pr-5164.yml
deleted file mode 100644
index a8255aa162d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5164.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - bugfix: "Fixes tempgun not recharging."
- - bugfix: "Fixes tempgun beams costing one tenth of what they are supposed to."
diff --git a/html/changelogs/AutoChangeLog-pr-5165.yml b/html/changelogs/AutoChangeLog-pr-5165.yml
deleted file mode 100644
index 1ed519978b6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5165.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies"
diff --git a/html/changelogs/AutoChangeLog-pr-5170.yml b/html/changelogs/AutoChangeLog-pr-5170.yml
deleted file mode 100644
index bf144623d0a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5170.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Crazylemon64
-delete-after: True
-changes:
- - bugfix: "\"Drop Everything\" in VV no longer causes limbs to fall to the ground."
diff --git a/html/changelogs/AutoChangeLog-pr-5172.yml b/html/changelogs/AutoChangeLog-pr-5172.yml
deleted file mode 100644
index d147308871a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5172.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - tweak: "Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand"
- - bugfix: "Fixes cablecuffs not having a unique in-hand icon"
- - bugfix: "Fixes cable coils not having a unique in-hand icon"
- - tweak: "All cablecuffs will be red, regardless of what they're produced from"
- - bugfix: "Fixes an unlimited metal exploit"
diff --git a/html/changelogs/AutoChangeLog-pr-5173.yml b/html/changelogs/AutoChangeLog-pr-5173.yml
deleted file mode 100644
index 2fd77d57ab3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5173.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - tweak: "The voting panel now uses the browser datum, which means it looks nicer."
- - tweak: "The voting panel now updates while a vote is in progress."
- - tweak: "When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in \"vote\"."
- - tweak: "Custom votes will now show full voting results upon completion."
- - bugfix: "Admins should no longer lose the \"cancel vote\" link in the voting panel."
diff --git a/html/changelogs/AutoChangeLog-pr-5178.yml b/html/changelogs/AutoChangeLog-pr-5178.yml
deleted file mode 100644
index 78b2f4f927e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5178.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "View Variables should probably stop crashing admins."
diff --git a/html/changelogs/AutoChangeLog-pr-5182.yml b/html/changelogs/AutoChangeLog-pr-5182.yml
deleted file mode 100644
index 35fee785997..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5182.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - tweak: "IAAs can now select the classic secHUD in loadouts"
- - rscadd: "adds bananas and suit jackets to the loadout system"
- - rscadd: "adds dress shoes and fancy sandals to the loadout system"
- - bugfix: "Miners can now get the mining coat from loadouts"
diff --git a/html/changelogs/AutoChangeLog-pr-5184.yml b/html/changelogs/AutoChangeLog-pr-5184.yml
deleted file mode 100644
index 53372963d89..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5184.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "IV Drip sprites updated; has visual feedback for if it's injecting or taking blood"
- - tweak: "IV Drip injection rate dramatically increased"
- - rscadd: "Warning ping for when someone is low on blood"
- - rscadd: "Support for species with exotic blood type"
- - rscadd: "Alt-Click to toggle between modes"
diff --git a/html/changelogs/AutoChangeLog-pr-5190.yml b/html/changelogs/AutoChangeLog-pr-5190.yml
deleted file mode 100644
index 232f6bb3f51..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5190.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - bugfix: "It is now possible for admins to remove a person's vamp thrall status."
diff --git a/html/changelogs/AutoChangeLog-pr-5191.yml b/html/changelogs/AutoChangeLog-pr-5191.yml
deleted file mode 100644
index ffa6d33de26..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5191.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - tweak: "The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen."
diff --git a/html/changelogs/AutoChangeLog-pr-5192.yml b/html/changelogs/AutoChangeLog-pr-5192.yml
deleted file mode 100644
index 9798dd041f0..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5192.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Fox-McCloud
-delete-after: True
-changes:
- - rscadd: "Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws"
- - bugfix: "Fixes some personal crafting behaving as other than intended"
diff --git a/html/changelogs/AutoChangeLog-pr-5198.yml b/html/changelogs/AutoChangeLog-pr-5198.yml
deleted file mode 100644
index ab88cd6b449..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5198.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Spacemanspark
-delete-after: True
-changes:
- - bugfix: "Cardboard boxes now have their own specific name in the cardboard sheets menu."
diff --git a/html/changelogs/AutoChangeLog-pr-5200.yml b/html/changelogs/AutoChangeLog-pr-5200.yml
deleted file mode 100644
index dad0ed52822..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5200.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - bugfix: "Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should."
- - bugfix: "Mentors should no longer get spammed by the library checkout computer on occasion."
- - bugfix: "Mentors should no longer get spammed by mirrors due to body accessories."
diff --git a/html/changelogs/AutoChangeLog-pr-5244.yml b/html/changelogs/AutoChangeLog-pr-5244.yml
new file mode 100644
index 00000000000..483ac6cced4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5244.yml
@@ -0,0 +1,4 @@
+author: TullyBurnalot
+delete-after: True
+changes:
+ - bugfix: "Using ATMs leaves fingerprints behind"
diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml
new file mode 100644
index 00000000000..9c999facb5a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5250.yml
@@ -0,0 +1,4 @@
+author: Krausus
+delete-after: True
+changes:
+ - bugfix: "Probably fixed some very specific items messing up View Variables for no adequately explicable reason."
diff --git a/html/changelogs/AutoChangeLog-pr-5254.yml b/html/changelogs/AutoChangeLog-pr-5254.yml
new file mode 100644
index 00000000000..abffb02bb8c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5254.yml
@@ -0,0 +1,5 @@
+author: Crazylemon64
+delete-after: True
+changes:
+ - rscadd: "Admins are now able to print a map of the z levels."
+ - rscadd: "Admins are now capable of scrambling the z levels' transitions."
diff --git a/html/changelogs/AutoChangeLog-pr-5255.yml b/html/changelogs/AutoChangeLog-pr-5255.yml
new file mode 100644
index 00000000000..11accc1db1a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5255.yml
@@ -0,0 +1,4 @@
+author: IcyV
+delete-after: True
+changes:
+ - rscadd: "Adds a unique axe for Atmos-traitors"
diff --git a/html/changelogs/AutoChangeLog-pr-5257.yml b/html/changelogs/AutoChangeLog-pr-5257.yml
new file mode 100644
index 00000000000..3fdf6046082
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5257.yml
@@ -0,0 +1,4 @@
+author: Krausus
+delete-after: True
+changes:
+ - bugfix: "Fixed round-end antagonist report failing to print due to null objectives."
diff --git a/html/changelogs/AutoChangeLog-pr-5263.yml b/html/changelogs/AutoChangeLog-pr-5263.yml
new file mode 100644
index 00000000000..d4e92a34c5f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5263.yml
@@ -0,0 +1,4 @@
+author: Kyep
+delete-after: True
+changes:
+ - bugfix: "Fixed bug with adv pinpointers and CMO hypospray theft objectives. Fixes #5232"
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index bdc47e32599..2e73e0e955a 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 20ff8795432..c576412d5b9 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 745f976c1ca..3cdea651719 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index f144b225160..cf3419cc1a7 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -89,6 +89,11 @@ Admin:
\tF7 = Player Panel
\tF8 = Admin PM
\tF9 = Invisimin
+
+Admin ghost:
+\tCtrl+Click = Player Panel
+\tCtrl+Shift+Click = View Variables
+\tShift+Middle Click = Mob Info
"}
mob.hotkey_help()
diff --git a/paradise.dme b/paradise.dme
index 5c184d781ea..1b802213c2c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -10,6 +10,7 @@
#define DEBUG
// END_PREFERENCES
// BEGIN_INCLUDE
+#include "_maps\__MAP_DEFINES.dm"
#include "_maps\cyberiad.dm"
#include "code\_compile_options.dm"
#include "code\hub.dm"
@@ -44,6 +45,7 @@
#include "code\__DEFINES\snpc.dm"
#include "code\__DEFINES\stat.dm"
#include "code\__DEFINES\tick.dm"
+#include "code\__DEFINES\zlevel.dm"
#include "code\__HELPERS\_string_lists.dm"
#include "code\__HELPERS\AnimationLibrary.dm"
#include "code\__HELPERS\constants.dm"
@@ -616,14 +618,9 @@
#include "code\game\machinery\doors\unpowered.dm"
#include "code\game\machinery\doors\windowdoor.dm"
#include "code\game\machinery\embedded_controller\airlock_controllers.dm"
-#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm"
-#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm"
#include "code\game\machinery\embedded_controller\airlock_program.dm"
-#include "code\game\machinery\embedded_controller\docking_program.dm"
-#include "code\game\machinery\embedded_controller\docking_program_multi.dm"
#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
#include "code\game\machinery\embedded_controller\embedded_program_base.dm"
-#include "code\game\machinery\embedded_controller\simple_docking_controller.dm"
#include "code\game\machinery\pipe\construction.dm"
#include "code\game\machinery\pipe\pipe_dispenser.dm"
#include "code\game\machinery\telecomms\broadcaster.dm"
@@ -1044,6 +1041,7 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\serialization.dm"
+#include "code\modules\admin\verbs\space_transitions.dm"
#include "code\modules\admin\verbs\striketeam.dm"
#include "code\modules\admin\verbs\striketeam_syndicate.dm"
#include "code\modules\admin\verbs\ticklag.dm"
@@ -1998,15 +1996,17 @@
#include "code\modules\shuttle\shuttle.dm"
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
-#include "code\modules\space_transition\space_transition.dm"
+#include "code\modules\space_management\heap_space_level.dm"
+#include "code\modules\space_management\space_chunk.dm"
+#include "code\modules\space_management\space_level.dm"
+#include "code\modules\space_management\space_transition.dm"
+#include "code\modules\space_management\zlevel_manager.dm"
#include "code\modules\spacepods\construction.dm"
#include "code\modules\spacepods\equipment.dm"
#include "code\modules\spacepods\lock_buster.dm"
#include "code\modules\spacepods\parts.dm"
#include "code\modules\spacepods\pod_fabricator.dm"
#include "code\modules\spacepods\spacepod.dm"
-#include "code\modules\spacial_allocator\zlevel.dm"
-#include "code\modules\spacial_allocator\zlevel_manager.dm"
#include "code\modules\store\items.dm"
#include "code\modules\store\store.dm"
#include "code\modules\surgery\bones.dm"
|