Merge pull request #6082 from VOREStation/upstream-merge-6465

[MIRROR] Medical Expansion
This commit is contained in:
Novacat
2019-10-21 20:12:18 -04:00
committed by GitHub
80 changed files with 2790 additions and 376 deletions

View File

@@ -175,6 +175,30 @@ HALOGEN COUNTER - Radcount on mobs
dat += stomachunknownreagents[d]
else
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.</span><br>"
if(C.touching && C.touching.total_volume)
var/unknown = 0
var/touchreagentdata[0]
var/touchunknownreagents[0]
for(var/B in C.touching.reagent_list)
var/datum/reagent/T = B
if(T.scannable)
touchreagentdata["[T.id]"] = "<span class='notice'>\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
if (advscan == 0 || showadvscan == 0)
dat += "<span class='notice'>[T.name] found in subject's dermis.</span><br>"
else
++unknown
touchunknownreagents["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
if(advscan >= 1 && showadvscan == 1)
dat += "<span class='notice'>Beneficial reagents detected in subject's dermis:</span><br>"
for(var/d in touchreagentdata)
dat += touchreagentdata[d]
if(unknown)
if(advscan >= 3 && showadvscan == 1)
dat += "<span class='warning'>Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:</span><br>"
for(var/d in touchunknownreagents)
dat += touchunknownreagents[d]
else
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.</span><br>"
if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB)

View File

@@ -50,4 +50,9 @@
/datum/matter_synth/wire
name = "Wire Synthesizer"
max_energy = 50
recharge_rate = 2
recharge_rate = 2
/datum/matter_synth/bandage
name = "Bandage Synthesizer"
max_energy = 10
recharge_rate = 1

View File

@@ -11,6 +11,8 @@
var/heal_burn = 0
var/apply_sounds
var/upgrade_to // The type path this stack can be upgraded to.
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M))
user << "<span class='warning'>\The [src] cannot be applied to [M]!</span>"
@@ -59,6 +61,80 @@
use(1)
M.updatehealth()
/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount)
. = FALSE
var/turf/T = get_turf(src)
if(ispath(upgrade_to) && use(upgrade_amount))
var/obj/item/stack/medical/M = new upgrade_to(T, upgrade_amount)
return M
return .
/obj/item/stack/medical/crude_pack
name = "crude bandage"
singular_name = "crude bandage length"
desc = "Some bandages to wrap around bloody stumps."
icon_state = "gauze"
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
upgrade_to = /obj/item/stack/medical/bruise_pack
/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
return
if(affecting.is_bandaged())
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if(W.bandaged)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/3))
to_chat(user, "<span class='notice'>You must stand still to bandage wounds.</span>")
break
if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
to_chat(user, "<span class='warning'>\The [src] is used up.</span>")
else
to_chat(user, "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>")
use(used)
/obj/item/stack/medical/bruise_pack
name = "roll of gauze"
singular_name = "gauze length"
@@ -68,6 +144,8 @@
no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
upgrade_to = /obj/item/stack/medical/advanced/bruise_pack
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1

View File

@@ -24,6 +24,9 @@
var/list/datum/matter_synth/synths = null
var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount.
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
/obj/item/stack/New(var/loc, var/amount=null)
..()
if (!stacktype)
@@ -159,6 +162,17 @@
for (var/obj/item/I in O)
qdel(I)
if ((pass_color || recipe.pass_color))
if(!color)
if(recipe.use_material)
var/material/MAT = get_material_by_name(recipe.use_material)
if(MAT.icon_colour)
O.color = MAT.icon_colour
else
return
else
O.color = color
/obj/item/stack/Topic(href, href_list)
..()
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
@@ -242,6 +256,9 @@
return 0
if ((stacktype != S.stacktype) && !type_verified)
return 0
if ((strict_color_stacking || S.strict_color_stacking) && S.color != color)
return 0
if (isnull(tamount))
tamount = src.get_amount()
@@ -355,8 +372,9 @@
var/one_per_turf = 0
var/on_floor = 0
var/use_material
var/pass_color
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null)
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
@@ -366,6 +384,7 @@
src.one_per_turf = one_per_turf
src.on_floor = on_floor
src.use_material = supplied_material
src.pass_color = pass_stack_color
/*
* Recipe list datum

View File

@@ -80,6 +80,10 @@
name = "\improper \"LiquidProtein\" ration"
icon_state = "liquidprotein"
/obj/item/trash/liquidvitamin
name = "\improper \"VitaPaste\" ration"
icon_state = "liquidvitamin"
/obj/item/trash/tastybread
name = "bread tube"
icon_state = "tastybread"

View File

@@ -13,6 +13,7 @@
var/implant_color = "b"
var/allow_reagents = 0
var/malfunction = 0
var/initialize_loc = BP_TORSO
show_messages = 1
/obj/item/weapon/implant/proc/trigger(emote, source as mob)
@@ -30,7 +31,7 @@
var/mob/living/carbon/human/H = source
var/obj/item/organ/external/affected = H.get_organ(target_zone)
if(affected)
affected.implants += src
affected.implants |= src
part = affected
if(part)
forceMove(part)
@@ -65,8 +66,9 @@
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
if(H)
var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD]
var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc]
if(handle_implant(H, affected))
invisibility = initial(invisibility)
post_implant(H)
/obj/item/weapon/implant/Destroy()
@@ -110,7 +112,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking
..()
/obj/item/weapon/implant/tracking/post_implant(var/mob/source)
START_PROCESSING(SSobj, src)
START_PROCESSING(SSobj, src)
/obj/item/weapon/implant/tracking/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -563,7 +565,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
mobname = source.real_name
START_PROCESSING(SSobj, src)
START_PROCESSING(SSobj, src)
//////////////////////////////
// Compressed Matter Implant

View File

@@ -0,0 +1,196 @@
//////////////////////////////
// Nanite Organ Implant
//////////////////////////////
/obj/item/weapon/implant/organ
name = "nanite fabrication implant"
desc = "A buzzing implant covered in a writhing layer of metal insects."
icon_state = "implant_evil"
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 2, TECH_ILLEGAL = 2)
var/organ_to_implant = /obj/item/organ/internal/augment/bioaugment/thermalshades
var/organ_display_name = "unknown organ"
/obj/item/weapon/implant/organ/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> \"GreyDoctor\" Class Nanite Hive<BR>
<b>Life:</b> Activates upon implantation, destroying itself in the process.<BR>
<b>Important Notes:</b> Nanites will fail to complete their task if a suitable location cannot be found for the organ.<BR>
<HR>
<b>Implant Details:</b><BR>
<b>Function:</b> Nanites will fabricate: <span class='alien'>[organ_display_name]</span><BR>
<b>Special Features:</b> Organ identification protocols.<BR>
<b>Integrity:</b> N/A"}
return dat
/obj/item/weapon/implant/organ/post_implant(var/mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/NewOrgan = new organ_to_implant()
var/obj/item/organ/external/E = H.get_organ(NewOrgan.parent_organ)
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
if(E && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
spawn(rand(1 SECONDS, 30 SECONDS))
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
NewOrgan.forceMove(H)
NewOrgan.owner = H
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= NewOrgan
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
H.internal_organs |= NewOrgan
NewOrgan.handle_organ_mod_special()
spawn(1)
if(!QDELETED(src))
qdel(src)
else
qdel(NewOrgan)
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
/obj/item/weapon/implant/organ/islegal()
return 0
/*
* Arm / leg mounted augments.
*/
/obj/item/weapon/implant/organ/limbaugment
name = "nanite implant"
organ_to_implant = /obj/item/organ/internal/augment/armmounted/taser
organ_display_name = "physiological augment"
var/list/possible_targets = list(O_AUG_L_FOREARM, O_AUG_R_FOREARM)
/obj/item/weapon/implant/organ/limbaugment/post_implant(var/mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/NewOrgan = new organ_to_implant()
var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan)
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
spawn(rand(1 SECONDS, 30 SECONDS))
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
NewOrgan.forceMove(H)
NewOrgan.owner = H
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= NewOrgan
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
H.internal_organs |= NewOrgan
NewOrgan.handle_organ_mod_special()
spawn(1)
if(!QDELETED(src))
qdel(src)
else
qdel(NewOrgan)
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
/obj/item/weapon/implant/organ/limbaugment/proc/setup_augment_slots(var/mob/living/carbon/human/H, var/obj/item/organ/internal/augment/armmounted/I)
var/list/Choices = possible_targets.Copy()
for(var/targ in possible_targets)
if(H.internal_organs_by_name[targ])
Choices -= targ
var/target_choice = null
if(Choices && Choices.len)
if(Choices.len == 1)
target_choice = Choices[1]
else
target_choice = input("Choose augment location:") in Choices
else
return FALSE
if(target_choice)
switch(target_choice)
if(O_AUG_R_HAND)
I.organ_tag = O_AUG_R_HAND
I.parent_organ = BP_R_HAND
I.target_slot = slot_r_hand
if(O_AUG_L_HAND)
I.organ_tag = O_AUG_L_HAND
I.parent_organ = BP_L_HAND
I.target_slot = slot_l_hand
if(O_AUG_R_FOREARM)
I.organ_tag = O_AUG_R_FOREARM
I.parent_organ = BP_R_ARM
I.target_slot = slot_r_hand
if(O_AUG_L_FOREARM)
I.organ_tag = O_AUG_L_FOREARM
I.parent_organ = BP_L_ARM
I.target_slot = slot_l_hand
if(O_AUG_R_UPPERARM)
I.organ_tag = O_AUG_R_UPPERARM
I.parent_organ = BP_R_ARM
I.target_slot = slot_r_hand
if(O_AUG_L_UPPERARM)
I.organ_tag = O_AUG_L_UPPERARM
I.parent_organ = BP_L_ARM
I.target_slot = slot_l_hand
. = H.get_organ(I.parent_organ)
/*
* Limb implant primary subtypes.
*/
/obj/item/weapon/implant/organ/limbaugment/upperarm
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple
organ_display_name = "multi-use augment"
possible_targets = list(O_AUG_R_UPPERARM,O_AUG_L_UPPERARM)
/obj/item/weapon/implant/organ/limbaugment/wrist
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand
organ_display_name = "wrist augment"
possible_targets = list(O_AUG_R_HAND,O_AUG_L_HAND)
/*
* Limb implant general subtypes.
*/
// Wrist
/obj/item/weapon/implant/organ/limbaugment/wrist/sword
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand/sword
organ_display_name = "weapon augment"
// Fore-arm
/obj/item/weapon/implant/organ/limbaugment/laser
organ_to_implant = /obj/item/organ/internal/augment/armmounted
organ_display_name = "weapon augment"
/obj/item/weapon/implant/organ/limbaugment/dart
organ_to_implant = /obj/item/organ/internal/augment/armmounted/dartbow
organ_display_name = "weapon augment"
// Upper-arm.
/obj/item/weapon/implant/organ/limbaugment/upperarm/medkit
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
/obj/item/weapon/implant/organ/limbaugment/upperarm/surge
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/surge
/*
* Others
*/
/obj/item/weapon/implant/organ/pelvic
name = "nanite fabrication implant"
organ_to_implant = /obj/item/organ/internal/augment/bioaugment/sprint_enhance
organ_display_name = "pelvic augment"

View File

@@ -179,3 +179,103 @@
src.imp = new /obj/item/weapon/implant/language/eal( src )
..()
return
/obj/item/weapon/implantcase/shades
name = "glass case - 'Integrated Shades'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/shades/New()
src.imp = new /obj/item/weapon/implant/organ( src )
..()
return
/obj/item/weapon/implantcase/taser
name = "glass case - 'Taser'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/taser/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment( src )
..()
return
/obj/item/weapon/implantcase/laser
name = "glass case - 'Laser'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/laser/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/laser( src )
..()
return
/obj/item/weapon/implantcase/dart
name = "glass case - 'Dart'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/dart/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/dart( src )
..()
return
/obj/item/weapon/implantcase/toolkit
name = "glass case - 'Toolkit'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/toolkit/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm( src )
..()
return
/obj/item/weapon/implantcase/medkit
name = "glass case - 'Toolkit'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/medkit/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/medkit( src )
..()
return
/obj/item/weapon/implantcase/surge
name = "glass case - 'Muscle Overclocker'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/surge/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/surge( src )
..()
return
/obj/item/weapon/implantcase/analyzer
name = "glass case - 'Scanner'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/analyzer/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist( src )
..()
return
/obj/item/weapon/implantcase/sword
name = "glass case - 'Scanner'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/sword/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/sword( src )
..()
return
/obj/item/weapon/implantcase/sprinter
name = "glass case - 'Sprinter'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/sprinter/New()
src.imp = new /obj/item/weapon/implant/organ/pelvic( src )
..()
return

View File

@@ -0,0 +1,30 @@
/obj/item/weapon/implant/dud
name = "unknown implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
initialize_loc = BP_HEAD
var/roundstart = TRUE
/obj/item/weapon/implant/dud/torso
name = "unknown implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
initialize_loc = BP_TORSO
/obj/item/weapon/implant/dud/old
name = "old implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
roundstart = FALSE
/obj/item/weapon/implant/dud/Initialize()
..()
if(roundstart)
invisibility = 100
..()
spawn(3)
if(!ishuman(loc) && !QDELETED(src))
qdel(src)

View File

@@ -1,6 +1,7 @@
/obj/item/weapon/implant/neural
name = "neural framework implant"
desc = "A small metal casing with numerous wires stemming off of it."
initialize_loc = BP_HEAD
var/obj/item/organ/internal/brain/my_brain = null
var/target_state = null
var/robotic_brain = FALSE
@@ -104,3 +105,10 @@ Implant Specifics:<BR>"}
my_brain.take_damage(15)
my_brain = null
return
/obj/item/weapon/implant/neural/roundstart/Initialize()
invisibility = 100
..()
spawn(3)
if(!ishuman(loc) && !QDELETED(src))
qdel(src)

View File

@@ -185,6 +185,20 @@ MRE Stuff
/obj/random/mre/sauce/crayon
)
/obj/item/weapon/storage/mre/menu13
name = "medical MRE"
meal_desc = "This one is menu 13, vitamin paste & dessert. Only for emergencies."
icon_state = "crayonmre"
starts_with = list(
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
/obj/random/mre/drink,
/obj/item/weapon/storage/mrebag/dessert,
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
)
/obj/item/weapon/storage/mre/random
meal_desc = "The menu label is faded out."
starts_with = list(

View File

@@ -93,6 +93,42 @@
O.update()
. = ..()
/obj/item/weapon/storage/box/syndie_kit/imp_aug
name = "boxed augment implant (with injector)"
var/case_type = /obj/item/weapon/implantcase/shades
/obj/item/weapon/storage/box/syndie_kit/imp_aug/Initialize()
new /obj/item/weapon/implanter(src)
new case_type(src)
. = ..()
/obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
case_type = /obj/item/weapon/implantcase/taser
/obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
case_type = /obj/item/weapon/implantcase/laser
/obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
case_type = /obj/item/weapon/implantcase/dart
/obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
case_type = /obj/item/weapon/implantcase/toolkit
/obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
case_type = /obj/item/weapon/implantcase/medkit
/obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
case_type = /obj/item/weapon/implantcase/surge
/obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
case_type = /obj/item/weapon/implantcase/analyzer
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
case_type = /obj/item/weapon/implantcase/sword
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
case_type = /obj/item/weapon/implantcase/sprinter
/obj/item/weapon/storage/box/syndie_kit/space
name = "boxed space suit and helmet"
starts_with = list(

View File

@@ -128,6 +128,15 @@
icon_state = "scalpel_manager_on"
force = 7.5
/obj/item/weapon/surgical/scalpel/ripper
name = "organ pincers"
desc = "A horrifying bladed tool with a large metal spike in its center. The tool is used for rapidly removing organs from hopefully willing patients."
icon_state = "organ_ripper"
item_state = "bone_setter"
force = 15.0
toolspeed = 0.75
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2)
/*
* Circular Saw
*/
@@ -147,6 +156,19 @@
sharp = 1
edge = 1
/obj/item/weapon/surgical/circular_saw/manager
name = "energetic bone diverter"
desc = "For heavy duty cutting (and sealing), with science!"
icon_state = "adv_saw"
item_state = "saw3"
hitsound = 'sound/weapons/emitter2.ogg'
damtype = SEARING
w_class = ITEMSIZE_LARGE
origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6)
matter = list(DEFAULT_WALL_MATERIAL = 12500)
attack_verb = list("attacked", "slashed", "seared", "cut")
toolspeed = 0.75
//misc, formerly from code/defines/weapons.dm
/obj/item/weapon/surgical/bonegel
name = "bone gel"
@@ -245,4 +267,4 @@
/obj/item/weapon/surgical/bone_clamp/alien
icon = 'icons/obj/abductor.dmi'
toolspeed = 0.75
toolspeed = 0.75