From 36a67dc379c9810799ff0f3d86bcf8ffe7a49a5d Mon Sep 17 00:00:00 2001 From: Geeves Date: Fri, 23 Oct 2020 17:20:33 +0200 Subject: [PATCH] Extraction Tweaks (#10289) --- .../items/weapons/implants/implanter.dm | 59 +++++++++---------- .../objects/items/weapons/material/knives.dm | 21 ++++--- html/changelogs/geeves-ghetto_extraction.yml | 9 +++ 3 files changed, 52 insertions(+), 37 deletions(-) create mode 100644 html/changelogs/geeves-ghetto_extraction.yml diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index c7d6b7aa513..ef46001512d 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -25,43 +25,42 @@ return /obj/item/implanter/proc/update() - if (src.imp) - src.icon_state = "implanter1" + if (imp) + icon_state = "implanter1" else - src.icon_state = "implanter0" + icon_state = "implanter0" return -/obj/item/implanter/attack(mob/M as mob, mob/user as mob, var/target_zone) - if (!istype(M, /mob/living/carbon)) +/obj/item/implanter/attack(mob/living/carbon/human/M, mob/user, var/target_zone) + if(!istype(M)) return - if (user && src.imp) - M.visible_message("[user] is attemping to implant [M].") + + var/obj/item/organ/external/affected = M.get_organ(target_zone) + + if(user && imp && affected) + M.visible_message("[user] is attempting to implant [M] in \the [affected.name].") user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(M) var/turf/T1 = get_turf(M) if (T1 && ((M == user) || do_after(user, 50))) - if(user && M && (get_turf(M) == T1) && src && src.imp) - M.visible_message("[M] has been implanted by [user].") + if(user && M && (get_turf(M) == T1) && src && imp) + M.visible_message("[M] has been implanted by [user] in the [affected.name].") - admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on") + admin_attack_log(user, M, "Implanted using \the [name] ([imp.name])", "Implanted with \the [name] ([imp.name])", "used an implanter, [name] ([imp.name]), on") - if(src.imp.implanted(M, user)) - src.imp.forceMove(M) - src.imp.imp_in = M - src.imp.implanted = 1 - if (ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/affected = H.get_organ(target_zone) - affected.implants += src.imp - imp.part = affected - - BITSET(H.hud_updateflag, IMPLOYAL_HUD) - if(istype(src.imp, /obj/item/implanter/loyalty)) + if(imp.implanted(M, user)) + imp.forceMove(M) + imp.imp_in = M + imp.implanted = TRUE + affected.implants += imp + imp.part = affected + BITSET(M.hud_updateflag, IMPLOYAL_HUD) + if(istype(imp, /obj/item/implanter/loyalty)) to_chat(M, "") - src.imp = null + imp = null update() return @@ -70,7 +69,7 @@ name = "implanter-loyalty" /obj/item/implanter/loyalty/New() - src.imp = new /obj/item/implant/mindshield( src ) + imp = new /obj/item/implant/mindshield(src) ..() update() return @@ -79,7 +78,7 @@ name = "implanter (E)" /obj/item/implanter/explosive/New() - src.imp = new /obj/item/implant/explosive( src ) + imp = new /obj/item/implant/explosive(src) ..() update() return @@ -88,7 +87,7 @@ name = "implanter-adrenalin" /obj/item/implanter/adrenalin/New() - src.imp = new /obj/item/implant/adrenalin(src) + imp = new /obj/item/implant/adrenalin(src) ..() update() return @@ -160,7 +159,7 @@ name = "implanter-augmentation disrupter" /obj/item/implanter/anti_augment/New() - src.imp = new /obj/item/implant/anti_augment(src) + imp = new /obj/item/implant/anti_augment(src) ..() update() return @@ -201,9 +200,9 @@ user.visible_message(SPAN_WARNING("\The [user] tags \the [M] with \the [src]!"), SPAN_NOTICE("You tag \the [M] with \the [src]."), range = 3) - M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.ipc_tag.name]) by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.ipc_tag.name]) to implant [M.name] ([M.ckey])") - msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) + M.attack_log += text("\[[time_stamp()]\] Implanted with [name] ([ipc_tag.name]) by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] Used the [name] ([ipc_tag.name]) to implant [M.name] ([M.ckey])") + msg_admin_attack("[key_name_admin(user)] implanted [key_name_admin(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(M)) ipc_tag.replaced(H, H.organs_by_name[BP_HEAD]) ipc_tag.forceMove(M) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 32b33153e6c..1f0758b91cb 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -31,8 +31,8 @@ M = user return eyestab(M,user) -/obj/item/material/knife/verb/extract_shrapnel(var/mob/living/carbon/human/H as mob in view(1)) - set name = "Extract Shrapnel" +/obj/item/material/knife/verb/extract_embedded(var/mob/living/carbon/human/H as mob in view(1)) + set name = "Extract Embedded Item" set category = "Object" set src in usr @@ -42,16 +42,23 @@ if(!istype(H)) return - if(!H.get_visible_implants(1)) - to_chat(usr, "There's nothing large enough to remove!") + var/list/available_organs = list() + for(var/thing in H.organs) + var/obj/item/organ/external/O = thing + available_organs[capitalize_first_letters(O.name)] = O + var/choice = input(usr, "Select an external organ to extract any embedded or implanted item from.", "Organ Selection") as null|anything in available_organs + if(!choice) return - for(var/obj/item/material/shard/S in H.contents) - visible_message("[usr] starts carefully digging out some of the shrapnel in [H == usr ? "themselves" : H]...") + var/obj/item/organ/external/O = available_organs[choice] + for(var/thing in O.implants) + var/obj/S = thing + usr.visible_message("[usr] starts carefully digging out something in [H == usr ? "themselves" : H]...") + O.take_damage(8, 0, DAM_SHARP|DAM_EDGE, src) H.custom_pain("It burns!", 50) if(do_mob(usr, H, 100)) H.remove_implant(S, FALSE) - log_and_message_admins("has extracted shrapnel out of [key_name(H)]") + log_and_message_admins("has extracted [S] out of [key_name(H)]") if(H.can_feel_pain()) H.emote("scream") diff --git a/html/changelogs/geeves-ghetto_extraction.yml b/html/changelogs/geeves-ghetto_extraction.yml new file mode 100644 index 00000000000..c8a7c6d08bc --- /dev/null +++ b/html/changelogs/geeves-ghetto_extraction.yml @@ -0,0 +1,9 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Knives can now dig out implants as well, via the Extract Embedded right click verb." + - rscadd: "Extracting embedded objects with a knife now deals damage to the specified organ." + - tweak: "The knife shrapnel removal menu now requires you to choose the specific external organ you're extracting from as well." + - rscadd: "Implanting someone now visually reports to which organ you'll be doing so."