From e0385e2acdcc9aca2f83ec566c89309781a59bc8 Mon Sep 17 00:00:00 2001
From: thgvr <81882910+thgvr@users.noreply.github.com>
Date: Thu, 11 Apr 2024 12:38:31 -0700
Subject: [PATCH] Brings back old gun suicide_act behavior (#2784)
## About The Pull Request
Brings back old suicide_act on handle_suicide proc of guns.
https://github.com/shiptest-ss13/Shiptest/assets/81882910/a5363807-0b49-46fc-aae6-cc1253cc1dbf
## Changelog
:cl:
add: Suicide & Execution with a damaging firearm is now more deadly and
gruesome.
/:cl:
---
code/modules/projectiles/gun.dm | 51 ++++++++++++++++++++------
code/modules/projectiles/projectile.dm | 2 +-
2 files changed, 41 insertions(+), 12 deletions(-)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index e9354e68d9d4..9aa8ac60326f 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -744,6 +744,9 @@
safety_overlay.icon_state = "[safety_wording]-off"
. += safety_overlay
+#define BRAINS_BLOWN_THROW_RANGE 2
+#define BRAINS_BLOWN_THROW_SPEED 1
+
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
return
@@ -751,32 +754,58 @@
if(semicd)
return
+ if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot.
+ shoot_with_empty_chamber(user)
+ return
+
if(user == target)
- target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \
- "You stick [src] in your mouth, ready to pull the trigger...")
+ target.visible_message(span_warning("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger..."), \
+ span_userdanger("You stick [src] in your mouth, ready to pull the trigger..."))
else
- target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \
- "[user] points [src] at your head, ready to pull the trigger...")
+ target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \
+ span_userdanger("[user] points [src] at your head, ready to pull the trigger..."))
semicd = TRUE
- if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
+ if(!bypass_timer && (!do_mob(user, target, 100) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH))
if(user)
if(user == target)
- user.visible_message("[user] decided not to shoot.")
+ user.visible_message(span_notice("[user] decided not to shoot."))
else if(target && target.Adjacent(user))
- target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!")
+ target.visible_message(span_notice("[user] has decided to spare [target]."), span_notice("[user] has decided to spare your life!"))
semicd = FALSE
return
semicd = FALSE
- target.visible_message("[user] pulls the trigger!", "[(user == target) ? "You pull" : "[user] pulls"] the trigger!")
+ target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!"))
- if(chambered && chambered.BB)
- chambered.BB.damage *= 5
+ if(chambered && chambered.BB && can_trigger_gun(user))
+ chambered.BB.damage *= 3
+ //Check is here for safeties and such, brain will be removed after
+ process_fire(target, user, TRUE, params, BODY_ZONE_HEAD)
+
+ var/obj/item/organ/brain/brain_to_blast = target.getorganslot(ORGAN_SLOT_BRAIN)
+ if(brain_to_blast)
+
+ //Check if the projectile is actually damaging and not of type STAMINA
+ if(chambered.BB.nodamage || !chambered.BB.damage || chambered.BB.damage_type == STAMINA)
+ return
+
+ //Remove brain of the mob shot
+ brain_to_blast.Remove(target)
+
+ var/turf/splat_turf = get_turf(target)
+ //Move the brain of the person shot to selected turf
+ brain_to_blast.forceMove(splat_turf)
+
+ var/turf/splat_target = get_ranged_target_turf(target, REVERSE_DIR(target.dir), BRAINS_BLOWN_THROW_RANGE)
+ var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_atom_to_turf), /obj/effect/gibspawner/generic, brain_to_blast, 1, FALSE, target)
+ //Throw the brain that has been removed away and place a gibspawner on landing
+ brain_to_blast.throw_at(splat_target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback = gibspawner)
- process_fire(target, user, TRUE, params, BODY_ZONE_HEAD)
+#undef BRAINS_BLOWN_THROW_RANGE
+#undef BRAINS_BLOWN_THROW_SPEED
/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins
if(pin)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 7cc9b1c6ebb4..85c4558343d9 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -133,7 +133,7 @@
var/homing_offset_y = 0
var/damage = 10
- var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
+ var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, STAMINA are the only things that should be in here
var/nodamage = FALSE //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
///How much armor this projectile pierces.