mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-19 21:12:41 +01:00
850 lines
28 KiB
Plaintext
850 lines
28 KiB
Plaintext
/*
|
|
CONTAINS:
|
|
SCALPEL
|
|
CIRCULAR SAW
|
|
STAPLE GUN
|
|
DEFIBRILLATOR
|
|
SUTURE
|
|
BANDAGE
|
|
BLOOD BAG (unused)
|
|
BODY BAG
|
|
*/
|
|
|
|
/* ================================================= */
|
|
/* -------------------- Scalpel -------------------- */
|
|
/* ================================================= */
|
|
|
|
/obj/item/scalpel
|
|
name = "scalpel"
|
|
desc = "A surgeon's tool, used to cut precisely into a subject's body."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "scalpel1"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "scalpel"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
hit_type = DAMAGE_CUT
|
|
hitsound = 'sound/weapons/slashcut.ogg'
|
|
force = 3.0
|
|
w_class = 1.0
|
|
throwforce = 5.0
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
m_amt = 10000
|
|
g_amt = 5000
|
|
stamina_damage = 5
|
|
stamina_cost = 5
|
|
stamina_crit_chance = 35
|
|
var/mob/Poisoner = null
|
|
module_research = list("tools" = 3, "medicine" = 3, "weapons" = 0.25)
|
|
|
|
New()
|
|
..()
|
|
if (src.icon_state == "scalpel1")
|
|
icon_state = pick("scalpel1", "scalpel2")
|
|
src.create_reagents(5)
|
|
|
|
attack(mob/living/carbon/M as mob, mob/user as mob)
|
|
if (src.reagents && src.reagents.total_volume)
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>) [log_reagents(src)]")
|
|
src.reagents.trans_to(M,5)
|
|
else
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>)")
|
|
if (!scalpel_surgery(M, user))
|
|
return ..()
|
|
else return
|
|
|
|
suicide(var/mob/user as mob)
|
|
user.visible_message("<span style=\"color:red\"><b>[user] slashes \his own throat with [src]!</b></span>")
|
|
blood_slash(user, 25)
|
|
playsound(user.loc, src.hitsound, 50, 1)
|
|
user.TakeDamage("head", 150, 0)
|
|
user.updatehealth()
|
|
spawn(100)
|
|
if (user)
|
|
user.suiciding = 0
|
|
return 1
|
|
|
|
/obj/item/scalpel/vr
|
|
icon = 'icons/effects/VR.dmi'
|
|
icon_state = "scalpel"
|
|
|
|
/* ====================================================== */
|
|
/* -------------------- Circular Saw -------------------- */
|
|
/* ====================================================== */
|
|
|
|
/obj/item/circular_saw
|
|
name = "circular saw"
|
|
desc = "A saw used to cut bone with precision."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "saw1"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "saw1"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
hit_type = DAMAGE_CUT
|
|
hitsound = 'sound/weapons/slashcut.ogg'
|
|
force = 3
|
|
w_class = 1.0
|
|
throwforce = 3.0
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
m_amt = 20000
|
|
g_amt = 10000
|
|
stamina_damage = 5
|
|
stamina_cost = 5
|
|
stamina_crit_chance = 35
|
|
var/mob/Poisoner = null
|
|
module_research = list("tools" = 3, "medicine" = 3, "weapons" = 0.25)
|
|
|
|
New()
|
|
..()
|
|
if (src.icon_state == "saw1")
|
|
icon_state = pick("saw1", "saw2", "saw3")
|
|
src.create_reagents(5)
|
|
|
|
attack(mob/living/carbon/M as mob, mob/user as mob)
|
|
if (src.reagents && src.reagents.total_volume)
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>) [log_reagents(src)]")
|
|
src.reagents.trans_to(M,5)
|
|
else
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>)")
|
|
if (!saw_surgery(M, user))
|
|
return ..()
|
|
else return
|
|
|
|
suicide(var/mob/user as mob)
|
|
user.visible_message("<span style=\"color:red\"><b>[user] slashes \his own throat with [src]!</b></span>")
|
|
blood_slash(user, 25)
|
|
playsound(user.loc, src.hitsound, 50, 1)
|
|
user.TakeDamage("head", 150, 0)
|
|
user.updatehealth()
|
|
spawn(100)
|
|
if (user)
|
|
user.suiciding = 0
|
|
return 1
|
|
|
|
/obj/item/circular_saw/vr
|
|
icon = 'icons/effects/VR.dmi'
|
|
icon_state = "saw"
|
|
|
|
/* =========================================================== */
|
|
/* -------------------- Enucleation Spoon -------------------- */
|
|
/* =========================================================== */
|
|
|
|
/obj/item/surgical_spoon
|
|
name = "enucleation spoon"
|
|
desc = "A surgeon's tool, used to protect the globe of the eye during eye removal surgery, and to lift the eye out of the socket. You could eat food with it too, I guess."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "spoon"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "scalpel"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
hit_type = DAMAGE_STAB
|
|
hitsound = 'sound/effects/bloody_stab.ogg'
|
|
force = 3.0
|
|
w_class = 1.0
|
|
throwforce = 5.0
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
m_amt = 10000
|
|
g_amt = 5000
|
|
stamina_damage = 5
|
|
stamina_cost = 5
|
|
stamina_crit_chance = 35
|
|
var/mob/Poisoner = null
|
|
module_research = list("tools" = 3, "medicine" = 3, "weapons" = 0.25)
|
|
|
|
New()
|
|
..()
|
|
src.create_reagents(5)
|
|
|
|
attack(mob/living/carbon/M as mob, mob/user as mob)
|
|
if (src.reagents && src.reagents.total_volume)
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>) [log_reagents(src)]")
|
|
src.reagents.trans_to(M,5)
|
|
else
|
|
logTheThing("combat", user, M, "used [src] on %target% (<b>Intent</b>: <i>[user.a_intent]</i>) (<b>Targeting</b>: <i>[user.zone_sel.selecting]</i>)")
|
|
if (!spoon_surgery(M, user))
|
|
return ..()
|
|
else return
|
|
|
|
suicide(var/mob/user as mob)
|
|
user.visible_message("<span style=\"color:red\"><b>[user] jabs [src] straight through \his eye and into \his brain!</b></span>")
|
|
blood_slash(user, 25)
|
|
playsound(user.loc, src.hitsound, 50, 1)
|
|
user.TakeDamage("head", 150, 0)
|
|
user.updatehealth()
|
|
spawn(100)
|
|
if (user)
|
|
user.suiciding = 0
|
|
return 1
|
|
|
|
/* ==================================================== */
|
|
/* -------------------- Staple Gun -------------------- */
|
|
/* ==================================================== */
|
|
|
|
/obj/item/staple_gun
|
|
name = "staple gun"
|
|
desc = "A medical staple gun for securely reattaching limbs."
|
|
icon = 'icons/obj/gun.dmi'
|
|
icon_state = "staplegun"
|
|
w_class = 1
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
force = 5
|
|
var/datum/projectile/staple = new/datum/projectile/bullet/staple
|
|
var/ammo = 20
|
|
stamina_damage = 15
|
|
stamina_cost = 15
|
|
stamina_crit_chance = 15
|
|
module_research = list("tools" = 1, "medicine" = 1, "weapons" = 1)
|
|
|
|
// Every bit of usability helps (Convair880).
|
|
examine()
|
|
src.desc = "A medical staple gun for securely reattaching limbs. There are [src.ammo] staples left."
|
|
..()
|
|
return
|
|
|
|
attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if (!istype(M, /mob))
|
|
return
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if (src.ammo < 1)
|
|
user.show_text("*click* *click*", "red")
|
|
return ..()
|
|
|
|
if (user.a_intent != "help" && ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
H.visible_message("<span style=\"color:red\"><B>[user] shoots [H] point-blank with [src]!</B></span>")
|
|
hit_with_projectile(user, staple, H)
|
|
src.ammo--
|
|
if (H && H.stat == 0)
|
|
H.lastgasp()
|
|
return
|
|
|
|
if (!(user.zone_sel.selecting in list("l_arm","r_arm","l_leg","r_leg", "head")) || !ishuman(M))
|
|
return ..()
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
|
|
//Attach butt to head
|
|
if (user.zone_sel.selecting == "head" && istype(H.head, /obj/item/clothing/head/butt))
|
|
var/obj/item/clothing/head/butt/B = H.head
|
|
B.staple()
|
|
if (src.staple.shot_sound)
|
|
playsound(user, src.staple.shot_sound, 50, 1)
|
|
if (user == H)
|
|
user.visible_message("<span style=\"color:red\"><b>[user] staples \the [B.name] to their own head! [prob(10) ? pick("Woah!", "What a goof!", "Wow!", "WHY!?"): null]</span>")
|
|
else
|
|
user.visible_message("<span style=\"color:red\"><b>[user] staples \the [B.name] to [H.name]'s head!</span>")
|
|
if (H.stat!=2)
|
|
H.emote(pick("cry", "wail", "weep", "sob", "shame", "twitch"))
|
|
src.ammo--
|
|
logTheThing("combat",user, H, "staples a butt to %target%'s head")
|
|
return
|
|
|
|
if (!surgeryCheck(H, user))
|
|
return ..()
|
|
|
|
// Marq fix for undefined variable /datum/human_limbs/var/head
|
|
if (user.zone_sel.selecting in H.limbs.vars)
|
|
var/obj/item/parts/surgery_limb = H.limbs.vars[user.zone_sel.selecting]
|
|
if (istype(surgery_limb))
|
|
src.ammo--
|
|
surgery_limb.surgery(src)
|
|
return
|
|
|
|
attackby(obj/item/W, mob/user)
|
|
..()
|
|
if (istype(W,/obj/item/pipebomb/frame))
|
|
var/obj/item/pipebomb/frame/F = W
|
|
if (F.state < 2)
|
|
user.show_text("This might work better if [F] was hollowed out.")
|
|
else if (F.state == 2)
|
|
user.show_text("You combine [F] and [src]. This looks pretty unsafe!")
|
|
user.u_equip(F)
|
|
user.u_equip(src)
|
|
var/turf/T = get_turf(src)
|
|
playsound(T, "sound/items/Deconstruct.ogg", 50, 1)
|
|
new/obj/item/gun/kinetic/zipgun(T)
|
|
qdel(F)
|
|
qdel(src)
|
|
|
|
else
|
|
user.show_text("You can't seem to combine these two items this way.")
|
|
return
|
|
|
|
/* =============================================== */
|
|
/* -------------------- Defib -------------------- */
|
|
/* =============================================== */
|
|
|
|
/obj/item/robodefibrilator
|
|
name = "defibrillator"
|
|
desc = "Used to resuscitate critical patients."
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
icon = 'icons/obj/surgery.dmi'
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
icon_state = "defib-on"
|
|
item_state = "defib"
|
|
var/icon_base = "defib"
|
|
var/charged = 1
|
|
var/charge_time = 100
|
|
var/emagged = 0
|
|
var/makeshift = 0
|
|
var/obj/item/cell/cell = null
|
|
mats = 10
|
|
|
|
emag_act(var/mob/user)
|
|
if (src.makeshift)
|
|
if (user)
|
|
user.show_text("You prod at [src], but it doesn't do anything.", "red")
|
|
return 0
|
|
if (!src.emagged)
|
|
if (user)
|
|
user.show_text("You short out the on board medical scanner!", "blue")
|
|
src.desc += " The screen only shows the word KILL flashing over and over."
|
|
src.emagged = 1
|
|
return 1
|
|
else
|
|
if (user)
|
|
user.show_text("This has already been tampered with.", "red")
|
|
return 0
|
|
|
|
demag(var/mob/user)
|
|
if (!src.emagged)
|
|
return 0
|
|
if (user)
|
|
user.show_text("You reapair the on board medical scanner.", "blue")
|
|
src.desc = null
|
|
src.desc = "Used to resuscitate critical patients."
|
|
src.emagged = 0
|
|
return 1
|
|
|
|
attack(mob/living/M as mob, mob/user as mob)
|
|
if (!ishuman(M))
|
|
return ..()
|
|
if (src.charged == 0)
|
|
user.show_text("[src] is still charging!", "red")
|
|
return
|
|
if (src.defibrillate(M, user, src.emagged, src.makeshift, src.cell))
|
|
src.charged = 0
|
|
src.icon_state = "[src.icon_base]-shock"
|
|
spawn(10)
|
|
src.icon_state = "[src.icon_base]-off"
|
|
spawn(src.charge_time)
|
|
src.charged = 1
|
|
src.icon_state = "[src.icon_base]-on"
|
|
playsound(user.loc, "sound/weapons/flash.ogg", 75, 1)
|
|
|
|
disposing()
|
|
..()
|
|
if (src.cell)
|
|
src.cell.dispose()
|
|
src.cell = null
|
|
|
|
get_desc(dist)
|
|
..()
|
|
if (istype(src.cell))
|
|
if (src.cell.artifact)
|
|
return
|
|
else
|
|
. += "The charge meter reads [round(src.cell.percent())]%."
|
|
|
|
/obj/item/robodefibrilator/emagged
|
|
emagged = 1
|
|
desc = "Used to resuscitate critical patients. The screen only shows the word KILL flashing over and over."
|
|
|
|
/obj/item/robodefibrilator/vr
|
|
icon = 'icons/effects/VR.dmi'
|
|
|
|
/obj/item/robodefibrilator/makeshift
|
|
name = "shoddy-looking makeshift defibrilator"
|
|
desc = "It might restart your heart, I guess, or it might barbeque your insides."
|
|
icon_state = "cell-on"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "cell"
|
|
icon_base = "cell"
|
|
makeshift = 1
|
|
|
|
New(var/location, var/obj/item/cell/newcell)
|
|
..()
|
|
if (!istype(newcell))
|
|
newcell = new /obj/item/cell/charged(src)
|
|
src.cell = newcell
|
|
newcell.set_loc(src)
|
|
|
|
/* ================================================ */
|
|
/* -------------------- Suture -------------------- */
|
|
/* ================================================ */
|
|
|
|
/obj/item/suture
|
|
name = "suture"
|
|
desc = "A fine, curved needle with a length of absorbable polyglycolide suture thread."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "suture"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "suture"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
hit_type = DAMAGE_STAB
|
|
w_class = 1.0
|
|
force = 1
|
|
throwforce = 1.0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
m_amt = 5000
|
|
stamina_damage = 1
|
|
stamina_cost = 1
|
|
stamina_crit_chance = 0
|
|
var/in_use = 0
|
|
|
|
attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if (!suture_surgery(M,user))
|
|
if (ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
var/zone = user.zone_sel.selecting
|
|
var/surgery_status = H.get_surgery_status(zone)
|
|
if (surgery_status && H.organHolder)
|
|
H.visible_message("<span style=\"color:red\"><b>[user]</b> begins suturing the incisions on [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] [zone_sel2name[zone]] closed with [src].</span>", \
|
|
"<span style=\"color:red\">[H == user ? "You begin" : "<b>[user]</b> begins"] suturing the incisions on your [zone_sel2name[zone]] closed with [src].</span>")
|
|
src.in_use = 1
|
|
if (do_mob(user, H, 20 * surgery_status))
|
|
H.visible_message("<span style=\"color:blue\"><b>[user]</b> sutures the incisions on [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] [zone_sel2name[zone]] closed.</span>", \
|
|
"<span style=\"color:blue\">[H == user ? "You suture" : "<b>[user]</b> sutures"] the incisions on your [zone_sel2name[zone]] closed.</span>")
|
|
if (zone == "chest")
|
|
if (H.organHolder.heart)
|
|
H.organHolder.heart.op_stage = 0.0
|
|
if (H.butt_op_stage)
|
|
H.butt_op_stage = 0.0
|
|
H.TakeDamage("chest", 2, 0)
|
|
else if (zone == "head")
|
|
if (H.organHolder.head)
|
|
H.organHolder.head.op_stage = 0.0
|
|
if (H.organHolder.skull)
|
|
H.organHolder.skull.op_stage = 0.0
|
|
if (H.organHolder.brain)
|
|
H.organHolder.brain.op_stage = 0.0
|
|
if (H.bleeding)
|
|
repair_bleeding_damage(H, 50, rand(1,3))
|
|
src.in_use = 0
|
|
return
|
|
else
|
|
user.show_text("<span style=\"color:red\">You were interrupted!</span>", "red")
|
|
src.in_use = 0
|
|
return
|
|
else if (H.bleeding)
|
|
H.visible_message("<span style=\"color:red\"><b>[user]</b> begins suturing [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] wounds closed with [src].</span>", \
|
|
"<span style=\"color:red\">[H == user ? "You begin" : "<b>[user]</b> begins"] suturing your wounds closed with [src].</span>")
|
|
src.in_use = 1
|
|
if (do_mob(user, H, 20 * H.bleeding))
|
|
H.visible_message("<span style=\"color:blue\"><b>[user]</b> sutures [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] wounds closed.</span>", \
|
|
"<span style=\"color:blue\">[H == user ? "You suture" : "<b>[user]</b> sutures"] your wounds closed.</span>")
|
|
repair_bleeding_damage(M, 100, 10)
|
|
src.in_use = 0
|
|
return
|
|
else
|
|
user.show_text("<span style=\"color:red\">You were interrupted!</span>", "red")
|
|
src.in_use = 0
|
|
return
|
|
else
|
|
user.show_text("[H] has no wounds to close!", "red")
|
|
return
|
|
else
|
|
return
|
|
|
|
suicide(var/mob/user as mob)
|
|
user.visible_message("<span style=\"color:red\"><b>[user] rapidly sews \his mouth and nose closed with [src]! Holy shit, how?!</b></span>")
|
|
user.take_oxygen_deprivation(160)
|
|
user.updatehealth()
|
|
spawn(100)
|
|
if (user)
|
|
user.suiciding = 0
|
|
return 1
|
|
|
|
/obj/item/suture/vr
|
|
icon = 'icons/effects/VR.dmi'
|
|
|
|
/* ================================================= */
|
|
/* -------------------- Bandage -------------------- */
|
|
/* ================================================= */
|
|
|
|
/obj/item/bandage
|
|
name = "bandage"
|
|
desc = "A length of gauze that will help stop bleeding."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "bandage-item-3"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "bandage"
|
|
flags = FPRINT | TABLEPASS
|
|
w_class = 1.0
|
|
force = 0
|
|
throwforce = 1.0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
stamina_damage = 0
|
|
stamina_cost = 0
|
|
stamina_crit_chance = 0
|
|
var/uses = 6
|
|
var/in_use = 0
|
|
|
|
get_desc(dist)
|
|
..()
|
|
if (src.uses >= 0)
|
|
switch (src.uses)
|
|
if (-INFINITY to 0)
|
|
. += "<span style=\"color:red\">There's none left.</span>"
|
|
if (1) // grhg w/e I'm half asleep this is good enough
|
|
. += "<span style=\"color:red\">There's enough left to bandage about [src.uses] wound.</span>"
|
|
if (2 to 5)
|
|
. += "<span style=\"color:red\">There's enough left to bandage about [src.uses] wounds.</span>"
|
|
if (6 to INFINITY)
|
|
. += "None of it's been used."
|
|
|
|
attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if (!src.uses || src.icon_state == "bandage-item-0")
|
|
user.show_text("There's nothing left of [src]!", "red")
|
|
return
|
|
if (src.in_use)
|
|
return
|
|
if (ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
if (H.bleeding)
|
|
H.visible_message("<span style=\"color:red\"><b>[user]</b> begins bandaging [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] wounds with [src].</span>", \
|
|
"<span style=\"color:red\">[H == user ? "You begin" : "<b>[user]</b> begins"] bandaging your wounds with [src].</span>")
|
|
src.in_use = 1
|
|
if (do_mob(user, H, 15))
|
|
H.visible_message("<span style=\"color:blue\"><b>[user]</b> dresses [H == user ? "[H.gender == "male" ? "his" : "her"]" : "[H]'s"] wounds.</span>", \
|
|
"<span style=\"color:blue\">[H == user ? "You dress" : "<b>[user]</b> dresses"] your wounds.</span>")
|
|
repair_bleeding_damage(M, 100, rand(2,5))
|
|
src.uses --
|
|
src.in_use = 0
|
|
src.update_icon()
|
|
var/target = user.zone_sel.selecting
|
|
if (!H.bandaged.Find(target))
|
|
H.bandaged += target
|
|
H.update_body()
|
|
else
|
|
user.show_text("You were interrupted!", "red")
|
|
src.in_use = 0
|
|
return
|
|
else
|
|
user.show_text("[H] has no wounds to bandage!", "red")
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
proc/update_icon()
|
|
switch (src.uses)
|
|
if (0 to -INFINITY)
|
|
src.icon_state = "bandage-item-0"
|
|
if (1 to 2)
|
|
src.icon_state = "bandage-item-1"
|
|
if (3 to 4)
|
|
src.icon_state = "bandage-item-2"
|
|
if (5 to INFINITY)
|
|
src.icon_state = "bandage-item-3"
|
|
|
|
/obj/item/bandage/vr
|
|
icon = 'icons/effects/VR.dmi'
|
|
|
|
/* =================================================== */
|
|
/* -------------------- Blood Bag -------------------- */
|
|
/* =================================================== */
|
|
/*
|
|
/obj/item/bloodbag
|
|
name = "blood bag"
|
|
desc = "A bag filled with donated O- blood. There's a fine needle at the end that can be used to transfer the blood to someone."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "bloodbag-10"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "bloodbag"
|
|
flags = FPRINT | TABLEPASS
|
|
w_class = 1.0
|
|
force = 0
|
|
throwforce = 1.0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
stamina_damage = 0
|
|
stamina_cost = 0
|
|
stamina_crit_chance = 0
|
|
var/volume = 100 // aaa why did they hold SO MUCH BLOOD?? 500 IS THE SAME AS A PERSON WHY DID THEY HAVE A PERSON WORTH OF BLOOD IN THEM
|
|
var/in_use = 0
|
|
|
|
get_desc(dist)
|
|
..()
|
|
if (src.volume >= 0)
|
|
switch (src.volume)
|
|
if (-INFINITY to 0)
|
|
. += "<span style=\"color:red\">It's empty.</span>"
|
|
if (1 to 29)
|
|
. += "<span style=\"color:red\">It's getting low.</span>"
|
|
if (30 to 69)
|
|
. += "Some of it's been used."
|
|
if (70 to 99)
|
|
. += "<span style=\"color:blue\">It's nearly full.</span>"
|
|
if (100 to INFINITY)
|
|
. += "<span style=\"color:blue\">It's full.</span>"
|
|
|
|
attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if (volume <= 0)
|
|
user.show_text("There's nothing left in [src]!", "red")
|
|
return
|
|
if (in_use)
|
|
return
|
|
if (ishuman(M))
|
|
var/mob/living/carbon/human/H = M
|
|
if (H.blood_volume < 500)
|
|
H.tri_message("<span style=\"color:blue\"><b>[user]</b> attaches [src]'s needle to [H == user ? </span>"[H.gender == "male" ? "his" : "her"]" : "[H]'s"] arm and begins transferring blood.",\
|
|
user, "<span style=\"color:blue\">You attach [src]'s needle to [H == user ? </span>"your" : "[H]'s"] arm and begin transferring blood.",\
|
|
H, "<span style=\"color:blue\">[H == user ? </span>"You attach" : "<b>[user]</b> attaches"] [src]'s needle to your arm and begin transferring blood.")
|
|
src.in_use = 1
|
|
for (var/i)
|
|
if (H.blood_volume >= 500)
|
|
H.visible_message("<span style=\"color:blue\"><b>[H]</b>'s blood transfusion finishes.</span>", \
|
|
"<span style=\"color:blue\">Your blood transfusion finishes.</span>")
|
|
src.in_use = 0
|
|
break
|
|
if (src.volume <= 0)
|
|
H.visible_message("<span style=\"color:red\"><b>[src] runs out of blood!</b></span>")
|
|
src.in_use = 0
|
|
break
|
|
if (get_dist(src, H) > 1)
|
|
var/fluff = pick("pulled", "yanked", "ripped")
|
|
H.visible_message("<span style=\"color:red\"><b>[src]'s needle gets [fluff] out of [H]'s arm!</b></span>", \
|
|
"<span style=\"color:red\"><b>[src]'s needle gets [fluff] out of your arm!</b></span>")
|
|
src.in_use = 0
|
|
break
|
|
else
|
|
H.blood_volume ++
|
|
src.volume --
|
|
src.update_icon()
|
|
if (prob(5))
|
|
var/fluff = pick("better", "a little better", "a bit better", "warmer", "a little warmer", "a bit warmer", "less cold")
|
|
H.visible_message("<span style=\"color:blue\"><b>[H]</b> looks [fluff].</span>", \
|
|
"<span style=\"color:blue\">You feel [fluff].</span>")
|
|
sleep(5)
|
|
else
|
|
user.show_text("[H] already has enough blood!", "red")
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
attackby(obj/item/W, mob/user)
|
|
if (istype(W, /obj/item/reagent_containers/hypospray) || istype(W, /obj/item/reagent_containers/syringe) || istype(W, /obj/item/reagent_containers/emergency_injector))
|
|
if (W.reagents && W.reagents.has_reagent("blood"))
|
|
var/blood_volume = W.reagents.get_reagent_amount("blood")
|
|
if (blood_volume < W.reagents.total_volume)
|
|
user.show_text("This blood is impure!", "red")
|
|
return
|
|
else
|
|
if (src.volume > 100 - W:amount_per_transfer_from_this)
|
|
user.show_text("[src] is too full!", "red")
|
|
return
|
|
user.visible_message("<span style=\"color:blue\"><b>[user]</b> transfers blood to [src].</span>", \
|
|
"<span style=\"color:blue\">You transfer blood from [W] to [src].</span>")
|
|
W.reagents.remove_reagent("blood", W:amount_per_transfer_from_this)
|
|
src.volume += W:amount_per_transfer_from_this
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
proc/update_icon()
|
|
var/iv_state = max(min(round(src.volume, 10) / 10, 100), 0)
|
|
icon_state = "bloodbag-[iv_state]"
|
|
/* switch (src.volume)
|
|
if (90 to INFINITY)
|
|
src.icon_state = "bloodbag-10"
|
|
if (80 to 89)
|
|
src.icon_state = "bloodbag-9"
|
|
if (70 to 79)
|
|
src.icon_state = "bloodbag-8"
|
|
if (60 to 69)
|
|
src.icon_state = "bloodbag-7"
|
|
if (50 to 59)
|
|
src.icon_state = "bloodbag-6"
|
|
if (40 to 49)
|
|
src.icon_state = "bloodbag-5"
|
|
if (30 to 39)
|
|
src.icon_state = "bloodbag-4"
|
|
if (20 to 29)
|
|
src.icon_state = "bloodbag-3"
|
|
if (10 to 19)
|
|
src.icon_state = "bloodbag-2"
|
|
if (1 to 9)
|
|
src.icon_state = "bloodbag-1"
|
|
if (-INFINITY to 0)
|
|
src.icon_state = "bloodbag-0"
|
|
*/
|
|
*/
|
|
/* ================================================== */
|
|
/* -------------------- Body Bag -------------------- */
|
|
/* ================================================== */
|
|
|
|
/obj/item/body_bag
|
|
name = "body bag"
|
|
desc = "A heavy bag, used for carrying stuff around. The stuff is usually dead bodies. Hence the name."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "bodybag"
|
|
flags = FPRINT | TABLEPASS
|
|
w_class = 1.0
|
|
force = 0
|
|
throwforce = 1.0
|
|
throw_speed = 4
|
|
throw_range = 20
|
|
stamina_damage = 0
|
|
stamina_cost = 0
|
|
stamina_crit_chance = 0
|
|
var/open = 0
|
|
var/image/open_image = null
|
|
var/sound_zipper = 'sound/items/zipper.ogg'
|
|
|
|
New()
|
|
..()
|
|
src.open_image = image(src.icon, src, "bodybag-open1", EFFECTS_LAYER_BASE)
|
|
|
|
disposing()
|
|
for(var/atom/movable/AM in src)
|
|
AM.set_loc(src.loc)
|
|
..()
|
|
|
|
proc/update_icon()
|
|
if (src.open && src.open_image)
|
|
src.overlays += src.open_image
|
|
src.icon_state = "bodybag-open"
|
|
src.w_class = 4.0
|
|
else if (!src.open)
|
|
src.overlays -= src.open_image
|
|
if (src.contents && src.contents.len)
|
|
src.icon_state = "bodybag-closed1"
|
|
else
|
|
src.icon_state = "bodybag-closed0"
|
|
src.w_class = 4.0
|
|
else
|
|
src.overlays -= src.open_image
|
|
src.icon_state = "bodybag"
|
|
src.w_class = 1.0
|
|
|
|
attack_self(mob/user as mob)
|
|
if (src.icon_state == "bodybag" && src.w_class == 1.0)
|
|
user.visible_message("<b>[user]</b> unfolds [src].",\
|
|
"You unfold [src].")
|
|
user.drop_item()
|
|
src.update_icon()
|
|
else
|
|
return
|
|
|
|
attack_hand(mob/user as mob)
|
|
add_fingerprint(user)
|
|
if (src.icon_state == "bodybag" && src.w_class == 1.0)
|
|
return ..()
|
|
else
|
|
if (src.open)
|
|
src.close()
|
|
else
|
|
src.open()
|
|
return
|
|
|
|
relaymove(mob/user as mob)
|
|
if (user.stat)
|
|
return
|
|
if (prob(75))
|
|
user.show_text("You fuss with [src], trying to find the zipper, but it's no use!", "red")
|
|
for (var/mob/M in hearers(src, null))
|
|
M.show_text("<FONT size=[max(0, 5 - get_dist(src, M))]>...rustle...</FONT>")
|
|
return
|
|
src.open()
|
|
src.visible_message("<span style=\"color:red\"><b>[user]</b> unzips themselves from [src]!</span>")
|
|
|
|
MouseDrop(mob/user as mob)
|
|
..()
|
|
if (!(src.contents && src.contents.len) && (usr == user && !usr.restrained() && !usr.stat && in_range(src, usr) && !issilicon(usr)))
|
|
if (src.icon_state != "bodybag")
|
|
usr.visible_message("<b>[usr]</b> folds up [src].",\
|
|
"You fold up [src].")
|
|
src.overlays -= src.open_image
|
|
src.icon_state = "bodybag"
|
|
src.w_class = 1.0
|
|
src.attack_hand(usr)
|
|
|
|
proc/open()
|
|
playsound(src.loc, src.sound_zipper, 100, 1, , 6)
|
|
for (var/obj/O in src)
|
|
O.set_loc(get_turf(src))
|
|
for (var/mob/M in src)
|
|
M.weakened += 2
|
|
spawn(3)
|
|
M.set_loc(get_turf(src))
|
|
src.open = 1
|
|
src.update_icon()
|
|
|
|
proc/close()
|
|
playsound(src.loc, src.sound_zipper, 100, 1, , 6)
|
|
for (var/obj/O in get_turf(src))
|
|
if (O.density || O.anchored || O == src)
|
|
continue
|
|
O.set_loc(src)
|
|
for (var/mob/M in get_turf(src))
|
|
if (!M.lying || M.anchored || M.buckled)
|
|
continue
|
|
M.set_loc(src)
|
|
src.open = 0
|
|
src.update_icon()
|
|
|
|
/* ================================================== */
|
|
/* -------------------- Hemostat -------------------- */
|
|
/* ================================================== */
|
|
|
|
/obj/item/hemostat
|
|
name = "hemostat"
|
|
desc = "A surgical tool used for the control and reduction of bleeding during surgery."
|
|
icon = 'icons/obj/surgery.dmi'
|
|
icon_state = "hemostat"
|
|
inhand_image_icon = 'icons/mob/inhand/hand_medical.dmi'
|
|
item_state = "hemostat"
|
|
flags = FPRINT | TABLEPASS | CONDUCT
|
|
hit_type = DAMAGE_STAB
|
|
hitsound = 'sound/effects/bloody_stab.ogg'
|
|
force = 1.5
|
|
w_class = 1.0
|
|
throwforce = 3.0
|
|
throw_speed = 3
|
|
throw_range = 6
|
|
m_amt = 7000
|
|
g_amt = 3500
|
|
stamina_damage = 2
|
|
stamina_cost = 2
|
|
stamina_crit_chance = 15
|
|
module_research = list("tools" = 2, "medicine" = 3, "weapons" = 0.1)
|
|
|
|
attack(mob/M as mob, mob/user as mob)
|
|
if (!ishuman(M))
|
|
if (user.a_intent == INTENT_HELP)
|
|
return
|
|
return ..()
|
|
var/mob/living/carbon/human/H = M
|
|
var/surgery_status = H.get_surgery_status(user.zone_sel.selecting)
|
|
if (!surgery_status)
|
|
if (user.a_intent == INTENT_HELP)
|
|
return
|
|
return ..()
|
|
if (!surgeryCheck(H, user))
|
|
if (user.a_intent == INTENT_HELP)
|
|
return
|
|
return ..()
|
|
H.tri_message("<span style=\"color:red\"><b>[user]</b> begins clamping the bleeders in [H == user ? "[his_or_her(H)]" : "[H]'s"] incision with [src].</span>",\
|
|
user, "<span style=\"color:red\">You begin clamping the bleeders in [user == H ? "your" : "[H]'s"] incision with [src].</span>",\
|
|
H, "<span style=\"color:red\">[H == user ? "You begin" : "<b>[user]</b> begins"] clamping the bleeders in your incision with [src].</span>")
|
|
|
|
if (!do_mob(user, H, minmax(surgery_status * 4, 0, 100)))
|
|
user.visible_message("<span style=\"color:red\"><b>[user]</b> was interrupted!</span>",\
|
|
"<span style=\"color:red\">You were interrupted!</span>")
|
|
return
|
|
|
|
H.tri_message("<span style=\"color:blue\"><b>[user]</b> clamps the bleeders in [H == user ? "[his_or_her(H)]" : "[H]'s"] incision with [src].</span>",\
|
|
user, "<span style=\"color:blue\">You clamp the bleeders in [user == H ? "your" : "[H]'s"] incision with [src].</span>",\
|
|
H, "<span style=\"color:blue\">[H == user ? "You clamp" : "<b>[user]</b> clamps"] the bleeders in your incision with [src].</span>")
|
|
|
|
if (H.bleeding)
|
|
repair_bleeding_damage(H, 50, rand(2,5))
|
|
return
|