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.