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