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
🆑
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.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
This commit is contained in:
necromanceranne
2024-07-24 12:47:03 +00:00
committed by GitHub
co-authored by Jacquerel
parent 98ec0acd3b
commit 9f780d3e35
4 changed files with 50 additions and 14 deletions
+4
View File
@@ -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,
+1 -1
View File
@@ -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
@@ -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(
@@ -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