From d5e2689336a7e5029a395c704eb68ee8e4bb63c4 Mon Sep 17 00:00:00 2001 From: Mahzel Date: Wed, 13 Jan 2016 22:57:13 +0100 Subject: [PATCH 1/5] MagLock integration --- code/game/machinery/doors/airlock.dm | 36 +- .../objects/items/devices/magnetic_lock.dm | 323 ++++++++++++++++++ 2 files changed, 340 insertions(+), 19 deletions(-) create mode 100644 code/game/objects/items/devices/magnetic_lock.dm diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 524708b64ed..eaa586fdee2 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -30,7 +30,7 @@ var/hasShocked = 0 //Prevents multiple shocks from happening var/secured_wires = 0 var/datum/wires/airlock/wires = null - + var/obj/item/device/magnetic_lock/bracer = null var/open_sound_powered = 'sound/machines/airlock.ogg' var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg' @@ -481,7 +481,6 @@ About the new airlock wires panel: else return 0 - /obj/machinery/door/airlock/update_icon() if(overlays) overlays.Cut() if(density) @@ -728,10 +727,10 @@ About the new airlock wires panel: else if (activate && !src.lights) lights = 1 usr << "The door bolt lights have been enabled." - update_icon() return 1 + /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) //world << text("airlock attackby src [] obj [] mob []", src, C, user) if(!istype(usr, /mob/living/silicon)) @@ -740,8 +739,14 @@ About the new airlock wires panel: return if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll)) return - src.add_fingerprint(user) + if (istype(C, /obj/item/device/magnetic_lock)) + if (bracer) + user << "There is already a [bracer] on [src]!" + return + var/obj/item/device/magnetic_lock/newbracer = C + newbracer.attachto(src, user) + return if(!repairing && (istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density)) var/obj/item/weapon/weldingtool/W = C if(W.remove_fuel(0,user)) @@ -792,16 +797,13 @@ About the new airlock wires panel: da.state = 1 da.created_name = src.name da.update_state() - if(operating == -1 || (stat & BROKEN)) new /obj/item/weapon/circuitboard/broken(src.loc) operating = 0 else if (!electronics) create_electronics() - electronics.loc = src.loc electronics = null - qdel(src) return else if(arePowerSystemsOn()) @@ -819,6 +821,7 @@ About the new airlock wires panel: user << "The airlock's bolts prevent it from being forced." else if( !welded && !operating ) if(density) + var/obj/item/weapon/material/twohanded/fireaxe/F = C if(F.wielded) spawn(0) open(1) @@ -830,7 +833,6 @@ About the new airlock wires panel: spawn(0) close(1) else user << "You need to be wielding \the [C] to do that." - else ..() return @@ -852,12 +854,12 @@ About the new airlock wires panel: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - update_icon() return /obj/machinery/door/airlock/open(var/forced=0) if(!can_open(forced)) + return 0 use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people @@ -875,7 +877,9 @@ About the new airlock wires panel: if(!forced) if(!arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR)) return 0 - + if (bracer) + visible_message("[src]'s actuators whirr, but the door does not open.") + return 0 if(locked || welded) return 0 return ..() @@ -883,12 +887,10 @@ About the new airlock wires panel: /obj/machinery/door/airlock/can_close(var/forced=0) if(locked || welded) return 0 - if(!forced) //despite the name, this wire is for general door control. if(!arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR)) return 0 - return ..() /atom/movable/proc/blocks_airlock() @@ -941,22 +943,20 @@ About the new airlock wires panel: /obj/machinery/door/airlock/close(var/forced=0) if(!can_close(forced)) return 0 - if(safe) for(var/turf/turf in locs) for(var/atom/movable/AM in turf) if(AM.blocks_airlock()) if(world.time > next_beep_at) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) next_beep_at = world.time + SecondsToTicks(10) close_door_at = world.time + 6 return - for(var/turf/turf in locs) for(var/atom/movable/AM in turf) if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) take_damage(DOOR_CRUSH_DAMAGE) - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(arePowerSystemsOn()) playsound(src.loc, open_sound_powered, 100, 1) @@ -972,9 +972,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/lock(var/forced=0) if(locked) return 0 - if (operating && !forced) return 0 - src.locked = 1 for(var/mob/M in range(1,src)) M.show_message("You hear a click from the bottom of the door.", 2) @@ -984,10 +982,8 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/unlock(var/forced=0) if(!src.locked) return - if (!forced) if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return - src.locked = 0 for(var/mob/M in range(1,src)) M.show_message("You hear a click from the bottom of the door.", 2) @@ -1081,6 +1077,8 @@ About the new airlock wires panel: update_icon() /obj/machinery/door/airlock/proc/prison_open() + if (bracer) + return src.unlock() src.open() src.lock() diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm new file mode 100644 index 00000000000..9b261401fe7 --- /dev/null +++ b/code/game/objects/items/devices/magnetic_lock.dm @@ -0,0 +1,323 @@ +#define STATUS_INACTIVE 0 +#define STATUS_ACTIVE 1 +#define STATUS_BROKEN 2 + +#define LAYER_ATTACHED 3.2 +#define LAYER_NORMAL 3 + +/obj/item/device/magnetic_lock + name = "magnetic door lock" + desc = "A large, ID locked device used for completely locking down airlocks." + icon = 'icons/obj/magnetic_locks/centcom.dmi' + icon_state = "inactive" + w_class = 3 + req_access = list(103) + health = 90 + + var/department = "CENTCOM" + var/status = 0 + var/constructionstate = 0 + var/drainamount = 20 + var/obj/machinery/door/airlock/target = null + var/obj/item/weapon/cell/powercell + +/obj/item/device/magnetic_lock/security + icon = 'icons/obj/magnetic_locks/security.dmi' + department = "Security" + req_access = list(1) + +/obj/item/device/magnetic_lock/engineering + icon = 'icons/obj/magnetic_locks/engineering.dmi' + department = "Engineering" + req_access = null + req_one_access = list(11, 24) + +/obj/item/device/magnetic_lock/New() + ..() + + powercell = new /obj/item/weapon/cell/high() + +/obj/item/device/magnetic_lock/examine() + ..() + + if (status == STATUS_BROKEN) + usr << "It looks broken!" + else + if (powercell) + var/power = round(powercell.charge / powercell.maxcharge * 100) + usr << "\blue The powercell is at [power]% charge." + else + usr << "\red It has no powercell to power it!" + +/obj/item/device/magnetic_lock/attack_hand(var/mob/user) + if (status == STATUS_ACTIVE) + ui_interact(user) + else + ..() + +/obj/item/device/magnetic_lock/bullet_act(var/obj/item/projectile/Proj) + takedamage(Proj.damage) + ..() + +/obj/item/device/magnetic_lock/attackby(var/obj/item/I, var/mob/user) + if (status == STATUS_BROKEN) + user << "[src] is broken beyond repair!" + return + + if (istype(I, /obj/item/weapon) && user.a_intent == "hurt") + if (I.force >= 8) + user.visible_message("[user] bashes [src] with [I]!", "You strike [src] with [I], damaging it!") + takedamage(I.force) + return + else + user.visible_message("[user] hits [src] with [I] to no visible effect.", "You hit [src] with [I], but it appears to have no effect.") + return + + switch (constructionstate) + if (0) + if (istype(I, /obj/item/weapon/card/emag)) + var/obj/item/weapon/card/emag/emagcard = I + emagcard.uses-- + visible_message("[src] sparks and falls off the door!", "You emag [src], frying its circuitry[status == STATUS_ACTIVE ? " and making it drop onto the floor" : ""]!") + + setstatus(STATUS_BROKEN) + return + + if (status == STATUS_ACTIVE && istype(I, /obj/item/weapon/card/id)) + if (check_access(I) && !constructionstate) + user << "You swipe your [I] through [src], making it drop onto the floor with a thud." + setstatus(STATUS_INACTIVE) + return + else if (constructionstate) + user << "You cannot swipe your [I] through [src] with it partially dismantled!" + return + else + user << "A red light flashes on [src] as you swipe your [I] through it." + flick("deny",src) + return + + if (istype(I, /obj/item/weapon/screwdriver)) + user << "You unfasten and remove the plastic cover from [src], revealing a thick metal shell." + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + setconstructionstate(1) + return + + if (1) + if (istype(I, /obj/item/weapon/screwdriver)) + user << "You put the metal cover of back onto [src], and screw it tight." + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + setconstructionstate(0) + return + if (istype(I, /obj/item/weapon/cell)) + user.drop_item() + I.loc = src + powercell = I + return + if (istype(I, /obj/item/weapon/crowbar)) + user << "You remove \the [powercell] from \the [src]." + powercell.loc = loc + powercell = null + return + if (istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if (WT.remove_fuel(1, user)) + user.visible_message("[user] starts welding through the metal shell of [src].", "You start welding through the metal covering of [src]") + playsound(loc, 'sound/items/Welder.ogg', 50, 1) + if (do_after(user, 25)) + user << "You are able to weld through the metal shell of [src]." + setconstructionstate(2) + return + if (2) + if (istype(I, /obj/item/weapon/crowbar)) + user << "You pry off the metal covering from [src]." + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + setconstructionstate(3) + return + if (3) + if (istype(I, /obj/item/weapon/wirecutters)) + user << "You cut the wires connecting the [src]'s magnets to their powersupply, [target ? "making the device fall off [target] and rendering it unusable." : "rendering the device unusable."]" + playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) + setconstructionstate(4) + return + +/obj/item/device/magnetic_lock/process() + if (powercell && powercell.charge > drainamount) + powercell.charge -= drainamount + else + if (powercell) + powercell.charge = 0 + visible_message("[src] beeps loudly and falls off \the [target]; its powercell having run out of power.") + setstatus(STATUS_INACTIVE) + +/obj/item/device/magnetic_lock/proc/attachto(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob) + if (status == STATUS_BROKEN) + user << "[src] is damaged beyond repair! It cannot be used!" + return + + if (!newtarget.density || newtarget.operating) + user << "[newtarget] must be closed before you can attach [src] to it!" + return + + if (newtarget.p_open) + user << "You must close [newtarget]'s maintenance panel before attaching [src] to it!" + return + + user.visible_message("[user] starts mounting [src] onto [newtarget].", "You begin mounting [src] onto [newtarget].") + if (do_after(user, 35, 1)) + if (status == STATUS_BROKEN) + user << "[src] is damaged beyond repair! It cannot be used!" + return + + if (!newtarget.density) + user << "[newtarget] must be closed before you can attach [src] to it!" + return + + if (newtarget.p_open) + user << "You must close [newtarget]'s maintenance panel before attaching [src] to it!" + return + + user.visible_message("[user] attached [src] onto [newtarget] and flicks it on. The magnetic lock now seals [newtarget].", "You attached [src] onto [newtarget] and switched on the magnetic lock.") + user.drop_item() + + setstatus(STATUS_ACTIVE, newtarget) + return + +/obj/item/device/magnetic_lock/proc/setstatus(var/newstatus, var/obj/machinery/door/airlock/newtarget as obj) + switch (newstatus) + if (STATUS_INACTIVE) + if (status != STATUS_ACTIVE) + return + if (!target) + return + + detach() + icon_state = "inactive" + status = newstatus + + if (STATUS_ACTIVE) + if (status != STATUS_INACTIVE) + return + if (!newtarget) + return + + attach(newtarget) + icon_state = "active" + status = newstatus + + if (STATUS_BROKEN) + spark() + + if (target) + var/playflick = 1 + if (constructionstate) + playflick = 0 + + detach(playflick) + + icon_state = "broken" + status = newstatus + +/obj/item/device/magnetic_lock/proc/setconstructionstate(var/newstate) + constructionstate = newstate + if (newstate == 0) + if (status == STATUS_ACTIVE) + icon_state = "active" + else + icon_state = "inactive" + else if (newstate == 2) + flick("deconstruct_2_anim", src) + else if (newstate == 4) + setstatus(STATUS_BROKEN) + else + icon_state = "deconstruct_[constructionstate]" + +/obj/item/device/magnetic_lock/proc/detach(var/playflick = 1) + if (target) + + if (playflick) + spawn(-15) flick("release", src) + + adjustsprite(null) + layer = LAYER_NORMAL + + target.bracer = null + + processing_objects.Remove(src) + + anchored = 0 + +/obj/item/device/magnetic_lock/proc/attach(var/obj/machinery/door/airlock/newtarget as obj) + adjustsprite(newtarget) + layer = LAYER_ATTACHED + flick("deploy", src) + + newtarget.bracer = src + target = newtarget + + processing_objects.Add(src) + + anchored = 1 + +/obj/item/device/magnetic_lock/proc/adjustsprite(var/obj/target as obj) + if (target) + switch (get_dir(src, target)) + if (NORTH) + pixel_x = 0 + pixel_y = 32 + if (NORTHEAST) + pixel_x = 32 + pixel_y = 32 + if (EAST) + pixel_x = 32 + pixel_y = 0 + if (SOUTHEAST) + pixel_x = 32 + pixel_y = -32 + if (SOUTH) + pixel_x = 0 + pixel_y = -32 + if (SOUTHWEST) + pixel_x = -32 + pixel_y = -32 + if (WEST) + pixel_x = -32 + pixel_y = 0 + if (NORTHWEST) + pixel_x = -32 + pixel_y = 32 + else + pixel_x = 0 + pixel_y = 0 + +/obj/item/device/magnetic_lock/proc/takedamage(var/damage) + health -= damage + + if (damage >= 40 && prob(50)) + health = 0 + + if (health <= 0) + visible_message("[src] sparks[target ? " and falls off of \the [target]!" : "!"] It is now completely unusable!") + setstatus(STATUS_BROKEN) + return + + if (prob(50)) + spark() + +/obj/item/device/magnetic_lock/proc/spark() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + + if (target) + s.set_up(5, 1, target) + else + s.set_up(5, 1, src) + + s.start() + spawn(5) + del(s) + +#undef STATUS_INACTIVE +#undef STATUS_ACTIVE +#undef STATUS_BROKEN + +#undef LAYER_ATTACHED +#undef LAYER_NORMAL From 6c01ad27c2f2e35c1a6be9029982a08f1453edf7 Mon Sep 17 00:00:00 2001 From: Mahzel Date: Wed, 13 Jan 2016 23:03:38 +0100 Subject: [PATCH 2/5] Maglock icons >< --- icons/obj/magnetic_locks/centcom.dmi | Bin 0 -> 3364 bytes icons/obj/magnetic_locks/engineering.dmi | Bin 0 -> 1494 bytes icons/obj/magnetic_locks/security.dmi | Bin 0 -> 3607 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/obj/magnetic_locks/centcom.dmi create mode 100644 icons/obj/magnetic_locks/engineering.dmi create mode 100644 icons/obj/magnetic_locks/security.dmi diff --git a/icons/obj/magnetic_locks/centcom.dmi b/icons/obj/magnetic_locks/centcom.dmi new file mode 100644 index 0000000000000000000000000000000000000000..97a977941acaeea6a14e568eb48645d27937b190 GIT binary patch literal 3364 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 literal 0 HcmV?d00001 diff --git a/icons/obj/magnetic_locks/engineering.dmi b/icons/obj/magnetic_locks/engineering.dmi new file mode 100644 index 0000000000000000000000000000000000000000..49323f4a3778d0166c52ab633a0159e5d7dc7e12 GIT binary patch literal 1494 zcmV;{1u6Q8P)9v&XE0N_16J@C^2-~a#sdEmZ>3Q9^!V`F3g#sHC# zkyXe5Ha0d~TwGpWUKhgv@TUOqbO63#3Q$l`R#sNPz`&*{N^}4K00DGTPE!Ct=GbNc z0078(R9JLGWpiV4X>fFDZ*Bkpc$}4z&klkx493sfQ!H>LM*bbW7>MB@uRtbLSsWYL zCWg0nf-w<6LwaeyeEl_P>ymwX$a0b#Gu(mFObW6i(PoR$omHl`MHpaI1H05_EVQ8p zZ0ayUOT#*FFshi+R`M}AE84)Azl|p)uOR-~Dk!DUM%_wN_^aH(DtEY!T~NWA`IgA4 zz-j-Ky&*8-QnpiC%VobXH26ZiBKCeD6>y+>Y4iS+8Gn#xiN8^+wStYjJwgy*SDeVj1U4d z1XrsC5kfHK^@zs28r6W3*B*oG_1cuzegYx!oI^CfQt!e|+?ev^8_*tu<_4?s!qoP%cfwr@|gLXl7UIR{OfdD=m9 ze2?*+cJQsAcF^qi?c1qsDTN|G>8Blh>!%$|`Z)*9w(CRaJJP_eP54C%OgwAg+;!*J zb)}+@Xg3URr(qcG<Tci#ED!HS!& z-Sb`7jm!q#`MkmJk-27`$#VjreBR(s-bd73%S@gV0OivbW7bFCcFp6NPYBHaL+N++ zFRK*;AmmH9s2K;ehbC=B9J7{qeEFZB;P zKIiY#X_U$5r_-n+-pyJ*M7ix{y(=LKy0z+W?eWeoT}L}v5@ z*!=zx{Qxw-ul+#n2YmDH*9R=MetBHo^5fTBfcK6Y-l2n^GQdB@V4ZE&aMxNuHDE2E_5;@We(eXGhqrV3fm;YS zF8;oTaOLrizFo%LAb5Pi z4O-7Z>hW!T6(CNs)^E4b^7ZXD-g$EY)qr)rU;6BHwDaCC5VP{4wKhuf}y>RGB==YNZcDx$KPl?fdO!Sj|M!yM+2STqX7?J z(O4kOV literal 0 HcmV?d00001 diff --git a/icons/obj/magnetic_locks/security.dmi b/icons/obj/magnetic_locks/security.dmi new file mode 100644 index 0000000000000000000000000000000000000000..00a820fbb8751161e8bc093fa6a23db1f9cdc1ad GIT binary patch literal 3607 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 Dc<(S~ literal 0 HcmV?d00001 From 7c3fc0e7010362f14da29560fdd900a4d2718ed4 Mon Sep 17 00:00:00 2001 From: Mahzel Date: Wed, 13 Jan 2016 23:05:29 +0100 Subject: [PATCH 3/5] dme update --- baystation12.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/baystation12.dme b/baystation12.dme index af6e369282f..68400f47455 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -573,6 +573,7 @@ #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" #include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\magnetic_lock.dm" #include "code\game\objects\items\devices\megaphone.dm" #include "code\game\objects\items\devices\modkit.dm" #include "code\game\objects\items\devices\multitool.dm" From 638f955420a3aac22dc86241e67411fb24e77b90 Mon Sep 17 00:00:00 2001 From: Mahzel Date: Wed, 13 Jan 2016 23:28:04 +0100 Subject: [PATCH 4/5] Cell tracker --- code/game/machinery/doors/brigdoors.dm | 39 +++++++++++++++++++++++++- code/modules/clothing/under/color.dm | 16 +++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 27ce595a779..8bbf9035aed 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -26,6 +26,7 @@ var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing var/picture_state // icon_state of alert picture, if not displaying text/numbers var/list/obj/machinery/targets = list() + var/list/obj/item/clothing/under/color/orange/uniforms = list() var/timetoset = 0 // Used to set releasetime upon starting the timer maptext_height = 26 @@ -47,6 +48,10 @@ if(C.id == src.id) targets += C + or(var/obj/item/clothing/under/color/orange/D in world) + if(D.id == id) + uniforms += D + if(targets.len==0) stat |= BROKEN update_icon() @@ -68,6 +73,8 @@ if(timeleft > 1e5) src.releasetime = 0 + if(timeleft < 30 && !alerted) + alertuniforms() if(world.timeofday > src.releasetime) src.timer_end() // open doors, reset timer, clear status screen @@ -152,6 +159,35 @@ /obj/machinery/door_timer/attack_ai(var/mob/user as mob) return src.attack_hand(user) +// Alert the uniform wearers that their timer is about to end up +/obj/machinery/door_timer/proc/alertuniforms() + if(stat & (NOPOWER|BROKEN)) return + if(!uniforms.len) + alerted = 1 + return + + for(var/obj/item/clothing/under/color/orange/D in uniforms) + if(!ishuman(D.loc)) continue + D.loc << "A speaker in the collar of your suit pings:\n\blue Your cell timer will expire in 30 seconds or less. Please go to your cell to speed up processing." + + alerted = 1 + + return + +// Alert the uniform wearers that they are needed at their cell +/obj/machinery/door_timer/proc/summonuniforms() + if(stat & (NOPOWER|BROKEN)) return + if(spamcheck) return + if(!uniforms.len) return + for(var/obj/item/clothing/under/color/orange/D in uniforms) + if(!ishuman(D.loc)) continue + D.loc << "A speaker in the collar of your suit pings:\n\red You have been summoned to your cell!" + + spamcheck = 1 + spawn(30) + spamcheck = 0 + + return //Allows humans to use door_timer //Opens dialog window when someone clicks on door timer @@ -249,7 +285,8 @@ if(href_list["change"]) src.timer_start() - + if(href_list["summon"]) + summonuniforms() src.add_fingerprint(usr) src.updateUsrDialog() src.update_icon() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 725f51b1ef4..aff37621b1f 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -38,6 +38,22 @@ has_sensor = 2 sensor_mode = 3 +/obj/item/clothing/under/color/orange/cell1 + desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 1\" marked on it." + id = "Cell 1" + +/obj/item/clothing/under/color/orange/cell2 + desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 2\" marked on it." + id = "Cell 2" + +/obj/item/clothing/under/color/orange/cell3 + desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 3\" marked on it." + id = "Cell 3" + +/obj/item/clothing/under/color/orange/cell4 + desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 4\" marked on it." + id = "Cell 4" + /obj/item/clothing/under/color/pink name = "pink jumpsuit" icon_state = "pink" From dbf7fc178fcb89c6a0c2ecf55cd4b06f4134befc Mon Sep 17 00:00:00 2001 From: Mahzel Date: Wed, 13 Jan 2016 23:37:21 +0100 Subject: [PATCH 5/5] Didn't paste? Oo --- code/game/machinery/doors/brigdoors.dm | 4 +++- code/modules/clothing/under/color.dm | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 8bbf9035aed..edce2e34d11 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -28,6 +28,8 @@ var/list/obj/machinery/targets = list() var/list/obj/item/clothing/under/color/orange/uniforms = list() var/timetoset = 0 // Used to set releasetime upon starting the timer + var/alerted = 0 + var/spamcheck = 0 maptext_height = 26 maptext_width = 32 @@ -48,7 +50,7 @@ if(C.id == src.id) targets += C - or(var/obj/item/clothing/under/color/orange/D in world) + for(var/obj/item/clothing/under/color/orange/D in world) if(D.id == id) uniforms += D diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index aff37621b1f..acc7f557087 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -37,6 +37,7 @@ worn_state = "orange" has_sensor = 2 sensor_mode = 3 + var/id /obj/item/clothing/under/color/orange/cell1 desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position.\nThis one has \"Cell 1\" marked on it."