mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-29 19:11:51 +00:00
* Gives the chainsaw start/stop/loop SFX, makes the arm-mounted chainsaw a subtype of a regular chainsaw (#73996) ## About The Pull Request The chainsaw now has an audio loop, as well as SFX for starting and stopping. I'm pretty confident that I did the attribution stuff correctly. https://user-images.githubusercontent.com/28870487/225054900-4bf87ee7-9245-4004-b414-77d0e6e83a7c.mp4 I think this came out well. It may be a bit loud, but I wanted the volume to be about the same as how the chainsaw slash sound comes out. Audio stuff isn't really my forte, so let me know if anything sounds off, or if any adjustments should be made. To make this work for the mounted chainsaw (more specifically, the abstract object that enters your hand), it has been made into a chainsaw subtype. An updatepaths script has been included in the event that someone has a map where the former path was included (why??). ## Why It's Good For The Game Makes the chainsaw more menacing. It's one of the most powerful and beloved pieces of crew weaponry, in addition to being a fucking chainsaw. If you aren't keen on walking around the hallways with the chainsaw loop playing like the badass you are, you can always just keep it off until you get into a fight. Gives an extra bit of immersion for those special moments where you get to chainsaw someone to death. ## Changelog 🆑 soundadd: The chainsaw now has SFX for starting, stopping, and idling. /🆑 * Gives the chainsaw start/stop/loop SFX, makes the arm-mounted chainsaw a subtype of a regular chainsaw --------- Co-authored-by: Rhials <Datguy33456@gmail.com>
133 lines
5.3 KiB
Plaintext
133 lines
5.3 KiB
Plaintext
/datum/surgery/prosthetic_replacement
|
|
name = "Prosthetic replacement"
|
|
surgery_flags = NONE
|
|
requires_bodypart_type = NONE
|
|
possible_locs = list(
|
|
BODY_ZONE_R_ARM,
|
|
BODY_ZONE_L_ARM,
|
|
BODY_ZONE_L_LEG,
|
|
BODY_ZONE_R_LEG,
|
|
BODY_ZONE_HEAD,
|
|
)
|
|
steps = list(
|
|
/datum/surgery_step/incise,
|
|
/datum/surgery_step/retract_skin,
|
|
/datum/surgery_step/clamp_bleeders,
|
|
/datum/surgery_step/add_prosthetic,
|
|
)
|
|
|
|
/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target)
|
|
if(!iscarbon(target))
|
|
return FALSE
|
|
var/mob/living/carbon/carbon_target = target
|
|
if(!carbon_target.get_bodypart(user.zone_selected)) //can only start if limb is missing
|
|
return TRUE
|
|
return FALSE
|
|
|
|
|
|
|
|
/datum/surgery_step/add_prosthetic
|
|
name = "add prosthetic"
|
|
implements = list(
|
|
/obj/item/bodypart = 100,
|
|
/obj/item/borg/apparatus/organ_storage = 100,
|
|
/obj/item/chainsaw = 100,
|
|
/obj/item/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)
|
|
if(istype(tool, /obj/item/borg/apparatus/organ_storage))
|
|
if(!tool.contents.len)
|
|
to_chat(user, span_warning("There is nothing inside [tool]!"))
|
|
return SURGERY_STEP_FAIL
|
|
var/obj/item/organ_storage_contents = tool.contents[1]
|
|
if(!isbodypart(organ_storage_contents))
|
|
to_chat(user, span_warning("[organ_storage_contents] cannot be attached!"))
|
|
return SURGERY_STEP_FAIL
|
|
tool = organ_storage_contents
|
|
if(isbodypart(tool))
|
|
var/obj/item/bodypart/bodypart_to_attach = tool
|
|
if(IS_ORGANIC_LIMB(bodypart_to_attach))
|
|
organ_rejection_dam = 10
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/human_target = target
|
|
var/obj/item/bodypart/chest/target_chest = human_target.get_bodypart(BODY_ZONE_CHEST)
|
|
if(!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype))
|
|
to_chat(user, span_warning("[bodypart_to_attach] doesn't match the patient's morphology."))
|
|
return SURGERY_STEP_FAIL
|
|
if(human_target.dna.species.id != bodypart_to_attach.limb_id)
|
|
organ_rejection_dam = 30
|
|
|
|
if(!bodypart_to_attach.can_attach_limb(target))
|
|
target.balloon_alert(user, "that doesn't go on the [parse_zone(target_zone)]!")
|
|
return SURGERY_STEP_FAIL
|
|
|
|
if(target_zone == bodypart_to_attach.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
|
|
display_results(
|
|
user,
|
|
target,
|
|
span_notice("You begin to replace [target]'s [parse_zone(target_zone)] with [tool]..."),
|
|
span_notice("[user] begins to replace [target]'s [parse_zone(target_zone)] with [tool]."),
|
|
span_notice("[user] begins to replace [target]'s [parse_zone(target_zone)]."),
|
|
)
|
|
else
|
|
to_chat(user, span_warning("[tool] isn't the right type for [parse_zone(target_zone)]."))
|
|
return SURGERY_STEP_FAIL
|
|
else if(target_zone == BODY_ZONE_L_ARM || target_zone == BODY_ZONE_R_ARM)
|
|
display_results(
|
|
user,
|
|
target,
|
|
span_notice("You begin to attach [tool] onto [target]..."),
|
|
span_notice("[user] begins to attach [tool] onto [target]'s [parse_zone(target_zone)]."),
|
|
span_notice("[user] begins to attach something onto [target]'s [parse_zone(target_zone)]."),
|
|
)
|
|
else
|
|
to_chat(user, span_warning("[tool] must be installed onto an arm."))
|
|
return SURGERY_STEP_FAIL
|
|
|
|
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
|
|
. = ..()
|
|
if(istype(tool, /obj/item/borg/apparatus/organ_storage))
|
|
tool.icon_state = initial(tool.icon_state)
|
|
tool.desc = initial(tool.desc)
|
|
tool.cut_overlays()
|
|
tool = tool.contents[1]
|
|
if(isbodypart(tool) && user.temporarilyRemoveItemFromInventory(tool))
|
|
var/obj/item/bodypart/limb_to_attach = tool
|
|
limb_to_attach.try_attach_limb(target)
|
|
if(organ_rejection_dam)
|
|
target.adjustToxLoss(organ_rejection_dam)
|
|
display_results(
|
|
user,
|
|
target,
|
|
span_notice("You succeed in replacing [target]'s [parse_zone(target_zone)]."),
|
|
span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!"),
|
|
span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)]!"),
|
|
)
|
|
display_pain(target, "You feel synthetic sensation wash from your [parse_zone(target_zone)], which you can feel again!", TRUE)
|
|
return
|
|
else
|
|
var/obj/item/bodypart/limb_to_attach = target.newBodyPart(target_zone, FALSE, FALSE)
|
|
limb_to_attach.is_pseudopart = TRUE
|
|
limb_to_attach.try_attach_limb(target)
|
|
user.visible_message(span_notice("[user] finishes attaching [tool]!"), span_notice("You attach [tool]."))
|
|
display_results(
|
|
user,
|
|
target,
|
|
span_notice("You attach [tool]."),
|
|
span_notice("[user] finishes attaching [tool]!"),
|
|
span_notice("[user] finishes the attachment procedure!"),
|
|
)
|
|
display_pain(target, "You feel a strange sensation from your new [parse_zone(target_zone)].", TRUE)
|
|
qdel(tool)
|
|
if(istype(tool, /obj/item/chainsaw))
|
|
var/obj/item/chainsaw/mounted_chainsaw/new_arm = new(target)
|
|
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
|
|
return
|
|
else if(istype(tool, /obj/item/melee/synthetic_arm_blade))
|
|
var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
|
|
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
|
|
return
|
|
return ..() //if for some reason we fail everything we'll print out some text okay?
|