/datum/surgery/organ_manipulation name = "organ manipulation" target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) requires_bodypart_type = BODYPART_ORGANIC requires_real_bodypart = 1 steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/manipulate_organs, //there should be bone fixing /datum/surgery_step/close ) /datum/surgery/organ_manipulation/soft possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/incise, /datum/surgery_step/manipulate_organs, /datum/surgery_step/close ) /datum/surgery/organ_manipulation/alien name = "Alien organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) target_mobtypes = list(/mob/living/carbon/alien/humanoid) steps = list( /datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs, /datum/surgery_step/close ) /datum/surgery/organ_manipulation/mechanic name = "Prosthesis organ manipulation" possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) requires_bodypart_type = BODYPART_ROBOTIC steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/prepare_electronics, /datum/surgery_step/manipulate_organs, /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close ) /datum/surgery/organ_manipulation/mechanic/soft possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/prepare_electronics, /datum/surgery_step/manipulate_organs, /datum/surgery_step/mechanic_close ) /datum/surgery_step/manipulate_organs time = 64 name = "manipulate organs" repeatable = 1 implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null /datum/surgery_step/manipulate_organs/New() ..() implements = implements + implements_extract /datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) I = null if(istype(tool, /obj/item/organ_storage)) if(!tool.contents.len) to_chat(user, "There is nothing inside [tool]!") return -1 I = tool.contents[1] if(!isorgan(I)) to_chat(user, "You cannot put [I] into [target]'s [parse_zone(target_zone)]!") return -1 tool = I if(isorgan(tool)) current_type = "insert" I = tool if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 var/obj/item/organ/meatslab = tool if(!meatslab.useable) to_chat(user, "[I] seems to have been chewed on, you can't use this!") return -1 display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...", "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") else if(implement_type in implements_extract) current_type = "extract" var/list/organs = target.getorganszone(target_zone) if(!organs.len) to_chat(user, "There are no removable organs in [target]'s [parse_zone(target_zone)]!") return -1 else for(var/obj/item/organ/O in organs) O.on_find(user) organs -= O organs[O.name] = O I = input("Remove which organ?", "Surgery", null, null) as null|anything in organs if(I && user && target && user.Adjacent(target) && user.get_active_held_item() == tool) I = organs[I] if(!I) return -1 display_results(user, target, "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...", "[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].", "[user] begins to extract something from [target]'s [parse_zone(target_zone)].") else return -1 /datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(current_type == "insert") if(istype(tool, /obj/item/organ_storage)) I = tool.contents[1] tool.icon_state = initial(tool.icon_state) tool.desc = initial(tool.desc) tool.cut_overlays() tool = I else I = tool user.temporarilyRemoveItemFromInventory(I, TRUE) I.Insert(target) display_results(user, target, "You insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!", "[user] inserts something into [target]'s [parse_zone(target_zone)]!") else if(current_type == "extract") if(I && I.owner == target) display_results(user, target, "You successfully extract [I] from [target]'s [parse_zone(target_zone)].", "[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!", "[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!") log_combat(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]") I.Remove() I.forceMove(get_turf(target)) else display_results(user, target, "You can't extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!") return 1