diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm
index 3aa13fbbac9..f09c8c89723 100644
--- a/code/WorkInProgress/surgery.dm
+++ b/code/WorkInProgress/surgery.dm
@@ -1,7 +1,28 @@
+
+//check if mob is lying down on something we can operate him on.
+/proc/can_operate(mob/living/carbon/M)
+ return (locate(/obj/machinery/optable, M.loc) && M.resting) || \
+ (locate(/obj/structure/stool/bed/roller, M.loc) && \
+ (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || \
+ (locate(/obj/structure/table/, M.loc) && \
+ (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))
+
+/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
@@ -36,138 +57,180 @@ proc/build_surgery_steps_list()
var/datum/surgery_step/S = new T
surgery_steps += S
-/* SURGERY STEPS */
-/datum/surgery_step/cut_open
+//////////////////////////////////////////////////////////////////
+// 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 (!hasorgans(target))
+ return 0
+ affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ return 1
+
+/datum/surgery_step/generic/cut_open
required_tool = /obj/item/weapon/scalpel
min_duration = 90
max_duration = 110
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 == 0
+ return ..() && affected.open == 0
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting open [target]'s [target_zone] with \the [tool]", \
- "You start cutting open [user]'s [target_zone] with \the [tool]")
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts cutting open [target]'s [affected.display_name] with \the [tool]", \
+ "You start cutting open [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] cuts open [target]'s [affected.display_name] with \the [tool]", \
- "\blue You cut open [user]'s [affected.display_name] with \the [tool]")
+ "\blue You cut open [target]'s [affected.display_name] with \the [tool]")
affected.open = 1
affected.createwound(CUT, 1)
+ 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 wrong spot with \the [tool]!", \
- "\red Your hand slips, slicing open [user]'s [affected.display_name] in wrong spot with \the [tool]!")
+ 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)
-/datum/surgery_step/clamp_bleeders
+/datum/surgery_step/generic/clamp_bleeders
required_tool = /obj/item/weapon/hemostat
min_duration = 40
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 && (affected.status & ORGAN_BLEEDING)
+ return ..() && affected.open && (affected.status & ORGAN_BLEEDING)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts clamping bleeders in the wound in [target]'s [target_zone] with \the [tool]", \
- "You start clamping bleeders in the wound in [user]'s [target_zone] with \the [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]")
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 the wound in [target]'s [affected.display_name] with \the [tool]", \
- "\blue You clamp bleeders in [user]'s [affected.display_name] with \the [tool]")
+ 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.bandage()
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 vessels in the wound in [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, tearing blood vessels in the wound in [affected.display_name] with \the [tool]!")
+ "\red Your hand slips, tearing blood vessels in the wound in [target]'s [affected.display_name] with \the [tool]!")
target.apply_damage(5, BRUTE, affected)
-/datum/surgery_step/retract_skin
+/datum/surgery_step/generic/retract_skin
required_tool = /obj/item/weapon/retractor
min_duration = 30
max_duration = 40
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 && !(affected.status & ORGAN_BLEEDING)
+ return ..() && affected.open < 2 && !(affected.status & ORGAN_BLEEDING)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts retracting flap of skin in the wound in [target]'s [target_zone] with \the [tool]", \
- "You starts retracting flap of skin in the wound in [user]'s [target_zone] with \the [tool]")
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts retracting flap of skin in the wound in [target]'s [affected.display_name] with \the [tool]", \
+ "You starts retracting a flap of skin in the wound 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] retracts flap of skin in the wound in [target]'s [affected.display_name] with \the [tool]", \
- "\blue You retract flap of skin in the wound in [user]'s [affected.display_name] with \the [tool]")
+ "\blue You retract a flap of skin in the wound in [target]'s [affected.display_name] with \the [tool]")
affected.open = 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, tearing skin flap in the wound in [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, tearing skin flap in the wound in [user]'s [affected.display_name] with \the [tool]!")
+ "\red Your hand slips, tearing the skin flap in the wound in [target]'s [affected.display_name] with \the [tool]!")
target.apply_damage(4, BRUTE, affected)
-/datum/surgery_step/cautherize
+/datum/surgery_step/generic/cauterize
required_tool = /obj/item/weapon/cautery
min_duration = 70
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
+ return ..() && affected.open
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision in [target]'s [target_zone] with \the [tool]", \
- "You are beginning to cauterize the incision in [user]'s [target_zone] with \the [tool]")
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to cauterize the incision in [target]'s [affected.display_name] with \the [tool]", \
+ "You are beginning to cauterize the incision 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] cauterizes the incision in [target]'s [affected.display_name] with \the [tool]", \
- "\blue You cauterize the incision in [user]'s [affected.display_name] with \the [tool]")
+ "\blue You cauterize the incision in [target]'s [affected.display_name] with \the [tool]")
affected.open = 0
affected.status &= ~ORGAN_BLEEDING
+ if (target_zone == "eyes" && target.op_stage.eyes > 0)
+ if (target.op_stage.eyes == 2)
+ target.sdisabilities &= ~BLIND
+ target.eye_stat = 0
+ target.op_stage.eyes = 0
+ if (target_zone == "mouth" && target.op_stage.face > 0)
+ if (target.op_stage.face == 2)
+ 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 small burn on [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, leaving small burn on [user]'s [affected.display_name] with \the [tool]!")
+ 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)
-/datum/surgery_step/cut_appendix
+//////////////////////////////////////////////////////////////////
+// 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
+ world << "Aiming right..."
+ groin = target.get_organ("groin")
+ if (!groin)
+ return 0
+ world << "Target locked..."
+ if (groin.open < 2)
+ return 0
+ world << "Entry gained..."
+ return 1
+
+/datum/surgery_step/appendectomy/cut_appendix
required_tool = /obj/item/weapon/scalpel
min_duration = 70
max_duration = 90
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/groin = target.get_organ("groin")
- return target_zone == "groin" && groin.open == 2 && groin:appendictomy_stage == 0
+ world << "Opstage: [target.op_stage.appendix]"
+ 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 cutting out [target]'s appendix with \the [tool]", \
"You start cutting out [user]'s appendix with \the [tool]")
end_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("\blue [user] cuts out [target]'s appendix with \the [tool]", \
"\blue You cut out [user]'s appendix with \the [tool]")
- groin:appendictomy_stage = 1
+ target.op_stage.appendix = 1
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 artery inside [target]'s abdomen with \the [tool]!", \
- "\red Your hand slips, slicing artery inside [target]'s abdomen with \the [tool]!")
+ 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)
/datum/surgery_step/remove_appendix
@@ -177,15 +240,13 @@ proc/build_surgery_steps_list()
max_duration = 80
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/groin = target.get_organ("groin")
- return target_zone == "groin" && groin.open == 2 && groin:appendictomy_stage == 1
+ 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 [user]'s appendix with \the [tool]")
end_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("\blue [user] removes [target]'s appendix with \the [tool]", \
"\blue You remove [user]'s appendix with \the [tool]")
var/datum/disease/appendicitis/app = null
@@ -197,7 +258,7 @@ proc/build_surgery_steps_list()
else
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(target))
target.resistances += app
- groin:appendictomy_stage = 2
+ target.op_stage.appendix = 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)
@@ -205,6 +266,10 @@ proc/build_surgery_steps_list()
"\red Your hand slips, hitting internal organs in [target]'s abdomen with \the [tool]!")
affected.createwound(BRUISE, 20)
+//////////////////////////////////////////////////////////////////
+// BONE SURGERY //
+//////////////////////////////////////////////////////////////////
+
/datum/surgery_step/glue_bone
required_tool = /obj/item/weapon/bonegel
@@ -235,7 +300,7 @@ proc/build_surgery_steps_list()
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, applying [tool] to the wrong spot in [target]'s [affected.display_name]!", \
- "\red Your hand slips, applying [tool] to the wrong spot in [user]'s [affected.display_name]!")
+ "\red Your hand slips, applying [tool] to the wrong spot in [target]'s [affected.display_name]!")
/datum/surgery_step/set_bone
required_tool = /obj/item/weapon/bonesetter
@@ -249,17 +314,297 @@ proc/build_surgery_steps_list()
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] is beginning to set [target]'s [target_zone] bone in place with \the [tool]", \
- "You are beginning to set [user]'s [target_zone] bone in place with \the [tool]")
+ "You are beginning to set [target]'s [target_zone] bone in place 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] set [target]'s [affected.display_name] bone in place with \the [tool]", \
- "\blue You set [user]'s [affected.display_name] bone in place with \the [tool]")
+ "\blue You set [target]'s [affected.display_name] bone in place with \the [tool]")
affected.stage = 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, setting [target]'s [affected.display_name] in wrong place with \the [tool]!", \
- "\red Your hand slips, setting [user]'s [affected.display_name] in wrong place with \the [tool]!")
+ user.visible_message("\red [user]'s hand slips, setting [target]'s [affected.display_name] in the wrong place with \the [tool]!", \
+ "\red Your hand slips, setting [target]'s [affected.display_name] in the wrong place with \the [tool]!")
affected.createwound(BRUISE, 5)
+//////////////////////////////////////////////////////////////////
+// EYE SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/lift_eyes
+ required_tool = /obj/item/weapon/retractor
+
+ min_duration = 30
+ max_duration = 40
+
+ 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_zone == "eyes" && target.op_stage.eyes < 1 && affected.open && !(affected.status & ORGAN_BLEEDING)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts lifting [target]'s eyes from sockets with \the [tool]", \
+ "You start lifting [target]'s eyes from sockets with \the [tool]")
+
+ end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] lifts [target]'s eyes from sockets with \the [tool]", \
+ "\blue You lift [target]'s eyes from sockets 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, damaging [target]'s eyes with \the [tool]!", \
+ "\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
+ target.apply_damage(10, BRUTE, affected)
+ //TODO eye damage
+
+/datum/surgery_step/mend_eyes
+ 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/datum/organ/external/affected = target.get_organ(target_zone)
+ return target_zone == "eyes" && target.op_stage.eyes == 1 && affected.open && !(affected.status & ORGAN_BLEEDING)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts mending nerves in [target]'s eyes with \the [tool]", \
+ "You start mending nerves 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] mend [target]'s eyes and nerves with \the [tool]", \
+ "\blue You mend [target]'s eyes and nerves 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, clamping on [target]'s eye nerves with \the [tool]!", \
+ "\red Your hand slips, clamping on [target]'s eye nerves with \the [tool]!")
+ target.apply_damage(10, BRUTE, affected)
+
+//////////////////////////////////////////////////////////////////
+// FACE SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/mend_vocal
+ required_tool = /obj/item/weapon/hemostat
+
+ 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)
+ return target_zone == "mouth" && target.op_stage.face < 1 && affected.open && !(affected.status & ORGAN_BLEEDING)
+
+ 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 = 1
+
+ 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
+
+/datum/surgery_step/fix_face
+ required_tool = /obj/item/weapon/retractor
+
+ 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 target_zone == "mouth" && target.op_stage.face == 1 && affected.open && !(affected.status & ORGAN_BLEEDING)
+
+ 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 = 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, 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)
+
+//////////////////////////////////////////////////////////////////
+// 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] starts sawing open [target]'s skull with \the [tool]", \
+ "You start start sawing open [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] saws [target]'s skull open with \the [tool]", \
+ "\blue You saw on [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, cutting [target]'s scalp with \the [tool]!", \
+ "\red Your hand slips, cutting [target]'s scalp with \the [tool]!")
+ target.apply_damage(10, BRUTE, "head")
+
+/datum/surgery_step/brain/cut_brain
+ required_tool = /obj/item/weapon/scalpel
+
+ 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")
+
+/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 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 rain from spine with \the [tool]", \
+ "\blue You separate [target]'s rain 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")
+
+
+//////////////////////////////////////////////////////////////////
+// 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
+
+ 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
+
+ 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.")
+ 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 //
+//////////////////////////////////////////////////////////////////
+
+//uh, sometime later, okay?
\ No newline at end of file
diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm
index c9f864fbc77..73dc0547702 100644
--- a/code/datums/organs/organ_external.dm
+++ b/code/datums/organs/organ_external.dm
@@ -467,7 +467,6 @@
max_damage = 115
min_broken_damage = 70
body_part = LOWER_TORSO
- var/appendictomy_stage = 0
/datum/organ/external/head
name = "head"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 29fec512a38..81955806796 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -1717,6 +1717,23 @@
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharp = 1
+/obj/item/weapon/bonegel
+ name = "bone gel"
+ icon = 'surgery.dmi'
+ icon_state = "bone-gel"
+ force = 0
+ throwforce = 1.0
+
+/obj/item/weapon/bonesetter
+ name = "bone setter"
+ icon = 'surgery.dmi'
+ icon_state = "bone setter"
+ force = 8.0
+ throwforce = 9.0
+ throw_speed = 3
+ throw_range = 5
+ attack_verb = list("attacked", "hit", "bludgeoned")
+
/obj/item/weapon/syntiflesh
name = "syntiflesh"
desc = "Meat that appears...strange..."
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 787bfe1356c..c9407bde7fe 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1353,6 +1353,15 @@ proc/is_hot(obj/item/W as obj)
istype(W, /obj/item/weapon/kitchen/utensil/fork) && W.icon_state != "forkloaded" || \
istype(W, /obj/item/weapon/twohanded/fireaxe) \
)
+/proc/is_surgery_tool(obj/item/W as obj)
+ return ( \
+ istype(W, /obj/item/weapon/scalpel) || \
+ istype(W, /obj/item/weapon/hemostat) || \
+ istype(W, /obj/item/weapon/retractor) || \
+ istype(W, /obj/item/weapon/cautery) || \
+ istype(W, /obj/item/weapon/bonegel) || \
+ istype(W, /obj/item/weapon/bonesetter)
+ )
/proc/reverse_direction(var/dir)
switch(dir)
@@ -1371,4 +1380,4 @@ proc/is_hot(obj/item/W as obj)
if(WEST)
return EAST
if(NORTHWEST)
- return SOUTHEAST
+ return SOUTHEAST
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e68e62ba5fa..1ecb152c171 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -179,28 +179,22 @@
if (!istype(M)) // not sure if this is the right thing...
return
-
- //if(istype(M) &&((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(50))))
- if(istype(M,/mob/living/carbon))
- if (user.a_intent == "help")
- if(surgery_steps == null) build_surgery_steps_list()
- for(var/datum/surgery_step/S in surgery_steps)
- var/have_correct_tool = 0
- if(istype(S.required_tool, /list))
- for(var/T in S.required_tool) if(istype(src, T))
- have_correct_tool = 1
- break
- else
- have_correct_tool = (istype(src, S.required_tool))
- if(!have_correct_tool) continue
- if(S.can_use(user, M, user.zone_sel.selecting, src))
- S.begin_step(user, M, user.zone_sel.selecting, src)
- if(do_mob(user, M, rand(S.min_duration, S.max_duration)))
- S.end_step(user, M, user.zone_sel.selecting, src)
- else
- S.fail_step(user, M, user.zone_sel.selecting, src)
- return //don't want to do weapony things after surgery
-
+ if (can_operate(M)) //Checks if mob is lying down on table for surgery
+ if(istype(M,/mob/living/carbon))
+ if (user.a_intent == "help")
+ if(surgery_steps == null) build_surgery_steps_list()
+ for(var/datum/surgery_step/S in surgery_steps) //check if tool is right
+ if(istype(src, S.required_tool) || \
+ (S.allowed_tools && src.type in S.allowed_tools )) //or close enough
+ if(S.can_use(user, M, user.zone_sel.selecting, src)) //is this step possible?
+ S.begin_step(user, M, user.zone_sel.selecting, src)
+ if(do_mob(user, M, rand(S.min_duration, S.max_duration)))
+ S.end_step(user, M, user.zone_sel.selecting, src)
+ else
+ S.fail_step(user, M, user.zone_sel.selecting, src)
+ return //don't want to do weapony things after surgery
+ if (is_surgery_tool(src) && user.a_intent != "harm")
+ return
var/messagesource = M
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 1d34a8c1657..e9099fe4736 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -9,582 +9,11 @@
*/
/*
- * Retractor
- */
-/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(50))))
- return ..()
+HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE!
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(2.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] retracts the flap in [M]'s abdomen cut open with [src].", 1)
- M << "\red [user] begins to retract the flap in your abdomen with [src]!"
- user << "\red You retract the flap in [M]'s abdomen with [src]!"
- M:appendix_op_stage = 3.0
- return
+NOW YOUR JOB IOS DONE BY ONLY 500 LINES OF SPAGHETTI CODE!
- if (user.zone_sel.selecting == "eyes")
+LOOK FOR SURGERY.DM
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(1.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes retracted by [user].", 1)
- M << "\red [user] begins to seperate your eyes with [src]!"
- user << "\red You seperate [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes retracted.", \
- "\red You begin to pry open your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
-
- M:eye_op_stage = 2.0
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-
-/*
- * Hemostat
- */
-/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(1.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1)
- M << "\red [user] begins to clamp bleeders in your abdomen with [src]!"
- user << "\red You clamp bleeders in [M]'s abdomen with [src]!"
- M:appendix_op_stage = 2.0
- if(4.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is removing [M]'s appendix with [src].", 1)
- M << "\red [user] begins to remove your appendix with [src]!"
- user << "\red You remove [M]'s appendix with [src]!"
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/appendicitis))
- new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(M))
- M:appendix_op_stage = 5.0
- return
- new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M))
- M:appendix_op_stage = 5.0
- return
-
- if (user.zone_sel.selecting == "eyes")
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(2.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes mended by [user].", 1)
- M << "\red [user] begins to mend your eyes with [src]!"
- user << "\red You mend [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes mended.", \
- "\red You begin to mend your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
- M:eye_op_stage = 3.0
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-
-/*
- * Cautery
- */
-/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(5.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1)
- M << "\red [user] begins to cauterize the incision in your abdomen with [src]!"
- user << "\red You cauterize the incision in [M]'s abdomen with [src]!"
- M:appendix_op_stage = 6.0
- for(var/datum/disease/appendicitis in M.viruses)
- appendicitis.cure()
- M.resistances += appendicitis
- return
-
- if (user.zone_sel.selecting == "eyes")
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M.eye_op_stage)
- if(3.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes cauterized by [user].", 1)
- M << "\red [user] begins to cauterize your eyes!"
- user << "\red You cauterize [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to have his eyes cauterized.", \
- "\red You begin to cauterize your eyes!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(15)
- M.sdisabilities &= ~BLIND
- M.eye_stat = 0
- M:eye_op_stage = 0.0
-
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-
- return
-
-/*
- * Surgical Drill
- */
-//obj/item/weapon/surgicaldrill
-
-
-/*
- * Scalpel
- */
-/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- //if(M.mutations & HUSK) return ..()
-
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- src.add_fingerprint(user)
-
- if(user.zone_sel.selecting == "groin")
- if(istype(M, /mob/living/carbon/human))
- switch(M:appendix_op_stage)
- if(0.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your abdomen with [src]!"
- user << "\red You cut [M]'s abdomen open with [src]!"
- M:appendix_op_stage = 1.0
- if(3.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1)
- M << "\red [user] begins to seperate your appendix with [src]!"
- user << "\red You seperate [M]'s appendix with [src]!"
- M:appendix_op_stage = 4.0
- return
-
- if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- switch(M:brain_op_stage)
- if(0.0)
- if(istype(M, /mob/living/carbon/metroid))
- if(M.stat == 2)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your flesh with [src]!"
- user << "\red You cut [M]'s flesh open with [src]!"
- M:brain_op_stage = 1.0
-
- return
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1)
- M << "\red [user] begins to cut open your head with [src]!"
- user << "\red You cut [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to cut open his skull with [src]!", \
- "\red You begin to cut open your head with [src]!" \
- )
-
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 1.0
-
- if(1)
- if(istype(M, /mob/living/carbon/metroid))
- if(M.stat == 2)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is having its silky inndards cut apart with [src] by [user].", 1)
- M << "\red [user] begins to cut apart your innards with [src]!"
- user << "\red You cut [M]'s silky innards apart with [src]!"
- M:brain_op_stage = 2.0
- return
- if(2.0)
- if(istype(M, /mob/living/carbon/metroid))
- if(M.stat == 2)
- var/mob/living/carbon/metroid/Metroid = M
- if(Metroid.cores > 0)
- if(istype(M, /mob/living/carbon/metroid))
- user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
- return
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1)
- M << "\red [user] begins to cut open your head with [src]!"
- user << "\red You cut [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] begin to delicately remove the connections to his brain with [src]!", \
- "\red You begin to cut open your head with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You nick an artery!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(75))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(75)
-
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 3.0
- else
- ..()
- return
-
- else if(user.zone_sel.selecting == "eyes")
- user << "\blue So far so good."
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
- user << "\red You cannot locate any eyes on this creature!"
- return
-
- switch(M:eye_op_stage)
- if(0.0)
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1)
- M << "\red [user] begins to cut open your eyes with [src]!"
- user << "\red You make an incision around [M]'s eyes with [src]!"
- else
- user.visible_message( \
- "\red [user] begins to cut around his eyes with [src]!", \
- "\red You begin to cut open your eyes with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(15))
- M:UpdateDamageIcon()
- else
- M.take_organ_damage(15)
-
- user << "\blue So far so good before."
- M.updatehealth()
- M:eye_op_stage = 1.0
- user << "\blue So far so good after."
- else
- return ..()
-/* wat
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
*/
- return
-
-
-/*
- * Circular Saw
- */
-/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
-
- if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
- return ..()
-
- src.add_fingerprint(user)
-
- if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
-
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
- (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- user << "\red You're going to need to remove that mask/helmet/glasses first."
- return
-
- switch(M:brain_op_stage)
- if(1.0)
- if(istype(M, /mob/living/carbon/metroid))
- return
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1)
- M << "\red [user] begins to saw open your head with [src]!"
- user << "\red You saw [M]'s head open with [src]!"
- else
- user.visible_message( \
- "\red [user] saws open his skull with [src]!", \
- "\red You begin to saw open your head with [src]!" \
- )
- if(M == user && prob(25))
- user << "\red You mess up!"
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- if(affecting.take_damage(40))
- M:UpdateDamageIcon()
- M.updatehealth()
- else
- M.take_organ_damage(40)
-
- if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
- affecting.take_damage(7)
- else
- M.take_organ_damage(7)
-
- M.updatehealth()
- M:brain_op_stage = 2.0
-
- if(2.0)
- if(istype(M, /mob/living/carbon/metroid))
- if(M.stat == 2)
- var/mob/living/carbon/metroid/Metroid = M
- if(Metroid.cores > 0)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
-
- Metroid.cores--
- M << "\red [user] begins to remove one of your cores with [src]! ([Metroid.cores] cores remaining)"
- user << "\red You cut one of [M]'s cores out with [src]! ([Metroid.cores] cores remaining)"
-
- new/obj/item/metroid_core(M.loc)
-
- if(Metroid.cores <= 0)
- M.icon_state = "baby roro dead-nocore"
-
- return
-
- if(3.0)
- if(M.mind && M.mind.changeling)
- user << "\red The neural tissue regrows before your eyes as you cut it."
- return
-
- if(M != user)
- for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1)
- M << "\red [user] severs your brain's connection to the spine with [src]!"
- user << "\red You sever [M]'s brain's connection to the spine with [src]!"
- else
- user.visible_message( \
- "\red [user] severs his brain's connection to the spine with [src]!", \
- "\red You sever your brain's connection to the spine with [src]!" \
- )
-
- user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
- M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
-
- log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
-
- log_admin("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
- msg_admin_attack("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
-
- var/obj/item/brain/B = new(M.loc)
- B.transfer_identity(M)
-
- M:brain_op_stage = 4.0
- M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
-
- else
- ..()
- return
-
- else
- return ..()
-/*
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
-*/
- return
-
-/obj/item/weapon/bonegel
- name = "bone gel"
- icon = 'surgery.dmi'
- icon_state = "bone-gel"
-
-/obj/item/weapon/bonesetter
- name = "bone setter"
- icon = 'surgery.dmi'
- icon_state = "bone setter"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 0f1fedb8de4..fae1e43474b 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,11 +1,11 @@
/mob/living/carbon/
gender = MALE
var/list/stomach_contents = list()
-
var/brain_op_stage = 0.0
+/*
var/eye_op_stage = 0.0
var/appendix_op_stage = 0.0
-
+*/
var/antibodies = 0
var/silent = null //Can't talk. Value goes down every life proc.