diff --git a/baystation12.dme b/baystation12.dme
index 5c6fe3730de..10e4561af41 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1132,10 +1132,19 @@
#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
+#include "code\modules\surgery\appendix.dm"
+#include "code\modules\surgery\bones.dm"
+#include "code\modules\surgery\braincore.dm"
+#include "code\modules\surgery\eye.dm"
+#include "code\modules\surgery\face.dm"
+#include "code\modules\surgery\generic.dm"
+#include "code\modules\surgery\other.dm"
+#include "code\modules\surgery\ribcage.dm"
+#include "code\modules\surgery\robolimbs.dm"
+#include "code\modules\surgery\surgery.dm"
#include "code\WorkInProgress\autopsy.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
-#include "code\WorkInProgress\surgery.dm"
#include "code\WorkInProgress\Cael_Aislinn\energy_field.dm"
#include "code\WorkInProgress\Cael_Aislinn\external_shield_gen.dm"
#include "code\WorkInProgress\Cael_Aislinn\meteor_battery.dm"
diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm
deleted file mode 100644
index c262be46f15..00000000000
--- a/code/WorkInProgress/surgery.dm
+++ /dev/null
@@ -1,1303 +0,0 @@
-/datum/surgery_status/
- var/eyes = 0
- var/face = 0
- var/appendix = 0
-
-/mob/living/carbon/var/datum/surgery_status/op_stage = new/datum/surgery_status
-
-/* SURGERY STEPS */
-
-/datum/surgery_step
- // type path referencing the required tool for this step
- var/required_tool = null
-
- // type path referencing tools that can be used as substitude for this step
- var/list/allowed_tools = null
-
- // When multiple steps can be applied with the current tool etc., choose the one with higher priority
-
- // checks whether this step can be applied with the given user and target
- proc/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return 0
-
- // does stuff to begin the step, usually just printing messages
- proc/begin_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return
-
- // does stuff to end the step, which is normally print a message + do whatever this step changes
- proc/end_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return
-
- // stuff that happens when the step fails
- proc/fail_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return null
-
- // duration of the step
- var/min_duration = 0
- var/max_duration = 0
-
- // evil infection stuff that will make everyone hate me
- var/can_infect = 0
-
- proc/isright(obj/item/tool) //is it is a required surgical tool for this step
- return (istype(tool,required_tool))
-
- proc/isacceptable(obj/item/tool) //is it is an accepted replacement tool for this step
- if (allowed_tools)
- for (var/T in allowed_tools)
- if (istype(tool,T))
- return 1
- return 0
-
-// Build this list by iterating over all typesof(/datum/surgery_step) and sorting the results by priority
-
-
-proc/build_surgery_steps_list()
- surgery_steps = list()
- for(var/T in typesof(/datum/surgery_step)-/datum/surgery_step)
- var/datum/surgery_step/S = new T
- surgery_steps += S
-
-proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
- if(!istype(user) || !istype(E)) return
-
- var/germ_level = user.germ_level
- if(user.gloves)
- germ_level = user.gloves.germ_level
-
- E.germ_level = germ_level
-
-
-//////////////////////////////////////////////////////////////////
-// COMMON STEPS //
-//////////////////////////////////////////////////////////////////
-/datum/surgery_step/generic/
- var/datum/organ/external/affected //affected organ
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (target_zone == "eyes") //there are specific steps for eye surgery
- return 0
- if (!hasorgans(target))
- return 0
- affected = target.get_organ(target_zone)
- if (affected == null)
- return 0
- if (affected.status & ORGAN_DESTROYED)
- return 0
- if (affected.status & ORGAN_ROBOT)
- return 0
- return 1
-
-/datum/surgery_step/generic/cut_open
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 90
- max_duration = 110
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && affected.open == 0 && target_zone != "mouth"
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \
- "You start the incision on [target]'s [affected.display_name] with \the [tool].")
- target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.display_name]!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \
- "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",)
- affected.open = 1
- affected.createwound(CUT, 1)
- spread_germs_to_organ(affected, user)
- if (target_zone == "head")
- target.brain_op_stage = 1
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!", \
- "\red Your hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!")
- affected.createwound(CUT, 10)
- if (ishuman(user))
- user:bloody_hands(target, 0)
-
-/datum/surgery_step/generic/clamp_bleeders
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
-
- min_duration = 40
- max_duration = 60
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && affected.open && (affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts clamping bleeders in [target]'s [affected.display_name] with \the [tool].", \
- "You start clamping bleeders in [target]'s [affected.display_name] with \the [tool].")
- target.custom_pain("The pain in your [affected.display_name] is maddening!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] clamps bleeders in [target]'s [affected.display_name] with \the [tool].", \
- "\blue You clamp bleeders in [target]'s [affected.display_name] with \the [tool].")
- affected.clamp()
- affected.status &= ~ORGAN_BLEEDING
- spread_germs_to_organ(affected, user)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.display_name] with the \[tool]!", \
- "\red Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.display_name] with \the [tool]!",)
- affected.createwound(CUT, 10)
- if (ishuman(user))
- user:bloody_hands(target, 0)
-
-/datum/surgery_step/generic/retract_skin
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 30
- max_duration = 40
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && affected.open < 2 && !(affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] starts to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
- var/self_msg = "You start to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
- if (target_zone == "chest")
- msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- if (target_zone == "groin")
- msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
- self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("It feels like the skin on your [affected.display_name] is on fire!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- var/msg = "\blue [user] keeps the incision open on [target]'s [affected.display_name] with \the [tool]."
- var/self_msg = "\blue You keep the incision open on [target]'s [affected.display_name] with \the [tool]."
- if (target_zone == "chest")
- msg = "\blue [user] keeps the ribcage open on [target]'s torso with \the [tool]."
- self_msg = "\blue You keep the ribcage open on [target]'s torso with \the [tool]."
- if (target_zone == "groin")
- msg = "\blue [user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
- self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]."
- user.visible_message(msg, self_msg)
- affected.open = 2
- spread_germs_to_organ(affected, user)
- if (prob(40)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- var/msg = "\red [user]'s hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
- var/self_msg = "\red Your hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
- if (target_zone == "chest")
- msg = "\red [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!"
- self_msg = "\red Your hand slips, damaging several organs [target]'s torso with \the [tool]!"
- if (target_zone == "groin")
- msg = "\red [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]"
- self_msg = "\red Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!"
- user.visible_message(msg, self_msg)
- target.apply_damage(12, BRUTE, affected)
-
-/datum/surgery_step/generic/cauterize
- required_tool = /obj/item/weapon/cautery
- allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
-
- min_duration = 70
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && affected.open && target_zone != "mouth"
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \
- "You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
- target.custom_pain("Your [affected.display_name] is being burned!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \
- "\blue You cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
- affected.open = 0
- affected.germ_level = 0
- affected.status &= ~ORGAN_BLEEDING
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!")
- target.apply_damage(3, BURN, affected)
-
-//////////////////////////////////////////////////////////////////
-// APPENDECTOMY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/appendectomy/
- var/datum/organ/external/groin
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (target_zone != "groin")
- return 0
- groin = target.get_organ("groin")
- if (!groin)
- return 0
- if (groin.open < 2)
- return 0
- return 1
-
-/datum/surgery_step/appendectomy/cut_appendix
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.appendix == 0
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \
- "You start to separating [target]'s appendix from the abdominal wall with \the [tool]." )
- target.custom_pain("The pain in your abdomen is living hell!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has separated [target]'s appendix with \the [tool]." , \
- "\blue You have separated [target]'s appendix with \the [tool].")
- target.op_stage.appendix = 1
- if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/groin = target.get_organ("groin")
- user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!", \
- "\red Your hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!")
- groin.createwound(CUT, 50, 1)
- if (ishuman(user))
- user:bloody_body(target)
-
-/datum/surgery_step/appendectomy/remove_appendix
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/wirecutters)
-
- min_duration = 60
- max_duration = 80
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.appendix == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts removing [target]'s appendix with \the [tool].", \
- "You start removing [target]'s appendix with \the [tool].")
- target.custom_pain("Someone's ripping out your bowels!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \
- "\blue You have removed [target]'s appendix with \the [tool].")
- var/app = 0
- for(var/datum/disease/appendicitis/appendicitis in target.viruses)
- app = 1
- appendicitis.cure()
- target.resistances += appendicitis
- if (app)
- new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(target))
- else
- new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(target))
- target.op_stage.appendix = 2
- if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!", \
- "\red Your hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!")
- affected.createwound(BRUISE, 20)
-
-
-//////////////////////////////////////////////////////////////////
-// INTERNAL WOUND PATCHING //
-//////////////////////////////////////////////////////////////////
-
-
-/datum/surgery_step/fix_vein
- required_tool = /obj/item/weapon/FixOVein
- allowed_tools = list(/obj/item/weapon/cable_coil)
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
-
- var/internal_bleeding = 0
- for(var/datum/wound/W in affected.wounds) if(W.internal)
- internal_bleeding = 1
- break
-
- return affected.open == 2 && internal_bleeding
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
- "You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
- target.custom_pain("The pain in [affected.display_name] is unbearable!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has patched the damaged vein in [target]'s [affected.display_name] with \the [tool].", \
- "\blue You have patched the damaged vein in [target]'s [affected.display_name] with \the [tool].")
-
- for(var/datum/wound/W in affected.wounds) if(W.internal)
- affected.wounds -= W
- affected.update_damages()
- if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
- "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
- affected.take_damage(5, 0)
-
-
-//////////////////////////////////////////////////////////////////
-// BONE SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/glue_bone
- required_tool = /obj/item/weapon/bonegel
- allowed_tools = list(/obj/item/weapon/screwdriver)
-
- min_duration = 50
- max_duration = 60
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.open == 2 && affected.stage == 0
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.stage == 0)
- user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
- "You start applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool].")
- target.custom_pain("Something in your [affected.display_name] is causing you a lot of pain!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] applies some [tool] to [target]'s bone in [affected.display_name]", \
- "\blue You apply some [tool] to [target]'s bone in [affected.display_name] with \the [tool].")
- affected.stage = 1
- spread_germs_to_organ(affected, user)
- if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
- "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
-
-/datum/surgery_step/set_bone
- required_tool = /obj/item/weapon/bonesetter
- allowed_tools = list(/obj/item/weapon/wrench)
-
- min_duration = 60
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.name != "head" && affected.open == 2 && affected.stage == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \
- "You are beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool].")
- target.custom_pain("The pain in your [affected.display_name] is going to make you pass out!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.status & ORGAN_BROKEN)
- user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name] in place with \the [tool].", \
- "\blue You set the bone in [target]'s [affected.display_name] in place with \the [tool].")
- affected.stage = 2
- spread_germs_to_organ(affected, user)
- else
- user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].", \
- "\blue You set the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].")
- affected.fracture()
- spread_germs_to_organ(affected, user)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!" , \
- "\red Your hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!")
- affected.createwound(BRUISE, 5)
-
-/datum/surgery_step/mend_skull
- required_tool = /obj/item/weapon/bonesetter
- allowed_tools = list(/obj/item/weapon/wrench)
-
- min_duration = 60
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.name == "head" && affected.open == 2 && affected.stage == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning piece together [target]'s skull with \the [tool]." , \
- "You are beginning piece together [target]'s skull with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] sets [target]'s skull with \the [tool]." , \
- "\blue You set [target]'s skull with \the [tool].")
- affected.stage = 2
- spread_germs_to_organ(affected, user)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
- "\red Your hand slips, damaging [target]'s face with \the [tool]!")
- var/datum/organ/external/head/h = affected
- h.createwound(BRUISE, 10)
- h.disfigured = 1
-
-/datum/surgery_step/finish_bone
- required_tool = /obj/item/weapon/bonegel
- allowed_tools = list(/obj/item/weapon/screwdriver)
-
- min_duration = 50
- max_duration = 60
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.open == 2 && affected.stage == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].", \
- "You start to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
- "\blue You have mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." )
- affected.status &= ~ORGAN_BROKEN
- affected.status &= ~ORGAN_SPLINTED
- affected.stage = 0
- affected.perma_injury = 0
- spread_germs_to_organ(affected, user)
- if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
- "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
-
-//////////////////////////////////////////////////////////////////
-// EYE SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/eye
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
- return 0
- return target_zone == "eyes"
-
-/datum/surgery_step/eye/cut_open
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 90
- max_duration = 110
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \
- "You start to separate the corneas on [target]'s eyes with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \
- "\blue You have separated the corneas on [target]'s eyes with \the [tool].",)
- target.op_stage.eyes = 1
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
- "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
- affected.createwound(CUT, 10)
-
-/datum/surgery_step/eye/lift_eyes
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 30
- max_duration = 40
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \
- "You start lifting corneas from [target]'s eyes with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \
- "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." )
- target.op_stage.eyes = 2
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
- target.apply_damage(10, BRUTE, affected)
-
-/datum/surgery_step/eye/mend_eyes
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \
- "You start mending the nerves and lenses in [target]'s eyes with the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \
- "\blue You mend the nerves and lenses in [target]'s with \the [tool].")
- target.op_stage.eyes = 3
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
- "\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
- target.apply_damage(10, BRUTE, affected)
-
-/datum/surgery_step/eye/cauterize
- required_tool = /obj/item/weapon/cautery
- allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
-
- min_duration = 70
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \
- "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
- "\blue You cauterize the incision around [target]'s eyes with \the [tool].")
- if (target.op_stage.eyes == 3)
- target.sdisabilities &= ~BLIND
- target.eye_stat = 0
- target.op_stage.eyes = 0
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, searing [target]'s eyes with \the [tool]!")
- target.apply_damage(5, BURN, affected)
- target.eye_stat += 5
-
-//////////////////////////////////////////////////////////////////
-// FACE SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/face
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
- return 0
- return target_zone == "mouth" && affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
-
-/datum/surgery_step/generic/cut_face
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 90
- max_duration = 110
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target_zone == "mouth" && target.op_stage.face == 0
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
- "You start to cut open [target]'s face and neck with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has cut open [target]'s face and neck with \the [tool]." , \
- "\blue You have cut open [target]'s face and neck with \the [tool].",)
- target.op_stage.face = 1
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
- "\red Your hand slips, slicing [target]'s throat wth \the [tool]!" )
- affected.createwound(CUT, 60)
- target.losebreath += 10
-
-/datum/surgery_step/face/mend_vocal
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
- "You start mending [target]'s vocal cords with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends [target]'s vocal cords with \the [tool].", \
- "\blue You mend [target]'s vocal cords with \the [tool].")
- target.op_stage.face = 2
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
- "\red Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
- target.losebreath += 10
- if (ishuman(user))
- user:bloody_body(target)
- user:bloody_hands(target, 0)
-
-/datum/surgery_step/face/fix_face
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \
- "You start pulling skin on [target]'s face back in place with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] pulls skin on [target]'s face back in place with \the [tool].", \
- "\blue You pull skin on [target]'s face back in place with \the [tool].")
- target.op_stage.face = 3
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
- "\red Your hand slips, tearing skin on [target]'s face with \the [tool]!")
- target.apply_damage(10, BRUTE, affected)
-
-/datum/surgery_step/face/cauterize
- required_tool = /obj/item/weapon/cautery
- allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
-
- min_duration = 70
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face > 0
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
- "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
- "\blue You cauterize the incision on [target]'s face and neck with \the [tool].")
- affected.open = 0
- affected.status &= ~ORGAN_BLEEDING
- if (target.op_stage.face == 3)
- var/datum/organ/external/head/h = affected
- h.disfigured = 0
- target.op_stage.face = 0
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
- "\red Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
- target.apply_damage(4, BURN, affected)
-
-//////////////////////////////////////////////////////////////////
-// BRAIN SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/brain/
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return target_zone == "head" && hasorgans(target)
-
-/datum/surgery_step/brain/saw_skull
- required_tool = /obj/item/weapon/circular_saw
-
- min_duration = 50
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target_zone == "head" && target.brain_op_stage == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] begins to cut through [target]'s skull with \the [tool].", \
- "You begin to cut through [target]'s skull with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \
- "\blue You have cut through [target]'s skull open with \the [tool].")
- target.brain_op_stage = 2
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, cracking [target]'s skull with \the [tool]!" , \
- "\red Your hand slips, cracking [target]'s skull with \the [tool]!" )
- target.apply_damage(10, BRUTE, "head")
-
-/datum/surgery_step/brain/cut_brain
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.brain_op_stage == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts separating connections to [target]'s brain with \the [tool].", \
- "You start separating connections to [target]'s brain with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] separates connections to [target]'s brain with \the [tool].", \
- "\blue You separate connections to [target]'s brain with \the [tool].")
- target.brain_op_stage = 3
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
- "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
- target.apply_damage(50, BRUTE, "head", 1)
- if (ishuman(user))
- user:bloody_body(target)
- user:bloody_hands(target, 0)
-
-/datum/surgery_step/brain/saw_spine
- required_tool = /obj/item/weapon/circular_saw
-
- min_duration = 50
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.brain_op_stage == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts separating [target]'s brain from \his spine with \the [tool].", \
- "You start separating [target]'s brain from spine with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] separates [target]'s brain from \his spine with \the [tool].", \
- "\blue You separate [target]'s brain from spine with \the [tool].")
-
- user.attack_log += "\[[time_stamp()]\] Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
- target.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
-
- log_admin("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
- message_admins("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
- log_attack("[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])")
-
- var/obj/item/brain/B = new(target.loc)
- B.transfer_identity(target)
-
- target:brain_op_stage = 4.0
- target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
- "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
- target.apply_damage(30, BRUTE, "head", 1)
- if (ishuman(user))
- user:bloody_body(target)
- user:bloody_hands(target, 0)
-
-
-//////////////////////////////////////////////////////////////////
-// METROID CORE EXTRACTION //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/metroid/
- can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- return istype(target, /mob/living/carbon/metroid/) && target.stat == 2
-
-/datum/surgery_step/metroid/cut_flesh
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 30
- max_duration = 50
-
- can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- return ..() && target.brain_op_stage == 0
-
- begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting [target]'s flesh with \the [tool].", \
- "You start cutting [target]'s flesh with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] cuts [target]'s flesh with \the [tool].", \
- "\blue You cut [target]'s flesh with \the [tool], exposing the cores")
- target.brain_op_stage = 1
-
- fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \
- "\red Your hand slips, tearing [target]'s flesh with \the [tool]!")
-
-/datum/surgery_step/metroid/cut_innards
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 30
- max_duration = 50
-
- can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- return ..() && target.brain_op_stage == 1
-
- begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \
- "You start cutting [target]'s silky innards apart with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores", \
- "\blue You cut [target]'s innards apart with \the [tool], exposing the cores")
- target.brain_op_stage = 2
-
- fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, tearing [target]'s innards with \the [tool]!", \
- "\red Your hand slips, tearing [target]'s innards with \the [tool]!")
-
-/datum/surgery_step/metroid/saw_core
- required_tool = /obj/item/weapon/circular_saw
-
- min_duration = 50
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- return ..() && target.brain_op_stage == 2 && target.cores > 0
-
- begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \
- "You start cutting out one of [target]'s cores with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- target.cores--
- user.visible_message("\blue [user] cuts out one of [target]'s cores with \the [tool].",, \
- "\blue You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
- if(target.cores >= 0)
- new/obj/item/metroid_core(target.loc)
- if(target.cores <= 0)
- target.icon_state = "baby roro dead-nocore"
-
- fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, failing to cut core out!", \
- "\red Your hand slips, failing to cut core out!")
-
-//////////////////////////////////////////////////////////////////
-// LIMB SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/limb/
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
- return 0
- if (!(affected.status & ORGAN_DESTROYED))
- return 0
- if (affected.parent)
- if (affected.parent.status & ORGAN_DESTROYED)
- return 0
- return 1
-
-
-/datum/surgery_step/limb/cut
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 80
- max_duration = 100
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \
- "You start cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] cuts away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \
- "\blue You cut away flesh where [target]'s [affected.display_name] used to be with \the [tool].")
- affected.status |= ORGAN_CUT_AWAY
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.parent)
- affected = affected.parent
- user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \
- "\red Your hand slips, cutting [target]'s [affected.display_name] open!")
- affected.createwound(CUT, 10)
-
-
-/datum/surgery_step/limb/mend
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected.status & ORGAN_CUT_AWAY
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \
- "You start repositioning flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].", \
- "\blue You have finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].")
- affected.open = 3
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.parent)
- affected = affected.parent
- user.visible_message("\red [user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \
- "\red Your hand slips, tearing flesh on [target]'s [affected.display_name]!")
- target.apply_damage(10, BRUTE, affected)
-
-
-/datum/surgery_step/limb/prepare
- required_tool = /obj/item/weapon/cautery
- allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
-
- min_duration = 60
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected.open == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \
- "You start adjusting area around [target]'s [affected.display_name] with \the [tool]..")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has finished adjusting the area around [target]'s [affected.display_name] with \the [tool].", \
- "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].")
- affected.status |= ORGAN_ATTACHABLE
- affected.amputated = 1
- affected.setAmputatedTree()
- affected.open = 0
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.parent)
- affected = affected.parent
- user.visible_message("\red [user]'s hand slips, searing [target]'s [affected.display_name]!", \
- "\red Your hand slips, searing [target]'s [affected.display_name]!")
- target.apply_damage(10, BURN, affected)
-
-
-/datum/surgery_step/limb/attach
- required_tool = /obj/item/robot_parts
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/robot_parts/p = tool
- if (p.part)
- if (!(target_zone in p.part))
- return 0
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected.status & ORGAN_ATTACHABLE
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \
- "You start attaching [tool] where [target]'s [affected.display_name] used to be.")
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \
- "\blue You have attached [tool] where [target]'s [affected.display_name] used to be.")
- affected.robotize()
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
- del(tool)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \
- "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!")
- target.apply_damage(10, BRUTE, affected)
-
-
-//////////////////////////////////////////////////////////////////
-// RIBCAGE SURGERY(LUNGS AND ALIENS) //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/ribcage
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return target_zone == "chest"
-
-/datum/surgery_step/ribcage/saw_ribcage
- required_tool = /obj/item/weapon/circular_saw
-
- min_duration = 50
- max_duration = 70
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return ..() && target.ribcage_op_stage == 0 && affected.open >= 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] begins to cut through [target]'s ribcage with \the [tool].", \
- "You begin to cut through [target]'s ribcage with \the [tool].")
- target.custom_pain("Something hurts horribly in your chest!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \
- "\blue You have cut through [target]'s ribcage open with \the [tool].")
- target.ribcage_op_stage = 1
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, cracking [target]'s ribcage with \the [tool]!" , \
- "\red Your hand slips, cracking [target]'s ribcage with \the [tool]!" )
-
-
-/datum/surgery_step/ribcage/retract_ribcage
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/crowbar)
-
- min_duration = 30
- max_duration = 40
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.ribcage_op_stage == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "[user] starts to force open the ribcage in [target]'s torso with \the [tool]."
- var/self_msg = "You start to force open the ribcage in [target]'s torso with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your chest!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "\blue [user] forces open [target]'s ribcage with \the [tool]."
- var/self_msg = "\blue You force open [target]'s ribcage with \the [tool]."
- user.visible_message(msg, self_msg)
- target.ribcage_op_stage = 2
-
- // Whoops!
- if(prob(10))
- var/datum/organ/external/affected = target.get_organ(target_zone)
- affected.fracture()
-
- if (ishuman(user))
- user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "\red [user]'s hand slips, breaking [target]'s ribcage!"
- var/self_msg = "\red Your hand slips, breaking [target]'s ribcage!"
- user.visible_message(msg, self_msg)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- affected.fracture()
-
-/datum/surgery_step/ribcage/close_ribcage
- required_tool = /obj/item/weapon/retractor
- allowed_tools = list(/obj/item/weapon/crowbar)
-
- min_duration = 20
- max_duration = 40
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.ribcage_op_stage == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]."
- var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your chest!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "\blue [user] bends [target]'s ribcage back into place with \the [tool]."
- var/self_msg = "\blue You bend [target]'s ribcage back into place with \the [tool]."
- user.visible_message(msg, self_msg)
-
- target.ribcage_op_stage = 1
-
-/datum/surgery_step/ribcage/mend_ribcage
- required_tool = /obj/item/weapon/bonegel
-
- min_duration = 20
- max_duration = 40
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.ribcage_op_stage == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "[user] starts applying \the [tool] to [target]'s ribcage."
- var/self_msg = "You start applying \the [tool] to [target]'s ribcage."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your chest!",1)
-
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "\blue [user] applied \the [tool] to [target]'s ribcage."
- var/self_msg = "\blue You applied \the [tool] to [target]'s ribcage."
- user.visible_message(msg, self_msg)
-
- target.ribcage_op_stage = 0
-
-
-/datum/surgery_step/ribcage/remove_embryo
- required_tool = /obj/item/weapon/hemostat
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/embryo = 0
- for(var/datum/disease/alien_embryo/A in target.viruses)
- embryo = 1
- break
- return ..() && embryo && target.ribcage_op_stage == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
- var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your chest!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user] rips the larva out of [target]'s ribcage!",
- "You rip the larva out of [target]'s ribcage!")
-
- var/mob/living/carbon/alien/larva/stupid = new(target.loc)
- stupid.death(0)
-
- for(var/datum/disease/alien_embryo in target.viruses)
- alien_embryo.cure()
-
- if (ishuman(user)) user:bloody_hands(target, 0)
-
-/datum/surgery_step/ribcage/fix_lungs
- required_tool = /obj/item/weapon/scalpel
- allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.is_lung_ruptured() && target.ribcage_op_stage == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \
- "You start mending the rupture in [target]'s lungs with \the [tool]." )
- target.custom_pain("The pain in your chest is living hell!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ("chest")
- user.visible_message("\blue [user] mends the rupture in [target]'s lungs with \the [tool].", \
- "\blue You mend the rupture in [target]'s lungs with \the [tool]." )
- affected.ruptured_lungs = 0
- if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ("chest")
- user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
- "\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
- affected.createwound(CUT, 20)
- if (ishuman(user))
- user:bloody_hands(target, 0)
- user:bloody_body(target)
-
-//////////////////////////////////////////////////////////////////
-// IMPLANT REMOVAL SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/implant_removal
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
- "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
- target.custom_pain("The pain in your chest is living hell!",1)
-
- end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
-
- var/find_prob = 0
- if (affected.implants.len)
- var/obj/item/weapon/implant/imp = affected.implants[1]
- if (imp.islegal())
- find_prob +=60
- else
- find_prob +=40
- if (isright(tool))
- find_prob +=20
-
- if (prob(find_prob))
- user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
- "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
- var/obj/item/weapon/implant/imp = affected.implants[1]
- affected.implants -= imp
- imp.loc = get_turf(target)
- imp.imp_in = null
- imp.implanted = 0
- else
- user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
- "\blue You could not find anything inside [target]'s [affected.display_name]." )
- if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
-
- fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
- affected.createwound(CUT, 20)
- if (affected.implants.len)
- var/fail_prob = 10
- if (!isright(tool))
- fail_prob += 30
- if (prob(fail_prob))
- var/obj/item/weapon/implant/imp = affected.implants[1]
- user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
- playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
- spawn(25)
- imp.activate()
- if (ishuman(user))
- user:bloody_hands(target, 0)
- user:bloody_body(target)
\ No newline at end of file
diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm
index 4b92cb04e17..32da1df83c9 100644
--- a/code/datums/organs/organ_external.dm
+++ b/code/datums/organs/organ_external.dm
@@ -224,6 +224,7 @@
proc/clamp()
var/rval = 0
+ src.status &= ~ORGAN_BLEEDING
for(var/datum/wound/W in wounds)
if(W.internal) continue
rval |= !W.clamped
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index b2c9caaa15c..c98f36f390f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -188,19 +188,8 @@
return
if (can_operate(M)) //Checks if mob is lying down on table for surgery
- if(istype(M,/mob/living/carbon))
- if (user.a_intent != "harm") //check for Hippocratic Oath
- if(surgery_steps.len == 0) build_surgery_steps_list()
- for(var/datum/surgery_step/S in surgery_steps)
- if( S.isright(src) || S.isacceptable(src) ) //check if tool is right or close enough
- if(S.can_use(user, M, user.zone_sel.selecting, src)) //and if this step is possible
- S.begin_step(user, M, user.zone_sel.selecting, src) //start on it
- if(do_mob(user, M, rand(S.min_duration, S.max_duration))) //if user did nto move or changed hands
- S.end_step(user, M, user.zone_sel.selecting, src) //finish successfully
- else //or
- S.fail_step(user, M, user.zone_sel.selecting, src) //malpractice~
- return //don't want to do weapony things after surgery
-
+ if (do_surgery(M,user,src))
+ return
var/messagesource = M
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index fdb6b71d586..be27645f955 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,12 +1,6 @@
/mob/living/carbon/
gender = MALE
var/list/stomach_contents = list()
- var/brain_op_stage = 0.0
- var/ribcage_op_stage = 0
-/*
- var/eye_op_stage = 0.0
- var/appendix_op_stage = 0.0
-*/
var/datum/disease2/disease/virus2 = null
var/list/datum/disease2/disease/resistances2 = list()
@@ -22,3 +16,6 @@
var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ //Surgery info
+ var/brain_op_stage = 0.0
+ var/datum/surgery_status/op_stage = new/datum/surgery_status
diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm
new file mode 100644
index 00000000000..0cae30f21c4
--- /dev/null
+++ b/code/modules/surgery/appendix.dm
@@ -0,0 +1,81 @@
+//Procedures in this file: Appendectomy
+//////////////////////////////////////////////////////////////////
+// APPENDECTOMY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/appendectomy/
+ var/datum/organ/external/groin
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (target_zone != "groin")
+ return 0
+ groin = target.get_organ("groin")
+ if (!groin)
+ return 0
+ if (groin.open < 2)
+ return 0
+ return 1
+
+/datum/surgery_step/appendectomy/cut_appendix
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.appendix == 0
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \
+ "You start to separating [target]'s appendix from the abdominal wall with \the [tool]." )
+ target.custom_pain("The pain in your abdomen is living hell!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has separated [target]'s appendix with \the [tool]." , \
+ "\blue You have separated [target]'s appendix with \the [tool].")
+ target.op_stage.appendix = 1
+ if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/groin = target.get_organ("groin")
+ user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!", \
+ "\red Your hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!")
+ groin.createwound(CUT, 50, 1)
+ if (ishuman(user))
+ user:bloody_body(target)
+
+/datum/surgery_step/appendectomy/remove_appendix
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/wirecutters)
+
+ min_duration = 60
+ max_duration = 80
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.appendix == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts removing [target]'s appendix with \the [tool].", \
+ "You start removing [target]'s appendix with \the [tool].")
+ target.custom_pain("Someone's ripping out your bowels!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \
+ "\blue You have removed [target]'s appendix with \the [tool].")
+ var/app = 0
+ for(var/datum/disease/appendicitis/appendicitis in target.viruses)
+ app = 1
+ appendicitis.cure()
+ target.resistances += appendicitis
+ if (app)
+ new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(target))
+ else
+ new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(target))
+ target.op_stage.appendix = 2
+ if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!", \
+ "\red Your hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!")
+ affected.createwound(BRUISE, 20)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
new file mode 100644
index 00000000000..ae5a8ea1bff
--- /dev/null
+++ b/code/modules/surgery/bones.dm
@@ -0,0 +1,133 @@
+//Procedures in this file: Fracture repair surgery
+//////////////////////////////////////////////////////////////////
+// BONE SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/glue_bone
+ required_tool = /obj/item/weapon/bonegel
+ allowed_tools = list(/obj/item/weapon/screwdriver)
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.open == 2 && affected.stage == 0
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.stage == 0)
+ user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
+ "You start applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool].")
+ target.custom_pain("Something in your [affected.display_name] is causing you a lot of pain!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] applies some [tool] to [target]'s bone in [affected.display_name]", \
+ "\blue You apply some [tool] to [target]'s bone in [affected.display_name] with \the [tool].")
+ affected.stage = 1
+ spread_germs_to_organ(affected, user)
+ if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
+ "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
+
+/datum/surgery_step/set_bone
+ required_tool = /obj/item/weapon/bonesetter
+ allowed_tools = list(/obj/item/weapon/wrench)
+
+ min_duration = 60
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.name != "head" && affected.open == 2 && affected.stage == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \
+ "You are beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool].")
+ target.custom_pain("The pain in your [affected.display_name] is going to make you pass out!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.status & ORGAN_BROKEN)
+ user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name] in place with \the [tool].", \
+ "\blue You set the bone in [target]'s [affected.display_name] in place with \the [tool].")
+ affected.stage = 2
+ spread_germs_to_organ(affected, user)
+ else
+ user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].", \
+ "\blue You set the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].")
+ affected.fracture()
+ spread_germs_to_organ(affected, user)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!" , \
+ "\red Your hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(BRUISE, 5)
+
+/datum/surgery_step/mend_skull
+ required_tool = /obj/item/weapon/bonesetter
+ allowed_tools = list(/obj/item/weapon/wrench)
+
+ min_duration = 60
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.name == "head" && affected.open == 2 && affected.stage == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] is beginning piece together [target]'s skull with \the [tool]." , \
+ "You are beginning piece together [target]'s skull with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] sets [target]'s skull with \the [tool]." , \
+ "\blue You set [target]'s skull with \the [tool].")
+ affected.stage = 2
+ spread_germs_to_organ(affected, user)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
+ "\red Your hand slips, damaging [target]'s face with \the [tool]!")
+ var/datum/organ/external/head/h = affected
+ h.createwound(BRUISE, 10)
+ h.disfigured = 1
+
+/datum/surgery_step/finish_bone
+ required_tool = /obj/item/weapon/bonegel
+ allowed_tools = list(/obj/item/weapon/screwdriver)
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.open == 2 && affected.stage == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].", \
+ "You start to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
+ "\blue You have mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." )
+ affected.status &= ~ORGAN_BROKEN
+ affected.status &= ~ORGAN_SPLINTED
+ affected.stage = 0
+ affected.perma_injury = 0
+ spread_germs_to_organ(affected, user)
+ if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
+ "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
\ No newline at end of file
diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm
new file mode 100644
index 00000000000..45b328fe5dc
--- /dev/null
+++ b/code/modules/surgery/braincore.dm
@@ -0,0 +1,177 @@
+//Procedures in this file: Brain extraction. Metroid Core extraction.
+//////////////////////////////////////////////////////////////////
+// BRAIN SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/brain/
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return target_zone == "head" && hasorgans(target)
+
+/datum/surgery_step/brain/saw_skull
+ required_tool = /obj/item/weapon/circular_saw
+
+ min_duration = 50
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target_zone == "head" && target.brain_op_stage == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins to cut through [target]'s skull with \the [tool].", \
+ "You begin to cut through [target]'s skull with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \
+ "\blue You have cut through [target]'s skull open with \the [tool].")
+ target.brain_op_stage = 2
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, cracking [target]'s skull with \the [tool]!" , \
+ "\red Your hand slips, cracking [target]'s skull with \the [tool]!" )
+ target.apply_damage(10, BRUTE, "head")
+
+/datum/surgery_step/brain/cut_brain
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.brain_op_stage == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts separating connections to [target]'s brain with \the [tool].", \
+ "You start separating connections to [target]'s brain with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] separates connections to [target]'s brain with \the [tool].", \
+ "\blue You separate connections to [target]'s brain with \the [tool].")
+ target.brain_op_stage = 3
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
+ "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
+ target.apply_damage(50, BRUTE, "head", 1)
+ if (ishuman(user))
+ user:bloody_body(target)
+ user:bloody_hands(target, 0)
+
+/datum/surgery_step/brain/saw_spine
+ required_tool = /obj/item/weapon/circular_saw
+
+ min_duration = 50
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.brain_op_stage == 3
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts separating [target]'s brain from \his spine with \the [tool].", \
+ "You start separating [target]'s brain from spine with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] separates [target]'s brain from \his spine with \the [tool].", \
+ "\blue You separate [target]'s brain from spine with \the [tool].")
+
+ user.attack_log += "\[[time_stamp()]\] Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
+ target.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
+
+ log_admin("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
+ message_admins("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
+ log_attack("[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])")
+
+ var/obj/item/brain/B = new(target.loc)
+ B.transfer_identity(target)
+
+ target:brain_op_stage = 4.0
+ target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
+ "\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
+ target.apply_damage(30, BRUTE, "head", 1)
+ if (ishuman(user))
+ user:bloody_body(target)
+ user:bloody_hands(target, 0)
+
+
+//////////////////////////////////////////////////////////////////
+// METROID CORE EXTRACTION //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/metroid/
+ can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ return istype(target, /mob/living/carbon/metroid/) && target.stat == 2
+
+/datum/surgery_step/metroid/cut_flesh
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 30
+ max_duration = 50
+
+ can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ return ..() && target.brain_op_stage == 0
+
+ begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting [target]'s flesh with \the [tool].", \
+ "You start cutting [target]'s flesh with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] cuts [target]'s flesh with \the [tool].", \
+ "\blue You cut [target]'s flesh with \the [tool], exposing the cores")
+ target.brain_op_stage = 1
+
+ fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \
+ "\red Your hand slips, tearing [target]'s flesh with \the [tool]!")
+
+/datum/surgery_step/metroid/cut_innards
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 30
+ max_duration = 50
+
+ can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ return ..() && target.brain_op_stage == 1
+
+ begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \
+ "You start cutting [target]'s silky innards apart with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores", \
+ "\blue You cut [target]'s innards apart with \the [tool], exposing the cores")
+ target.brain_op_stage = 2
+
+ fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, tearing [target]'s innards with \the [tool]!", \
+ "\red Your hand slips, tearing [target]'s innards with \the [tool]!")
+
+/datum/surgery_step/metroid/saw_core
+ required_tool = /obj/item/weapon/circular_saw
+
+ min_duration = 50
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ return ..() && target.brain_op_stage == 2 && target.cores > 0
+
+ begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \
+ "You start cutting out one of [target]'s cores with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ target.cores--
+ user.visible_message("\blue [user] cuts out one of [target]'s cores with \the [tool].",, \
+ "\blue You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
+ if(target.cores >= 0)
+ new/obj/item/metroid_core(target.loc)
+ if(target.cores <= 0)
+ target.icon_state = "baby roro dead-nocore"
+
+ fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, failing to cut core out!", \
+ "\red Your hand slips, failing to cut core out!")
\ No newline at end of file
diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm
new file mode 100644
index 00000000000..fc9842f69b7
--- /dev/null
+++ b/code/modules/surgery/eye.dm
@@ -0,0 +1,117 @@
+//Procedures in this file: Eye mending surgery
+//////////////////////////////////////////////////////////////////
+// EYE SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/eye
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (!affected)
+ return 0
+ return target_zone == "eyes"
+
+/datum/surgery_step/eye/cut_open
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..()
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \
+ "You start to separate the corneas on [target]'s eyes with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \
+ "\blue You have separated the corneas on [target]'s eyes with \the [tool].",)
+ target.op_stage.eyes = 1
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
+ "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
+ affected.createwound(CUT, 10)
+
+/datum/surgery_step/eye/lift_eyes
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 30
+ max_duration = 40
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.eyes == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \
+ "You start lifting corneas from [target]'s eyes with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \
+ "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." )
+ target.op_stage.eyes = 2
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
+ "\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
+ target.apply_damage(10, BRUTE, affected)
+
+/datum/surgery_step/eye/mend_eyes
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.eyes == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \
+ "You start mending the nerves and lenses in [target]'s eyes with the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \
+ "\blue You mend the nerves and lenses in [target]'s with \the [tool].")
+ target.op_stage.eyes = 3
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
+ "\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
+ target.apply_damage(10, BRUTE, affected)
+
+/datum/surgery_step/eye/cauterize
+ required_tool = /obj/item/weapon/cautery
+ allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
+
+ min_duration = 70
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..()
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \
+ "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
+ "\blue You cauterize the incision around [target]'s eyes with \the [tool].")
+ if (target.op_stage.eyes == 3)
+ target.sdisabilities &= ~BLIND
+ target.eye_stat = 0
+ target.op_stage.eyes = 0
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
+ "\red Your hand slips, searing [target]'s eyes with \the [tool]!")
+ target.apply_damage(5, BURN, affected)
+ target.eye_stat += 5
\ No newline at end of file
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
new file mode 100644
index 00000000000..8ea34d590d3
--- /dev/null
+++ b/code/modules/surgery/face.dm
@@ -0,0 +1,122 @@
+//Procedures in this file: Facial reconstruction surgery
+//////////////////////////////////////////////////////////////////
+// FACE SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/face
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (!affected)
+ return 0
+ return target_zone == "mouth" && affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
+
+/datum/surgery_step/generic/cut_face
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target_zone == "mouth" && target.op_stage.face == 0
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
+ "You start to cut open [target]'s face and neck with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has cut open [target]'s face and neck with \the [tool]." , \
+ "\blue You have cut open [target]'s face and neck with \the [tool].",)
+ target.op_stage.face = 1
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
+ "\red Your hand slips, slicing [target]'s throat wth \the [tool]!" )
+ affected.createwound(CUT, 60)
+ target.losebreath += 10
+
+/datum/surgery_step/face/mend_vocal
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
+ "You start mending [target]'s vocal cords with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] mends [target]'s vocal cords with \the [tool].", \
+ "\blue You mend [target]'s vocal cords with \the [tool].")
+ target.op_stage.face = 2
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
+ "\red Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
+ target.losebreath += 10
+ if (ishuman(user))
+ user:bloody_body(target)
+ user:bloody_hands(target, 0)
+
+/datum/surgery_step/face/fix_face
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \
+ "You start pulling skin on [target]'s face back in place with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] pulls skin on [target]'s face back in place with \the [tool].", \
+ "\blue You pull skin on [target]'s face back in place with \the [tool].")
+ target.op_stage.face = 3
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
+ "\red Your hand slips, tearing skin on [target]'s face with \the [tool]!")
+ target.apply_damage(10, BRUTE, affected)
+
+/datum/surgery_step/face/cauterize
+ required_tool = /obj/item/weapon/cautery
+ allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
+
+ min_duration = 70
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face > 0
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
+ "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
+ "\blue You cauterize the incision on [target]'s face and neck with \the [tool].")
+ affected.open = 0
+ affected.status &= ~ORGAN_BLEEDING
+ if (target.op_stage.face == 3)
+ var/datum/organ/external/head/h = affected
+ h.disfigured = 0
+ target.op_stage.face = 0
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
+ "\red Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
+ target.apply_damage(4, BURN, affected)
\ No newline at end of file
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
new file mode 100644
index 00000000000..264418774e2
--- /dev/null
+++ b/code/modules/surgery/generic.dm
@@ -0,0 +1,165 @@
+//Procedures in this file: Gneric surgery steps
+//////////////////////////////////////////////////////////////////
+// COMMON STEPS //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/generic/
+ var/datum/organ/external/affected //affected organ
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (target_zone == "eyes") //there are specific steps for eye surgery
+ return 0
+ if (!hasorgans(target))
+ return 0
+ affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.status & ORGAN_DESTROYED)
+ return 0
+ if (affected.status & ORGAN_ROBOT)
+ return 0
+ return 1
+
+/datum/surgery_step/generic/cut_open
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && affected.open == 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \
+ "You start the incision on [target]'s [affected.display_name] with \the [tool].")
+ target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.display_name]!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",)
+ affected.open = 1
+ affected.createwound(CUT, 1)
+ spread_germs_to_organ(affected, user)
+ if (target_zone == "head")
+ target.brain_op_stage = 1
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!", \
+ "\red Your hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!")
+ affected.createwound(CUT, 10)
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+
+/datum/surgery_step/generic/clamp_bleeders
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
+
+ min_duration = 40
+ max_duration = 60
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && affected.open && (affected.status & ORGAN_BLEEDING)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts clamping bleeders in [target]'s [affected.display_name] with \the [tool].", \
+ "You start clamping bleeders in [target]'s [affected.display_name] with \the [tool].")
+ target.custom_pain("The pain in your [affected.display_name] is maddening!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] clamps bleeders in [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You clamp bleeders in [target]'s [affected.display_name] with \the [tool].")
+ affected.clamp()
+ spread_germs_to_organ(affected, user)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.display_name] with the \[tool]!", \
+ "\red Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.display_name] with \the [tool]!",)
+ affected.createwound(CUT, 10)
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+
+/datum/surgery_step/generic/retract_skin
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 30
+ max_duration = 40
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && affected.open < 2 && !(affected.status & ORGAN_BLEEDING)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user] starts to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
+ var/self_msg = "You start to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
+ if (target_zone == "chest")
+ msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
+ self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
+ if (target_zone == "groin")
+ msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
+ self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("It feels like the skin on your [affected.display_name] is on fire!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "\blue [user] keeps the incision open on [target]'s [affected.display_name] with \the [tool]."
+ var/self_msg = "\blue You keep the incision open on [target]'s [affected.display_name] with \the [tool]."
+ if (target_zone == "chest")
+ msg = "\blue [user] keeps the ribcage open on [target]'s torso with \the [tool]."
+ self_msg = "\blue You keep the ribcage open on [target]'s torso with \the [tool]."
+ if (target_zone == "groin")
+ msg = "\blue [user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
+ self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]."
+ user.visible_message(msg, self_msg)
+ affected.open = 2
+ spread_germs_to_organ(affected, user)
+ if (prob(40)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "\red [user]'s hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
+ var/self_msg = "\red Your hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
+ if (target_zone == "chest")
+ msg = "\red [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!"
+ self_msg = "\red Your hand slips, damaging several organs [target]'s torso with \the [tool]!"
+ if (target_zone == "groin")
+ msg = "\red [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]"
+ self_msg = "\red Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!"
+ user.visible_message(msg, self_msg)
+ target.apply_damage(12, BRUTE, affected)
+
+/datum/surgery_step/generic/cauterize
+ required_tool = /obj/item/weapon/cautery
+ allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
+
+ min_duration = 70
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && affected.open && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \
+ "You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
+ target.custom_pain("Your [affected.display_name] is being burned!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
+ affected.open = 0
+ affected.germ_level = 0
+ affected.status &= ~ORGAN_BLEEDING
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!")
+ target.apply_damage(3, BURN, affected)
\ No newline at end of file
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
new file mode 100644
index 00000000000..0cb00773cdf
--- /dev/null
+++ b/code/modules/surgery/other.dm
@@ -0,0 +1,110 @@
+//Procedures in this file: Inernal wound patching, Implant removal.
+//////////////////////////////////////////////////////////////////
+// INTERNAL WOUND PATCHING //
+//////////////////////////////////////////////////////////////////
+
+
+/datum/surgery_step/fix_vein
+ required_tool = /obj/item/weapon/FixOVein
+ allowed_tools = list(/obj/item/weapon/cable_coil)
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+
+ var/internal_bleeding = 0
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ internal_bleeding = 1
+ break
+
+ return affected.open == 2 && internal_bleeding
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
+ "You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
+ target.custom_pain("The pain in [affected.display_name] is unbearable!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has patched the damaged vein in [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You have patched the damaged vein in [target]'s [affected.display_name] with \the [tool].")
+
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ affected.wounds -= W
+ affected.update_damages()
+ if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
+ "\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
+ affected.take_damage(5, 0)
+
+//////////////////////////////////////////////////////////////////
+// IMPLANT REMOVAL SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/implant_removal
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
+ "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
+ target.custom_pain("The pain in your chest is living hell!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+
+ var/find_prob = 0
+ if (affected.implants.len)
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ if (imp.islegal())
+ find_prob +=60
+ else
+ find_prob +=40
+ if (isright(tool))
+ find_prob +=20
+
+ if (prob(find_prob))
+ user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ affected.implants -= imp
+ imp.loc = get_turf(target)
+ imp.imp_in = null
+ imp.implanted = 0
+ else
+ user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
+ "\blue You could not find anything inside [target]'s [affected.display_name]." )
+ if (ishuman(user) && prob(80)) user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+ if (affected.implants.len)
+ var/fail_prob = 10
+ if (!isright(tool))
+ fail_prob += 30
+ if (prob(fail_prob))
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
+ playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
+ spawn(25)
+ imp.activate()
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+ user:bloody_body(target)
\ No newline at end of file
diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm
new file mode 100644
index 00000000000..492edbafcfa
--- /dev/null
+++ b/code/modules/surgery/ribcage.dm
@@ -0,0 +1,206 @@
+//Procedures in this file: Generic ribcage opening steps, Removing alien embryo, Fixing ruptured lungs
+//////////////////////////////////////////////////////////////////
+// GENERIC RIBCAGE SURGERY //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/ribcage
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return target_zone == "chest"
+
+/datum/surgery_step/ribcage/saw_ribcage
+ required_tool = /obj/item/weapon/circular_saw
+
+ min_duration = 50
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && target.op_stage.ribcage == 0 && affected.open >= 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins to cut through [target]'s ribcage with \the [tool].", \
+ "You begin to cut through [target]'s ribcage with \the [tool].")
+ target.custom_pain("Something hurts horribly in your chest!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \
+ "\blue You have cut through [target]'s ribcage open with \the [tool].")
+ target.op_stage.ribcage = 1
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, cracking [target]'s ribcage with \the [tool]!" , \
+ "\red Your hand slips, cracking [target]'s ribcage with \the [tool]!" )
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ affected.createwound(CUT, 20)
+ affected.fracture()
+
+
+/datum/surgery_step/ribcage/retract_ribcage
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/crowbar)
+
+ min_duration = 30
+ max_duration = 40
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.ribcage == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts to force open the ribcage in [target]'s torso with \the [tool]."
+ var/self_msg = "You start to force open the ribcage in [target]'s torso with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your chest!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "\blue [user] forces open [target]'s ribcage with \the [tool]."
+ var/self_msg = "\blue You force open [target]'s ribcage with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.op_stage.ribcage = 2
+
+ // Whoops!
+ if(prob(10))
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ affected.fracture()
+
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "\red [user]'s hand slips, breaking [target]'s ribcage!"
+ var/self_msg = "\red Your hand slips, breaking [target]'s ribcage!"
+ user.visible_message(msg, self_msg)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ affected.createwound(BRUISE, 20)
+ affected.fracture()
+
+/datum/surgery_step/ribcage/close_ribcage
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/crowbar)
+
+ min_duration = 20
+ max_duration = 40
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.ribcage == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]."
+ var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your chest!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "\blue [user] bends [target]'s ribcage back into place with \the [tool]."
+ var/self_msg = "\blue You bend [target]'s ribcage back into place with \the [tool]."
+ user.visible_message(msg, self_msg)
+
+ target.op_stage.ribcage = 1
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "\red [user]'s hand slips, bending [target]'s ribcage in a wrong shape!"
+ var/self_msg = "\red Your hand slips, bending [target]'s ribcage in a wrong shape!"
+ user.visible_message(msg, self_msg)
+ var/datum/organ/external/chest/affected = target.get_organ("chest")
+ affected.createwound(BRUISE, 20)
+ affected.fracture()
+ if (prob(40))
+ user.visible_message("\red Rib pierces the lung!")
+ affected.ruptured_lungs = 1
+
+/datum/surgery_step/ribcage/mend_ribcage
+ required_tool = /obj/item/weapon/bonegel
+
+ min_duration = 20
+ max_duration = 40
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.ribcage == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts applying \the [tool] to [target]'s ribcage."
+ var/self_msg = "You start applying \the [tool] to [target]'s ribcage."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your chest!",1)
+
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "\blue [user] applied \the [tool] to [target]'s ribcage."
+ var/self_msg = "\blue You applied \the [tool] to [target]'s ribcage."
+ user.visible_message(msg, self_msg)
+
+ target.op_stage.ribcage = 0
+
+//////////////////////////////////////////////////////////////////
+// ALIEN EMBRYO SURGERY //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/ribcage/remove_embryo
+ required_tool = /obj/item/weapon/hemostat
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/embryo = 0
+ for(var/datum/disease/alien_embryo/A in target.viruses)
+ embryo = 1
+ break
+ return ..() && embryo && target.op_stage.ribcage == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
+ var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your chest!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user] rips the larva out of [target]'s ribcage!",
+ "You rip the larva out of [target]'s ribcage!")
+
+ var/mob/living/carbon/alien/larva/stupid = new(target.loc)
+ stupid.death(0)
+
+ for(var/datum/disease/alien_embryo in target.viruses)
+ alien_embryo.cure()
+
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+ spread_germs_to_organ(affected, user)
+ if (prob(60))
+ user:bloody_body(target)
+
+
+//////////////////////////////////////////////////////////////////
+// LUNG SURGERY //
+//////////////////////////////////////////////////////////////////
+/datum/surgery_step/ribcage/fix_lungs
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.is_lung_ruptured() && target.op_stage.ribcage == 2
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \
+ "You start mending the rupture in [target]'s lungs with \the [tool]." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ("chest")
+ user.visible_message("\blue [user] mends the rupture in [target]'s lungs with \the [tool].", \
+ "\blue You mend the rupture in [target]'s lungs with \the [tool]." )
+ affected.ruptured_lungs = 0
+ if (ishuman(user) && prob(80))
+ user:bloody_hands(target, 0)
+ spread_germs_to_organ(affected, user)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ("chest")
+ user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
+ "\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
+ affected.createwound(CUT, 20)
+ if (ishuman(user))
+ user:bloody_hands(target, 0)
+ user:bloody_body(target)
\ No newline at end of file
diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm
new file mode 100644
index 00000000000..f1cce977bdf
--- /dev/null
+++ b/code/modules/surgery/robolimbs.dm
@@ -0,0 +1,146 @@
+//Procedures in this file: Robotic limbs attachment
+//////////////////////////////////////////////////////////////////
+// LIMB SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/limb/
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (!affected)
+ return 0
+ if (!(affected.status & ORGAN_DESTROYED))
+ return 0
+ if (affected.parent)
+ if (affected.parent.status & ORGAN_DESTROYED)
+ return 0
+ return 1
+
+
+/datum/surgery_step/limb/cut
+ required_tool = /obj/item/weapon/scalpel
+ allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
+
+ min_duration = 80
+ max_duration = 100
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \
+ "You start cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] cuts away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \
+ "\blue You cut away flesh where [target]'s [affected.display_name] used to be with \the [tool].")
+ affected.status |= ORGAN_CUT_AWAY
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.parent)
+ affected = affected.parent
+ user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \
+ "\red Your hand slips, cutting [target]'s [affected.display_name] open!")
+ affected.createwound(CUT, 10)
+
+
+/datum/surgery_step/limb/mend
+ required_tool = /obj/item/weapon/retractor
+ allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected.status & ORGAN_CUT_AWAY
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \
+ "You start repositioning flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].", \
+ "\blue You have finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].")
+ affected.open = 3
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.parent)
+ affected = affected.parent
+ user.visible_message("\red [user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \
+ "\red Your hand slips, tearing flesh on [target]'s [affected.display_name]!")
+ target.apply_damage(10, BRUTE, affected)
+
+
+/datum/surgery_step/limb/prepare
+ required_tool = /obj/item/weapon/cautery
+ allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
+
+ min_duration = 60
+ max_duration = 70
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected.open == 3
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \
+ "You start adjusting area around [target]'s [affected.display_name] with \the [tool]..")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has finished adjusting the area around [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].")
+ affected.status |= ORGAN_ATTACHABLE
+ affected.amputated = 1
+ affected.setAmputatedTree()
+ affected.open = 0
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ if (affected.parent)
+ affected = affected.parent
+ user.visible_message("\red [user]'s hand slips, searing [target]'s [affected.display_name]!", \
+ "\red Your hand slips, searing [target]'s [affected.display_name]!")
+ target.apply_damage(10, BURN, affected)
+
+
+/datum/surgery_step/limb/attach
+ required_tool = /obj/item/robot_parts
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/robot_parts/p = tool
+ if (p.part)
+ if (!(target_zone in p.part))
+ return 0
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected.status & ORGAN_ATTACHABLE
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \
+ "You start attaching [tool] where [target]'s [affected.display_name] used to be.")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \
+ "\blue You have attached [tool] where [target]'s [affected.display_name] used to be.")
+ affected.robotize()
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+ del(tool)
+
+ fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \
+ "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!")
+ target.apply_damage(10, BRUTE, affected)
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
new file mode 100644
index 00000000000..6228720a5be
--- /dev/null
+++ b/code/modules/surgery/surgery.dm
@@ -0,0 +1,74 @@
+/* SURGERY STEPS */
+
+/datum/surgery_step
+ // type path referencing the required tool for this step
+ var/required_tool = null
+
+ // type path referencing tools that can be used as substitude for this step
+ var/list/allowed_tools = null
+
+ // When multiple steps can be applied with the current tool etc., choose the one with higher priority
+
+ // checks whether this step can be applied with the given user and target
+ proc/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return 0
+
+ // does stuff to begin the step, usually just printing messages
+ proc/begin_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return
+
+ // does stuff to end the step, which is normally print a message + do whatever this step changes
+ proc/end_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return
+
+ // stuff that happens when the step fails
+ proc/fail_step(user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return null
+
+ // duration of the step
+ var/min_duration = 0
+ var/max_duration = 0
+
+ // evil infection stuff that will make everyone hate me
+ var/can_infect = 0
+
+ proc/isright(obj/item/tool) //is it is a required surgical tool for this step
+ return (istype(tool,required_tool))
+
+ proc/isacceptable(obj/item/tool) //is it is an accepted replacement tool for this step
+ if (allowed_tools)
+ for (var/T in allowed_tools)
+ if (istype(tool,T))
+ return 1
+ return 0
+
+proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
+ if(!istype(user) || !istype(E)) return
+
+ var/germ_level = user.germ_level
+ if(user.gloves)
+ germ_level = user.gloves.germ_level
+
+ E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no.
+
+proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
+ if(!istype(M,/mob/living/carbon))
+ return 0
+ if (user.a_intent == "harm") //check for Hippocratic Oath
+ return 0
+ for(var/datum/surgery_step/S in surgery_steps)
+ if( S.isright(tool) || S.isacceptable(tool) && \
+ S.can_use(user, M, user.zone_sel.selecting, tool)) //check if tool is right or close enough and if this step is possible
+ S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it
+ if(do_mob(user, M, rand(S.min_duration, S.max_duration))) //if user did nto move or changed hands
+ S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully
+ else //or
+ S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~
+ return 1 //don't want to do weapony things after surgery
+ return 0
+
+/datum/surgery_status/
+ var/eyes = 0
+ var/face = 0
+ var/appendix = 0
+ var/ribcage = 0
\ No newline at end of file