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