diff --git a/baystation12.dme b/baystation12.dme index 38710d30f7c..3b1b41b84db 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -141,6 +141,7 @@ #define FILE_DIR "code/WorkInProgress/mapload" #define FILE_DIR "code/WorkInProgress/Mini" #define FILE_DIR "code/WorkInProgress/organs" +#define FILE_DIR "code/WorkInProgress/SkyMarshal" #define FILE_DIR "code/WorkInProgress/virus2" #define FILE_DIR "code/WorkInProgress/virus2/Disease2" #define FILE_DIR "html" @@ -981,6 +982,7 @@ #include "code\WorkInProgress\mapload\dmm_suite.dm" #include "code\WorkInProgress\mapload\reader.dm" #include "code\WorkInProgress\Mini\customitems.dm" +#include "code\WorkInProgress\SkyMarshal\policetape.dm" #include "code\WorkInProgress\virus2\Prob.dm" #include "code\WorkInProgress\virus2\Disease2\analyser.dm" #include "code\WorkInProgress\virus2\Disease2\base.dm" diff --git a/code/WorkInProgress/SkyMarshal/coatrack.dm b/code/WorkInProgress/SkyMarshal/coatrack.dm new file mode 100644 index 00000000000..0807dce7448 --- /dev/null +++ b/code/WorkInProgress/SkyMarshal/coatrack.dm @@ -0,0 +1,96 @@ +/obj/machinery/coatrack/attack_hand(mob/user as mob) + switch(alert("What do you want from the coat rack?",,"Coat","Hat")) + if("Coat") + if(coat) + if(!user.get_active_hand()) + user.put_in_hand(coat) + else + coat.loc = get_turf(user) + coat = null + if(!hat) + icon_state = "coatrack0" + else + icon_state = "coatrack1" + return + else + user << "\blue There is no coat to take!" + return + if("Hat") + if(hat) + if(!user.get_active_hand()) + user.put_in_hand(hat) + else + hat.loc = get_turf(user) + hat = null + if(!coat) + icon_state = "coatrack0" + else + icon_state = "coatrack2" + return + else + user << "\blue There is no hat to take!" + return + user << "Something went wrong." + return + +/obj/machinery/coatrack/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/obj/item/I = user.equipped() + if ( istype(I,/obj/item/clothing/head/det_hat) && !hat) + user.drop_item() + I.loc = src + hat = I + if(!coat) + icon_state = "coatrack1" + else + icon_state = "coatrack3" + for(var/mob/M in viewers(src, null)) + if(M.client) + M.show_message(text("\blue [user] puts his hat onto the rack."), 2) + return + if ( istype(I,/obj/item/clothing/suit/storage/det_suit) && !coat) + user.drop_item() + I.loc = src + coat = I + if(!hat) + icon_state = "coatrack2" + else + icon_state = "coatrack3" + for(var/mob/M in viewers(src, null)) + if(M.client) + M.show_message(text("\blue [user] puts his coat onto the rack."), 2) + return + if ( istype(I,/obj/item/clothing/head/det_hat) && hat) + user << "There's already a hat on the rack!" + return ..() + if ( istype(I,/obj/item/clothing/suit/storage/det_suit) && coat) + user << "There's already a coat on the rack!" + return ..() + user << "The coatrack wants none of what you offer." + return ..() + + +/obj/machinery/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if ( istype(mover,/obj/item/clothing/head/det_hat) && !hat) + mover.loc = src + hat = mover + if(!coat) + icon_state = "coatrack1" + else + icon_state = "coatrack3" + for(var/mob/M in viewers(src, null)) + if(M.client) + M.show_message(text("\blue The hat lands perfectly atop its hanger!"), 2) + return 0 + if ( istype(mover,/obj/item/clothing/suit/storage/det_suit) && !coat) + mover.loc = src + coat = mover + if(!hat) + icon_state = "coatrack2" + else + icon_state = "coatrack3" + for(var/mob/M in viewers(src, null)) + if(M.client) + M.show_message(text("\blue The coat lands perfectly atop its hanger!"), 2) + return 0 + else + return 0 \ No newline at end of file diff --git a/code/WorkInProgress/SkyMarshal/policetape.dm b/code/WorkInProgress/SkyMarshal/policetape.dm new file mode 100644 index 00000000000..a130670a6e9 --- /dev/null +++ b/code/WorkInProgress/SkyMarshal/policetape.dm @@ -0,0 +1,164 @@ +/obj/item/policetaperoll/attack_self(mob/user as mob) + if(icon_state == "rollstart") + tapestartx = src.loc.x + tapestarty = src.loc.y + tapestartz = src.loc.z + usr << "\blue You place the first end of the police tape." + icon_state = "rollstop" + else + tapeendx = src.loc.x + tapeendy = src.loc.y + tapeendz = src.loc.z + var/tapetest = 0 + if(tapestartx == tapeendx && tapestarty > tapeendy && tapestartz == tapeendz) + for(var/Y=tapestarty,Y>=tapeendy,Y--) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/Y=tapestarty,Y>=tapeendy,Y--) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "vertical") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) + P.loc = locate(tapestartx,Y,tapestartz) + P.icon_state = "vertical" + usr << "\blue You finish placing the police tape." //Git Test + + if(tapestartx == tapeendx && tapestarty < tapeendy && tapestartz == tapeendz) + for(var/Y=tapestarty,Y<=tapeendy,Y++) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/Y=tapestarty,Y<=tapeendy,Y++) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "vertical") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) + P.loc = locate(tapestartx,Y,tapestartz) + P.icon_state = "vertical" + usr << "\blue You finish placing the police tape." + + if(tapestarty == tapeendy && tapestartx > tapeendx && tapestartz == tapeendz) + for(var/X=tapestartx,X>=tapeendx,X--) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/X=tapestartx,X>=tapeendx,X--) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "horizontal") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) + P.loc = locate(X,tapestarty,tapestartz) + P.icon_state = "horizontal" + usr << "\blue You finish placing the police tape." + + if(tapestarty == tapeendy && tapestartx < tapeendx && tapestartz == tapeendz) + for(var/X=tapestartx,X<=tapeendx,X++) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/X=tapestartx,X<=tapeendx,X++) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "horizontal") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) + P.loc = locate(X,tapestarty,tapestartz) + P.icon_state = "horizontal" + usr << "\blue You finish placing the police tape." + + if(tapestarty != tapeendy && tapestartx != tapeendx) + usr << "\blue Police tape can only be laid horizontally or vertically." + icon_state = "rollstart" + +/obj/item/policetape/Bumped(M as mob) + if(src.allowed(M)) + var/turf/T = get_turf(src) + M:loc = T + +/obj/item/policetape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + + if ((mover.flags & 2 || istype(mover, /obj/effect/meteor) || mover.throwing == 1) ) + return 1 + else + return 0 + +/obj/item/policetape/attackby(obj/item/weapon/W as obj, mob/user as mob) + breaktape(W, user) + +/obj/item/policetape/attack_hand(mob/user as mob) + breaktape(null, user) + +/obj/item/policetape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) + if(!W || !is_cut(W)) + user << "You can't break the tape with that!" + return + user.show_viewers(text("\blue [] breaks the police tape!", user)) + var/OX = src.x + var/OY = src.y + if(src.icon_state == "horizontal") + var/N = 0 + var/X = OX + 1 + var/turf/T = src.loc + while(N != 1) + N = 1 + T = locate(X,T.y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "horizontal") + del(P) + X += 1 + + X = OX - 1 + N = 0 + while(N != 1) + N = 1 + T = locate(X,T.y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "horizontal") + del(P) + X -= 1 + + if(src.icon_state == "vertical") + var/N = 0 + var/Y = OY + 1 + var/turf/T = src.loc + while(N != 1) + N = 1 + T = locate(T.x,Y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "vertical") + del(P) + Y += 1 + + Y = OY - 1 + N = 0 + while(N != 1) + N = 1 + T = locate(T.x,Y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "vertical") + del(P) + Y -= 1 + + del(src) + return diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm index 673c81bbb78..9b2d62cb00e 100644 --- a/code/WorkInProgress/detective_work.dm +++ b/code/WorkInProgress/detective_work.dm @@ -135,7 +135,8 @@ obj/machinery/computer/forensic_scanning if(istype(I, /obj/item/weapon/evidencebag)) scanning = I.contents[1] scanning.loc = src - I.underlays -= scanning + I.underlays = null + I.icon_state = "evidenceobj" else scanning = I M.drop_item() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 0bb5f8dd060..668a0f5fe9f 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -22,6 +22,28 @@ proc/initialize() +/obj/item/policetaperoll + name = "police tape roll" + desc = "A roll of police tape used to block off crime scenes from the public." + icon = 'policetape.dmi' + icon_state = "rollstart" + flags = FPRINT + var/tapestartx = 0 + var/tapestarty = 0 + var/tapestartz = 0 + var/tapeendx = 0 + var/tapeendy = 0 + var/tapeendz = 0 + +/obj/item/policetape + name = "police tape" + desc = "A length of police tape. Do not cross." + icon = 'policetape.dmi' + anchored = 1 + density = 1 + throwpass = 1 + req_access = list(access_security) + /obj/structure/signpost icon = 'stationobjs.dmi' icon_state = "signpost" @@ -436,10 +458,6 @@ var/obj/structure/crematorium/connected = null anchored = 1.0 - - - - /obj/structure/cable level = 1 anchored =1 diff --git a/code/defines/obj/clothing/gloves.dm b/code/defines/obj/clothing/gloves.dm index 55315576777..8de02f5d1ae 100644 --- a/code/defines/obj/clothing/gloves.dm +++ b/code/defines/obj/clothing/gloves.dm @@ -37,6 +37,23 @@ ce color = "chief" //Exists for washing machines. Is not different from black gloves in any way. +/obj/item/clothing/gloves/detective + desc = "Made of well worn leather, these gloves are comfortable, useful, and stylish!" + name = "The Detective's Gloves" + icon_state = "black" + item_state = "bgloves" + color="brown" + siemens_coefficient = 0.30 + protective_temperature = 1100 + +/obj/item/clothing/gloves/hos + desc = "These gloves belong to the man in charge of the guns." + name = "Head of Security's Gloves" + icon_state = "black" + item_state = "bgloves" + color="brown" + siemens_coefficient = 0.30 + protective_temperature = 1100 /obj/item/clothing/gloves/cyborg desc = "beep boop borp" @@ -145,7 +162,6 @@ icon_state = "red" item_state = "redgloves" siemens_coefficient = 0.30 - protective_temperature = 1100 /obj/item/clothing/gloves/rainbow diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm index 15dbf0a4ab4..98e7a3efdeb 100644 --- a/code/defines/obj/machinery.dm +++ b/code/defines/obj/machinery.dm @@ -451,3 +451,13 @@ h_r = 245.0 h_g = 245.0 h_b = 245.0 + +/obj/machinery/coatrack + name = "coatrack" + desc = "A fancy stand for the Detective's coat and hat." + icon_state = "coatrack0" + icon = 'coatrack.dmi' + density = 1 + anchored = 1.0 + var/obj/item/clothing/suit/storage/det_suit/coat + var/obj/item/clothing/head/det_hat/hat \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 67cd8981d04..619fde8125d 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -9,9 +9,10 @@ /proc/is_convertable_to_cult(datum/mind/mind) if(!istype(mind)) return 0 - for(var/obj/item/weapon/implant/loyalty/L in mind.current) + //This makes security unconvertable. *comments out* +/* for(var/obj/item/weapon/implant/loyalty/L in mind.current) if(L && L.implanted) - return 0 + return 0 */ return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index f9463337cc6..72868937048 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -17,7 +17,7 @@ H.equip_if_possible(new /obj/item/device/pda/heads/hos(H), H.slot_belt) // H.equip_if_possible(new /obj/item/clothing/suit/armor/hos(H), H.slot_wear_suit) //We're Bay12, not Goon. We don't need armor 24/7 - H.equip_if_possible(new /obj/item/clothing/gloves/red(H), H.slot_gloves) + H.equip_if_possible(new /obj/item/clothing/gloves/hos(H), H.slot_gloves) H.equip_if_possible(new /obj/item/clothing/head/helmet/HoS(H), H.slot_head) H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack) @@ -71,8 +71,8 @@ if(!H) return 0 H.equip_if_possible(new /obj/item/device/radio/headset/headset_sec(H), H.slot_ears) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back) - H.equip_if_possible(new /obj/item/weapon/storage/box/evidence(H.back), H.slot_in_backpack) H.equip_if_possible(new /obj/item/clothing/under/det(H), H.slot_w_uniform) + H.equip_if_possible(new /obj/item/clothing/suit/storage/det_suit(H), H.slot_wear_suit) H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes) H.equip_if_possible(new /obj/item/device/pda/detective(H), H.slot_belt) H.equip_if_possible(new /obj/item/clothing/head/det_hat(H), H.slot_head) @@ -80,11 +80,11 @@ CIG.light("") H.equip_if_possible(CIG, H.slot_wear_mask) */ //Fuck that thing. --SkyMarshal - H.equip_if_possible(new /obj/item/clothing/gloves/black(H), H.slot_gloves) - H.equip_if_possible(new /obj/item/weapon/storage/fcard_kit(H.back), H.slot_in_backpack) + H.equip_if_possible(new /obj/item/clothing/gloves/detective(H), H.slot_gloves) + H.equip_if_possible(new /obj/item/weapon/storage/box/evidence(H.back), H.slot_in_backpack) H.equip_if_possible(new /obj/item/weapon/fcardholder(H), H.slot_in_backpack) - H.equip_if_possible(new /obj/item/clothing/suit/storage/det_suit(H), H.slot_wear_suit) H.equip_if_possible(new /obj/item/device/detective_scanner(H), H.slot_in_backpack) + H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/drinks/dflask(H.back), H.slot_in_backpack) H.equip_if_possible(new /obj/item/weapon/zippo(H), H.slot_l_store) // H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/candy_corn(H), H.slot_h_store) // No... just no. --SkyMarshal diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm index 9dc558db8ea..196646b9a31 100644 --- a/code/game/objects/closets/secure/security.dm +++ b/code/game/objects/closets/secure/security.dm @@ -53,6 +53,7 @@ new /obj/item/clothing/under/jensen(src) new /obj/item/clothing/suit/armor/hos/jensen(src) new /obj/item/clothing/suit/armor/hos(src) + new /obj/item/clothing/gloves/hos(src) new /obj/item/clothing/head/helmet/HoS/dermal(src) new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/weapon/shield/riot(src) @@ -104,6 +105,7 @@ new /obj/item/clothing/gloves/red(src) new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/weapon/storage/belt/security(src) + new /obj/item/policetaperoll(src) new /obj/item/weapon/flashbang(src) new /obj/item/weapon/pepperspray(src) new /obj/item/device/flash(src) @@ -131,7 +133,7 @@ new /obj/item/clothing/under/det(src) new /obj/item/clothing/suit/det_suit/armor(src) new /obj/item/clothing/suit/storage/det_suit(src) - new /obj/item/clothing/gloves/black(src) + new /obj/item/clothing/gloves/detective(src) new /obj/item/clothing/head/det_hat(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/device/radio/headset/headset_sec(src) @@ -140,7 +142,9 @@ new /obj/item/weapon/clipboard(src) new /obj/item/device/detective_scanner(src) new /obj/item/weapon/pepperspray/small(src) + new /obj/item/policetaperoll(src) new /obj/item/weapon/storage/box/evidence(src) + new /obj/item/weapon/reagent_containers/food/drinks/dflask(src) return diff --git a/code/game/objects/devices/flashlight.dm b/code/game/objects/devices/flashlight.dm index 2d723d933ce..922d6dbe129 100644 --- a/code/game/objects/devices/flashlight.dm +++ b/code/game/objects/devices/flashlight.dm @@ -83,6 +83,7 @@ icon_on = "plight1" icon_off = "plight0" brightness_on = 3 + w_class = 1 @@ -90,7 +91,7 @@ if(!ismob(M)) return user << "\red You stab [M] with the pen." - M << "\red You feel a tiny prick!" +// M << "\red You feel a tiny prick!" M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to stab [M.name] ([M.ckey])") ..() diff --git a/code/game/objects/devices/taperecorder.dm b/code/game/objects/devices/taperecorder.dm index dc9b5b653d8..abb413dea65 100644 --- a/code/game/objects/devices/taperecorder.dm +++ b/code/game/objects/devices/taperecorder.dm @@ -1,5 +1,5 @@ /obj/item/device/taperecorder - desc = "A device that can record up to a minute of dialogue and play it back. It automatically translates the content in playback." + desc = "A device that can record up to an hour of dialogue and play it back. It automatically translates the content in playback." name = "universal recorder" icon_state = "taperecorderidle" item_state = "analyzer" @@ -10,7 +10,9 @@ var/recording = 0.0 var/playing = 0.0 var/timerecorded = 0.0 + var/playsleepseconds = 0.0 var/list/storedinfo = new/list() + var/list/timestamp = new/list() flags = FPRINT | TABLEPASS| CONDUCT throwforce = 2 throw_speed = 4 @@ -19,19 +21,20 @@ /obj/item/device/taperecorder/hear_talk(mob/M as mob, msg) if (recording) var/ending = copytext(msg, length(msg)) + src.timestamp+= src.timerecorded if (M.stuttering) - src.storedinfo += "[M.name] stammers, \"[msg]\"" + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] stammers, \"[msg]\"" return if (M.getBrainLoss() >= 60) - src.storedinfo += "[M.name] gibbers, \"[msg]\"" + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] gibbers, \"[msg]\"" return if (ending == "?") - src.storedinfo += "[M.name] asks, \"[msg]\"" + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] asks, \"[msg]\"" return else if (ending == "!") - src.storedinfo += "[M.name] exclaims, \"[msg]\"" + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] exclaims, \"[msg]\"" return - src.storedinfo += "[M.name] says, \"[msg]\"" + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] [M.name] says, \"[msg]\"" return /obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -60,15 +63,18 @@ set name = "Start Recording" set category = "Object" if(usr.stat) - usr << "Not when you're incapicated." + usr << "Not when you're incapacitated." return if(src.emagged == 1) usr << "\red The tape recorder makes a scratchy noise." return src.icon_state = "taperecorderrecording" - if(src.timerecorded < 60 && src.playing == 0) + if(src.timerecorded < 3600 && src.playing == 0) + usr << "\blue Recording started." src.recording = 1 - for(src.timerecorded, src.timerecorded<60) + src.timestamp+= src.timerecorded + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording started." + for(src.timerecorded, src.timerecorded<3600) if(src.recording == 0) break src.timerecorded++ @@ -80,17 +86,25 @@ usr << "\red Either your tape recorder's memory is full, or it is currently playing back its memory." -/obj/item/device/taperecorder/verb/stop_recording() - set name = "Stop Recording" +/obj/item/device/taperecorder/verb/stop() + set name = "Stop" set category = "Object" if(usr.stat) - usr << "Not when you're incapicated." + usr << "Not when you're incapacitated." return - if (src.recording == 1 || src.playing == 1) + if (src.recording == 1) src.recording = 0 + src.timestamp+= src.timerecorded + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording stopped." + usr << "\blue Recording stopped." + src.icon_state = "taperecorderidle" + return + else if (src.playing == 1) src.playing = 0 - usr << "\blue Stopped." + var/turf/T = get_turf(src) + for(var/mob/O in hearers(world.view-1, T)) + O.show_message("Tape Recorder: Playback stopped.",2) src.icon_state = "taperecorderidle" return else @@ -113,6 +127,7 @@ return else src.storedinfo -= src.storedinfo + src.timestamp -= src.timestamp src.timerecorded = 0 usr << "\blue Memory cleared." return @@ -133,20 +148,32 @@ return src.playing = 1 src.icon_state = "taperecorderplaying" - for(var/i=1,src.timerecorded<60,sleep(10 * (src.timerecorded/src.storedinfo.len))) + usr << "\blue Playing started." + for(var/i=1,src.timerecorded<3600,sleep(10 * (src.playsleepseconds) )) if (src.playing == 0) break if (src.storedinfo.len < i) break var/turf/T = get_turf(src) for(var/mob/O in hearers(world.view-1, T)) - O.show_message("\green Tape Recorder: \"[src.storedinfo[i]]\"",2) + O.show_message("Tape Recorder: [src.storedinfo[i]]",2) + if (src.storedinfo.len < i+1) + src.playsleepseconds = 1 + sleep(10) + T = get_turf(src) + for(var/mob/O in hearers(world.view-1, T)) + O.show_message("Tape Recorder: End of recording.",2) + else + src.playsleepseconds = src.timestamp[i+1] - src.timestamp[i] + if (src.playsleepseconds > 19) + sleep(10) + T = get_turf(src) + for(var/mob/O in hearers(world.view-1, T)) + O.show_message("Tape Recorder: Skipping [src.playsleepseconds] seconds of silence",2) + src.playsleepseconds = 1 i++ src.icon_state = "taperecorderidle" src.playing = 0 - var/turf/T = get_turf(src) - for(var/mob/O in hearers(world.view-1, T)) - O.show_message("Tape Recorder: End playback.",2) if (src.emagged == 1.0) for(var/mob/O in hearers(world.view-1, get_turf(src))) O.show_message("Tape Recorder: This tape recorder will self destruct in 5",2) @@ -163,4 +190,67 @@ for(var/mob/O in hearers(world.view-1, get_turf(src))) O.show_message("1",2) sleep(10) - src.explode() \ No newline at end of file + src.explode() + + +/obj/item/device/taperecorder/verb/print_transcript() + set name = "Print Transcript" + set category = "Object" + + if (src.recording == 1 || src.playing == 1) + usr << "\red You can't print the transcript while playing or recording!" + return + usr << "\blue Transcript printed." + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) + var/t1 = "Transcript:

" + for(var/i=1,src.storedinfo.len >= i,i++) + t1 += "[src.storedinfo[i]]
" + P.info = t1 + P.name = "paper- 'Transcript'" + + +/obj/item/device/taperecorder/attack_self(mob/user) + if(src.recording == 0 && src.playing == 0) + if(usr.stat) + usr << "Not when you're incapacitated." + return + if(src.emagged == 1) + usr << "\red The tape recorder makes a scratchy noise." + return + src.icon_state = "taperecorderrecording" + if(src.timerecorded < 3600 && src.playing == 0) + usr << "\blue Recording started." + src.recording = 1 + src.timestamp+= src.timerecorded + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording started." + for(src.timerecorded, src.timerecorded<3600) + if(src.recording == 0) + break + src.timerecorded++ + sleep(10) + src.recording = 0 + src.icon_state = "taperecorderidle" + return + else + usr << "\red Either your tape recorder's memory is full, or it is currently playing back its memory." + else + if(usr.stat) + usr << "Not when you're incapacitated." + return + if (src.recording == 1) + src.recording = 0 + src.timestamp+= src.timerecorded + src.storedinfo += "\[[time2text(src.timerecorded*10,"mm:ss")]\] Recording stopped." + usr << "\blue Recording stopped." + src.icon_state = "taperecorderidle" + return + else if (src.playing == 1) + src.playing = 0 + var/turf/T = get_turf(src) + for(var/mob/O in hearers(world.view-1, T)) + O.show_message("Tape Recorder: Playback stopped.",2) + src.icon_state = "taperecorderidle" + return + else + usr << "\red Stop what?" + return \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 118b89ccd7d..0183dcc26d3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -466,3 +466,25 @@ istype(W, /obj/item/weapon/reagent_containers/syringe) || \ istype(W, /obj/item/weapon/kitchen/utensil/fork) && W.icon_state != "forkloaded" \ ) + +/proc/is_cut(obj/item/W as obj) + return ( \ + istype(W, /obj/item/weapon/wirecutters) || \ + istype(W, /obj/item/weapon/circular_saw) || \ + istype(W, /obj/item/weapon/melee/energy/sword) && W:active || \ + istype(W, /obj/item/weapon/melee/energy/blade) || \ + istype(W, /obj/item/weapon/shovel) || \ + istype(W, /obj/item/weapon/kitchenknife) || \ + istype(W, /obj/item/weapon/butch) || \ + istype(W, /obj/item/weapon/scalpel) || \ + istype(W, /obj/item/weapon/kitchen/utensil/knife) || \ + istype(W, /obj/item/weapon/shard) \ + ) + +/proc/is_burn(obj/item/W as obj) + return ( \ + istype(W, /obj/item/weapon/weldingtool) && W:welding || \ + istype(W, /obj/item/weapon/zippo) && W:lit || \ + istype(W, /obj/item/weapon/match) && W:lit || \ + istype(W, /obj/item/clothing/mask/cigarette) && W:lit \ + ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/evidence.dm b/code/game/objects/items/weapons/evidence.dm index 1519f563075..0dd4243b75d 100644 --- a/code/game/objects/items/weapons/evidence.dm +++ b/code/game/objects/items/weapons/evidence.dm @@ -8,6 +8,7 @@ desc = "An empty evidence bag." icon = 'storage.dmi' icon_state = "evidenceobj" + w_class = 1 /* buggy and stuff /obj/item/weapon/evidencebag/attackby(obj/item/weapon/O, mob/user as mob) @@ -23,14 +24,30 @@ if(!(O && istype(O)) || O.anchored == 1) user << "You can't put that inside the [src]!" return ..() + if(O in user) + user << "You are wearing that." + return if(src.contents.len > 0) user << "The [src] already has something inside it." return ..() + if(istype(O.loc, /obj/item/weapon/storage)) + user << "This is broke as hell." + return +/* var/obj/item/weapon/storage/U = O.loc + w_class = O.w_class + for(var/i, i < U.contents.len, i++) + if(O in U.contents[i]) + U.contents[i] = null + O.loc = src + continue*/ user << "You put the [O] inside the [src]." - O.loc = src icon_state = "evidence" src.underlays += O desc = "An evidence bag containing \a [O]. [O.desc]" + O.loc = src + w_class = O.w_class + return + /obj/item/weapon/evidencebag/attack_self(mob/user as mob) if (src.contents.len > 0) @@ -38,9 +55,13 @@ user << "You take the [I] out of the [src]." I.loc = user.loc src.underlays -= I - icon_state = "evidenceobj" + w_class = 1 + src.icon_state = "evidenceobj" + desc = "An empty evidence bag." else - user << "The [src] is empty." + user << "[src] is empty." + src.icon_state = "evidenceobj" + return /obj/item/weapon/storage/box/evidence name = "evidence bag box" @@ -51,7 +72,7 @@ new /obj/item/weapon/evidencebag(src) new /obj/item/weapon/evidencebag(src) new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) - new /obj/item/weapon/evidencebag(src) + new /obj/item/weapon/f_card(src) + new /obj/item/weapon/f_card(src) ..() return \ No newline at end of file diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm index 5a51aa630df..7fb560776fc 100644 --- a/code/game/objects/storage/belt.dm +++ b/code/game/objects/storage/belt.dm @@ -116,7 +116,6 @@ "/obj/item/ammo_magazine", "/obj/item/weapon/reagent_containers/food/snacks/donut", "/obj/item/weapon/reagent_containers/food/snacks/jellydonut", - "/obj/item/device/radio", "/obj/item/device/detective_scanner", "/obj/item/device/pda", @@ -131,5 +130,6 @@ "/obj/item/weapon/camera_test", "/obj/item/weapon/cigpacket", "/obj/item/weapon/zippo", - "/obj/item/device/taperecorder" + "/obj/item/device/taperecorder", + "/obj/item/weapon/evidencebag" ) \ No newline at end of file diff --git a/code/game/throwing.dm b/code/game/throwing.dm index 12e7696f912..2311cd69b32 100644 --- a/code/game/throwing.dm +++ b/code/game/throwing.dm @@ -96,11 +96,12 @@ src.throw_impact(A) src.throwing = 0 if(isobj(A)) - if(A.density) // **TODO: Better behaviour for windows - // which are dense, but shouldn't always stop movement + if(A.density && !A.throwpass) // **TODO: Better behaviour for windows + // which are dense, but shouldn't always stop movement src.throw_impact(A) src.throwing = 0 +/atom/var/throwpass = 0 /atom/proc/throw_impact(atom/hit_atom) if(istype(hit_atom,/mob/living)) var/mob/living/M = hit_atom diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 924ab5c62a2..8e365f061fa 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1882,16 +1882,26 @@ if(istype(M, /mob/living/carbon/alien)) dat += "Alien" - if(M.mind && M.mind.assigned_role) // Adds a column to Player Panel that shows their current job. + if(M.mind && M.mind.assigned_role && istype(M, /mob/living/carbon/human)) // Adds a column to Player Panel that shows their current job. var/mob/living/carbon/human/H = M + if (H.wear_id) - var/obj/item/weapon/card/id/id = H.wear_id + var/obj/item/weapon/card/id/id + + if(istype(H.wear_id, /obj/item/weapon/card/id)) + id = H.wear_id // The ID is on the ID slot + else if(istype(H.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/PDA = H.wear_id + id = PDA.id // The ID is contained inside the PDA + if(M.mind.assigned_role == id.assignment) // Polymorph dat += "[M.mind.assigned_role]" else dat += "[M.mind.assigned_role] ([id.assignment])" + else dat += "[M.mind.assigned_role] (No ID)" + else dat += "No Assigned Role" @@ -1960,7 +1970,7 @@ dat += "" - usr << browse(dat, "window=players;size=540x480") + usr << browse(dat, "window=players;size=905x480") /obj/admins/proc/Jobbans() diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index a7c3b224d6a..88231c0d8c0 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -2823,6 +2823,12 @@ icon_state = "flask" volume = 60 +/obj/item/weapon/reagent_containers/food/drinks/dflask + name = "Detective's Flask" + desc = "A well used metal flask with the detective's name etched into it." + icon_state = "dflask" + volume = 60 + /obj/item/weapon/reagent_containers/food/drinks/britcup name = "cup" desc = "A cup with the british flag emblazoned on it." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 59b311bfa84..83a8e37890a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -62,6 +62,8 @@ item_state = "gearharness" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + /obj/item/clothing/suit/storage/armourrigvest name = "armour rig vest" @@ -70,6 +72,8 @@ item_state = "armourrigvest" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 7c24acb92c4..c31eb236599 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -58,7 +58,7 @@ icon_state = "lamp1" base_state = "lamp" fitting = "bulb" - brightness = 5 + brightness = 7 desc = "A desk lamp" light_type = /obj/item/weapon/light/bulb var/switchon = 0 // independent switching for lamps - not controlled by area lightswitch diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 74e10dfad4f..3fd78d2ee53 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/coatrack.dmi b/icons/obj/coatrack.dmi new file mode 100644 index 00000000000..96c1171d82e Binary files /dev/null and b/icons/obj/coatrack.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 81a3cd47a27..446531d6ff4 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/policetape.dmi b/icons/policetape.dmi new file mode 100644 index 00000000000..f2736418da4 Binary files /dev/null and b/icons/policetape.dmi differ diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index 35f9273a646..a98b728112d 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -5356,7 +5356,7 @@ "bYZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/computer/security/telescreen{dir = 8; layer = 4; name = "Singularity Engine Telescreen"; network = "Singularity"; pixel_x = 0; pixel_y = -30},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/engine/engineering) "bZa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/turf/simulated/floor/plating,/area/engine/engineering) "bZb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/turf/simulated/floor/plating,/area/engine/engineering) -"bZc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor/plating,/area/engine/particle_accelerator) +"bZc" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/engine/particle_accelerator) "bZd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = "90Curve"},/turf/simulated/floor/plating,/area/engine/particle_accelerator) "bZe" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area) "bZf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)