From a725526e4a558194147e1d10981a50dd2c6d3afe Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Thu, 13 Nov 2014 20:17:41 +0000 Subject: [PATCH 1/4] Fix cyborg latejoining, allow mid-round joining --- code/game/jobs/job/silicon.dm | 2 +- code/game/jobs/job_controller.dm | 7 +++---- code/modules/mob/new_player/new_player.dm | 6 ++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index 5e067d8556..07ceefb8b3 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -21,7 +21,7 @@ flag = CYBORG department_flag = ENGSEC faction = "Station" - total_positions = 0 + total_positions = 2 spawn_positions = 2 supervisors = "your laws and the AI" //Nodrak selection_color = "#ddffdd" diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 15a8016b34..465b4ef05d 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -348,7 +348,7 @@ var/global/datum/controller/occupations/job_master proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) - if(!H) return 0 + if(!H) return null var/datum/job/job = GetJob(rank) var/list/spawn_in_storage = list() @@ -445,8 +445,7 @@ var/global/datum/controller/occupations/job_master switch(rank) if("Cyborg") - H.Robotize() - return 1 + return H.Robotize() if("AI","Clown") //don't need bag preference stuff! else switch(H.backbag) //BS12 EDIT @@ -525,7 +524,7 @@ var/global/datum/controller/occupations/job_master H.hud_updateflag |= (1 << ID_HUD) H.hud_updateflag |= (1 << IMPLOYAL_HUD) H.hud_updateflag |= (1 << SPECIALROLE_HUD) - return 1 + return H proc/spawnId(var/mob/living/carbon/human/H, rank, title) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index fa147113b4..e8de6468c5 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -302,8 +302,8 @@ job_master.AssignRole(src, rank, 1) - var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind - job_master.EquipRank(character, rank, 1) //equips the human + var/mob/living/character = create_character() //creates the human and transfers vars and mind + character = job_master.EquipRank(character, rank, 1) //equips the human UpdateFactionList(character) EquipCustomItems(character) @@ -339,8 +339,6 @@ AnnounceArrival(character, rank, join_message) - else - character.Robotize() del(src) proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message) From d10311befd7d4b97e887a76d015be952b54c0473 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 14 Nov 2014 22:30:45 +0000 Subject: [PATCH 2/4] Adds cyborg-only latejoin spawnpoint --- code/game/objects/effects/landmarks.dm | 4 ++++ code/global.dm | 1 + .../modules/client/preferences_spawnpoints.dm | 23 ++++++++++++++++++- code/modules/mob/new_player/new_player.dm | 20 ++++++++++++++-- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 514a5b38f9..d15f9dc58d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -48,6 +48,10 @@ latejoin_cryo += loc del(src) + if("JoinLateCyborg") + latejoin_cyborg += loc + del(src) + //prisoners if("prisonwarp") prisonwarp += loc diff --git a/code/global.dm b/code/global.dm index f6076c600c..07d83a8ca7 100644 --- a/code/global.dm +++ b/code/global.dm @@ -129,6 +129,7 @@ var/list/newplayer_start = list() var/list/latejoin = list() var/list/latejoin_gateway = list() var/list/latejoin_cryo = list() +var/list/latejoin_cyborg = list() var/list/prisonwarp = list() //prisoners go to these var/list/holdingfacility = list() //captured people go here diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 504a962049..ac0d5447e6 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -10,6 +10,17 @@ var/list/spawntypes = list() var/msg //Message to display on the arrivals computer. var/list/turfs //List of turfs to spawn on. var/display_name //Name used in preference setup. + var/list/restrict_job = null + var/list/disallow_job = null + + proc/check_job_spawning(job) + if(restrict_job && !(job in restrict_job)) + return 0 + + if(disallow_job && (job in disallow_job)) + return 0 + + return 1 /datum/spawnpoint/arrivals display_name = "Arrivals Shuttle" @@ -30,7 +41,17 @@ var/list/spawntypes = list() /datum/spawnpoint/cryo display_name = "Cryogenic Storage" msg = "has completed cryogenic revival" + disallow_job = list("Cyborg") /datum/spawnpoint/cryo/New() ..() - turfs = latejoin_cryo \ No newline at end of file + turfs = latejoin_cryo + +/datum/spawnpoint/cyborg + display_name = "Cyborg Storage" + msg = "has been activated from storage" + restrict_job = list("Cyborg") + +/datum/spawnpoint/cyborg/New() + ..() + turfs = latejoin_cyborg \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index e8de6468c5..0d8fdd7659 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -315,8 +315,13 @@ S = spawntypes[spawning_at] if(S && istype(S)) - character.loc = pick(S.turfs) - join_message = S.msg + if(S.check_job_spawning(rank)) + character.loc = pick(S.turfs) + join_message = S.msg + else + character << "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead." + character.loc = pick(latejoin) + join_message = "has arrived on the station" else character.loc = pick(latejoin) join_message = "has arrived on the station" @@ -338,6 +343,8 @@ //Grab some data from the character prefs for use in random news procs. AnnounceArrival(character, rank, join_message) + else + AnnounceCyborg(character, rank, join_message) del(src) @@ -349,6 +356,15 @@ a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") del(a) + proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) + if (ticker.current_state == GAME_STATE_PLAYING) + var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI. + if(character.mind.role_alt_title) + rank = character.mind.role_alt_title + // can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc. + a.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") + del(a) + proc/LateChoices() var/mills = world.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 From 95f020433237c4fe291322c386cc1f4669f21d3f Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 14 Nov 2014 23:37:44 +0000 Subject: [PATCH 3/4] Adds robot equivalent of cryo --- code/game/machinery/cryopod.dm | 169 ++++++++++++++++++++++++++------- icons/obj/robot_storage.dmi | Bin 0 -> 5159 bytes 2 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 icons/obj/robot_storage.dmi diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index dd94a88bc6..d9c40ce64e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -6,9 +6,6 @@ * ~ Zuhayr */ -//Used for logging people entering cryosleep and important items they are carrying. -var/global/list/frozen_crew = list() -var/global/list/frozen_items = list() //Main cryopod console. @@ -20,6 +17,25 @@ var/global/list/frozen_items = list() circuit = "/obj/item/weapon/circuitboard/cryopodcontrol" var/mode = null + //Used for logging people entering cryosleep and important items they are carrying. + var/list/frozen_crew = list() + var/list/frozen_items = list() + + var/storage_type = "crewmembers" + var/storage_name = "Cryogenic Oversight Control" + var/allow_items = 1 + +/obj/machinery/computer/cryopod/robot + name = "robotic storage console" + desc = "An interface between crew and the robotic storage systems" + icon = 'icons/obj/robot_storage.dmi' + icon_state = "console" + circuit = "/obj/item/weapon/circuitboard/robotstoragecontrol" + + storage_type = "cyborgs" + storage_name = "Robotic Storage Control" + allow_items = 0 + /obj/machinery/computer/cryopod/attack_ai() src.attack_hand() @@ -35,12 +51,13 @@ var/global/list/frozen_items = list() if (!( ticker )) return - dat += "

Cryogenic Oversight Control
" + dat += "

[storage_name]
" dat += "Welcome, [user.real_name].


" dat += "View storage log.
" - dat += "View objects.
" - dat += "Recover object.
" - dat += "Recover all objects.
" + if(allow_items) + dat += "View objects.
" + dat += "Recover object.
" + dat += "Recover all objects.
" user << browse(dat, "window=cryopod_console") onclose(user, "cryopod_console") @@ -56,7 +73,7 @@ var/global/list/frozen_items = list() if(href_list["log"]) - var/dat = "Recently stored crewmembers


" + var/dat = "Recently stored [storage_type]


" for(var/person in frozen_crew) dat += "[person]
" dat += "
" @@ -64,6 +81,7 @@ var/global/list/frozen_items = list() user << browse(dat, "window=cryolog") if(href_list["view"]) + if(!allow_items) return var/dat = "Recently stored objects


" for(var/obj/item/I in frozen_items) @@ -73,6 +91,7 @@ var/global/list/frozen_items = list() user << browse(dat, "window=cryoitems") else if(href_list["item"]) + if(!allow_items) return if(frozen_items.len == 0) user << "\blue There is nothing to recover from storage." @@ -92,6 +111,7 @@ var/global/list/frozen_items = list() frozen_items -= I else if(href_list["allitems"]) + if(!allow_items) return if(frozen_items.len == 0) user << "\blue There is nothing to recover from storage." @@ -111,6 +131,11 @@ var/global/list/frozen_items = list() build_path = "/obj/machinery/computer/cryopod" origin_tech = "programming=3" +/obj/item/weapon/circuitboard/robotstoragecontrol + name = "Circuit board (Robotic Storage Console)" + build_path = "/obj/machinery/computer/cryopod/robot" + origin_tech = "programming=3" + //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -143,12 +168,23 @@ var/global/list/frozen_items = list() density = 1 anchored = 1 + var/base_icon_state = "body_scanner_0" + var/occupied_icon_state = "body_scanner_1" + var/on_store_message = "has entered long-term storage." + var/on_store_name = "Cryogenic Oversight" + var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward." + var/allow_occupant_types = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + var/disallow_occupant_types = list() + var/mob/occupant = null // Person waiting to be despawned. var/orient_right = null // Flips the sprite. var/time_till_despawn = 18000 // 30 minutes-ish safe period before being despawned. var/time_entered = 0 // Used to keep track of the safe period. var/obj/item/device/radio/intercom/announce // + var/obj/machinery/computer/cryopod/control_computer + var/last_no_computer_message = 0 + // These items are preserved when the process() despawn proc occurs. var/list/preserve_items = list( /obj/item/weapon/hand_tele, @@ -169,16 +205,64 @@ var/global/list/frozen_items = list() orient_right = 1 icon_state = "body_scanner_0-r" -/obj/machinery/cryopod/New() +/obj/machinery/cryopod/robot + name = "robotic storage unit" + desc = "A storage unit for robots." + icon = 'icons/obj/robot_storage.dmi' + icon_state = "pod_0" + base_icon_state = "pod_0" + occupied_icon_state = "pod_1" + on_store_message = "has entered robotic storage." + on_store_name = "Robotic Storage Oversight" + on_enter_occupant_message = "The storage unit broadcasts a sleep signal to you. Your systems start to shut down, and you enter low-power mode." + allow_occupant_types = list(/mob/living/silicon/robot) + disallow_occupant_types = list(/mob/living/silicon/robot/drone) +/obj/machinery/cryopod/robot/right + orient_right = 1 + icon_state = "pod_0-r" + +/obj/machinery/cryopod/New() announce = new /obj/item/device/radio/intercom(src) if(orient_right) - icon_state = "body_scanner_0-r" + icon_state = "[base_icon_state]-r" else - icon_state = "body_scanner_0" + icon_state = base_icon_state + ..() +/obj/machinery/cryopod/initialize() + ..() + + find_control_computer() + +/obj/machinery/cryopod/proc/find_control_computer(urgent=0) + control_computer = locate(/obj/machinery/computer/cryopod) in src.loc.loc + + // Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged + if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time) + log_admin("Cryopod in [src.loc.loc] could not find control computer!") + message_admins("Cryopod in [src.loc.loc] could not find control computer!") + last_no_computer_message = world.time + + return control_computer != null + +/obj/machinery/cryopod/proc/check_occupant_allowed(mob/M) + var/correct_type = 0 + for(var/type in allow_occupant_types) + if(istype(M, type)) + correct_type = 1 + break + + if(!correct_type) return 0 + + for(var/type in disallow_occupant_types) + if(istype(M, type)) + return 0 + + return 1 + //Lifted from Unity stasis.dm and refactored. ~Zuhayr /obj/machinery/cryopod/process() if(occupant) @@ -187,9 +271,18 @@ var/global/list/frozen_items = list() return if(!occupant.client && occupant.stat<2) //Occupant is living and has no client. + if(!control_computer) + if(!find_control_computer(urgent=1)) + return //Drop all items into the pod. for(var/obj/item/W in occupant) + if(istype(W, /obj/item/device/mmi)) + if(istype(occupant, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = occupant + if(R.mmi == W) + del(W) + continue occupant.drop_from_inventory(W) W.loc = src @@ -215,8 +308,11 @@ var/global/list/frozen_items = list() if(!preserve) del(W) else - frozen_items += W - W.loc = null + if(control_computer && control_computer.allow_items) + control_computer.frozen_items += W + W.loc = null + else + W.loc = src.loc //Update any existing objectives involving this mob. for(var/datum/objective/O in all_objectives) @@ -265,9 +361,9 @@ var/global/list/frozen_items = list() del(G) if(orient_right) - icon_state = "body_scanner_0-r" + icon_state = "[base_icon_state]-r" else - icon_state = "body_scanner_0" + icon_state = base_icon_state //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags? @@ -275,10 +371,10 @@ var/global/list/frozen_items = list() occupant.ckey = null //Make an announcement and log the person entering storage. - frozen_crew += "[occupant.real_name]" + control_computer.frozen_crew += "[occupant.real_name]" - announce.autosay("[occupant.real_name] has entered long-term storage.", "Cryogenic Oversight") - visible_message("\blue The crypod hums and hisses as it moves [occupant.real_name] into storage.", 3) + announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]") + visible_message("\blue \The [src] hums and hisses as it moves [occupant.real_name] into storage.", 3) // Delete the mob. del(occupant) @@ -293,17 +389,20 @@ var/global/list/frozen_items = list() if(istype(G, /obj/item/weapon/grab)) if(occupant) - user << "\blue The cryo pod is in use." + user << "\blue \The [src] is in use." return if(!ismob(G:affecting)) return + if(!check_occupant_allowed(G:affecting)) + return + var/willing = null //We don't want to allow people to be forced into despawning. var/mob/M = G:affecting if(M.client) - if(alert(M,"Would you like to enter cryosleep?",,"Yes","No") == "Yes") + if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes") if(!M || !G || !G:affecting) return willing = 1 else @@ -311,7 +410,7 @@ var/global/list/frozen_items = list() if(willing) - visible_message("[user] starts putting [G:affecting:name] into the cryo pod.", 3) + visible_message("[user] starts putting [G:affecting:name] into \the [src].", 3) if(do_after(user, 20)) if(!M || !G || !G:affecting) return @@ -323,11 +422,11 @@ var/global/list/frozen_items = list() M.client.eye = src if(orient_right) - icon_state = "body_scanner_1-r" + icon_state = "[occupied_icon_state]-r" else - icon_state = "body_scanner_1" + icon_state = occupied_icon_state - M << "\blue You feel cool air surround you. You go numb as your senses turn inward." + M << "\blue [on_enter_occupant_message]" M << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." occupant = M time_entered = world.time @@ -349,9 +448,9 @@ var/global/list/frozen_items = list() return if(orient_right) - icon_state = "body_scanner_0-r" + icon_state = "[base_icon_state]-r" else - icon_state = "body_scanner_0" + icon_state = base_icon_state //Eject any items that aren't meant to be in the pod. var/list/items = src.contents @@ -370,11 +469,11 @@ var/global/list/frozen_items = list() set category = "Object" set src in oview(1) - if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr))) + if(usr.stat != 0 || !check_occupant_allowed(usr)) return if(src.occupant) - usr << "\blue The cryo pod is in use." + usr << "\blue \The [src] is in use." return for(var/mob/living/carbon/slime/M in range(1,usr)) @@ -382,7 +481,7 @@ var/global/list/frozen_items = list() usr << "You're too busy getting your life sucked out of you." return - visible_message("[usr] starts climbing into the cryo pod.", 3) + visible_message("[usr] starts climbing into \the [src].", 3) if(do_after(usr, 20)) @@ -390,7 +489,7 @@ var/global/list/frozen_items = list() return if(src.occupant) - usr << "\blue The cryo pod is in use." + usr << "\blue \The [src] is in use." return usr.stop_pulling() @@ -400,11 +499,11 @@ var/global/list/frozen_items = list() src.occupant = usr if(orient_right) - icon_state = "body_scanner_1-r" + icon_state = "[occupied_icon_state]-r" else - icon_state = "body_scanner_1" + icon_state = occupied_icon_state - usr << "\blue You feel cool air surround you. You go numb as your senses turn inward." + usr << "\blue [on_enter_occupant_message]" usr << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." occupant = usr time_entered = world.time @@ -426,9 +525,9 @@ var/global/list/frozen_items = list() occupant = null if(orient_right) - icon_state = "body_scanner_0-r" + icon_state = "[base_icon_state]-r" else - icon_state = "body_scanner_0" + icon_state = base_icon_state return diff --git a/icons/obj/robot_storage.dmi b/icons/obj/robot_storage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5a996c01e7e7678414e5f90f6559d1b22c0e90e9 GIT binary patch literal 5159 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 VvR2vf&rSdU002ovPDHLkV1h#^9Mu2- literal 0 HcmV?d00001 From ae823f4969046c4eafd886c4d04495ccf4852ab5 Mon Sep 17 00:00:00 2001 From: GinjaNinja32 Date: Fri, 14 Nov 2014 23:45:25 +0000 Subject: [PATCH 4/4] Maps in robot cryo and latejoin point --- maps/tgstation2.dmm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index c6e22fc1e3..c318e1125e 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -5369,7 +5369,7 @@ "bZm" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engine/drone_fabrication) "bZn" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1379; icon_state = "door_closed"; id_tag = "engine_airlock_interior"; locked = 0; name = "Engine Airlock Interior"; req_access_txt = "10"},/turf/simulated/floor/plating,/area/engine/engine_room) "bZo" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = null; req_access_txt = "20"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"bZp" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/drone_fabrication) +"bZp" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/drone_fabrication) "bZq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker) "bZr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bZs" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) @@ -5765,7 +5765,7 @@ "cgS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "cgT" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay) "cgU" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/medbay) -"cgV" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engine/drone_fabrication) +"cgV" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/drone_fabrication) "cgW" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engine/drone_fabrication) "cgX" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio5"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) "cgY" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology) @@ -5783,7 +5783,7 @@ "chk" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 25},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engine/engine_hallway) "chl" = (/obj/machinery/light{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/engine/engine_hallway) "chm" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engine/drone_fabrication) -"chn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/drone_fabrication) +"chn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engine/drone_fabrication) "cho" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/reception) "chp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engine/engine_hallway) "chq" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/atmos) @@ -11261,6 +11261,7 @@ "eiC" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "eiD" = (/obj/structure/table/reinforced,/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "eiE" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) +"eiF" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor/plating,/area/engine/drone_fabrication) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -11443,7 +11444,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHeaOaaaaaaaaaaamaaaaaaaaaeaTdvqdwHdvqdwGeckeblectecsecIeblectecsecIecJecteblectecsectecKbQGbQGcgxcdfcdgcdhceabQGcgvcgwbQGbQGbQGbQGbQGcddcrgcgucrgcaOcaOcaOcaOcaOcaOcaOcaOcWpcVTcVTcgocglcVFbClcgQbTBbsJbsDecTecNecUbYdbsybTBecWecVceLaaaaaaaaaaaaaaaaaabVubXKcgIcfwcaZccKcgKdXbcaZcgJdXadWUdWTchdchcdWXbVuaaeaaeaaaaaaaaaaaaciMaaabudcWucdCcgZcdIcgYcdCcgXcdFcgYcdCchabudaaaaaabCVaaaaaeaaaaaeaaaaaeaaadDdaaaaaeaaaaaeaaeaaeaaeciHaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHciQecXecXecXecYedaedaedaecXedaedbedaedcedaedbedaedcedaedbedaedcedaecXedaedbedaedcedaeddaaabQGchqchtchychzcffcmgedfedeedkchgchlchpchjchkchpchOchpchNchUchSchRchJchJchIchFchCchMchMchKcWycVFbClchZbTBbTBbVPcoicohcoibVPcojbTBceLciiceLaaaaaaaaaaaaaaaaaabVucaZcimdWPcaZdXicincWzcaZceQceRceXcthbYXciobYTbZJaaaaaaaaaaaaaaaaaactyaaebudcWAcficitcfcciscfecircfcciqcfsciubudaaaaaaciHaaachWchWchWchWchWaaedDdaaechWchWchWchWchWaaeciHaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaeaaeaaaaaaaamaaaaaaaaaaaebTecdXcdMcdWbTecdXcdMcdWbTecdNcdMcdLbTeaaabTecdNcdMcdLbTeaaaaaabQGbQGcfRcfRcfRcfRcfRciNcfRcgpciOciyceociLceoceocizceoceociwceociycixcdPciJcWRedledoedmedpciCcVFcjhcjfcjecjibVPctGbYdctFbVPctEaaeecPecOecPaaaaaaaaaaaaaaaaaabVucjacexbXKciVciUbXKciZcbNcgOaaeaaaciXaaLciQclJaaaaaaaaaaafaaaaaaaaaaaaaaabudcWSccCccCcfccgsccCccCcfccgsccCccCbudaaeaaeciHaaedNWdNYdNYdNYdNYdORdOPdSHdOSdOSdOSdOSdTTaaeciHaaacmdcmdcmdcmdaaacmdcmdcmdcmdcmdcmdcmdcmdcmdaaacmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaeaaeaaaaamaaaaaaaaaaaabTectJcgMctKbTectNchPctObTectLcemctMbTeaaabTectQbVqctPbTeaaaaaaaaachnbZdcgVbZpchbcgWcjmdDUcrjcrjcjkedqcgEcdYcehcjpcdYcehcgEbYocjocjnbYocgpcgpcVFcVvcWWcWVedrcVFbmvcjrcjqcjsbVPcoicqmcoibVPctEaaeaaaaaeaaaaaaaaaaaaaaaaaaaaabVucjacjzcjxcjycjycjxcfvdXybVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabudcWXccCccCcfcchQccCccCcfcchQccCccCbudaaaaaaciHaaecfqcfqcfqcfqcfqaaadDdaaacfqcfqcfqcfqcfqaaaciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaaaaeaaeaaaaamaaaaaaaaaaaabTectJcgMctKbTectNchPctObTectLcemctMbTeaaabTectQbVqctPbTeaaaaaaaaachneiFbZpcgVchbcgWcjmdDUcrjcrjcjkedqcgEcdYcehcjpcdYcehcgEbYocjocjnbYocgpcgpcVFcVvcWWcWVedrcVFbmvcjrcjqcjsbVPcoicqmcoibVPctEaaeaaaaaeaaaaaaaaaaaaaaaaaaaaabVucjacjzcjxcjycjycjxcfvdXybVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabudcWXccCccCcfcchQccCccCcfcchQccCccCbudaaaaaaciHaaecfqcfqcfqcfqcfqaaadDdaaacfqcfqcfqcfqcfqaaaciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaamaaaaaaaaaaaabTecfBcgNcfBbTechVciechVbTebUhcesbUhbTeaaabTebUhbUhbVrbTeaaaaaaaaabYmcifbXTchmdYKcigcjmbYKcrjcjJcjKcjLbYrceDcakcjEcewcjFbYrcjGcjIcjHbYoaaaaaecVFedveducXaaaeaaabmvbClbClbCjbVPctUcpoctTbVPctEaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabVucjOcjPdVQciGciGdVQbXKdVSbVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabudccCccCccCcfccihccCccCcfccihccCccCbudaafaaaciHaaaaaaaaeaaeaaeaaaaaaedwaaeaaaaaaaaeaaeaaaaaaciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaAaaaaaaaaaaaebTecfBceGcfBbTechVcijchVbTebUhceIbUhbTeaaabTebUhbUhbUhbTeaaaaaaaaabYmbXZcikbYNbXZcigcjTcivcrjcjRcjWckabYrcjUckmckjckeckdbYrckrckpcknbYoaaaaaacVFedyedxcXbaaaaaabmvbClbClbmvbVPcrJcrJcrJbVPcubctmaaaaaaaaaaaaaaaaaaaaaaaaaaabVudVTckubXKbXKbXKbXKbXKdVUbVuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccQbudbudbudbudbudbudbudbudciKciKciKccQaaaaaaciHciHciHciHciHaaaaaaaaadyPaaaaaaaaaciHciHciHbCVciHaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaebTebTebTebTebTebTebTebTebTebTebTebTebTeaaabYybTebTebTebTeaaaaaaaaabYmcVjbXTbXZbXZbYacbHcbIcbKcbLcbycbAcbEcbGcbScbRcbVcbTcbOcbMcbQcbPbYoaaeaaaedzcVvcVucVFciWaaabmvcbwbClcbxciIaaeaaeaaeaaaciMaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabZJbVubVubXCdVZdVQdVQdVQdVYbXCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXlbXlbXlaaaaaaaaaaaaaaaaaaaaaaaaaaaciHaaeedAaaeciHaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa