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."