diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index 54c72df922f..f6e02d754bb 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -65,12 +65,13 @@ dat += "Collected Samples : [points]
" dat += "Gear Credits: [credits]
" dat += "Transfer data in exchange for supplies:
" - dat += "Advanced Baton
" - dat += "Agent Helmet
" - dat += "Agent Vest
" - dat += "Radio Silencer
" - dat += "Science Tool
" - dat += "Mental Interface Device
" + dat += "Advanced Baton (2)
" + dat += "Agent Helmet
" + dat += "Agent Vest
" + dat += "Radio Silencer
" + dat += "Science Tool
" + dat += "Mental Interface Device (2)
" + dat += "Organ Extractor (2)
" else dat += "NO EXPERIMENT MACHINE DETECTED
" @@ -134,6 +135,8 @@ Dispense(/obj/item/clothing/suit/armor/abductor/vest) if("mind_device") Dispense(/obj/item/abductor/mind_device, cost = 2) + if("organ_extractor") + Dispense(/obj/item/organ_extractor/abductor, cost = 2) updateUsrDialog() diff --git a/code/modules/surgery/organs/organ_extractor.dm b/code/modules/surgery/organs/organ_extractor.dm index b02ff3633bb..02f54d36d63 100644 --- a/code/modules/surgery/organs/organ_extractor.dm +++ b/code/modules/surgery/organs/organ_extractor.dm @@ -7,6 +7,9 @@ w_class = WEIGHT_CLASS_SMALL origin_tech = "biotech=6;materials=5;syndicate=2" var/obj/item/organ/internal/storedorgan + var/insert_time = 12 SECONDS + var/self_insert_time = 7 SECONDS + var/advanced = FALSE /obj/item/organ_extractor/examine(mob/user) . = ..() @@ -46,6 +49,7 @@ if(!iscarbon(M)) to_chat(user, "ERROR: [M] has no organs to harvest!") return + var/mob/living/carbon/C = M if(!length(C.client_mobs_in_contents)) //Basically, we don't want someone putting organs in monkeys then extracting from it. Has to be someone who had a client in the past to_chat(user, "ERROR: [C] has no soul trace to assist in targeting the drill bit!") @@ -57,6 +61,7 @@ to_chat(user, "NOTICE: Internal organ deteced. Beginning insertion procedure!") insert_organ(user, C) return + in_use = TRUE var/obj/item/chosen_organ = tgui_input_list(user, "Please select an organ for removal", "Organ Selection", C.internal_organs) if(!chosen_organ || !user.Adjacent(C)) @@ -74,13 +79,16 @@ to_chat(user, "ERROR: [chosen_organ] was inserted when [C] was dead, and has no soul trace to lock onto!") in_use = FALSE return + var/obj/item/organ/internal/internal_organ = chosen_organ var/drilled_organ = internal_organ.parent_organ user.visible_message("[user] activates [src] and begins to drill into [C]!", "You level the extractor at [M] and hold down the trigger.") to_chat(C, "You feel a lot of pain as [user] drills into your [drilled_organ]!") playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 75, TRUE) - C.apply_damage(15, BRUTE, drilled_organ) - if(!do_after_once(user, 12 SECONDS, target = C))// Slightly longer than stamina crit, at least cuff and buckle them to a pipe or something + + if(!advanced) + C.apply_damage(15, BRUTE, drilled_organ) + if(!do_after_once(user, insert_time, target = C))// Slightly longer than stamina crit, at least cuff and buckle them to a pipe or something to_chat(user, "ERROR: Process interrupted!") in_use = FALSE return @@ -88,27 +96,13 @@ to_chat(user, "ERROR: unable to find the desired organ!") in_use = FALSE return + user.visible_message("[user] removes [internal_organ] from [C]!", "You remove [internal_organ] from [C] as it gets sucked into [src]'s internal container!") playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 75, TRUE) C.apply_damage(10, BRUTE, drilled_organ) internal_organ.remove(C) - internal_organ.forceMove(src) - storedorgan = internal_organ - storedorgan.rejuvenate() //Organ gets dumped into the internal mito tank, heals it up. And nanites for robotic organs, I guess. in_use = FALSE - var/organ_x = internal_organ.pixel_x - var/organ_y = internal_organ.pixel_y - internal_organ.pixel_x = 2 - internal_organ.pixel_y = -2 - var/image/img = image("icon" = internal_organ, "layer" = FLOAT_LAYER) - var/matrix/MA = matrix(transform) - MA.Scale(0.66, 0.66) - img.transform = MA - img.plane = FLOAT_PLANE - overlays += img - internal_organ.pixel_x = organ_x - internal_organ.pixel_y = organ_y - overlays += "organ_extractor_2" //should look nicer for transparent stuff. + insert_internal_organ_in_extractor(internal_organ) /obj/item/organ_extractor/proc/insert_organ(mob/user, mob/our_target) if(!storedorgan) @@ -117,6 +111,7 @@ if(in_use) to_chat(user, "[src] is already busy!") return + var/user_is_target = FALSE if(user == our_target) user_is_target = TRUE @@ -125,23 +120,22 @@ return if(!iscarbon(our_target)) return + var/mob/living/carbon/C = our_target in_use = TRUE user.visible_message("[user] activates [src] and begins to drill into [C]!", "You level the extractor at [user_is_target ? "yourself" : C] and hold down the trigger.") var/drilled_organ = storedorgan.parent_organ - C.apply_damage(5, BRUTE, drilled_organ) + if(!advanced) + C.apply_damage(5, BRUTE, drilled_organ) playsound(get_turf(C), 'sound/weapons/circsawhit.ogg', 50, TRUE) - if(user_is_target) - if(!do_after_once(C, 7 SECONDS, target = C)) - to_chat(user, "ERROR: Process interrupted!") - in_use = FALSE - return - else - if(!do_after_once(C, 12 SECONDS, target = C)) - to_chat(user, "ERROR: Process interrupted!") - in_use = FALSE - return - C.apply_damage(10, BRUTE, drilled_organ) + + if(!do_after_once(C, (user_is_target ? self_insert_time : insert_time), target = C)) + to_chat(user, "ERROR: Process interrupted!") + in_use = FALSE + return + + if(!advanced) + C.apply_damage(10, BRUTE, drilled_organ) var/obj/item/organ/internal/replaced = C.get_organ_slot(storedorgan.slot) if(replaced) //Lets not destroy someones brain fully by putting someone elses brain in that slot. replaced.remove(C) @@ -154,3 +148,39 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C H.set_heartattack(FALSE) //Otherwise you die if you try to do an organic heart, very funny, very bad + +/obj/item/organ_extractor/proc/insert_internal_organ_in_extractor(obj/item/organ/organ_to_be_inserted) + organ_to_be_inserted.forceMove(src) + storedorgan = organ_to_be_inserted + storedorgan.rejuvenate() //Organ gets dumped into the internal mito tank, heals it up. And nanites for robotic organs, I guess. + var/organ_x = storedorgan.pixel_x + var/organ_y = storedorgan.pixel_y + storedorgan.pixel_x = 2 + storedorgan.pixel_y = -2 + var/image/img = image("icon" = storedorgan, "layer" = FLOAT_LAYER) + var/matrix/MA = matrix(transform) + MA.Scale(0.66, 0.66) + img.transform = MA + img.plane = FLOAT_PLANE + overlays += img + storedorgan.pixel_x = organ_x + storedorgan.pixel_y = organ_y + overlays += "[icon_state]_2" //should look nicer for transparent stuff. + +/// Advanced abductor version. Is a lot faster with implanting into others +/obj/item/organ_extractor/abductor + name = "alien organ extractor" + origin_tech = "biotech=6;materials=5;alien=4" + icon_state = "abductor_extractor" + insert_time = 3 SECONDS + self_insert_time = 1 SECONDS + advanced = TRUE + +/obj/item/organ_extractor/abductor/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/organ/internal) && !storedorgan) + user.unEquip(I) + insert_internal_organ_in_extractor(I) + +/obj/item/organ_extractor/abductor/emp_act(severity) + return FALSE diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0aec30495a1..e51dd28c6db 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ