diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index f87b293e534..304fd36d66e 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -150,7 +150,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "arm_blade"
item_state = "arm_blade"
- flags = ABSTRACT | NODROP | DROPDEL
+ flags = ABSTRACT | NODROP
w_class = WEIGHT_CLASS_HUGE
force = 25
throwforce = 0 //Just to be on the safe side
@@ -159,11 +159,14 @@
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
+ var/can_drop = FALSE
-/obj/item/weapon/melee/arm_blade/New(location,silent)
+/obj/item/weapon/melee/arm_blade/New(location,silent,synthetic)
..()
if(ismob(loc) && !silent)
loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!")
+ if(synthetic)
+ can_drop = TRUE
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
if(!proximity)
@@ -196,6 +199,12 @@
"You hear a metal screeching sound.")
A.open(2)
+/obj/item/weapon/melee/arm_blade/dropped(mob/user)
+ ..()
+ if(can_drop)
+ new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
+ qdel(src)
+
/***************************************\
|***********COMBAT TENTACLES*************|
\***************************************/
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index 1eee8167848..40a6a2b8a7c 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -36,8 +36,10 @@
item_state = "arm_blade"
origin_tech = "combat=5,biotech=5"
w_class = WEIGHT_CLASS_HUGE
- force = 15
+ force = 20
throwforce = 10
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharpness = IS_SHARP
/obj/item/weapon/melee/sabre
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 2ebe45f2d31..ccff88204ce 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -19,5 +19,10 @@
var/mob/living/carbon/human/L = target
user.visible_message("[user] severs [L]'s [parse_zone(target_zone)]!", "You sever [L]'s [parse_zone(target_zone)].")
if(surgery.operated_bodypart)
- surgery.operated_bodypart.drop_limb()
+ var/obj/item/bodypart/target_limb = surgery.operated_bodypart
+ var/obj/item/held_item = L.get_item_for_held_index(target_limb.held_index)
+ target_limb.drop_limb()
+ if(held_item && held_item.flags & NODROP)
+ qdel(target_limb) // arm is ruined
+
return 1
\ No newline at end of file
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 6f452d63484..beae8cd5787 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -57,69 +57,4 @@
add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
user << "[target] has no organic [parse_zone(target_zone)] there!"
- return 1
-
-
-
-
-
-
-
-
-
-/datum/surgery/chainsaw
- name = "chainsaw augmentation"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders,
- /datum/surgery_step/incise, /datum/surgery_step/chainsaw)
- species = list(/mob/living/carbon/human)
- possible_locs = list("r_arm", "l_arm")
- requires_organic_bodypart = 0
-
-
-/datum/surgery_step/chainsaw
- time = 64
- name = "insert chainsaw"
- implements = list(/obj/item/weapon/twohanded/required/chainsaw = 100)
-
-/datum/surgery_step/chainsaw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to install the chainsaw onto [target].", "You begin to install the chainsaw onto [target]...")
-
-/datum/surgery_step/chainsaw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(!target.get_empty_held_indexes())
- user << "You can't fit the chainsaw in while [target]'s hands are full!"
- return 0
- else
- user.visible_message("[user] finishes installing the chainsaw!", "You install the chainsaw.")
- user.unEquip(tool)
- qdel(tool)
- var/obj/item/weapon/mounted_chainsaw/sawarms = new(target)
- target.put_in_hands(sawarms)
-
- return 1
-
-/datum/surgery/chainsaw_removal
- name = "chainsaw removal"
- steps = list(/datum/surgery_step/chainsaw_removal)
- species = list(/mob/living/carbon/human)
- possible_locs = list("r_arm", "l_arm")
- requires_organic_bodypart = 0
-
-/datum/surgery/chainsaw_removal/can_start(mob/user, mob/living/carbon/target)
- if(target.is_holding_item_of_type(/obj/item/weapon/mounted_chainsaw))
- return 1//can continue surgery
- else
- return 0//surgery will never be available
-
-/datum/surgery_step/chainsaw_removal
- time = 128
- name = "saw off chainsaw"
- implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/mounted_chainsaw = 65, /obj/item/weapon/twohanded/fireaxe = 50, /obj/item/weapon/twohanded/required/chainsaw = 50, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
-
-/datum/surgery_step/chainsaw_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins sawing the chainsaw off of [target]'s arms.", "You begin removing [target]'s chainsaw...")
-
-/datum/surgery_step/chainsaw_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- for(var/obj/item/weapon/mounted_chainsaw/V in target.held_items)
- target.unEquip(V, 1)
- user.visible_message("[user] carefully saws [target]'s arm free of the chainsaw.", "You remove the chainsaw.")
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 5341c2bf09d..da3c36dd687 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -16,38 +16,58 @@
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
- implements = list(/obj/item/bodypart = 100)
+ implements = list(/obj/item/bodypart = 100, /obj/item/weapon/twohanded/required/chainsaw = 100, /obj/item/weapon/melee/synthetic_arm_blade = 100)
time = 32
var/organ_rejection_dam = 0
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/bodypart/BP = tool
- if(ismonkey(target))// monkey patient only accept organic monkey limbs
- if(BP.status == BODYPART_ROBOTIC || BP.animal_origin != MONKEY_BODYPART)
- user << "[BP] doesn't match the patient's morphology."
- return -1
- if(BP.status != BODYPART_ROBOTIC)
- organ_rejection_dam = 10
- if(ishuman(target))
- if(BP.animal_origin)
+ if(istype(tool, /obj/item/bodypart))
+ var/obj/item/bodypart/BP = tool
+ if(ismonkey(target))// monkey patient only accept organic monkey limbs
+ if(BP.status == BODYPART_ROBOTIC || BP.animal_origin != MONKEY_BODYPART)
user << "[BP] doesn't match the patient's morphology."
return -1
- var/mob/living/carbon/human/H = target
- if(H.dna.species.id != BP.species_id)
- organ_rejection_dam = 30
+ if(BP.status != BODYPART_ROBOTIC)
+ organ_rejection_dam = 10
+ if(ishuman(target))
+ if(BP.animal_origin)
+ user << "[BP] doesn't match the patient's morphology."
+ return -1
+ var/mob/living/carbon/human/H = target
+ if(H.dna.species.id != BP.species_id)
+ organ_rejection_dam = 30
- if(target_zone == BP.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
- user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...")
+ if(target_zone == BP.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
+ user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...")
+ else
+ user << "[tool] isn't the right type for [parse_zone(target_zone)]."
+ return -1
+ else if(target_zone == "l_arm" || target_zone == "r_arm")
+ user.visible_message("[user] begins to attach [tool] onto [target].", "You begin to attach [tool] onto [target]...")
else
- user << "[tool] isn't the right type for [parse_zone(target_zone)]."
+ user << "[tool] must be installed onto an arm."
return -1
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/bodypart/L = tool
- user.drop_item()
- L.attach_limb(target)
- if(organ_rejection_dam)
- target.adjustToxLoss(organ_rejection_dam)
- user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
- return 1
+ if(istype(tool, /obj/item/bodypart))
+ var/obj/item/bodypart/L = tool
+ user.drop_item()
+ L.attach_limb(target)
+ if(organ_rejection_dam)
+ target.adjustToxLoss(organ_rejection_dam)
+ user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
+ return 1
+ else
+ target.regenerate_limb(target_zone)
+ user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].")
+ user.unEquip(tool)
+ qdel(tool)
+ if(istype(tool, /obj/item/weapon/twohanded/required/chainsaw))
+ var/obj/item/weapon/mounted_chainsaw/new_arm = new(target)
+ target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
+ return 1
+ else if(istype(tool, /obj/item/weapon/melee/synthetic_arm_blade))
+ var/obj/item/weapon/melee/arm_blade/new_arm = new(target, silent = TRUE, synthetic = TRUE)
+ target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
+ return 1