From 9f780d3e35963207a4260a2a0757ca641fb2bba9 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Wed, 24 Jul 2024 22:47:03 +1000 Subject: [PATCH] Updates Strong-Arm implants to be cooldown based, deal entirely lethal damage (but more of it) (#85012) ## About The Pull Request Strong-Arm implants utilize a five second cooldown between activation (this is per implant, not for both). As a result, the implant does a larger chunk of damage in one blow. It does not do stamina damage anymore. If you strike a mob with either the MOB_BEAST or MOB_SPECIAL biotypes, you inflict additional damage (40 extra). You can fit both a toolset implant and a muscle implant into the same arm. ## Why It's Good For The Game Strong-arms were really weird implants in that they were not locked behind any research progression, but instead could be purchased from cargo. However, they were still not exactly amazing to have, so they only really get purchased by bored medical doctors, since the implant was a medical departmental order option (for some reason). I tried giving them a little extra oomph a while ago, but I never felt like they were in a particularly good space even after that update. Borrowing some ideas from an older PR, I've introduced a cooldown to allow for them to work alongside other unarmed features, but still not allow them to stack with other effects. It makes them exceptionally good as opening attacks, but not to the point of being intrusive. They were also a method of infinite stamina damage, so that has been resolved as well. The mob bonus damage makes them a little fun option for miners, really, that's why I added it. I thought it would be a cute feature, and maybe incentivize a few to get augmented. I don't think they will, since augments aren't super useful for miners, but still. The pairing with toolsets is because they're not quite as useful generally as the toolsets, and since they are a weaker arm implant in the progression, I don't feel it is too extreme to have both, because overall most people will gravitate towards toolsets if they had to choose. ## Changelog :cl: balance: Strong-arm implants go on cooldown when activated, but deal more overall lethal damage on a single blow. balance: The strong-arm implant does additional damage to fauna and some other dangerous mobs. qol: You can pair toolset arm implants with the strong-arm implants. /:cl: --------- Co-authored-by: Jacquerel --- code/__DEFINES/DNA.dm | 4 ++ code/modules/cargo/packs/medical.dm | 2 +- .../research/designs/medical_designs.dm | 12 ++++- .../organs/internal/cyberimp/augments_arms.dm | 46 ++++++++++++++----- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index bdda4d295c2..f6d5d76ee16 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -86,6 +86,8 @@ #define ORGAN_SLOT_MONSTER_CORE "monstercore" #define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device" #define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" //This one ignores alphabetical order cause the arms should be together +#define ORGAN_SLOT_RIGHT_ARM_MUSCLE "r_arm_muscle" +#define ORGAN_SLOT_LEFT_ARM_MUSCLE "l_arm_muscle" //same as above #define ORGAN_SLOT_SPINE "spine" #define ORGAN_SLOT_STOMACH "stomach" #define ORGAN_SLOT_STOMACH_AID "stomach_aid" @@ -137,6 +139,8 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_APPENDIX, ORGAN_SLOT_RIGHT_ARM_AUG, ORGAN_SLOT_LEFT_ARM_AUG, + ORGAN_SLOT_LEFT_ARM_MUSCLE, + ORGAN_SLOT_RIGHT_ARM_MUSCLE, ORGAN_SLOT_STOMACH, ORGAN_SLOT_STOMACH_AID, ORGAN_SLOT_BREATHING_TUBE, diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index c30a698c06f..0c626223916 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -187,6 +187,6 @@ name = "Strong-Arm Implant Set" desc = "A crate containing two implants, which can be surgically implanted to empower the strength of human arms. Warranty void if exposed to electromagnetic pulses." cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/organ/internal/cyberimp/arm/muscle = 2) + contains = list(/obj/item/organ/internal/cyberimp/arm/strongarm = 2) crate_name = "Strong-Arm implant crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 23a41da63ec..5daf9361190 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -403,7 +403,11 @@ desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." id = "ci-surgery" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.25, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + ) construction_time = 2 SECONDS build_path = /obj/item/organ/internal/cyberimp/arm/surgery category = list( @@ -416,7 +420,11 @@ desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." id = "ci-toolset" build_type = PROTOLATHE | AWAY_LATHE | MECHFAB - materials = list (/datum/material/iron = SHEET_MATERIAL_AMOUNT*1.25, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT * 1.5, /datum/material/silver =HALF_SHEET_MATERIAL_AMOUNT * 1.5) + materials = list ( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1.25, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + ) construction_time = 2 SECONDS build_path = /obj/item/organ/internal/cyberimp/arm/toolset category = list( diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 5632688cb47..e4ab654cb5e 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -17,6 +17,10 @@ var/extend_sound = 'sound/mecha/mechmove03.ogg' /// Sound played when retracting var/retract_sound = 'sound/mecha/mechmove03.ogg' + /// Organ slot that the implant occupies for the right arm + var/right_arm_organ_slot = ORGAN_SLOT_RIGHT_ARM_AUG + /// Organ slot that the implant occupies for the left arm + var/left_arm_organ_slot = ORGAN_SLOT_LEFT_ARM_AUG /obj/item/organ/internal/cyberimp/arm/Initialize(mapload) . = ..() @@ -48,9 +52,9 @@ /obj/item/organ/internal/cyberimp/arm/proc/SetSlotFromZone() switch(zone) if(BODY_ZONE_L_ARM) - slot = ORGAN_SLOT_LEFT_ARM_AUG + slot = left_arm_organ_slot if(BODY_ZONE_R_ARM) - slot = ORGAN_SLOT_RIGHT_ARM_AUG + slot = right_arm_organ_slot else CRASH("Invalid zone for [type]") @@ -370,18 +374,24 @@ /obj/item/knife/combat/cyborg, ) -/obj/item/organ/internal/cyberimp/arm/muscle +/obj/item/organ/internal/cyberimp/arm/strongarm name = "\proper Strong-Arm empowered musculature implant" desc = "When implanted, this cybernetic implant will enhance the muscles of the arm to deliver more power-per-action." icon_state = "muscle_implant" zone = BODY_ZONE_R_ARM - slot = ORGAN_SLOT_RIGHT_ARM_AUG + slot = ORGAN_SLOT_RIGHT_ARM_MUSCLE + right_arm_organ_slot = ORGAN_SLOT_RIGHT_ARM_MUSCLE + left_arm_organ_slot = ORGAN_SLOT_LEFT_ARM_MUSCLE actions_types = list() ///The amount of damage the implant adds to our unarmed attacks. var/punch_damage = 5 + ///Biotypes we apply an additional amount of damage too + var/biotype_bonus_targets = MOB_BEAST | MOB_SPECIAL + ///Extra damage dealt to our targeted mobs + var/biotype_bonus_damage = 20 ///IF true, the throw attack will not smash people into walls var/non_harmful_throw = TRUE ///How far away your attack will throw your oponent @@ -392,17 +402,24 @@ var/throw_power_max = 4 ///How long will the implant malfunction if it is EMP'd var/emp_base_duration = 9 SECONDS + ///How long before we get another slam punch; consider that these usually come in pairs of two + var/slam_cooldown_duration = 5 SECONDS + ///Tracks how soon we can perform another slam attack + COOLDOWN_DECLARE(slam_cooldown) -/obj/item/organ/internal/cyberimp/arm/muscle/on_mob_insert(mob/living/carbon/arm_owner) +/obj/item/organ/internal/cyberimp/arm/strongarm/l + zone = BODY_ZONE_L_ARM + +/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_insert(mob/living/carbon/arm_owner) . = ..() if(ishuman(arm_owner)) //Sorry, only humans RegisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) -/obj/item/organ/internal/cyberimp/arm/muscle/on_mob_remove(mob/living/carbon/arm_owner) +/obj/item/organ/internal/cyberimp/arm/strongarm/on_mob_remove(mob/living/carbon/arm_owner) . = ..() UnregisterSignal(arm_owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) -/obj/item/organ/internal/cyberimp/arm/muscle/emp_act(severity) +/obj/item/organ/internal/cyberimp/arm/strongarm/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) return @@ -410,11 +427,11 @@ organ_flags |= ORGAN_FAILING addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) -/obj/item/organ/internal/cyberimp/arm/muscle/proc/reboot() +/obj/item/organ/internal/cyberimp/arm/strongarm/proc/reboot() organ_flags &= ~ORGAN_FAILING owner.balloon_alert(owner, "your arm stops spasming!") -/obj/item/organ/internal/cyberimp/arm/muscle/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) +/obj/item/organ/internal/cyberimp/arm/strongarm/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) SIGNAL_HANDLER if(source.get_active_hand() != hand || !proximity) @@ -425,6 +442,8 @@ return NONE if(HAS_TRAIT(source, TRAIT_HULK)) //NO HULK return NONE + if(!COOLDOWN_FINISHED(src, slam_cooldown)) + return NONE if(!source.can_unarmed_attack()) return COMPONENT_SKIP_ATTACK @@ -454,13 +473,16 @@ var/obj/item/bodypart/attacking_bodypart = hand potential_damage += rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) + var/is_correct_biotype = living_target.mob_biotypes & biotype_bonus_targets + if(biotype_bonus_targets && is_correct_biotype) //If we are punching one of our special biotype targets, increase the damage floor by a factor of two. + potential_damage += biotype_bonus_damage + source.do_attack_animation(target, ATTACK_EFFECT_SMASH) playsound(living_target.loc, 'sound/weapons/punch1.ogg', 25, TRUE, -1) var/target_zone = living_target.get_random_valid_zone(source.zone_selected) var/armor_block = living_target.run_armor_check(target_zone, MELEE, armour_penetration = attacking_bodypart.unarmed_effectiveness) - living_target.apply_damage(potential_damage, attacking_bodypart.attack_type, target_zone, armor_block) - living_target.apply_damage(potential_damage*1.5, STAMINA, target_zone, armor_block) + living_target.apply_damage(potential_damage * 2, attacking_bodypart.attack_type, target_zone, armor_block) if(source.body_position != LYING_DOWN) //Throw them if we are standing var/atom/throw_target = get_edge_target_turf(living_target, source.dir) @@ -478,4 +500,6 @@ log_combat(source, target, "[picked_hit_type]ed", "muscle implant") + COOLDOWN_START(src, slam_cooldown, slam_cooldown_duration) + return COMPONENT_CANCEL_ATTACK_CHAIN