Files
Bubberstation/code/game/objects/items/chainsaw.dm
SkyratBot 8705e531e1 [MIRROR] Replace natural beheading with cranial fissures (splitting your skull) [MDB IGNORE] (#26020)
* Replace natural beheading with cranial fissures (splitting your skull) (#80703)

## About The Pull Request

Replaces natural beheading (doing a lot of damage to the head) with
cranial fissures, which split your skull in half.

![dreamseeker_2023-12-31T19-38-16](https://github.com/tgstation/tgstation/assets/35135081/f84dc479-6156-45b7-bb23-4e4ec7378f6b)

While you have this wound, your eyes can be pulled out of your head with
bare hands, and slipping will spill your brain out of your head.

Removes beheading objective from traitor.

Zombies can be beheaded all the same.

Any other way of beheading, such as surgery or amputation shears, is
still possible.

Closes #80439

## Why It's Good For The Game

I've enjoyed seeing the results of the test merge to remove natural
beheading. At 947 beheadings in a week, 1 in every 7 deaths resulted in
a beheading. This makes it significantly easier to remove people from
rounds as the brain is generally critical to actually reviving someone.
While round removal is fine, it should be something that is
intentionally performed with enough effort. Mass round removals ought to
require a significant amount of effort. There are plenty of ways to
round remove someone, but it ought not be an incidental choice.

The effects of beheading removal have shown some interesting anecdotal
highlights (nothing here is backed up with stats, so take it with a
grain of salt):
1. As a whole, people did not really replace it with anything. The
biggest alternative has been lighting people on fire, but this has not
been done at a significant enough scale at all to be a noteworthy
problem, and is still fixable with enough effort.
2. Cult and rev rounds have played out far more interestingly. In one
round I was adminning a head of staff who intended to behead every
revolutionary they saw, but because they didn't, the back and forth
continues. I've also had opportunities to revive head revs that I am
skeptical would've been available to me otherwise.

Complete removal of beheading was not chosen as it does not feel right
for a repeated fire axe to the head to do basically nothing. The current
implementation is intended to be something that is just not useful
enough to do on everyone you see, but is still appreciably an effect.

## Changelog
🆑
balance: Instead of too much damage to the head beheading someone, it
will now split their skull in half. While their skull is open, you can
rip out their eyes with your hands. and they will spill their brain out
of their head if they slip.
balance: The Path of Blades ascension will accept either a beheaded
person, or someone with their skull split open.
del: Removed the beheading objectives from traitor.
/🆑

* Replace natural beheading with cranial fissures (splitting your skull)

---------

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2024-01-06 14:30:08 +00:00

171 lines
5.6 KiB
Plaintext

// CHAINSAW
/obj/item/chainsaw
name = "chainsaw"
desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
icon = 'icons/obj/weapons/chainsaw.dmi'
icon_state = "chainsaw_off"
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
obj_flags = CONDUCTS_ELECTRICITY
force = 13
var/force_on = 24
w_class = WEIGHT_CLASS_HUGE
throwforce = 13
throw_speed = 2
throw_range = 4
demolition_mod = 1.5
custom_materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 6.5)
attack_verb_continuous = list("saws", "tears", "lacerates", "cuts", "chops", "dices")
attack_verb_simple = list("saw", "tear", "lacerate", "cut", "chop", "dice")
hitsound = SFX_SWING_HIT
sharpness = SHARP_EDGED
actions_types = list(/datum/action/item_action/startchainsaw)
tool_behaviour = TOOL_SAW
toolspeed = 1.5 //Turn it on first you dork
var/on = FALSE
///The looping sound for our chainsaw when running
var/datum/looping_sound/chainsaw/chainsaw_loop
/obj/item/chainsaw/apply_fantasy_bonuses(bonus)
. = ..()
force_on = modify_fantasy_variable("force_on", force_on, bonus)
if(on)
force = force_on
/obj/item/chainsaw/remove_fantasy_bonuses(bonus)
force_on = reset_fantasy_variable("force_on", force_on)
if(on)
force = force_on
return ..()
/obj/item/chainsaw/Initialize(mapload)
. = ..()
chainsaw_loop = new(src)
apply_components()
/obj/item/chainsaw/suicide_act(mob/living/carbon/user)
if(on)
user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
playsound(src, 'sound/weapons/chainsawhit.ogg', 100, TRUE)
var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)
if(myhead)
myhead.dismember()
else
user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!"))
playsound(src, 'sound/weapons/genhit1.ogg', 100, TRUE)
return BRUTELOSS
/obj/item/chainsaw/attack_self(mob/user)
on = !on
to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
force = on ? force_on : initial(force)
throwforce = on ? force_on : initial(force)
icon_state = "chainsaw_[on ? "on" : "off"]"
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = on
if(on)
hitsound = 'sound/weapons/chainsawhit.ogg'
chainsaw_loop.start()
else
hitsound = SFX_SWING_HIT
chainsaw_loop.stop()
toolspeed = on ? 0.5 : initial(toolspeed) //Turning it on halves the speed
if(src == user.get_active_held_item()) //update inhands
user.update_held_items()
update_item_action_buttons()
/**
* Handles adding components to the chainsaw. Added in Initialize()
*
* Applies components to the chainsaw. Added as a seperate proc to allow for
* variance between subtypes
*/
/obj/item/chainsaw/proc/apply_components()
AddComponent(/datum/component/butchering, \
speed = 3 SECONDS, \
effectiveness = 100, \
bonus_modifier = 0, \
butcher_sound = 'sound/weapons/chainsawhit.ogg', \
disabled = TRUE, \
)
AddComponent(/datum/component/two_handed, require_twohands=TRUE)
/obj/item/chainsaw/doomslayer
name = "THE GREAT COMMUNICATOR"
desc = "<span class='warning'>VRRRRRRR!!!</span>"
armour_penetration = 100
force_on = 30
/obj/item/chainsaw/doomslayer/attack(mob/living/target_mob, mob/living/user, params)
if (target_mob.stat != DEAD)
return ..()
if (user.zone_selected != BODY_ZONE_HEAD)
return ..()
var/obj/item/bodypart/head = target_mob.get_bodypart(BODY_ZONE_HEAD)
if (isnull(head))
return ..()
playsound(user, 'sound/weapons/slice.ogg', vol = 80, vary = TRUE)
target_mob.balloon_alert(user, "cutting off head...")
if (!do_after(user, 2 SECONDS, target_mob, extra_checks = CALLBACK(src, PROC_REF(has_same_head), target_mob, head)))
return TRUE
head.dismember(silent = FALSE)
user.put_in_hands(head)
return TRUE
/obj/item/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE)
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!"))
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE)
return TRUE
return FALSE
/obj/item/chainsaw/doomslayer/proc/has_same_head(mob/living/target_mob, obj/item/bodypart/head)
return target_mob.get_bodypart(BODY_ZONE_HEAD) == head
/obj/item/chainsaw/mounted_chainsaw
name = "mounted chainsaw"
desc = "A chainsaw that has replaced your arm."
inhand_icon_state = "mounted_chainsaw"
item_flags = ABSTRACT | DROPDEL
throwforce = 0
throw_range = 0
throw_speed = 0
toolspeed = 1
/obj/item/chainsaw/mounted_chainsaw/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
/obj/item/chainsaw/mounted_chainsaw/Destroy()
var/obj/item/bodypart/part
new /obj/item/chainsaw(get_turf(src))
if(iscarbon(loc))
var/mob/living/carbon/holder = loc
var/index = holder.get_held_index_of_item(src)
if(index)
part = holder.hand_bodyparts[index]
. = ..()
if(part)
part.drop_limb()
/obj/item/chainsaw/mounted_chainsaw/apply_components()
AddComponent(/datum/component/butchering, \
speed = 3 SECONDS, \
effectiveness = 100, \
bonus_modifier = 0, \
butcher_sound = 'sound/weapons/chainsawhit.ogg', \
disabled = TRUE, \
)
/datum/action/item_action/startchainsaw
name = "Pull The Starting Cord"