diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 5536e6b4..eafca057 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -97,3 +97,51 @@ proc/RoundHealth(health)
else
return "health-100"
return "0"
+
+
+/proc/this_guy_is_allowed_to_drag_that_guy_into_something(atom/movable/target as mob|obj, mob/user as mob, obj/target_object as obj)
+ if(istype(target, /obj/screen)) //fix for HUD elements making their way into the world - Pete
+ return
+ if(target.loc == user) //no you can't pull things out of your ass
+ return
+ if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other
+ return
+ if(get_dist(user, target_object) > 1 || get_dist(user, target) > 1 || user.contents.Find(target_object)) // is the mob anchored, too far away from you, or are you too far away from the source
+ return
+ if(!ismob(target)) //mobs only
+ return
+ if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper
+ return
+ if(istype(user, /mob/living/silicon/robot/drone)) // drones don't get to use medical machinery
+ return
+ if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems
+ return
+ if(!istype(user.loc, /turf) || !istype(target.loc, /turf)) // are you in a container/closet/pod/etc?
+ return
+ var/mob/living/L = target
+ if(!istype(L) || L.buckled)
+ return
+ return TRUE
+
+
+/proc/this_is_an_animal_or_a_robot(atom/movable/target as mob|obj)
+ return (istype(target, /mob/living/simple_animal) || istype(target, /mob/living/silicon))
+
+
+/proc/allowed_to_add_this_person_to_a_medical_machine(atom/movable/target as mob|obj, mob/user as mob, obj/target_object as obj, var/occupant)
+ if(!this_guy_is_allowed_to_drag_that_guy_into_something(target,user,target_object))
+ return
+ if(this_is_an_animal_or_a_robot(target))
+ return
+ if(occupant)
+ user << "\blue The [target_object] is already occupied!"
+ return
+ var/mob/living/L = target
+ if(L.abiotic())
+ user << "\red Subject cannot have abiotic items on."
+ return
+ for(var/mob/living/carbon/slime/M in range(1,L))
+ if(M.Victim == L)
+ usr << "\red [L.name] will not fit into the [target_object] because they have a slime latched onto their head."
+ return
+ return TRUE
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index b1a391cb..e674fc1a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -734,6 +734,15 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
return 0
return 1
+
+// this works like do_after but needs the target to stay still as well
+/proc/do_after_to_target(var/mob/user as mob, target, delay as num, var/numticks = 5, var/needhand = 1)
+ var/target_original_turf = get_turf(target)
+ if (do_after(user,delay,numticks,needhand))
+ if (get_turf(target)==target_original_turf)
+ return TRUE
+ return FALSE
+
//Takes: Anything that could possibly have variables and a varname to check.
//Returns: 1 if found, 0 if not.
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 63630ea4..a02c03d0 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -153,6 +153,12 @@
Topic(src, list("src"= "\ref[src]", "command"="enable", "value"="[!enabled]"), 1)
return 1
+/obj/machinery/power/emitter/AICtrlClick() // locks emitters
+ if(emagged) // can't lock emagged stuff
+ return 1
+ locked = !locked
+ return 1
+
/atom/proc/AIAltClick(var/atom/A)
AltClick(A)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 4ffa5ea5..fe7a6ebd 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -24,6 +24,8 @@
/proc/randmutb(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
+ if(M.dna.species == "Machine")
+ return 0
var/block = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
M.dna.SetSEState(block, 1)
@@ -31,6 +33,8 @@
/proc/randmutg(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
+ if(M.dna.species == "Machine")
+ return 0
var/block = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
M.dna.SetSEState(block, 1)
@@ -38,6 +42,8 @@
/proc/randmuti(var/mob/living/M)
if(!M) return
M.dna.check_integrity()
+ if(M.dna.species == "Machine")
+ return 0
M.dna.SetUIValue(rand(1,DNA_UI_LENGTH),rand(1,4095))
// Scramble UI or SE.
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 2f7a2797..4f8e0846 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -120,6 +120,19 @@
src.add_fingerprint(usr)
return
+
+/obj/machinery/dna_scannernew/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant))
+ return
+ var/mob/living/L = O
+ if(L == user)
+ return
+ visible_message("[user] puts [L.name] into the DNA Scanner.", 3)
+ put_in(L)
+ if(user.pulling == L)
+ user.pulling = null
+
+
/obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob)
if(istype(item, /obj/item/weapon/reagent_containers/glass))
if(beaker)
@@ -829,4 +842,5 @@
return 1
+
/////////////////////////// DNA MACHINES
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index 2b701caf..b35e74e9 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -1384,6 +1384,8 @@ It is possible to destroy the net by the occupant or someone else.
else//And they are free.
M << "\blue You are free of the net!"
+ M.captured = 0 //Important.
+ M.anchored = initial(M.anchored) //Changes the mob's anchored status to the original one; this is not handled by the can_move proc.
return
bullet_act(var/obj/item/projectile/Proj)
diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm
index 78c953d1..d376f57f 100644
--- a/code/game/gamemodes/factions.dm
+++ b/code/game/gamemodes/factions.dm
@@ -143,7 +143,6 @@ Stealth and Camouflage Items;
/obj/item/device/chameleon:4:Chameleon-Projector;
Whitespace:Seperator;
Devices and Tools;
-/obj/item/shoe_cover:1:Silent Step Fabric;
/obj/item/weapon/card/emag:3:Cryptographic Sequencer;
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
/obj/item/weapon/storage/box/syndie_kit/space:3:Space Suit;
@@ -216,4 +215,4 @@ Whitespace:Seperator;
desc = "The Exolitics are an ancient alien race with an energy-based anatomy. Their culture, communication, morales and knowledge is unknown. They are so radically different to humans that their \
attempts of communication with other life forms is completely incomprehensible. Members of this alien race are capable of broadcasting subspace transmissions from their bodies. \
The religious leaders of the Tiger Cooperative claim to have the technology to decypher and interpret their messages, which have been confirmed as religious propaganda. Their motives are unknown \
- but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
\ No newline at end of file
+ but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index fd586d33..6ef5cdde 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -48,7 +48,7 @@ Stealthy and Inconspicuous Weapons;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
Whitespace:Seperator;
Stealth and Camouflage Items;
-/obj/item/weapon/storage/box/syndie_kit/chameleon:3:Chameleon Kit;
+/obj/item/weapon/storage/box/syndie_kit/chameleon:6:Chameleon Kit;
/obj/item/weapon/storage/box/syndie_kit/masks:1:Disguised Breathe Mask;
/obj/item/weapon/storage/box/syndie_kit/masks_gas:2:Disguised Gasmask;
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
@@ -58,7 +58,6 @@ Stealth and Camouflage Items;
/obj/item/device/chameleon:4:Chameleon-Projector;
Whitespace:Seperator;
Devices and Tools;
-/obj/item/shoe_cover:1:Silent Step Fabric;
/obj/item/weapon/card/emag:3:Cryptographic Sequencer;
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
/obj/item/weapon/storage/box/syndie_kit/space:3:Space Suit;
@@ -520,4 +519,4 @@ proc/get_nt_opposed()
player.current << "\blue Your current objectives:"
for(var/datum/objective/objective in player.objectives)
player.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
\ No newline at end of file
+ obj_count++
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index b74f9604..d2a7d0e2 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -171,268 +171,298 @@
idle_power_usage = 15
active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors.
- New()
- ..()
- beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large()
- spawn( 5 )
- if(orient == "RIGHT")
- icon_state = "sleeper_0-r"
- return
+/obj/machinery/sleeper/New()
+ ..()
+ beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large()
+ spawn( 5 )
+ if(orient == "RIGHT")
+ icon_state = "sleeper_0-r"
+ return
+ return
+
+
+/obj/machinery/sleeper/allow_drop()
+ return 0
+
+
+/obj/machinery/sleeper/process()
+ if (stat & (NOPOWER|BROKEN))
return
-
- allow_drop()
- return 0
-
-
- process()
- if (stat & (NOPOWER|BROKEN))
- return
-
- if(filtering > 0)
- if(beaker)
- if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
+ if(filtering > 0)
+ if(beaker)
+ if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
+ src.occupant.vessel.trans_to(beaker, 1)
+ for(var/datum/reagent/x in src.occupant.reagents.reagent_list)
+ src.occupant.reagents.trans_to(beaker, 3)
src.occupant.vessel.trans_to(beaker, 1)
- for(var/datum/reagent/x in src.occupant.reagents.reagent_list)
- src.occupant.reagents.trans_to(beaker, 3)
- src.occupant.vessel.trans_to(beaker, 1)
- src.updateUsrDialog()
- return
+ src.updateUsrDialog()
+ return
- blob_act()
- if(prob(75))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- A.blob_act()
- del(src)
- return
+/obj/machinery/sleeper/blob_act()
+ if(prob(75))
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ A.blob_act()
+ del(src)
+ return
- attackby(var/obj/item/weapon/G as obj, var/mob/user as mob)
- if(istype(G, /obj/item/weapon/reagent_containers/glass))
- if(!beaker)
- beaker = G
- user.drop_item()
- G.loc = src
- user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
- src.updateUsrDialog()
- return
- else
- user << "\red The sleeper has a beaker already."
+/obj/machinery/sleeper/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob)
+ if(istype(G, /obj/item/weapon/reagent_containers/glass))
+ if(!beaker)
+ beaker = G
+ user.drop_item()
+ G.loc = src
+ user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
+ src.updateUsrDialog()
+ return
+ else
+ user << "\red The sleeper has a beaker already."
+ return
+
+ else if(istype(G, /obj/item/weapon/grab))
+ if(!ismob(G:affecting))
+ return
+
+ if(src.occupant)
+ user << "\blue The sleeper is already occupied!"
+ return
+
+ for(var/mob/living/carbon/slime/M in range(1,G:affecting))
+ if(M.Victim == G:affecting)
+ usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head."
return
- else if(istype(G, /obj/item/weapon/grab))
- if(!ismob(G:affecting))
- return
+ visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3)
+ if(do_after(user, 20))
if(src.occupant)
user << "\blue The sleeper is already occupied!"
return
+ if(!G || !G:affecting) return
+ var/mob/M = G:affecting
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ update_use_power(2)
+ src.occupant = M
+ src.icon_state = "sleeper_1"
+ if(orient == "RIGHT")
+ icon_state = "sleeper_1-r"
- for(var/mob/living/carbon/slime/M in range(1,G:affecting))
- if(M.Victim == G:affecting)
- usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head."
- return
-
- visible_message("[user] starts putting [G:affecting:name] into the sleeper.", 3)
-
- if(do_after(user, 20))
- if(src.occupant)
- user << "\blue The sleeper is already occupied!"
- return
- if(!G || !G:affecting) return
- var/mob/M = G:affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- update_use_power(2)
- src.occupant = M
- src.icon_state = "sleeper_1"
- if(orient == "RIGHT")
- icon_state = "sleeper_1-r"
-
- src.add_fingerprint(user)
- del(G)
- return
+ src.add_fingerprint(user)
+ del(G)
return
+ return
- ex_act(severity)
- if(filtering)
- toggle_filter()
- switch(severity)
- if(1.0)
+/obj/machinery/sleeper/ex_act(severity)
+ if(filtering)
+ toggle_filter()
+ switch(severity)
+ if(1.0)
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ ex_act(severity)
+ del(src)
+ return
+ if(2.0)
+ if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc
ex_act(severity)
del(src)
return
- if(2.0)
- if(prob(50))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- del(src)
- return
- if(3.0)
- if(prob(25))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- del(src)
- return
- return
- emp_act(severity)
- if(filtering)
- toggle_filter()
- if(stat & (BROKEN|NOPOWER))
- ..(severity)
- return
- if(occupant)
- go_out()
- ..(severity)
-
- alter_health(mob/living/M as mob)
- if (M.health > 0)
- if (M.getOxyLoss() >= 10)
- var/amount = max(0.15, 1)
- M.adjustOxyLoss(-amount)
- else
- M.adjustOxyLoss(-12)
- M.updatehealth()
- M.AdjustParalysis(-4)
- M.AdjustWeakened(-4)
- M.AdjustStunned(-4)
- M.Paralyse(1)
- M.Weaken(1)
- M.Stun(1)
- if (M:reagents.get_reagent_amount("inaprovaline") < 5)
- M:reagents.add_reagent("inaprovaline", 5)
- return
- proc/toggle_filter()
- if(!src.occupant)
- filtering = 0
- return
- if(filtering)
- filtering = 0
- else
- filtering = 1
-
- proc/go_out()
- if(filtering)
- toggle_filter()
- if(!src.occupant)
- return
- if(src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- src.occupant.loc = src.loc
- src.occupant = null
- update_use_power(1)
- if(orient == "RIGHT")
- icon_state = "sleeper_0-r"
- return
-
-
- proc/inject_chemical(mob/living/user as mob, chemical, amount)
- if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20)
- src.occupant.reagents.add_reagent(chemical, amount)
- user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
+ if(3.0)
+ if(prob(25))
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ ex_act(severity)
+ del(src)
return
- user << "There's no occupant in the sleeper or the subject has too many chemicals!"
+ return
+
+/obj/machinery/sleeper/emp_act(severity)
+ if(filtering)
+ toggle_filter()
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
return
+ if(occupant)
+ go_out()
+ ..(severity)
-
- proc/check(mob/living/user as mob)
- if(src.occupant)
- user << text("\blue Occupant ([]) Statistics:", src.occupant)
- var/t1
- switch(src.occupant.stat)
- if(0.0)
- t1 = "Conscious"
- if(1.0)
- t1 = "Unconscious"
- if(2.0)
- t1 = "*dead*"
- else
- user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1)
- user << text("[]\t -Core Temperature: []°C ([]°F)
", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67)
- user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss())
- user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss())
- user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss())
- user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss())
- user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)"
- user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5)
- if(src.beaker)
- user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume)
- else
- user << "\blue No Dialysis Output Beaker loaded."
+/obj/machinery/sleeper/alter_health(mob/living/M as mob)
+ if (M.health > 0)
+ if (M.getOxyLoss() >= 10)
+ var/amount = max(0.15, 1)
+ M.adjustOxyLoss(-amount)
else
- user << "\blue There is no one inside!"
+ M.adjustOxyLoss(-12)
+ M.updatehealth()
+ M.AdjustParalysis(-4)
+ M.AdjustWeakened(-4)
+ M.AdjustStunned(-4)
+ M.Paralyse(1)
+ M.Weaken(1)
+ M.Stun(1)
+ if (M:reagents.get_reagent_amount("inaprovaline") < 5)
+ M:reagents.add_reagent("inaprovaline", 5)
+ return
+
+/obj/machinery/sleeper/proc/toggle_filter()
+ if(!src.occupant)
+ filtering = 0
+ return
+ if(filtering)
+ filtering = 0
+ else
+ filtering = 1
+
+/obj/machinery/sleeper/proc/go_out()
+ if(filtering)
+ toggle_filter()
+ if(!src.occupant)
+ return
+ if(src.occupant.client)
+ src.occupant.client.eye = src.occupant.client.mob
+ src.occupant.client.perspective = MOB_PERSPECTIVE
+ src.occupant.loc = src.loc
+ src.occupant = null
+ update_use_power(1)
+ if(orient == "RIGHT")
+ icon_state = "sleeper_0-r"
+ return
+
+
+/obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount)
+ if(src.occupant && src.occupant.reagents)
+ if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20)
+ src.occupant.reagents.add_reagent(chemical, amount)
+ user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
+ return
+ user << "There's no occupant in the sleeper or the subject has too many chemicals!"
+ return
+
+
+/obj/machinery/sleeper/proc/check(mob/living/user as mob)
+ if(src.occupant)
+ user << text("\blue Occupant ([]) Statistics:", src.occupant)
+ var/t1
+ switch(src.occupant.stat)
+ if(0.0)
+ t1 = "Conscious"
+ if(1.0)
+ t1 = "Unconscious"
+ if(2.0)
+ t1 = "*dead*"
+ else
+ user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1)
+ user << text("[]\t -Core Temperature: []°C ([]°F)
", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67)
+ user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss())
+ user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss())
+ user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss())
+ user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss())
+ user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)"
+ user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5)
+ if(src.beaker)
+ user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume)
+ else
+ user << "\blue No Dialysis Output Beaker loaded."
+ else
+ user << "\blue There is no one inside!"
+ return
+
+
+/obj/machinery/sleeper/verb/eject()
+ set name = "Eject Sleeper"
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat != 0)
+ return
+ if(orient == "RIGHT")
+ icon_state = "sleeper_0-r"
+ src.icon_state = "sleeper_0"
+ src.go_out()
+ add_fingerprint(usr)
+ return
+
+/obj/machinery/sleeper/verb/remove_beaker()
+ set name = "Remove Beaker"
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat != 0)
+ return
+ if(beaker)
+ filtering = 0
+ beaker.loc = usr.loc
+ beaker = null
+ add_fingerprint(usr)
+ return
+
+/obj/machinery/sleeper/verb/move_inside()
+ set name = "Enter Sleeper"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr)))
return
-
- verb/eject()
- set name = "Eject Sleeper"
- set category = "Object"
- set src in oview(1)
- if(usr.stat != 0)
- return
- if(orient == "RIGHT")
- icon_state = "sleeper_0-r"
- src.icon_state = "sleeper_0"
- src.go_out()
- add_fingerprint(usr)
+ if(src.occupant)
+ usr << "\blue The sleeper is already occupied!"
return
- verb/remove_beaker()
- set name = "Remove Beaker"
- set category = "Object"
- set src in oview(1)
- if(usr.stat != 0)
+ for(var/mob/living/carbon/slime/M in range(1,usr))
+ if(M.Victim == usr)
+ usr << "You're too busy getting your life sucked out of you."
return
- if(beaker)
- filtering = 0
- beaker.loc = usr.loc
- beaker = null
- add_fingerprint(usr)
- return
-
- verb/move_inside()
- set name = "Enter Sleeper"
- set category = "Object"
- set src in oview(1)
-
- if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr)))
- return
-
+ visible_message("[usr] starts climbing into the sleeper.", 3)
+ if(do_after(usr, 20))
if(src.occupant)
usr << "\blue The sleeper is already occupied!"
return
+ usr.stop_pulling()
+ usr.client.perspective = EYE_PERSPECTIVE
+ usr.client.eye = src
+ usr.loc = src
+ update_use_power(2)
+ src.occupant = usr
+ src.icon_state = "sleeper_1"
+ if(orient == "RIGHT")
+ icon_state = "sleeper_1-r"
- for(var/mob/living/carbon/slime/M in range(1,usr))
- if(M.Victim == usr)
- usr << "You're too busy getting your life sucked out of you."
- return
- visible_message("[usr] starts climbing into the sleeper.", 3)
- if(do_after(usr, 20))
- if(src.occupant)
- usr << "\blue The sleeper is already occupied!"
- return
- usr.stop_pulling()
- usr.client.perspective = EYE_PERSPECTIVE
- usr.client.eye = src
- usr.loc = src
- update_use_power(2)
- src.occupant = usr
- src.icon_state = "sleeper_1"
- if(orient == "RIGHT")
- icon_state = "sleeper_1-r"
-
- for(var/obj/O in src)
- del(O)
- src.add_fingerprint(usr)
- return
+ for(var/obj/O in src)
+ del(O)
+ src.add_fingerprint(usr)
return
+ return
+
+
+/obj/machinery/sleeper/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant))
+ return
+ var/mob/living/L = O
+ if(L == user)
+ visible_message("[user] starts climbing into the sleeper.", 3)
+ else
+ visible_message("[user] starts putting [L.name] into the sleeper.", 3)
+ if(do_after(user, 20))
+ if(src.occupant)
+ user << "\blue The sleeper is already occupied!"
+ return
+ if(!L) return
+
+ if(L.client)
+ L.client.perspective = EYE_PERSPECTIVE
+ L.client.eye = src
+ L.loc = src
+ src.occupant = L
+ src.icon_state = (orient == "RIGHT") ? "sleeper_1-r" : "sleeper_1"
+ L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
+ src.add_fingerprint(user)
+ if(user.pulling == L)
+ user.pulling = null
+ return
+ return
\ No newline at end of file
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 16b21a59..fc6d27e5 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -14,8 +14,23 @@
idle_power_usage = 60
active_power_usage = 10000 //10 kW. It's a big all-body scanner.
-/*/obj/machinery/bodyscanner/allow_drop()
- return 0*/
+
+/obj/machinery/bodyscanner/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant))
+ return
+ var/mob/living/L = O
+ if(L == user)
+ visible_message("[user] climbs into the body scanner.", 3)
+ else
+ visible_message("[user] puts [L.name] into the body scanner.", 3)
+ if (L.client)
+ L.client.perspective = EYE_PERSPECTIVE
+ L.client.eye = src
+ L.loc = src
+ src.occupant = L
+ src.icon_state = "body_scanner_1"
+ src.add_fingerprint(user)
+ return
/obj/machinery/bodyscanner/relaymove(mob/user as mob)
if (user.stat)
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index d059e310..72533e80 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -370,7 +370,7 @@
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
- new /mob/living/simple_animal/hostile/carp(L.loc)
+ new /mob/living/simple_animal/hostile/carp/hologram(L.loc)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 32ecb748..2c54faed 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -32,6 +32,20 @@
node = target
break
+
+/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant))
+ return
+ var/mob/living/L = O
+ if(put_mob(L))
+ if(L == user)
+ visible_message("[user] climbs into the cryo cell.", 3)
+ else
+ visible_message("[user] puts [L.name] into the cryo cell.", 3)
+ if(user.pulling == L)
+ user.pulling = null
+
+
/obj/machinery/atmospherics/unary/cryo_cell/process()
..()
if(!node)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 7143e381..766749e3 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -144,6 +144,7 @@ var/global/list/frozen_items = list()
desc = "A man-sized pod for entering suspended animation."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "body_scanner_0"
+ var/occupied_icon_state = "body_scanner_1"
density = 1
anchored = 1
@@ -288,7 +289,6 @@ var/global/list/frozen_items = list()
del(occupant)
occupant = null
-
return
@@ -327,9 +327,9 @@ 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 If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
@@ -345,6 +345,72 @@ var/global/list/frozen_items = list()
//Despawning occurs when process() is called with an occupant without a client.
src.add_fingerprint(M)
+
+
+/obj/machinery/cryopod/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+ if(!allowed_to_add_this_person_to_a_medical_machine(O,user,src,occupant))
+ return
+
+ var/mob/living/L = O
+
+ if(L.stat == DEAD)
+ user << "Dead people can not be put into cryo."
+ return
+
+ for(var/mob/living/carbon/slime/M in range(1,L))
+ if(M.Victim == L)
+ usr << "[L.name] will not fit into the cryo pod because they have a slime latched onto their head."
+ return
+
+ var/willing = null //We don't want to allow people to be forced into despawning.
+
+ if(L.client)
+ if(alert(L,"Would you like to enter cryosleep?",,"Yes","No") == "Yes")
+ if(!L) return
+ willing = 1
+ else
+ willing = 1
+
+ if(willing)
+ if(L == user)
+ visible_message("[user] starts climbing into the cryo pod.", 3)
+ else
+ visible_message("[user] starts putting [L] into the cryo pod.", 3)
+
+ if(do_after(user, 20))
+ if(!L) return
+
+ L.loc = src
+
+ if(L.client)
+ L.client.perspective = EYE_PERSPECTIVE
+ L.client.eye = src
+ else
+ user << "You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]"
+ return
+
+ if(orient_right)
+ icon_state = "[occupied_icon_state]-r"
+ else
+ icon_state = occupied_icon_state
+
+ L << "\blue You feel cool air surround you. You go numb as your senses turn inward."
+ L << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round."
+ occupant = L
+ time_entered = world.time
+
+ // Book keeping!
+ var/turf/location = get_turf(src)
+ log_admin("[key_name_admin(L)] has entered a stasis pod.")
+ message_admins("\blue [key_name_admin(L)] has entered a stasis pod.(JMP)")
+ message_mods("\blue [key_name_admin(L)] has entered a stasis pod.(JMP)")
+
+ //Despawning occurs when process() is called with an occupant without a client.
+ src.add_fingerprint(L)
+
+ return
+
+
/obj/machinery/cryopod/verb/eject()
set name = "Eject Pod"
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index fe9e8cf1..82b680b3 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -16,7 +16,7 @@
var/locked = 1
attack_self(mob/user as mob)
- if (!ishuman(user) && !istype(user,/mob/living/silicon/robot/drone))
+ if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
return ..(user)
var/mob/living/carbon/human/H = user
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index d582713a..f9e6be91 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -45,17 +45,16 @@
name = "\improper Resource Vender"
desc = "For various resources!"
icon = 'icons/obj/vending.dmi'
+ var/accepts = list(/obj/item/stack/sheet/metal,
+ /obj/item/stack/sheet/glass,
+ /obj/item/stack/sheet/mineral/diamond,
+ /obj/item/stack/sheet/mineral/uranium,
+ /obj/item/stack/sheet/mineral/plasma,
+ /obj/item/stack/sheet/mineral/gold
+ )
/obj/machinery/smartfridge/resources/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/stack/sheet/metal/))
- return 1
- if(istype(O,/obj/item/stack/sheet/glass/))
- return 1
- if(istype(O,/obj/item/stack/sheet/mineral/diamond/))
- return 1
- if(istype(O,/obj/item/stack/sheet/mineral/uranium/))
- return 1
- if(istype(O,/obj/item/stack/sheet/mineral/plasma/))
+ if(O.type in accepts)
return 1
return 0
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 8508f849..a1199642 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -12,7 +12,7 @@
use_power = 1
idle_power_usage = 20
active_power_usage = 5000
- req_access = list(access_research)
+ req_access = list(access_robotics)
var/time_coeff = 1.5 //can be upgraded with research
var/resource_coeff = 1.5 //can be upgraded with research
var/list/resources = list(
@@ -126,13 +126,13 @@
/obj/item/borg/upgrade/vtec,
/obj/item/borg/upgrade/tasercooler,
/obj/item/borg/upgrade/jetpack),
-
+
"Synthetic Coverings" = list( /obj/item/weapon/synth_skin_spray,
/obj/item/weapon/synth_skin_cartridge/paint,
/obj/item/weapon/synth_skin_cartridge/skin,
/obj/item/weapon/synth_skin_cartridge/fur,
/obj/item/weapon/synth_skin_cartridge/scales),
-
+
"Engineering Equipment"=list(/obj/item/mecha_parts/mecha_tracking))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index f9fa55ba..80eeb962 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -707,6 +707,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
var/obj/item/device/encryptionkey/keyslot = null//Borg radios can handle a single encryption key
icon = 'icons/obj/robot_component.dmi' // Cyborgs radio icons should look like the component.
icon_state = "radio"
+ var/emagged = 0 // getting emagged gives you the syndicate channels and access to the external speaker
+ var/external_speakers = TRUE
/obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
@@ -749,9 +751,12 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
return
+/obj/item/device/radio/borg/proc/update_speaker_range()
+ canhear_range = external_speakers ? 3 : 0 // if your speakers are on, people can hear you, if not, they can't
+
/obj/item/device/radio/borg/proc/recalculateChannels()
src.channels = list()
- src.syndie = 0
+ src.syndie = FALSE
var/mob/living/silicon/robot/D = src.loc
if(D.module)
@@ -760,30 +765,29 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
continue
src.channels += ch_name
src.channels[ch_name] += D.module.channels[ch_name]
+ if(emagged) // emagged cyborgs get the syndicate channel
+ src.channels["Syndicate"]=TRUE
+ src.syndie = TRUE
+ update_speaker_range()
if(keyslot)
for(var/ch_name in keyslot.channels)
if(ch_name in src.channels)
continue
src.channels += ch_name
src.channels[ch_name] += keyslot.channels[ch_name]
-
if(keyslot.syndie)
- src.syndie = 1
-
-
+ src.syndie = TRUE
for (var/ch_name in src.channels)
if(!radio_controller)
sleep(30) // Waiting for the radio_controller to be created.
if(!radio_controller)
src.name = "broken radio"
return
-
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
-
return
/obj/item/device/radio/borg/Topic(href, href_list)
- if(usr.stat || !on)
+ if (usr.stat || !on)
return
if (href_list["mode"])
if(subspace_transmission != 1)
@@ -796,6 +800,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
channels = list()
else
recalculateChannels()
+ if (href_list["external_speakers"])
+ external_speakers = !external_speakers
..()
/obj/item/device/radio/borg/interact(mob/user as mob)
@@ -803,8 +809,12 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
return
var/dat = "[src]"
+ var/external_speaker_line = "" // external speakers
+ if (emagged)
+ external_speaker_line = "External Speakers: " + (external_speakers ? "Engaged" : "Disengaged") + "
"
dat += {"
- Speaker: [listening ? "Engaged" : "Disengaged"]
+ Internal Speaker: [listening ? "Engaged" : "Disengaged"]
+ [external_speaker_line]
Frequency:
-
-
@@ -822,6 +832,11 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
onclose(user, "radio")
return
+
+/obj/item/device/radio/borg/proc/set_emag(var/is_emagged)
+ emagged=is_emagged
+ recalculateChannels()
+
/obj/item/device/radio/proc/config(op)
if(radio_controller)
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index f1c63cfc..6662b0d0 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -176,7 +176,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid
randomItems.Add("/obj/item/clothing/shoes/syndigaloshes") //No-Slip Syndicate Shoes
randomItems.Add("/obj/item/weapon/plastique") //C4
randomItems.Add("/obj/item/weapon/storage/box/syndie_kit/masks_gas")
- randomItems.Add("/obj/item/shoe_cover")
if(uses > 0)
randomItems.Add("/obj/item/weapon/soap/syndie") //Syndicate Soap
@@ -208,7 +207,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
uses -= 3
if("/obj/item/ammo_magazine/a357" , "/obj/item/clothing/shoes/syndigaloshes" , "/obj/item/weapon/plastique", "/obj/item/weapon/card/id/syndicate" , "/obj/item/weapon/storage/box/syndie_kit/masks_gas")
uses -= 2
- if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate" , "/obj/item/weapon/storage/box/syndie_kit/masks", "/obj/item/shoe_cover")
+ if("/obj/item/weapon/soap/syndie" , "/obj/item/weapon/storage/toolbox/syndicate" , "/obj/item/weapon/storage/box/syndie_kit/masks")
uses -= 1
del(randomItems)
return buyItem
@@ -282,10 +281,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid
feedback_add_details("traitor_uplink_items_bought","SR")
if("/obj/item/clothing/gloves/force/syndicate")
feedback_add_details("traitor_uplink_items_bought","FG")
- if("/obj/item/shoe_cover")
- feedback_add_details("traitor_uplink_items_bought","SFS")
-/obj/item/shoe_cover
-
/obj/item/device/uplink/Topic(href, href_list)
if (href_list["buy_item"])
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index ed2c2d32..694f5b09 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -160,10 +160,16 @@
/obj/item/robot_parts/robot_suit/proc/allowed_to_build(mob/user as mob, obj/item/device/mmi/brain as obj)
if(!check_completion()) // not complete? not allowed
- return
+ return 0
if(!check_allowed_to_install_brain(user,brain)) // not allowed to put the brain in there
- return
- return TRUE
+ return 0
+ if(src.head.law_computer) // Ok they are what are we making?
+ if(!jobban_isbanned(brain.brainmob, "Cyborg")) // Are you banned?
+ return "BORG"
+ else //Ok IPC then
+ if(is_alien_whitelisted(brain.brainmob, "Machine")) // They still need a whitelist! Scopes.
+ return "IPC"
+ return 0
/obj/item/robot_parts/robot_suit/proc/check_allowed_to_install_brain(mob/user as mob, obj/item/device/mmi/brain as obj)
@@ -189,9 +195,6 @@
if(brain.brainmob.mind in ticker.mode.head_revolutionaries)
user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [brain]."
return
- if(jobban_isbanned(brain.brainmob, "Cyborg"))
- user << "\red This [brain] does not seem to fit."
- return
return TRUE
@@ -220,16 +223,49 @@
var/obj/item/robot_parts/part = W
part.attach_to_robot(user,src)
return
+ // Handle PART REMOVAL
+ if(istype(W, /obj/item/weapon/crowbar))
+ switch(user.zone_sel.selecting)
+ if("head")
+ if(head)
+ head.loc = loc
+ head = null
+ if("chest")
+ if(chest)
+ chest.loc = loc
+ chest = null
+ if("l_arm","l_hand")
+ if(l_arm)
+ l_arm.loc = loc
+ l_arm = null
+ if("r_arm","r_hand")
+ if(r_arm)
+ r_arm.loc = loc
+ r_arm = null
+ if("l_leg","l_foot")
+ if(l_leg)
+ l_leg.loc = loc
+ l_leg = null
+ if("r_leg","r_foot")
+ if(r_leg)
+ r_leg.loc = loc
+ r_leg = null
+ updateicon()
+ return
// HANDLE ROBOT CREATION
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/brain = W
- if (allowed_to_build(user,brain)) // we are allowed to build this robot
- user.drop_item() // drop this thing
- if (src.head.law_computer) // do we have a law computer? If so, we're making a standard robot
+ switch(allowed_to_build(user,brain)) // we are allowed to build this robot
+ if("BORG") // do we have a law computer? If so, we're making a standard robot
+ user.drop_item() // We only drop it if it's compatible
create_robot(brain)
- else // otherwise we're making a shell
+ return
+ if("IPC")
+ user.drop_item() // We only drop it if it's compatible
create_shell(brain)
-
+ return
+ user << "The frame refuses to intergate with [brain]"
+ return
/obj/item/robot_parts/robot_suit/proc/create_robot(obj/item/device/mmi/brain as obj)
var/mob/living/silicon/robot/new_robot = new(get_turf(loc), unfinished = 1)
@@ -257,7 +293,7 @@
/obj/item/robot_parts/robot_suit/proc/create_shell(obj/item/device/mmi/brain as obj)
- var/mob/living/carbon/human/machine/new_shell = new(src.loc)
+ var/mob/living/carbon/human/new_shell = new(src.loc, "Machine")
brain.brainmob.mind.transfer_to(new_shell) // transfer brain
var/datum/organ/internal/brain/robot/brain_datum=new_shell.internal_organs_by_name["brain"] // put the brain in the head
brain_datum.machine_brain_type=brain.machine_brain_type
@@ -355,4 +391,4 @@ proc/give_option_to_rename(var/mob/living/carbon/human/new_shell)
user << "\red You slide [W] into the dataport on [src] and short out the safeties."
sabotaged = 1
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index f1dc4bf4..6e2ed3c4 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -1048,7 +1048,6 @@
-
- Author's Foreword
@@ -1060,7 +1059,7 @@
- Or: What the fuck does a "passive gate" do?
+ Or: What the fuck does a "pressure regulator" do?
Alright. It has come to my attention that a variety of people are unsure of what a "pipe" is and what it does.
Apparently, there is an unnatural fear of these arcane devices and their "gases." Spooky, spooky. So,
@@ -1085,6 +1084,8 @@
Manual T-valve: Like a manual valve, but at the center of a manifold instead of a straight pipe.
+ An important note here is that pipes are now done in three distinct lines - general, supply, and scrubber. You can move gases between these with a universal adapter. Use the correct position for the correct location.
+ Connecting scrubbers to a supply position pipe makes you an idiot who gives everyone a difficult job. Insulated and HE pipes don't go through these positions.
Bent pipes: Pipes with a 90 degree bend at the half-meter mark. My goodness.
Pipe manifolds: Pipes that are essentially a "T" shape, allowing you to connect three things at one point.
@@ -1101,43 +1102,36 @@
They actually do something.
This is usually where people get frightened, afraid, and start calling on their gods and/or cowering in fear. Yes, I can see you doing that right now.
Stop it. It's unbecoming. Most of these are fairly straightforward.
-
- - Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 4500 kPa (kilopascals).
+
- Gas pump: Take a wild guess. It moves gas in the direction it's pointing (marked by the red line on one end). It moves it based on pressure, the maximum output being 15000 kPa (kilopascals).
Ordinary atmospheric pressure, for comparison, is 101.3 kPa, and the minimum pressure of room-temperature pure oxygen needed to not suffocate in a matter of minutes is 16 kPa
- (though 18 kPa is preferred using internals, for various reasons).
- - Volume pump: This pump goes based on volume, instead of pressure, and the possible maximum pressure it can create in the pipe on the receiving end is double the gas pump because of this,
- clocking in at an incredible 9000 kPa. If a pipe with this is destroyed or damaged, and this pressure of gas escapes, it can be incredibly dangerous depending on the size of the pipe filled.
- Don't hook this to the distribution loop, or you will make babies cry and the Chief Engineer brutally beat you.
- - Passive gate: This is essentially a cap on the pressure of gas allowed to flow in a specific direction.
- When turned on, instead of actively pumping gas, it measures the pressure flowing through it, and whatever pressure you set is the maximum: it'll cap after that.
- In addition, it only lets gas flow one way. The direction the gas flows is opposite the red handle on it, which is confusing to people used to the red stripe on pumps pointing the way.
+ (though 18 kPa is preferred when using internals with pure oxygen, for various reasons). A high-powered variant will move gas more quickly at the expense of consuming more power. Do not turn the distribution loop up to 15000 kPa.
+ You will make engiborgs cry and the Chief Engineer will beat you.
+ - Pressure regulator: These replaced the old passive gates. You can choose to regulate pressure by input or output, and regulate flow rate. Regulating by input means that when input pressure is above the limit, gas will flow.
+ Regulating by output means that when pressure is below the limit, gas will flow. Flow rate can be controlled.
- Unary vent: The basic vent used in rooms. It pumps gas into the room, but can't suck it back out. Controlled by the room's air alarm system.
- Scrubber: The other half of room equipment. Filters air, and can suck it in entirely in what's called a "panic siphon." Activating a panic siphon without very good reason will kill someone. Don't do it.
- Meter: A little box with some gauges and numbers. Fasten it to any pipe or manifold and it'll read you the pressure in it. Very useful.
- - Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference.
- Can output this gas at pressures from 0-4500 kPa.
+ - Gas mixer: Two sides are input, one side is output. Mixes the gases pumped into it at the ratio defined. The side perpendicular to the other two is "node 2," for reference, on non-mirrored mixers..
+ Output is controlled by flow rate. There is also an "omni" variant that allows you to set input and output sections freely..
- Gas filter: Essentially the opposite of a gas mixer. One side is input. The other two sides are output. One gas type will be filtered into the perpendicular output pipe,
- the rest will continue out the other side. Can also output from 0-4500 kPa.
+ the rest will continue out the other side. Can also output from 0-4500 kPa. The "omni" vairant allows you to set input and output sections freely.
-
Will not set you on fire.
These systems are used to only transfer heat between two pipes. They will not move gases or any other element, but will equalize the temperature (eventually). Note that because of how gases work (remember: pv=nRt),
a higher temperature will raise pressure, and a lower one will lower temperature.
-
Pipe: This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.
Bent pipe: Take a wild guess.
Junction: The point where you connect your normal pipes to heat exchange pipes. Not necessary for heat exchangers, but necessary for H/E pipes/bent pipes.
Heat exchanger: These funky-looking bits attach to an open pipe end. Put another heat exchanger directly across from it, and you can transfer heat across two pipes without having to have the gases touch.
- This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions...
-
+ This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.
That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please.
+
"}
-
/obj/item/weapon/book/manual/evaguide
name = "EVA Gear and You: Not Spending All Day Inside"
icon_state = "evabook"
@@ -1158,16 +1152,15 @@
Or: How not to suffocate because there's a hole in your shoes
-
- A foreword on using EVA gear
- Donning a Civilian Suit
- Putting on a Hardsuit
+ - Cyclers and Other Modification Equipment
- Final Checks
-
EVA gear. Wonderful to use. It's useful for mining, engineering, and occasionally just surviving, if things are that bad. Most people have EVA training,
but apparently there are some on a space station who don't. This guide should give you a basic idea of how to use this gear, safely. It's split into two sections:
Civilian suits and hardsuits.
@@ -1185,6 +1178,7 @@
There is a small slot on the side of the suit where an emergency oxygen tank or extended emergency oxygen tank will fit,
but it is recommended to have a full-sized tank on your back for EVA.
+ These suits tend to be wearable by most species. They're large and flexible. They might be pretty uncomfortable for some, though, so keep that in mind.
Heavy, uncomfortable, still the best option.
These suits come in Engineering, Mining, and the Armory. There's also a couple Medical Hardsuits in EVA. These provide a lot more protection than the standard suits.
@@ -1194,15 +1188,28 @@
and then is screwed in for one and a quarter full rotations clockwise, leaving the faceplate directly in front of you. There is a small button on the right side of the helmet that activates the helmet light.
The tanks that fasten onto the side slot are emergency tanks, as well as full-sized oxygen tanks, leaving your back free for a backpack or satchel.
+ These suits generally only fit one species. Nanotrasen's are usually human-fitting by default, but there's equipment that can make modifications to the hardsuits to fit them to other species.
+
+
+ How to actually make hardsuits fit you.
+ There's a variety of equipment that can modify hardsuits to fit species that can't fit into them, making life quite a bit easier.
+
+ The first piece of equipment is a suit cycler. This is a large machine resembling the storage pods that are in place in some places. These are machines that will automatically tailor a suit to certain specifications.
+ The largest uses of them are for their cleaning functions and their ability to tailor suits for a species. Do not enter them physically. You will die from any of the functions being activated, and it will be painful.
+ These machines can both tailor a suit between species, and between types. This means you can convert engineering hardsuits to atmospherics, or the other way. This is useful. Use it if you can.
+
+ Suit cooling units are useful for people who need to go into fires. Any suits except for atmospherics' hardsuits aren't designed to handle high heat situations, so this will be necessary. It's also useful for IPCs, who find heat rather than oxygen the largest issue in vacuum.
+
+ There's also modification kits that let you modify suits yourself. These are extremely difficult to use unless you understand the actual construction of the suit. I do not reccomend using them unless no other option is available.
- Are all seals fastened correctly?
+ - If you have modified it manually, is absolutely everything sealed perfectly?
- Do you either have shoes on under the suit, or magnetic boots on over it?
- Do you have a mask on and internals on the suit or your back?
- Do you have a way to communicate with the station in case something goes wrong?
- Do you have a second person watching if this is a training session?
-
If you don't have any further issues, go out and do whatever is necessary.