diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 1590325df0e..15a969e7a47 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -365,7 +365,7 @@ "aha" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahb" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahc" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) -"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe/HoS{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) +"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos) "ahe" = (/turf/simulated/wall,/area/security/range) "ahf" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/clothing/suit/armor/laserproof,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden) "ahg" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"}) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 460498a874b..e848eec1aca 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -27,131 +27,132 @@ max_w_class = 2 max_combined_w_class = 14 - examine(mob/user) - if(..(user, 1)) - to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) +/obj/item/weapon/storage/secure/examine(mob/user) + if(..(user, 1)) + to_chat(user, text("The service panel is [open ? "open" : "closed"].")) - attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(locked) - if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged)) - emag_act(user, W) +/obj/item/weapon/storage/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(locked) + if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!emagged)) + emag_act(user, W) - if(istype(W, /obj/item/weapon/screwdriver)) - if(do_after(user, 20, target = src)) - src.open =! src.open - user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close"))) - return - if((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1) - src.l_hacking = 1 - if(do_after(usr, 100, target = src)) - if(prob(40)) - src.l_setshort = 1 - src.l_set = 0 - user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1) - sleep(80) - src.l_setshort = 0 - src.l_hacking = 0 - else - user.show_message(text("\red Unable to reset internal memory."), 1) - src.l_hacking = 0 - else src.l_hacking = 0 - return - //At this point you have exhausted all the special things to do when locked - // ... but it's still locked. + if(istype(W, /obj/item/weapon/screwdriver)) + if(do_after(user, 20, target = src)) + open = !open + user.show_message("You [open ? "open" : "close"] the service panel.", 1) return - // -> storage/attackby() what with handle insertion, etc - ..() - - emag_act(user as mob, weapon as obj) - if(!emagged) - emagged = 1 - src.overlays += image('icons/obj/storage.dmi', icon_sparking) - sleep(6) - src.overlays = null - overlays += image('icons/obj/storage.dmi', icon_locking) - locked = 0 - if(istype(weapon, /obj/item/weapon/melee/energy/blade)) - var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) - to_chat(user, "You slice through the lock on [src].") - else - to_chat(user, "You short out the lock on [src].") - return - - - MouseDrop(over_object, src_location, over_location) - if(locked) - src.add_fingerprint(usr) - return - ..() - - - attack_self(mob/user as mob) - user.set_machine(src) - var/dat = text("[]
\n\nLock Status: []",src, (src.locked ? "LOCKED" : "UNLOCKED")) - var/message = "Code" - if((src.l_set == 0) && (!src.emagged) && (!src.l_setshort)) - dat += text("

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
") - if(src.emagged) - dat += text("

\nLOCKING SYSTEM ERROR - 1701") - if(src.l_setshort) - dat += text("

\nALERT: MEMORY SYSTEM ERROR - 6040 201") - message = text("[]", src.code) - if(!src.locked) - message = "*****" - dat += {"


\n>[message]
\n - 1- - 2- - 3
\n - 4- - 5- - 6
\n - 7- - 8- - 9
\n - R- - 0- - E
\n
"} - user << browse(dat, "window=caselock;size=300x280") - - Topic(href, href_list) - ..() - if((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1)) - return - if(href_list["type"]) - if(href_list["type"] == "E") - if((src.l_set == 0) && (length(src.code) == 5) && (!src.l_setshort) && (src.code != "ERROR")) - src.l_code = src.code - src.l_set = 1 - else if((src.code == src.l_code) && (src.emagged == 0) && (src.l_set == 1)) - src.locked = 0 - src.overlays = null - overlays += image('icons/obj/storage.dmi', icon_opened) - src.code = null + if((istype(W, /obj/item/device/multitool)) && (open == 1) && (!l_hacking)) + user.show_message("Now attempting to reset internal memory, please hold.", 1) + l_hacking = 1 + if(do_after(usr, 100, target = src)) + if(prob(40)) + l_setshort = 1 + l_set = 0 + user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) + sleep(80) + l_setshort = 0 + l_hacking = 0 else - src.code = "ERROR" - else - if((href_list["type"] == "R") && (src.emagged == 0) && (!src.l_setshort)) - src.locked = 1 - src.overlays = null - src.code = null - src.close(usr) - else - src.code += text("[]", href_list["type"]) - if(length(src.code) > 5) - src.code = "ERROR" - src.add_fingerprint(usr) - for(var/mob/M in viewers(1, src.loc)) - if((M.client && M.machine == src)) - src.attack_self(M) - return + user.show_message("Unable to reset internal memory.", 1) + l_hacking = 0 + else + l_hacking = 0 + return + //At this point you have exhausted all the special things to do when locked + // ... but it's still locked. return + return ..() + +/obj/item/weapon/storage/secure/emag_act(user as mob, weapon as obj) + if(!emagged) + emagged = 1 + overlays += image('icons/obj/storage.dmi', icon_sparking) + sleep(6) + overlays = null + overlays += image('icons/obj/storage.dmi', icon_locking) + locked = 0 + if(istype(weapon, /obj/item/weapon/melee/energy/blade)) + var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(loc, 'sound/weapons/blade1.ogg', 50, 1) + playsound(loc, "sparks", 50, 1) + to_chat(user, "You slice through the lock on [src].") + else + to_chat(user, "You short out the lock on [src].") + return + + +/obj/item/weapon/storage/secure/MouseDrop(over_object, src_location, over_location) + if(locked) + add_fingerprint(usr) + to_chat(usr, "It's locked!") + return 0 + ..() + +/obj/item/weapon/storage/secure/attack_self(mob/user as mob) + user.set_machine(src) + var/dat = text("[]
\n\nLock Status: []", src, (locked ? "LOCKED" : "UNLOCKED")) + var/message = "Code" + if((l_set == 0) && (!emagged) && (!l_setshort)) + dat += text("

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
") + if(emagged) + dat += text("

\nLOCKING SYSTEM ERROR - 1701") + if(l_setshort) + dat += text("

\nALERT: MEMORY SYSTEM ERROR - 6040 201") + message = text("[]", code) + if(!locked) + message = "*****" + dat += {"


\n>[message]
\n + 1- + 2- + 3
\n + 4- + 5- + 6
\n + 7- + 8- + 9
\n + R- + 0- + E
\n
"} + user << browse(dat, "window=caselock;size=300x280") + +/obj/item/weapon/storage/secure/Topic(href, href_list) + ..() + if(usr.incapacitated() || (get_dist(src, usr) > 1)) + return + if(href_list["type"]) + if(href_list["type"] == "E") + if((l_set == 0) && (length(code) == 5) && (!l_setshort) && (code != "ERROR")) + l_code = code + l_set = 1 + else if((code == l_code) && (emagged == 0) && (l_set == 1)) + locked = 0 + overlays = null + overlays += image('icons/obj/storage.dmi', icon_opened) + code = null + else + code = "ERROR" + else + if((href_list["type"] == "R") && (emagged == 0) && (!l_setshort)) + locked = 1 + overlays = null + code = null + close(usr) + else + code += text("[]", href_list["type"]) + if(length(code) > 5) + code = "ERROR" + add_fingerprint(usr) + for(var/mob/M in viewers(1, loc)) + if((M.client && M.machine == src)) + attack_self(M) + return + return + /obj/item/weapon/storage/secure/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!locked) return ..() @@ -160,8 +161,10 @@ return 0 /obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg) + return /obj/item/weapon/storage/secure/hear_message(mob/living/M as mob, msg) + return // ----------------------------- // Secure Briefcase @@ -174,7 +177,7 @@ item_state = "sec-case" flags = CONDUCT hitsound = "swing_hit" - force = 8.0 + force = 8 throw_speed = 2 throw_range = 4 w_class = 4 @@ -182,36 +185,36 @@ max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - New() - ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/pen(src) +/obj/item/weapon/storage/secure/briefcase/New() + ..() + handle_item_insertion(new /obj/item/weapon/paper, 1) + handle_item_insertion(new /obj/item/weapon/pen, 1) - attack_hand(mob/user as mob) - if((src.loc == user) && (src.locked == 1)) - to_chat(usr, "\red [src] is locked and cannot be opened!") - else if((src.loc == user) && (!src.locked)) - playsound(src.loc, "rustle", 50, 1, -5) - if(user.s_active) - user.s_active.close(user) //Close and re-open - src.show_to(user) - else - ..() - for(var/mob/M in range(1)) - if(M.s_active == src) - src.close(M) - src.orient2hud(user) - src.add_fingerprint(user) - return +/obj/item/weapon/storage/secure/briefcase/attack_hand(mob/user as mob) + if((loc == user) && (locked == 1)) + to_chat(usr, "[src] is locked and cannot be opened!") + else if((loc == user) && !locked) + playsound(loc, "rustle", 50, 1, -5) + if(user.s_active) + user.s_active.close(user) //Close and re-open + show_to(user) + else + ..() + for(var/mob/M in range(1)) + if(M.s_active == src) + close(M) + orient2hud(user) + add_fingerprint(user) + return //Syndie variant of Secure Briefcase. Contains space cash, slightly more robust. /obj/item/weapon/storage/secure/briefcase/syndie - force = 15.0 + force = 15 /obj/item/weapon/storage/secure/briefcase/syndie/New() + ..() for(var/i = 0, i < storage_slots - 2, i++) - new /obj/item/weapon/spacecash/c1000(src) - return ..() + handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1) // ----------------------------- // Secure Safe @@ -224,30 +227,17 @@ icon_opened = "safe0" icon_locking = "safeb" icon_sparking = "safespark" - force = 8.0 + force = 8 w_class = 5 max_w_class = 8 - anchored = 1.0 + anchored = 1 density = 0 cant_hold = list("/obj/item/weapon/storage/secure/briefcase") - New() - ..() - new /obj/item/weapon/paper(src) - new /obj/item/weapon/pen(src) - - attack_hand(mob/user as mob) - return attack_self(user) - -// Clown planet WMD storage -/obj/item/weapon/storage/secure/safe/clown - name="WMD Storage" - -/obj/item/weapon/storage/secure/safe/clown/New() - for(var/i=0;i<10;i++) - new /obj/item/weapon/reagent_containers/food/snacks/pie(src) - - -/obj/item/weapon/storage/secure/safe/HoS/New() +/obj/item/weapon/storage/secure/safe/New() ..() - //new /obj/item/weapon/storage/lockbox/clusterbang(src) This item is currently broken... and probably shouldnt exist to begin with (even though it's cool) \ No newline at end of file + handle_item_insertion(new /obj/item/weapon/paper, 1) + handle_item_insertion(new /obj/item/weapon/pen, 1) + +/obj/item/weapon/storage/secure/safe/attack_hand(mob/user as mob) + return attack_self(user) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 37ff565f4a3..862eed1b986 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -934,11 +934,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/obj/item/briefcase_item in sec_briefcase) qdel(briefcase_item) for(var/i=3, i>0, i--) - sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 - sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow - sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_box/a357 - sec_briefcase.contents += new /obj/item/weapon/grenade/plastic/c4 + sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1) + sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1) + sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1) // briefcase must be unlocked by setting the code. M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M) diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 6fad0961ab4..1c8bd73c47f 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -189,15 +189,11 @@ to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.") H.update_inv_head() -/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params) if(!isliving(user)) return - if(istype(src.loc,/mob/living)) - to_chat(user, "How do you propose to modify a hardsuit while it is being worn?") - return - - if(istype(W,/obj/item/weapon/screwdriver)) + if(istype(W,/obj/item/weapon/screwdriver) && can_modify(user)) if(!helmet) to_chat(user, "\The [src] does not have a helmet installed.") else @@ -213,7 +209,7 @@ boots = null return - else if(istype(W,/obj/item/clothing/head/helmet/space)) + else if(istype(W,/obj/item/clothing/head/helmet/space) && can_modify(user)) if(!attached_helmet) to_chat(user, "\The [src] does not have a helmet mount.") return @@ -226,7 +222,7 @@ src.helmet = W return - else if(istype(W,/obj/item/clothing/shoes/magboots)) + else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user)) if(!attached_boots) to_chat(user, "\The [src] does not have boot mounts.") return @@ -242,6 +238,13 @@ return ..() ..() + +/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user) + if(isliving(loc)) + to_chat(user, "You can not modify the hardsuit while it is being worn.") + return 0 + + return 1 //Engineering rig /obj/item/clothing/head/helmet/space/rig/engineering diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 4c974c46c16..47c243e970e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -466,6 +466,9 @@ return if(istype(target, /obj/mecha/working/ripley)) var/obj/mecha/D = target + if(D.icon_state != "ripley-open") + to_chat(user, "You can't add armour onto the mech while someone is inside!") + return var/list/damage_absorption = D.damage_absorption if(damage_absorption["brute"] > 0.3) damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3) @@ -474,17 +477,11 @@ damage_absorption["laser"] = damage_absorption["laser"] - 0.025 to_chat(user, "You strengthen [target], improving its resistance against melee attacks.") qdel(src) - if(D.icon_state == "ripley-open") - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") - D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." - else - to_chat(user, "You can't add armour onto the mech while someone is inside!") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") + D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." if(damage_absorption.["brute"] == 0.3) - if(D.icon_state == "ripley-open") - D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") - D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." - else - to_chat(user, "You can't add armour onto the mech while someone is inside!") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") + D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." else to_chat(user, "You can't improve [D] any further!") return