mirror of
https://github.com/Aurorastation/Aurora-Old.git
synced 2026-08-24 13:16:18 +01:00
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
@@ -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: []°C ([]°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: []°C ([]°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
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user