Merge pull request #45 from Aurorastation/master

ALL THE FIXES
This commit is contained in:
skull132
2015-09-25 16:34:23 +03:00
47 changed files with 13325 additions and 12930 deletions
+48
View File
@@ -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 <B>The [target_object] is already occupied!</B>"
return
var/mob/living/L = target
if(L.abiotic())
user << "\red <B>Subject cannot have abiotic items on.</B>"
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
+9
View File
@@ -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.
+6
View File
@@ -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)
+6
View File
@@ -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.
+14
View File
@@ -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
@@ -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)
+1 -2
View File
@@ -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 <b>Exolitics</b> 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."
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."
+2 -3
View File
@@ -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 << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
obj_count++
+260 -230
View File
@@ -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 <B>The sleeper is already occupied!</B>"
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 <B>The sleeper is already occupied!</B>"
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 <B>The sleeper is already occupied!</B>"
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 <B>Occupant ([]) Statistics:</B>", 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: []&deg;C ([]&deg;F)</FONT><BR>", (src.occupant.bodytemperature > 50 ? "<font color='blue'>" : "<font color='red'>"), 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 <B>Occupant ([]) Statistics:</B>", 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: []&deg;C ([]&deg;F)</FONT><BR>", (src.occupant.bodytemperature > 50 ? "<font color='blue'>" : "<font color='red'>"), 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 <B>The sleeper is already occupied!</B>"
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 <B>The sleeper is already occupied!</B>"
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 <B>The sleeper is already occupied!</B>"
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 <B>The sleeper is already occupied!</B>"
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 <b>You feel cool air surround you. You go numb as your senses turn inward.</b>"
src.add_fingerprint(user)
if(user.pulling == L)
user.pulling = null
return
return
+17 -2
View File
@@ -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)
@@ -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()
+14
View File
@@ -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)
+69 -3
View File
@@ -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 <b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b>"
@@ -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 << "<span class='notice'>Dead people can not be put into cryo.</span>"
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 << "<span class='notice'>You stop [L == user ? "climbing into the cryo pod." : "putting [L] into the cryo pod."]</span>"
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 <b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b>"
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.(<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
message_mods("\blue [key_name_admin(L)] has entered a stasis pod.(<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
//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"
@@ -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
+8 -9
View File
@@ -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
+3 -3
View File
@@ -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))
+24 -9
View File
@@ -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 = "<html><head><title>[src]</title></head><body><TT>"
var/external_speaker_line = "" // external speakers
if (emagged)
external_speaker_line = "External Speakers: " + (external_speakers ? "<A href='byond://?src=\ref[src];external_speakers=1'>Engaged</A>" : "<A href='byond://?src=\ref[src];external_speakers=1'>Disengaged</A>") + "<BR>"
dat += {"
Speaker: [listening ? "<A href='byond://?src=\ref[src];listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];listen=1'>Disengaged</A>"]<BR>
Internal Speaker: [listening ? "<A href='byond://?src=\ref[src];listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];listen=1'>Disengaged</A>"]<BR>
[external_speaker_line]
Frequency:
<A href='byond://?src=\ref[src];freq=-10'>-</A>
<A href='byond://?src=\ref[src];freq=-2'>-</A>
@@ -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)
+1 -6
View File
@@ -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"])
+49 -13
View File
@@ -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
..()
..()
+29 -22
View File
@@ -1048,7 +1048,6 @@
</style>
</head>
<body>
<h1><a name="Contents">Contents</a></h1>
<ol>
<li><a href="#Foreword">Author's Foreword</a></li>
@@ -1060,7 +1059,7 @@
</ol><br>
<h1><a name="Foreword"><U><B>HOW TO NOT SUCK QUITE SO HARD AT ATMOSPHERICS</B></U></a></h1><BR>
<I>Or: What the fuck does a "passive gate" do?</I><BR><BR>
<I>Or: What the fuck does a "pressure regulator" do?</I><BR><BR>
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 @@
<li><b>Manual T-valve:</b> Like a manual valve, but at the center of a manifold instead of a straight pipe.</li><BR><BR>
</ul>
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.
<h1><a name="Insulated"><B>Insulated Pipes</B></a></h1>
<li><I>Bent pipes:</I> Pipes with a 90 degree bend at the half-meter mark. My goodness.</li>
<li><I>Pipe manifolds:</I> Pipes that are essentially a "T" shape, allowing you to connect three things at one point.</li>
@@ -1101,43 +1102,36 @@
<I>They actually do something.</I><BR>
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.<BR>
<ul>
<li><b>Gas pump:</b> 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).
<li><b>Gas pump:</b> 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).</li>
<li><b>Volume pump:</b> 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.</li>
<li><b>Passive gate:</b> 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.</li>
(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.</li>
<li><b>Pressure regulator:</b> 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.</li>
<li><b>Unary vent:</b> 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.</li>
<li><b>Scrubber:</b> 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.</li>
<li><b>Meter:</b> 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.</li>
<li><b>Gas mixer:</b> 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.</li>
<li><b>Gas mixer:</b> 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..</li>
<li><b>Gas filter:</b> 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.</li>
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.</li>
</ul>
<h1><a name="HES"><B>Heat Exchange Systems</B></a></h1>
<I>Will not set you on fire.</I><BR>
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.<BR>
<li><I>Pipe:</I> This is a pipe that will exchange heat with the surrounding atmosphere. Place in fire for superheating. Place in space for supercooling.</li>
<li><I>Bent pipe:</I> Take a wild guess.</li>
<li><I>Junction:</I> 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.</li>
<li><I>Heat exchanger:</I> 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...</li><BR>
This normally shouldn't exchange with the ambient air, despite being totally exposed. Just don't ask questions.</li><BR>
That's about it for pipes. Go forth, armed with this knowledge, and try not to break, burn down, or kill anything. Please.
</body>
</html>
"}
/obj/item/weapon/book/manual/evaguide
name = "EVA Gear and You: Not Spending All Day Inside"
icon_state = "evabook"
@@ -1158,16 +1152,15 @@
<h1><a name="Foreword">EVA Gear and You: Not Spending All Day Inside</a></h1>
<I>Or: How not to suffocate because there's a hole in your shoes</I><BR>
<h2><a name="Contents">Contents</a></h2>
<ol>
<li><a href="#Foreword">A foreword on using EVA gear</a></li>
<li><a href="#Civilian">Donning a Civilian Suit</a></li>
<li><a href="#Hardsuit">Putting on a Hardsuit</a></li>
<li><a href="#Equipment">Cyclers and Other Modification Equipment</a></li>
<li><a href="#Final">Final Checks</a></li>
</ol>
<br>
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.<BR><BR>
@@ -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.<BR><BR>
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.<BR><BR>
<h2><a name="Hardsuit">Hardsuits</a></h2>
<I>Heavy, uncomfortable, still the best option.</I><BR>
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.<BR><BR>
@@ -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.<BR><BR>
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.<BR><BR>
<h2><a name="Equipment">Modification Equipment</a></h2>
<I>How to actually make hardsuits fit you.</I><BR>
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.<BR><BR>
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.<BR><BR>
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.<BR><BR>
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.
<h2><a name="Final">Final Checks</a></h2>
<ul>
<li>Are all seals fastened correctly?</li>
<li>If you have modified it manually, is absolutely everything sealed perfectly?</li>
<li>Do you either have shoes on under the suit, or magnetic boots on over it?</li>
<li>Do you have a mask on and internals on the suit or your back?</li>
<li>Do you have a way to communicate with the station in case something goes wrong?</li>
<li>Do you have a second person watching if this is a training session?</li><BR>
</ul>
If you don't have any further issues, go out and do whatever is necessary.
</body>
@@ -234,4 +234,4 @@
name = "combat ruck"
desc = "A large rucksack with supports and webbing, specifically designed for combat operations and equipment carrying. This one has bright red highlights, denoting a squad combat trooper."
icon_state = "ert_security"
item_state = "ert_security"
item_state = "ert_security"
@@ -55,7 +55,7 @@
/obj/item/weapon/storage/firstaid/toxin
name = "toxin first aid"
desc = "Used to treat when you have a high amoutn of toxins in your body."
desc = "Used to treat when you have a high amount of toxins in your body."
icon_state = "antitoxin"
item_state = "firstaid-toxin"
@@ -9,7 +9,6 @@
new /obj/item/clothing/shoes/syndigaloshes(src)
return
if ("stealth")
if("stealth")
new /obj/item/weapon/gun/energy/crossbow(src)
new /obj/item/weapon/pen/paralysis(src)
@@ -156,4 +155,4 @@
new /obj/item/clothing/mask/gas/monkeymask(src)
new /obj/item/clothing/mask/gas/owl_mask(src)
new /obj/item/clothing/mask/gas/plaguedoctor(src)
return
return
@@ -111,4 +111,4 @@
new /obj/item/weapon/storage/backpack/ert/medic(src)
new /obj/item/weapon/storage/backpack/ert/medic(src)
new /obj/item/weapon/storage/backpack/ert/security(src)
new /obj/item/weapon/storage/backpack/ert/security(src)
new /obj/item/weapon/storage/backpack/ert/security(src)
+2 -2
View File
@@ -349,8 +349,8 @@
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return ..()
if(isrobot(user))
return
if(istype(user, /mob/living/silicon/robot/drone)) // drones don't get to table people
return ..()
user.drop_item()
if (O.loc != src.loc)
step(O, get_dir(O, src))
+4
View File
@@ -9,6 +9,10 @@ var/global/list/blacklist = list()
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
if(!computer_id)
message_admins("\blue Failed Login: [key] ([address]) Null computerID")
return list("reason"="Bad computerID", "desc"="\nReason: Blank computerID returned from client.")
if(ckey(key) in admin_datums)
return ..()
@@ -16,6 +16,10 @@
src << "\red The game hasn't started yet!"
return
if(istype(mob, /mob/new_player))
src << "\red You can't be in the lobby to join as a duty officer"
return
if(mob.mind && mob.mind.special_role == "Duty Officer")
src << "\red You are already a Duty Officer"
verbs += /client/proc/returntobody
@@ -130,6 +134,8 @@
bag.name = "officer's leather satchel"
bag.desc = "A well cared for leather satchel for Nanotrasen officers."
M.equip_if_possible(bag, slot_back)
if(M.backbag == 1)
M.equip_to_slot_or_del(new /obj/item/weapon/stamp/centcomm(M.back), slot_in_backpack)
var /obj/item/weapon/storage/lockbox/lockbox = new(M)
lockbox.req_access = list(access_cent_captain)
+2 -2
View File
@@ -86,8 +86,8 @@
spawn_positions = 2
supervisors = "the Chief Engineer"
selection_color = "#fff5cc"
access = list(access_engine, access_maint_tunnels, access_construction, access_engine_equip)
minimal_access = list(access_engine, access_maint_tunnels, access_construction, access_engine_equip)
access = list(access_maint_tunnels, access_construction, access_engine_equip)
minimal_access = list(access_maint_tunnels, access_construction, access_engine_equip)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
+1 -1
View File
@@ -25,7 +25,7 @@
continue
if(T.z != 1)
continue
if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters))
if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters/sleep))
continue
if(istype(H,/mob/living/carbon/human))
@@ -76,6 +76,27 @@
if(target)
ManualFollow(target)
if (href_list["follow"])
var/atom/target = locate(href_list["follow"])
if(target)
ManualFollow(target)
if (href_list["jump"])
var/mob/target = locate(href_list["jump"])
var/mob/A = usr;
A << "Teleporting to [target]..."
if(target && target != usr)
spawn(0)
var/turf/pos = get_turf(A)
var/turf/T=get_turf(target)
if(T != pos)
if(!T)
return
if(!client)
return
loc = T
following = null
..()
/mob/dead/attackby(obj/item/W, mob/user)
@@ -3,7 +3,12 @@
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
for(var/mob/O in viewers(container, null))
O.show_message(text("\red <B>[]'s MMI flatlines!</B>", src), 1, "\red You hear something flatline.", 2)
container.icon_state = "mmi_dead"
if(istype(container, /obj/item/device/mmi/posibrain))
container.icon_state = "posibrain"
ghostize(0)
return 0
else
container.icon_state = "mmi_dead"
stat = DEAD
if(blind) blind.layer = 0
@@ -40,4 +45,4 @@
del(loc)//Gets rid of the brain item
spawn(15)
if(animation) del(animation)
if(src) del(src)
if(src) del(src)
@@ -11,6 +11,7 @@
construction_time = 75
var/searching = 0
var/askDelay = 10 * 60 * 1
var/list/ghost_volunteers[0]
req_access = list(access_robotics)
locked = 0
mecha = null//This does not appear to be used outside of reference in mecha.dm.
@@ -23,31 +24,36 @@
//Start the process of searching for a new user.
user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
icon_state = "posibrain-searching"
ghost_volunteers.Cut()
src.searching = 1
src.request_player()
spawn(600) reset_search()
spawn(600)
if(ghost_volunteers.len)
var/mob/dead/observer/O = pick(ghost_volunteers)
if(istype(O) && O.client && O.key)
transfer_personality(O)
reset_search()
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
continue
if(jobban_isbanned(O, "pAI"))
continue
if(O.client)
if(O.client.prefs.be_special & BE_PAI)
question(O.client)
/obj/item/device/mmi/posibrain/proc/question(var/client/C)
spawn(0)
if(!C) return
var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if (response == "Never for this round")
C.prefs.be_special ^= BE_PAI
if(check_observer(O))
O << "\blue <b>\A [src] has been activated. (<a href='?src=\ref[O];jump=\ref[src]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)"
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/test)
if (!test) // no person ?
return
if (!test.client) // is someone actually home?
return
if (!test.client.prefs.be_special & BE_PAI) // do they want to be a pAI?
return
if(test.has_enabled_antagHUD == 1 && config.antag_hud_restricted) // have they activated the antagHUD?
return
if ((jobban_isbanned(test, "Cyborg") || jobban_isbanned(test,"nonhumandept")) && !is_alien_whitelisted(test,"Machine")) // if you can't play as either role that uses posibrains, then you can't get into a posibrain
return
return TRUE
/obj/item/device/mmi/posibrain/transfer_identity(var/mob/living/carbon/H)
/*
Positronic brains should have posibrain-like name, instead of human-MMIlike names. -- ATL
@@ -67,8 +73,20 @@
icon_state = "posibrain-occupied"
return
/obj/item/device/mmi/posibrain/proc/get_possible_uses_string(var/mob/test)
if (!(jobban_isbanned(test, "Cyborg") || jobban_isbanned(test,"nonhumandept")))
if (is_alien_whitelisted(test,"Machine"))
return "This posibrain's personality is compatible with assignment to either a tool-robot or a shell."
else
return "This posibrain's personality is compatible only with tool-robots."
else
if (is_alien_whitelisted(test,"Machine"))
return "This posibrain's personality is compatible only with shells."
else
return "This posibrain's personality is not compatible with any chassis. Something has gone wrong. Please call a bluespace technician to correct the issue."
/obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate)
var/uses = get_possible_uses_string(candidate)
src.searching = 0
src.brainmob.mind = candidate.mind
src.brainmob.ckey = candidate.ckey
@@ -78,12 +96,43 @@
src.brainmob << "<b>Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.</b>"
src.brainmob << "<b>Use say :b to speak to other artificial intelligences.</b>"
src.brainmob.mind.assigned_role = "Positronic Brain"
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
M.show_message("\blue The positronic brain chimes quietly.")
M.show_message("\blue The positronic brain chimes quietly as it loads a new personality. [uses]")
icon_state = "posibrain-occupied"
/obj/item/device/mmi/posibrain/Topic(href,href_list)
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
if(!O) return
volunteer(O)
/obj/item/device/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O)
if(!searching)
O << "Not looking for a ghost, yet."
return
if(!istype(O))
O << "\red Error."
return
if(O in ghost_volunteers)
O << "\blue Removed from registration list."
ghost_volunteers.Remove(O)
return
if(!check_observer(O))
O << "\red You cannot be \a [src]."
return
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
O << "\red Upon using the antagHUD you forfeited the ability to join the round."
return
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
O << "\red You are job banned from this role."
return
O.<< "\blue You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer."
ghost_volunteers.Add(O)
/obj/item/device/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
if(src.brainmob && src.brainmob.key) return
@@ -345,6 +345,11 @@ This function restores the subjects blood to max.
This function restores all organs.
*/
/mob/living/carbon/human/restore_all_organs()
for(var/species_organ in species.has_organ)
if(!(species_organ in internal_organs_by_name))
var/organ_type = species.has_organ[species_organ]
internal_organs_by_name[species_organ] = new organ_type(src)
for(var/datum/organ/external/current_organ in organs)
current_organ.rejuvenate()
+19 -29
View File
@@ -26,6 +26,13 @@ var/datum/paiController/paiController // Global handler for pAI candidates
var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min]
/datum/paiController/Topic(href, href_list[])
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
if(!O) return
if(!check_recruit(O)) return
recruitWindow(O)
return
if(href_list["download"])
var/datum/paiCandidate/candidate = locate(href_list["candidate"])
var/obj/item/device/paicard/card = locate(href_list["device"])
@@ -346,33 +353,16 @@ var/datum/paiController/paiController // Global handler for pAI candidates
/datum/paiController/proc/requestRecruits(var/mob/user)
inquirer = user
for(var/mob/dead/observer/O in player_list)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
continue
if(jobban_isbanned(O, "pAI"))
continue
if(asked.Find(O.key))
if(world.time < asked[O.key] + askDelay)
continue
else
asked.Remove(O.key)
if(O.client)
if(O.client.prefs.be_special & BE_PAI)
question(O.client)
/datum/paiController/proc/question(var/client/C)
spawn(0)
if(!C) return
asked.Add(C.key)
asked[C.key] = world.time
var/response = alert(C, "[inquirer] is requesting a pAI personality. Would you like to play as a personal AI?", "pAI Request", "Yes", "No", "Never for this round")
if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes")
recruitWindow(C.mob)
else if (response == "Never for this round")
var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
if(warning == "Yes")
asked[C.key] = INFINITY
else
question(C)
if(O.client && O.client.prefs.be_special & BE_PAI)
if(check_recruit(O))
O << "\blue <b>A pAI card is looking for personalities. (<a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</b>"
/datum/paiController/proc/check_recruit(var/mob/dead/observer/O)
if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept"))
return
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
return
if(O.client)
return TRUE
@@ -49,7 +49,7 @@
set name = "Drop Item"
set desc = "Release an item from your magnetic gripper."
set category = "Drone"
set category = "Robot Commands"
if(!wrapped)
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
@@ -64,14 +64,14 @@
src.loc << "\red You drop \the [wrapped]."
wrapped.loc = get_turf(src)
wrapped = null
//update_icon()
update_wrapped()
/obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
return
/obj/item/weapon/gripper/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity, params)
if(!target || !proximity) //Target is invalid or we are not adjacent.
update_wrapped()
return
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
@@ -93,6 +93,7 @@
wrapped.loc = src
else
wrapped = null
update_wrapped()
return
else if(istype(target,/obj/item)) //Check that we're not pocketing a mob.
@@ -115,27 +116,42 @@
user << "You collect \the [I]."
I.loc = src
wrapped = I
update_wrapped()
return
else
user << "\red Your gripper cannot hold \the [target]."
update_wrapped()
else if(istype(target,/obj/machinery/power/apc))
var/obj/machinery/power/apc/A = target
if(A.opened)
if(A.cell)
wrapped = A.cell
A.cell.add_fingerprint(user)
A.cell.updateicon()
A.cell.loc = src
A.cell = null
A.charging = 0
A.update_icon()
user.visible_message("\red [user] removes the power cell from [A]!", "You remove the power cell.")
update_wrapped()
/obj/item/weapon/gripper/proc/update_wrapped()
update_name()
update_overlay()
/obj/item/weapon/gripper/proc/update_name()
name = initial(name)
if (wrapped)
name += " ([wrapped])"
/obj/item/weapon/gripper/proc/update_overlay()
overlays.Cut()
if (wrapped)
overlays+=wrapped
//TODO: Matter decompiler.
/obj/item/weapon/matter_decompiler
@@ -745,6 +745,8 @@
src << "<b>Obey these laws:</b>"
laws.show_laws(src)
src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
if(radio)
radio.set_emag(TRUE)
if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
del(D)
@@ -231,10 +231,8 @@
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.emag = new /obj/item/borg/stun(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
// src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -244,7 +242,10 @@
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.emag = new /obj/item/borg/stun(src)
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.amount = 50
src.modules += M
@@ -66,4 +66,36 @@
icon_state = "critter"
icon_living = "critter"
icon_dead = "critter_dead"
attackv = "swoops"
attackv = "swoops"
// Holographic carp for the holodeck
/mob/living/simple_animal/hostile/carp/hologram
name = "space carp"
desc = "A solid light image of a ferocious, fang-bearing creature resembling a fish. It flickers inconsistently but appears to be able to affect solid matter."
icon_state = "holocarp"
icon_living = "holocarp"
icon_dead = "carp_dead"
icon_gib = "carp_gib"
meat_type = null
var/datum/effect/effect/system/spark_spread/spark_system // for when they die
/mob/living/simple_animal/hostile/carp/hologram/New(loc)
. = ..(loc)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
/mob/living/simple_animal/hostile/carp/hologram/death()
src.spark_system.start() // sparks for holograms! Hurray!
stat = DEAD
density = 0
. = ..()
src.visible_message("[src] sparks and then flickers out of existence.")
del(src)
/mob/living/simple_animal/hostile/carp/hologram/gib()
return death()
+1 -1
View File
@@ -5,7 +5,7 @@
computer_id = client.computer_id
log_access("Login: [key_name(src)] from [lastKnownIP ? lastKnownIP : "localhost"]-[computer_id] || BYOND v[client.byond_version]")
if(config.log_access)
for(var/mob/M in player_list)
for(var/mob/M in mob_list)
if(M == src) continue
if( M.key && (M.key != key) )
var/matches
@@ -711,6 +711,12 @@
icon_state = "hair_messy"
species_allowed = list("Tajaran")
taj_ears_curls
name = "Tajara Curly"
icon_state = "hair_curly"
gender = FEMALE
species_allowed = list("Tajaran")
taj_ears_wife
name = "Tajara Housewife"
icon_state = "hair_wife"
+8 -7
View File
@@ -29,7 +29,8 @@ datum/synthetic_limb_cover/New( var/datum/organ/external/datum_target=null,var/i
datum/synthetic_limb_cover/proc/get_icon() // default mechanical limbs return robo versions
var/icon/temp = new /icon((coverage ? main_icon : damage_icon), "[limb_datum.icon_name][limb_datum.get_gender_string()]") // only add a gender if it's necessary
var/icon/result = icon(temp)
result.Blend(colour, ICON_ADD)
if (coverage)
result.Blend(colour, ICON_ADD)
return result
@@ -213,7 +214,8 @@ proc/create_tinted_icon(icon_name, icon_state_name, target_colour)
if (target in list("mouth","eyes")) // we don't paint these individually
target="head"
if (allowed_to_paint(human_target,user,target))
paint_organ(human_target, user, human_target.get_organ(target))
if (do_after_to_target(user,human_target,20))
paint_organ(human_target, user, human_target.get_organ(target))
/obj/item/weapon/synth_skin_spray/proc/paint_organ(mob/M, mob/user, datum/organ/external/datum_target)
@@ -229,13 +231,11 @@ proc/create_tinted_icon(icon_name, icon_state_name, target_colour)
human_target.r_facial = hair_colour_as_list[1]
human_target.g_facial = hair_colour_as_list[2]
human_target.b_facial = hair_colour_as_list[3]
human_target.h_style=random_hair_style(human_target.gender,human_target.species)
human_target.update_hair()
if (istype(datum_target,/datum/organ/external/groin)) // this is a bit reductive, but whatever
var/gender_string = input(user,"What sex do you want this shell to appear as?") in list("Male","Female")
human_target.gender = (gender_string=="Male") ? MALE : FEMALE
human_target.update_tail_showing(FALSE)
human_target.update_body(TRUE)
cartridge.current_charges--
user.visible_message("<span class='notice'>[user] has covered [M]'s [datum_target.display_name] with [cartridge.covering_description].</span>")
@@ -294,8 +294,9 @@ proc/create_tinted_icon(icon_name, icon_state_name, target_colour)
return " It looks like there are [current_charges] charges left."
/obj/item/weapon/synth_skin_cartridge/examine(mob/user)
user << src.desc + get_charges_string()
/obj/item/weapon/synth_skin_cartridge/examine()
set src in usr
usr << src.desc + get_charges_string()
/obj/item/weapon/synth_skin_cartridge/attack_self(mob/user)
+4
View File
@@ -497,6 +497,10 @@
name = "paper scrap"
icon_state = "scrap"
/obj/item/weapon/paper/armoury
name = "Armoury Inventory"
info = "<center><img src = http://wiki.baystation12.net/logo.png><br><center><font size=4>ARMORY INVENTORY</font></center><br><table border=2><tr><td><center><b>Amount</b></center></td><td><center><b>Item</b></center></td><tr><td><center>4</center></td><td> Deployable Barriers</td><tr><td><center>4</center></td><td> Portable Flashers + Wrench </td><tr><td><center>3</center></td><td> Sets of Riot Armor </td><tr><td><center>1</center></td><td> Bulletproof Vest </td><tr><td><center>1</center></td><td> Ablative Vest </td><tr><td><center>1</center></td><td> Bomb Suit </td><tr><td><center>1</center></td><td> Biohazard Suit </td><tr><td><center>1</center></td><td> Chemical Implant Kit </td><tr><td><center>1</center></td><td> Tracking Implant Kit </td><tr><td><center>1</center></td><td> Loyalty Implant Kit </td><tr><td><center>1</center></td><td> Box of Spare Handcuffs </td><tr><td><center>1</center></td><td> Box of flashbangs </td><tr><td><center>1</center></td><td> Box of spare R.O.B.U.S.T. cartridges </td><tr><td><center>3</center></td><td> Riot shields </td><tr><td><center>3</center></td><td> Stun Batons </td><tr><td><center>3</center></td><td> Energy Guns </td><tr><td><center>3</center></td><td> Laser Rifles </td><tr><td><center>6</center></td><td> Gas Masks</td></center>"
/obj/item/weapon/paper/crumpled/update_icon()
return
+44
View File
@@ -56,6 +56,50 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->
<div class='commit sansserif'>
<h2 class='date'>23 August 2015</h2>
<h3 class='author'>SoundScopes updated:</h3>
<ul class='changes bgimages16'>
<li class='rscadd'>Click dragging mobs into medical machinery and cryo pods </li>
<li class='rscadd'>Emagged cyborgs can turn off their external speakers and get access to the syndicate channel</li>
<li class='imageadd'>Tajara Curly hair</li>
<li class='imageadd'>ERT Backpack sprites</li>
<li class='rscdel'>Bugged out Silent Step Fabric</li>
<li class='tweak'>Posibrain request now appear in chat rather than an alert message</li>
<li class='tweak'>Posibrains will now display a message showing if the player can be cyborgs or IPC's</li>
<li class='tweak'>IPC's are fully whitelisted</li>
<li class='tweak'>AI and borgs can now lock & unlock emitters</li>
<li class='tweak'>Engineering borgs get a magnetic gripper</li>
<li class='tweak'>Delay added to the paint cartridges</li>
<li class='tweak'>Holocarp are blue and spark</li>
<li class='tweak'>Robotics machinery requires robotics access</li>
<li class='tweak'>SQL News feed linked with the website code</li>
<li class='tweak'>Robot Endoskeletons can be pulled apart with a crowbar</li>
<li class='tweak'>Access levels in engineering doors</li>
<li class='tweak'>Reduced vents and scrubbers in select area's</li>
<li class='tweak'>Chameleon Kit cost raised as it cost the same as less than what was in it (It's still less than all the items combined)</li>
<li class='bugfix'>Examining paint cartridges should work properly</li>
<li class='bugfix'>Ninja energy nets now release people when they are gone</li>
<li class='bugfix'>IPC should no longer be able to get random mutations</li>
<li class='bugfix'>Fixes the issue with damaged IPC shells having their metallic bodies tinted by their body colour</li>
<li class='bugfix'>Fixes the issue with tails not updating properly on IPC shells</li>
<li class='bugfix'>Spray-cans will no longer remove hair on IPC shells, provided that you're not changing apparent species</li>
<li class='bugfix'>Updates atmos and EVA manuals to the current system</li>
<li class='bugfix'>Captains office gets affected by radiation storms</li>
<li class='bugfix'>Posibrains reset their icon rather than turn into a cyberbrain when suiciding</li>
<li class='bugfix'>Removed Job specific ERT backpacks due to missing or lost icons</li>
<li class='bugfix'>Mobs missing a brain will have one created when respawned with admin rejuve</li>
<li class='bugfix'>HoP office windoors are now the correct door type and access level</li>
<li class='bugfix'>Holopad added to Robotics & AI core</li>
<li class='bugfix'>Syndibundle should now give the stealth pack instead of an empty box</li>
<li class='bugfix'>Airlocks on the outpost and Tcomms fixed(Code for it still needs a look at, something is wrong there)</li>
<li class='bugfix'>Gas mix tank no longer starts with air(Mix tank not Air tank)</li>
<li class='bugfix'>No longer able to join with a null computerID</li>
</ul>
</div>
<div class='commit sansserif'>
<h2 class='date'>11 July 2015</h2>
<h3 class='author'>SoundScopes updated:</h3>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 58 KiB

+12492 -12542
View File
File diff suppressed because it is too large Load Diff