mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-04 14:33:30 +00:00
Commiting for the night, in case KGB steals my laptop.
Pretty much finished surgery system. -working appendectomy, bone surgery, eye surgery, face surgery, brain surgery (humans only) and metroid core surgery. -moved operation stages tracking vars to one op_stage datum. Left brain opstage var alone because way too many things reference it. -added bone gel and bone setter. -added check for surgery tools, so new doctors won't beat shit out of patients on optable too often. -pretty much emptied surgery_tols.dm, it was unneeded by this point. Still need to test it more, slap sanity checks everyfuckingwhere. Also more literate messages written with help of trained monkey (faux).
This commit is contained in:
@@ -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()]\]<font color='red'> Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
target.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
|
||||
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("<font color='red'>[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
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?
|
||||
@@ -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"
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()]\]<font color='red'> Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
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"
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user