mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-16 16:47:32 +01:00
Fixed that damn book cluster spawning. Secure doors can now be opened by hitting them with yer hand Cleaned up surgery tools People now lie down and stand properly. For Cajoes: Cleanbot is more robust, and cleans up kitchen messes, now.
1234 lines
41 KiB
Plaintext
1234 lines
41 KiB
Plaintext
/*
|
|
CONTAINS:
|
|
RETRACTOR
|
|
HEMOSTAT
|
|
CAUTERY
|
|
SURGICAL DRILL
|
|
SCALPEL
|
|
CIRCULAR SAW
|
|
|
|
*/
|
|
|
|
/////////////
|
|
//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 ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_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 cut open torso with [src].", 1)
|
|
M << "\red [user] begins to retracts the flap in your chest with [src]!"
|
|
user << "\red You clamp retracts the flap in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 3.0
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] rips the larva out of [M]'s torso!", 1)
|
|
M << "\red [user] begins to rip the larva out of [M]'s torso!"
|
|
user << "\red You rip the larva out of [M]'s torso!"
|
|
var/mob/living/carbon/alien/larva/stupid = new(M.loc)
|
|
stupid.death(0)
|
|
//Make a larva and kill it. -- SkyMarshal
|
|
M:embryo_op_stage = 5.0
|
|
for(var/datum/disease/alien_embryo in M.viruses)
|
|
alien_embryo.cure()
|
|
return
|
|
|
|
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
|
|
|
|
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) || 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")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M:eye_op_stage = 2.0
|
|
return
|
|
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
|
|
/obj/item/weapon/retractor/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
|
|
if(!istype(H))
|
|
return 0
|
|
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
|
|
if(!S || !istype(S))
|
|
return 0
|
|
|
|
if(S.destroyed)
|
|
user << "What [S.display_name]?"
|
|
if(!S.open)
|
|
user << "\red There is skin in the way!"
|
|
return 0
|
|
if(S.bleeding)
|
|
user << "\red [H] is profusely bleeding in \his [S.display_name]!"
|
|
return 0
|
|
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] is beginning to retract the flap in the wound in [H]'s [S.display_name] with [src].", \
|
|
"\red [user] begins to retract the flap in the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] begins to retract the flap in the wound in \his [S.display_name] with [src]!", \
|
|
"\red You begin to retract the flap in the wound in your [S.display_name] with [src]!")
|
|
|
|
if(do_mob(user, H, 30))
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] retracts the flap in the wound in [H]'s [S.display_name] with [src]!", \
|
|
"\red [user] retracts the flap in the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] retracts the flap in the wound in \his [S.display_name] with [src]!", \
|
|
"\red You retract the flap in the wound in your [S.display_name] with [src]!")
|
|
|
|
if(H == user && prob(25))
|
|
user << "\red You mess up!"
|
|
S.take_damage(15)
|
|
|
|
S.open = 2
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
|
|
return 1
|
|
|
|
////////////
|
|
//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 == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_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 cut open torso with [src].", 1)
|
|
M << "\red [user] begins to torso bleeders in your chest with [src]!"
|
|
user << "\red You clamp bleeders in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 2.0
|
|
return
|
|
if(5.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] cleans out the debris from [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to clean out the debris in your torso with [src]!"
|
|
user << "\red You clean out the debris from in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 6.0
|
|
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
|
|
return
|
|
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/appendixinflamed(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")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M:eye_op_stage = 3.0
|
|
return
|
|
if(user.zone_sel.selecting == "head")
|
|
if(istype(M, /mob/living/carbon/human) && M:brain_op_stage == 1)
|
|
M:brain_op_stage = 0
|
|
var/datum/organ/external/S = M:organs["head"]
|
|
if(!S || !istype(S))
|
|
return ..()
|
|
M:brain_op_stage = 0
|
|
S.open = 1
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
else
|
|
return ..()
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
|
|
|
|
/obj/item/weapon/hemostat/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
|
|
if(!istype(H))
|
|
return 0
|
|
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
|
|
if(!S || !istype(S))
|
|
return 0
|
|
|
|
if(S.destroyed)
|
|
user << "What [S.display_name]?"
|
|
if(!S.open)
|
|
user << "\red There is skin in the way!"
|
|
return 0
|
|
if(!S.bleeding)
|
|
user << "\red [H] is not bleeding in \his [S.display_name]!"
|
|
return 0
|
|
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] is beginning to clamp bleeders in the wound in [H]'s [S.display_name] with [src].", \
|
|
"\red [user] begins to clamp bleeders in the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] begins to clamp bleeders in the wound in \his [S.display_name] with [src]!", \
|
|
"\red You begin to clamp bleeders in the wound in your [S.display_name] with [src]!")
|
|
|
|
if(do_mob(user, H, 50))
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] clamps bleeders in the wound in [H]'s [S.display_name] with [src]!", \
|
|
"\red [user] clamps bleeders in the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] clamps bleeders in the wound in \his [S.display_name] with [src]!", \
|
|
"\red You clamp bleeders in the wound in your [S.display_name] with [src]!")
|
|
|
|
if(H == user && prob(25))
|
|
user << "\red You mess up!"
|
|
S.take_damage(15)
|
|
|
|
S.bleeding = 0
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
|
|
return 1
|
|
|
|
///////////////////
|
|
//AUTOPSY SCANNER//
|
|
///////////////////
|
|
/obj/item/weapon/autopsy_scanner/var/list/datum/wound_data/wdata = list()
|
|
/obj/item/weapon/autopsy_scanner/var/target_name = null
|
|
|
|
/datum/wound_data
|
|
var
|
|
weapon = null // this is the DEFINITE weapon type that was used
|
|
list/organs_scanned = list() // this maps a number of scanned organs to
|
|
// the wounds to those organs with this data's weapon type
|
|
organ_names = ""
|
|
|
|
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
|
|
if(!O.weapon_wounds.len) return
|
|
|
|
for(var/V in O.weapon_wounds)
|
|
var/datum/wound/W = O.weapon_wounds[V]
|
|
|
|
if(!W.pretend_weapon)
|
|
// the more hits, the more likely it is that we get the right weapon type
|
|
if(prob(W.hits * 10 + W.damage))
|
|
W.pretend_weapon = W.weapon
|
|
else
|
|
W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet")
|
|
|
|
|
|
var/datum/wound_data/D = wdata[V]
|
|
if(!D)
|
|
D = new()
|
|
D.weapon = W.weapon
|
|
wdata[V] = D
|
|
|
|
if(!D.organs_scanned[O.name])
|
|
D.organ_names += "[O.display_name] "
|
|
|
|
del D.organs_scanned[O.name]
|
|
D.organs_scanned[O.name] = W.copy()
|
|
|
|
/obj/item/weapon/autopsy_scanner/verb/print_data()
|
|
set src in view(usr, 1)
|
|
if(usr.stat)
|
|
src << "No."
|
|
return
|
|
|
|
var/scan_data = ""
|
|
var/n = 1
|
|
for(var/wdata_idx in wdata)
|
|
var/datum/wound_data/D = wdata[wdata_idx]
|
|
var/total_hits = 0
|
|
var/total_score = 0
|
|
var/list/weapon_chances = list() // maps weapon names to a score
|
|
var/age = 0
|
|
|
|
for(var/wound_idx in D.organs_scanned)
|
|
var/datum/wound/W = D.organs_scanned[wound_idx]
|
|
total_hits += W.hits
|
|
|
|
var/wname = W.pretend_weapon
|
|
|
|
if(wname in weapon_chances) weapon_chances[wname] += W.damage
|
|
else weapon_chances[wname] = W.damage
|
|
total_score+=W.damage
|
|
|
|
|
|
var/wound_age = world.time - W.time_inflicted
|
|
age = max(age, wound_age)
|
|
|
|
var/damage_desc
|
|
|
|
// total score happens to be the total damage
|
|
switch(total_score)
|
|
if(0 to 5)
|
|
damage_desc = "<font color='green'>negligible</font>"
|
|
if(5 to 15)
|
|
damage_desc = "<font color='green'>light</font>"
|
|
if(15 to 30)
|
|
damage_desc = "<font color='orange'>moderate</font>"
|
|
if(30 to 1000)
|
|
damage_desc = "<font color='red'>severe</font>"
|
|
|
|
scan_data += "<b>Weapon #[n]</b><br>"
|
|
scan_data += "Severity: [damage_desc]<br>"
|
|
scan_data += "Hits by weapon: [total_hits]<br>"
|
|
scan_data += "Age of wound: [round(age / (60*10))] minutes<br>"
|
|
scan_data += "Affected limbs: [D.organ_names]<br>"
|
|
scan_data += "Possible weapons:<br>"
|
|
for(var/weapon_name in weapon_chances)
|
|
scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]<br>"
|
|
|
|
scan_data += "<br>"
|
|
|
|
n++
|
|
|
|
for(var/mob/O in viewers(usr))
|
|
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
|
|
|
|
sleep(10)
|
|
|
|
var/obj/item/weapon/paper/P = new(usr.loc)
|
|
P.name = "Autopsy Data ([target_name])"
|
|
P.info = "<tt>[scan_data]</tt>"
|
|
P.overlays += "paper_words"
|
|
|
|
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/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(target_name != M.name)
|
|
target_name = M.name
|
|
for(var/V in src.wdata)
|
|
del src.wdata[V]
|
|
src.wdata = list()
|
|
|
|
var/datum/organ/external/S = M.organs[user.zone_sel.selecting]
|
|
if(!S)
|
|
usr << "<b>You can't scan this body part.</b>"
|
|
return
|
|
if(!S.open)
|
|
usr << "<b>You have to cut the limb open first!</b>"
|
|
return
|
|
for(var/mob/O in viewers(M))
|
|
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
|
|
|
|
src.add_data(S)
|
|
|
|
return 1
|
|
|
|
|
|
///////////
|
|
//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 == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
if(M:embryo_op_stage == 6.0 || M:embryo_op_stage == 3.0 || M:embryo_op_stage == 7.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 torso with [src].", 1)
|
|
M << "\red [user] begins to cauterize the incision in your torso with [src]!"
|
|
user << "\red You cauterize the incision in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 0.0
|
|
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")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.disabilities &= ~128
|
|
M:eye_op_stage = 0.0
|
|
return
|
|
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
|
|
/obj/item/weapon/cautery/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
|
|
if(!istype(H))
|
|
return 0
|
|
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
|
|
if(!S || !istype(S))
|
|
return 0
|
|
|
|
if(S.destroyed)
|
|
user << "What [S.display_name]?"
|
|
if(!S.open)
|
|
user << "\red There is no wound to close up!"
|
|
return 0
|
|
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] is beginning to cauterize the incision in [H]'s [S.display_name] with [src].", \
|
|
"\red [user] begins to cut open the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] begins to cauterize the incision in \his [S.display_name] with [src]!", \
|
|
"\red You begin to cauterize the incision in your [S.display_name] with [src]!")
|
|
|
|
if(do_mob(user, H, rand(70,100)))
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] cauterizes the incision in [H]'s [S.display_name] with [src]!", \
|
|
"\red [user] cauterizes the incision in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] cauterizes the incision in \his [S.display_name] with [src]!", \
|
|
"\red You cauterize the incision in your [S.display_name] with [src]!")
|
|
|
|
if(H == user && prob(25))
|
|
user << "\red You mess up!"
|
|
S.take_damage(15)
|
|
|
|
S.open = 0
|
|
if(S.display_name == "chest" && H:embryo_op_stage == 1.0)
|
|
H:embryo_op_stage = 0.0
|
|
if(S.display_name == "groin" && H:appendix_op_stage == 1.0)
|
|
H:appendix_op_stage = 0.0
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
|
|
return 1
|
|
|
|
//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((user.mutations & CLUMSY) && 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 == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_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 torso cut open with [src] by [user].", 1)
|
|
// M << "\red [user] begins to cut open your torso with [src]!"
|
|
// user << "\red You cut [M]'s torso open with [src]!"
|
|
// M:embryo_op_stage = 1.0
|
|
// return
|
|
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 stomach cut open with [src] by [user].", 1)
|
|
M << "\red [user] begins to cut open your stomach with [src]!"
|
|
user << "\red You cut [M]'s stomach open with [src]!"
|
|
for(var/datum/disease/D in M.viruses)
|
|
if(istype(D, /datum/disease/alien_embryo))
|
|
user << "\blue There's something wiggling in there!"
|
|
M:embryo_op_stage = 4.0
|
|
if(M:embryo_op_stage == 3.0)
|
|
M:embryo_op_stage = 7.0 //Make it not cut their stomach open again and again if no larvae.
|
|
return
|
|
|
|
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.organs["head"])
|
|
var/datum/organ/external/affecting = H.organs["head"]
|
|
if(affecting.destroyed)
|
|
return ..()
|
|
|
|
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")
|
|
affecting.take_damage(15)
|
|
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)
|
|
affecting.open = 1
|
|
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")
|
|
affecting.take_damage(75)
|
|
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
|
|
|
|
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")
|
|
affecting.take_damage(15)
|
|
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."
|
|
return
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
|
|
/* wat
|
|
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
|
return ..()
|
|
*/
|
|
return
|
|
|
|
/obj/item/weapon/scalpel/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
|
|
if(!istype(H))
|
|
return 0
|
|
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
|
|
if(!S || !istype(S))
|
|
return 0
|
|
|
|
if(S.destroyed)
|
|
user << "What [S.display_name]?"
|
|
if(S.open)
|
|
user << "\red The wound is already open!"
|
|
return 0
|
|
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] is beginning to cut open the wound in [H]'s [S.display_name] with [src].", \
|
|
"\red [user] begins to cut open the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] begins to cut open the wound in \his [S.display_name] with [src]!", \
|
|
"\red You begin to cut open the wound in your [S.display_name] with [src]!")
|
|
|
|
if(do_mob(user, H, 100))
|
|
if(H != user)
|
|
H.visible_message( \
|
|
"\red [user] cuts open the wound in [H]'s [S.display_name] with [src]!", \
|
|
"\red [user] cuts open the wound in your [S.display_name] with [src]!")
|
|
else
|
|
H.visible_message( \
|
|
"\red [user] cuts open the wound in \his [S.display_name] with [src]!", \
|
|
"\red You cut open the wound in your [S.display_name] with [src]!")
|
|
|
|
if(H == user && prob(25))
|
|
user << "\red You mess up!"
|
|
S.take_damage(15)
|
|
|
|
S.open = 1
|
|
S.bleeding = 1
|
|
if(S.display_name == "chest")
|
|
H:embryo_op_stage = 1.0
|
|
if(S.display_name == "groin")
|
|
H:appendix_op_stage = 1.0
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
else
|
|
var/a = pick(1,2,3)
|
|
var/msg
|
|
if(a == 1)
|
|
msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding"
|
|
S.brute_dam += 35
|
|
S.createwound(rand(1,3))
|
|
else if(a == 2)
|
|
msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself"
|
|
S.brute_dam += 35
|
|
var/datum/organ/external/userorgan = user:organs["chest"]
|
|
if(userorgan)
|
|
userorgan.brute_dam += 35
|
|
else
|
|
user.take_organ_damage(35)
|
|
else if(a == 3)
|
|
msg = "\red [user] quickly stops the surgery"
|
|
for(var/mob/O in viewers(H))
|
|
O.show_message(msg, 1)
|
|
|
|
return 1
|
|
|
|
////////////////
|
|
//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((user.mutations & CLUMSY) && 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(0)
|
|
if(!istype(H))
|
|
return ..()
|
|
var/datum/organ/external/S = H.organs["head"]
|
|
if(S.destroyed)
|
|
return
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [H] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user,rand(50,70)))
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
|
|
return
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
|
|
S.destroyed = 1
|
|
S.droplimb()
|
|
H.update_body()
|
|
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")
|
|
affecting.take_damage(40)
|
|
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 metroid dead-nocore"
|
|
|
|
return
|
|
|
|
if(3.0)
|
|
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>"
|
|
|
|
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 if(user.zone_sel.selecting != "chest" && istype(M, /mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = M
|
|
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
|
|
if(S.destroyed)
|
|
return
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [H] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user, rand(20,80)))
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
|
|
return
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
|
|
S.destroyed = 1
|
|
S.droplimb()
|
|
H.update_body()
|
|
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/surgical_tool
|
|
name = "surgical tool"
|
|
var/list/stage = list() //Stage to act on
|
|
var/time = 50 //Time it takes to use
|
|
var/wound //Wound type to act on
|
|
|
|
proc/get_message(var/mnumber,var/M,var/user,var/datum/organ/external/organ)//=Start,2=finish,3=walk away,4=screw up, 5 = closed wound
|
|
proc/screw_up(mob/living/carbon/M as mob,mob/living/carbon/user as mob,var/datum/organ/external/organ)
|
|
organ.brute_dam += 30
|
|
/obj/item/weapon/surgical_tool/proc/IsFinalStage(var/stage)
|
|
var/a
|
|
switch(wound)
|
|
if("broken") //Basic broken bone
|
|
a=3
|
|
if("blood")
|
|
a=3
|
|
return stage == a
|
|
|
|
/obj/item/weapon/surgical_tool/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M, /mob))
|
|
return
|
|
if((usr.mutations & 16) && prob(50))
|
|
M << "\red You stab yourself in the eye."
|
|
M.disabilities |= 128
|
|
M.weakened += 4
|
|
M.bruteloss += 10
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if(!(locate(/obj/machinery/optable, M.loc) && M.resting))
|
|
return ..()
|
|
|
|
var/zone = user.zone_sel.selecting
|
|
if (istype(M.organs[zone], /datum/organ/external))
|
|
var/datum/organ/external/temp = M.organs[zone]
|
|
var/msg
|
|
|
|
// quickly convert embryo removal to bone surgery
|
|
if(zone == "chest" && M.embryo_op_stage == 3)
|
|
M.embryo_op_stage = 0
|
|
temp.open = 2
|
|
temp.bleeding = 0
|
|
|
|
// quickly convert appendectomy to bone surgery
|
|
if(zone == "groin" && M.appendix_op_stage == 3)
|
|
M.appendix_op_stage = 0
|
|
temp.open = 2
|
|
temp.bleeding = 0
|
|
|
|
msg = get_message(1,M,user,temp)
|
|
for(var/mob/O in viewers(M,null))
|
|
O.show_message("\red [msg]",1)
|
|
if(do_mob(user,M,time))
|
|
if(temp.open == 2 && !temp.bleeding)
|
|
if(temp.wound == wound)
|
|
if(temp.stage in stage)
|
|
temp.stage += 1
|
|
|
|
if(IsFinalStage(temp.stage))
|
|
temp.broken = 0
|
|
temp.stage = 0
|
|
temp.perma_injury = 0
|
|
temp.brute_dam = temp.min_broken_damage -1
|
|
msg = get_message(2,M,user,temp)
|
|
else
|
|
msg = get_message(4,M,user,temp)
|
|
screw_up(M,user,temp)
|
|
else
|
|
msg = get_message(5,M,user,temp)
|
|
else
|
|
msg = get_message(3,M,user,temp)
|
|
|
|
for(var/mob/O in viewers(M,null))
|
|
O.show_message("\red [msg]",1)
|
|
|
|
|
|
/*Broken bone
|
|
Basic:
|
|
Open -> Clean -> Bone-gel -> pop-into-place -> Bone-gel -> close -> glue -> clean
|
|
|
|
Split:
|
|
Open -> Clean -> Tweasers -> bone-glue -> close -> glue -> clean
|
|
|
|
The above might not apply anymore.
|
|
|
|
*/
|
|
|
|
/obj/item/weapon/surgical_tool/bonegel
|
|
name = "bone gel"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone gel"
|
|
|
|
/obj/item/weapon/surgical_tool/bonegel/New()
|
|
stage += 0
|
|
stage += 2
|
|
wound = "broken"
|
|
/obj/item/weapon/surgical_tool/bonegel/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ)
|
|
var/z
|
|
switch(n)
|
|
if(1)
|
|
z="[usr] starts applying bone gel to [m]'s [organ.display_name]"
|
|
if(2)
|
|
z="[usr] finishes applying bone gel to [m]'s [organ.display_name]"
|
|
if(3)
|
|
z="[usr] stops applying bone gel to [m]'s [organ.display_name]"
|
|
if(4)
|
|
z="[usr] applies bone gel incorrectly to [m]'s [organ.display_name]"
|
|
if(5)
|
|
z="[usr] lubricates [m]'s [organ.display_name]"
|
|
return z
|
|
|
|
/obj/item/weapon/surgical_tool/bonesetter
|
|
name = "bone setter"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone setter"
|
|
|
|
/obj/item/weapon/surgical_tool/bonesetter/New()
|
|
stage += 1
|
|
wound = "broken"
|
|
/obj/item/weapon/surgical_tool/bonesetter/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ)
|
|
var/z
|
|
switch(n)
|
|
if(1)
|
|
z="[usr] starts popping [m]'s [organ.display_name] bone into place"
|
|
if(2)
|
|
z="[usr] finishes popping [m]'s [organ.display_name] bone into place"
|
|
if(3)
|
|
z="[usr] stops popping [m]'s [organ.display_name] bone into place"
|
|
if(4)
|
|
z="[usr] pops [m]'s [organ.display_name] bone into the wrong place"
|
|
if(5)
|
|
z="[usr] performs chiropractice on [m]'s [organ.display_name]"
|
|
return z
|
|
|
|
|
|
|
|
/obj/item/weapon/boneinjector
|
|
name = "Bone-repairing Nanites Injector"
|
|
desc = "This injects the person with nanites that repair bones."
|
|
icon = 'items.dmi'
|
|
icon_state = "implanter1"
|
|
throw_speed = 1
|
|
throw_range = 5
|
|
w_class = 1.0
|
|
var/uses = 5
|
|
|
|
/obj/item/weapon/boneinjector/attack_paw(mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
/obj/item/weapon/boneinjector/proc/inject(mob/M as mob)
|
|
if(istype(M,/mob/living/carbon/human))
|
|
var/mob/living/carbon/human/H = M
|
|
for(var/name in H.organs)
|
|
var/datum/organ/external/e = H.organs[name]
|
|
if(e.destroyed) // this is nanites, not space magic
|
|
continue
|
|
e.brute_dam = 0.0
|
|
e.burn_dam = 0.0
|
|
e.bandaged = 0.0
|
|
e.wound_size = 0.0
|
|
e.max_damage = initial(e.max_damage)
|
|
e.bleeding = 0
|
|
e.open = 0
|
|
e.broken = 0
|
|
e.destroyed = 0
|
|
e.perma_injury = 0
|
|
e.update_icon()
|
|
H.update_body()
|
|
H.update_face()
|
|
H.UpdateDamageIcon()
|
|
|
|
uses--
|
|
if(uses == 0)
|
|
spawn(0)//this prevents the collapse of space-time continuum
|
|
del(src)
|
|
return uses
|
|
|
|
/obj/item/weapon/boneinjector/attack(mob/M as mob, mob/user as mob)
|
|
if (!istype(M, /mob))
|
|
return
|
|
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
|
user << "\red You don't have the dexterity to do this!"
|
|
return
|
|
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been injected with [name] by [user.name] ([user.ckey])</font>")
|
|
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [name] to inject [M.name] ([M.ckey])</font>")
|
|
|
|
if (user)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1)
|
|
//Foreach goto(192)
|
|
if (!(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)))
|
|
user << "\red Apparently it didn't work."
|
|
return
|
|
inject(M)//Now we actually do the heavy lifting.
|
|
|
|
if(!isnull(user))//If the user still exists. Their mob may not.
|
|
user.show_message(text("\red You inject [M]"))
|
|
return |