From 6351073f56db14d4ac33bfcce7bea9f87494ad96 Mon Sep 17 00:00:00 2001 From: Lucy Grindler <110352801+LucyGrind@users.noreply.github.com> Date: Sun, 16 Jun 2024 16:11:44 -0700 Subject: [PATCH] Pegging Update (#83991) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About The Pull Request We be addin' peg legs an' peg arms, makin' 'em craftable fer all ye scurvy dogs. Ye can attach 'em yerselves, no need fer a surgeon's touch, usin' the mighty ligament hook code. There be tons o' balance tweaks an' special properties fer these limbs. Yarrrrr! ## Why It's Good For The Game Arrr, this be givin' ye a ghetto alternative to headin' to medbay when yer limbs be blown off. Plus, the potential fer pirate RP be fantastic! Who doesn’t want peg limbs? If ye think otherwise, ye be lyin’ ,and ye'll be walkin’ the plank! Yarrrrr! ## Changelog :cl: Hacks-The-Doors (coding) & Septicchlorine (spriting) add: craftable peg limbs (2 planks) which are attachable without surgery bal: peg limbs take 1.5x burn and 1.3x brute, and do reduced damage bal: peg limbs have chunky fingers (like insuls, but per limb) /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: septic <105231896+septoBismol@users.noreply.github.com> Co-authored-by: Jacquerel --- code/__DEFINES/mobs.dm | 6 +- code/__DEFINES/surgery.dm | 2 + code/__DEFINES/traits/declarations.dm | 2 + code/_globalvars/bitfields.dm | 2 + code/_globalvars/traits/_traits.dm | 3 + .../items/stacks/sheets/sheet_types.dm | 21 +++++ code/game/objects/items/tools/weldingtool.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 27 ++++++ code/modules/mob/mob_helpers.dm | 13 --- code/modules/power/cable.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- .../modules/surgery/bodyparts/ghetto_parts.dm | 79 ++++++++++++++++++ icons/mob/human/bodyparts.dmi | Bin 52010 -> 52823 bytes icons/mob/human/species/ghetto.dmi | Bin 0 -> 746 bytes tgstation.dme | 1 + 15 files changed, 145 insertions(+), 17 deletions(-) create mode 100644 code/modules/surgery/bodyparts/ghetto_parts.dm create mode 100644 icons/mob/human/species/ghetto.dmi diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index e8904f0bb1f..2e5d9beadaf 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -84,6 +84,8 @@ #define BODYTYPE_ALIEN (1<<3) ///The limb is from a golem #define BODYTYPE_GOLEM (1<<4) +//The limb is a peg limb +#define BODYTYPE_PEG (1<<5) // Bodyshape defines for how things can be worn, i.e., what "shape" the mob sprite is ///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. @@ -95,7 +97,7 @@ ///The limb is snouted. #define BODYSHAPE_SNOUTED (1<<3) -#define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM) +#define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM | BODYTYPE_PEG) #define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE)) // Defines for Species IDs. Used to refer to the name of a species, for things like bodypart names or species preferences. @@ -135,6 +137,8 @@ #define BODYPART_ID_LARVA "larva" #define BODYPART_ID_PSYKER "psyker" #define BODYPART_ID_MEAT "meat" +#define BODYPART_ID_PEG "peg" + //See: datum/species/var/digitigrade_customization ///The species does not have digitigrade legs in generation. diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 42e00045761..feddc24c6f8 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -33,6 +33,8 @@ #define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) /// Helper to figure out if a limb is robotic #define IS_ROBOTIC_LIMB(limb) (limb.bodytype & BODYTYPE_ROBOTIC) +/// Helper to figure out if a limb is a peg limb +#define IS_PEG_LIMB(limb) (limb.bodytype & BODYTYPE_PEG) // Flags for the bodypart_flags var on /obj/item/bodypart /// Bodypart cannot be dismembered or amputated diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 17d9008a543..2d420339e18 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1153,5 +1153,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This item cannot be selected for or used by a theft objective (Spies, Traitors, etc.) #define TRAIT_ITEM_OBJECTIVE_BLOCKED "item_objective_blocked" +/// This trait lets you attach limbs to any player without surgery. +#define TRAIT_EASY_ATTACH "easy_attach" // END TRAIT DEFINES diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 67f33d0460e..ead7b324cea 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -390,6 +390,7 @@ DEFINE_BITFIELD(bodytype, list( "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, + "BODYTYPE_PEG" = BODYTYPE_PEG, )) DEFINE_BITFIELD(acceptable_bodytype, list( @@ -398,6 +399,7 @@ DEFINE_BITFIELD(acceptable_bodytype, list( "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, + "BODYTYPE_PEG" = BODYTYPE_PEG, )) DEFINE_BITFIELD(bodyshape, list( diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 1fe465da39f..ba065653fe6 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -548,6 +548,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, ), + /obj/item/bodypart = list( + "TRAIT_EASY_ATTACH" = TRAIT_EASY_ATTACH, + ), /obj/item/card/id = list( "TRAIT_JOB_FIRST_ID_CARD" = TRAIT_JOB_FIRST_ID_CARD, "TRAIT_MAGNETIC_ID_CARD" = TRAIT_MAGNETIC_ID_CARD, diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 7b6d4b62073..662f94c61d5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -347,6 +347,12 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new /datum/stack_recipe("pew (left)", /obj/structure/chair/pew/left, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) )), + new/datum/stack_recipe_list("peg limbs", list( + new /datum/stack_recipe("peg arm (left)", /obj/item/bodypart/arm/left/ghetto, 2, crafting_flags = NONE, category = CAT_MISC), + new /datum/stack_recipe("peg arm (right)", /obj/item/bodypart/arm/right/ghetto, 2, crafting_flags = NONE, category = CAT_MISC), + new /datum/stack_recipe("peg leg (left)", /obj/item/bodypart/leg/left/ghetto, 2, crafting_flags = NONE, category = CAT_MISC), + new /datum/stack_recipe("peg leg (right)", /obj/item/bodypart/leg/right/ghetto, 2, crafting_flags = NONE, category = CAT_MISC) + )), null, \ )) @@ -377,6 +383,21 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ /obj/item/stack/sheet/mineral/wood/fifty amount = 50 +/obj/item/stack/sheet/mineral/wood/interact_with_atom(mob/living/carbon/human/target, mob/user) + if(!istype(target)) + return NONE + + var/obj/item/bodypart/affecting = target.get_bodypart(check_zone(user.zone_selected)) + if(affecting && IS_PEG_LIMB(affecting)) + if(user == target) + user.visible_message(span_notice("[user] starts to fix their [affecting.name]."), span_notice("You start fixing [target == user ? "your" : "[target]'s"] [affecting.name].")) + if(!do_after(user, 5 SECONDS, target)) + return ITEM_INTERACT_FAILURE + if(target.item_heal(user, brute_heal = 15, burn_heal = 15, heal_message_brute = "splintering", heal_message_burn = "charring", required_bodytype = BODYTYPE_PEG)) + use(1) + return ITEM_INTERACT_SUCCESS + else + return NONE /* * Bamboo */ diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 0e9b9743a45..b2b0109c04c 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -160,7 +160,7 @@ if(!use_tool(attacked_humanoid, user, use_delay, volume=50, amount=1)) return ITEM_INTERACT_BLOCKING - item_heal_robotic(attacked_humanoid, user, 15, 0) + attacked_humanoid.item_heal(user, brute_heal = 15, burn_heal = 0, heal_message_brute = "dents", heal_message_burn = "burnt wires", required_bodytype = BODYTYPE_ROBOTIC) return ITEM_INTERACT_SUCCESS /obj/item/weldingtool/afterattack(atom/target, mob/user, click_parameters) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index da2c057d740..e588485aedc 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -360,3 +360,30 @@ var/damage = ((min_damage / 4) + (max_damage / 4)) / 2 // We expect you to have 4 functional limbs- if you have fewer you're probably not going to be so good at lifting return ceil(damage * (ceil(athletics_level / 2)) * fitness_modifier * maxHealth) + +/mob/living/carbon/human/proc/item_heal(mob/user, brute_heal, burn_heal, heal_message_brute, heal_message_burn, required_bodytype) + var/obj/item/bodypart/affecting = src.get_bodypart(check_zone(user.zone_selected)) + if (!affecting || !(affecting.bodytype == required_bodytype)) + to_chat(user, span_warning("[affecting] is already in good condition!")) + return FALSE + + var/brute_damaged = affecting.brute_dam > 0 + var/burn_damaged = affecting.burn_dam > 0 + + var/nothing_to_heal = ((brute_heal <= 0 || !brute_damaged) && (burn_heal <= 0 || !burn_damaged)) + if (nothing_to_heal) + to_chat(user, span_notice("[affecting] is already in good condition!")) + return FALSE + + src.update_damage_overlays() + var/message + if ((brute_damaged && brute_heal > 0) && (burn_damaged && burn_heal > 0)) + message = "[heal_message_brute] and [heal_message_burn] on" + else if (brute_damaged && brute_heal > 0) + message = "[heal_message_brute] on" + else + message = "[heal_message_burn] on" + affecting.heal_damage(brute_heal, burn_heal, required_bodytype) + user.visible_message(span_notice("[user] fixes some of the [message] [src]'s [affecting.name]."), \ + span_notice("You fix some of the [message] [src == user ? "your" : "[src]'s"] [affecting.name].")) + return TRUE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9092efac428..a6a1c58c7ed 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -331,19 +331,6 @@ toast.name = header toast.target_ref = WEAKREF(source) -/// Heals a robotic limb on a mob -/proc/item_heal_robotic(mob/living/carbon/human/human, mob/user, brute_heal, burn_heal) - var/obj/item/bodypart/affecting = human.get_bodypart(check_zone(user.zone_selected)) - if(!affecting || IS_ORGANIC_LIMB(affecting)) - to_chat(user, span_warning("[affecting] is already in good condition!")) - return FALSE - var/brute_damage = brute_heal > burn_heal //changes repair text based on how much brute/burn was supplied - if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) - if(affecting.heal_damage(brute_heal, burn_heal, required_bodytype = BODYTYPE_ROBOTIC)) - human.update_damage_overlays() - user.visible_message(span_notice("[user] fixes some of the [brute_damage ? "dents on" : "burnt wires in"] [human]'s [affecting.name]."), \ - span_notice("You fix some of the [brute_damage ? "dents on" : "burnt wires in"] [human == user ? "your" : "[human]'s"] [affecting.name].")) - return TRUE //successful heal ///Is the passed in mob a ghost with admin powers, doesn't check for AI interact like isAdminGhost() used to diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index e55442f31fd..a8e20cde8c7 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -575,7 +575,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [affecting.name]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) if(!do_after(user, 5 SECONDS, H)) return - if(item_heal_robotic(H, user, 0, 15)) + if(H.item_heal(user, 0, 15, "dents", "burnt wires", BODYTYPE_ROBOTIC)) use(1) return else diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 318926465ae..c03a930395a 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -362,7 +362,7 @@ if(ishuman(victim)) var/mob/living/carbon/human/human_victim = victim - if(HAS_TRAIT(victim, TRAIT_LIMBATTACHMENT)) + if(HAS_TRAIT(victim, TRAIT_LIMBATTACHMENT) || HAS_TRAIT(src, TRAIT_EASY_ATTACH)) if(!human_victim.get_bodypart(body_zone)) user.temporarilyRemoveItemFromInventory(src, TRUE) if(!try_attach_limb(victim)) diff --git a/code/modules/surgery/bodyparts/ghetto_parts.dm b/code/modules/surgery/bodyparts/ghetto_parts.dm new file mode 100644 index 00000000000..36c0310dead --- /dev/null +++ b/code/modules/surgery/bodyparts/ghetto_parts.dm @@ -0,0 +1,79 @@ +/obj/item/bodypart/arm/left/ghetto + name = "left peg arm" + desc = "A roughly hewn wooden peg replaces where a forearm should be. It's simple and sturdy, clearly made in a hurry with whatever materials were at hand. Despite its crude appearance, it gets the job done." + icon = 'icons/mob/human/species/ghetto.dmi' + icon_static = 'icons/mob/human/species/ghetto.dmi' + limb_id = BODYPART_ID_PEG + icon_state = "peg_l_arm" + bodytype = BODYTYPE_PEG + should_draw_greyscale = FALSE + attack_verb_simple = list("bashed", "slashed") + unarmed_damage_low = 3 + unarmed_damage_high = 9 + unarmed_effectiveness = 5 + brute_modifier = 1.2 + burn_modifier = 1.5 + bodypart_traits = list(TRAIT_CHUNKYFINGERS) + +/obj/item/bodypart/arm/left/ghetto/Initialize(mapload, ...) + . = ..() + ADD_TRAIT(src, TRAIT_EASY_ATTACH, INNATE_TRAIT) + +/obj/item/bodypart/arm/right/ghetto + name = "right peg arm" + desc = "A roughly hewn wooden peg replaces where a forearm should be. It's simple and sturdy, clearly made in a hurry with whatever materials were at hand. Despite its crude appearance, it gets the job done." + icon = 'icons/mob/human/species/ghetto.dmi' + icon_static = 'icons/mob/human/species/ghetto.dmi' + limb_id = BODYPART_ID_PEG + icon_state = "peg_r_arm" + bodytype = BODYTYPE_PEG + should_draw_greyscale = FALSE + attack_verb_simple = list("bashed", "slashed") + unarmed_damage_low = 3 + unarmed_damage_high = 9 + unarmed_effectiveness = 5 + brute_modifier = 1.2 + burn_modifier = 1.5 + bodypart_traits = list(TRAIT_CHUNKYFINGERS) + +/obj/item/bodypart/arm/right/ghetto/Initialize(mapload, ...) + . = ..() + ADD_TRAIT(src, TRAIT_EASY_ATTACH, INNATE_TRAIT) + +/obj/item/bodypart/leg/left/ghetto + name = "left peg leg" + desc = "Fashioned from what looks suspiciously like a table leg, this peg leg brings a whole new meaning to 'dining on the go.' It's a bit wobbly and creaks ominously with every step, but at least you can claim to have the most well-balanced diet on the seven seas." + icon = 'icons/mob/human/species/ghetto.dmi' + icon_static = 'icons/mob/human/species/ghetto.dmi' + limb_id = BODYPART_ID_PEG + icon_state = "peg_l_leg" + bodytype = BODYTYPE_PEG + should_draw_greyscale = FALSE + unarmed_damage_low = 2 + unarmed_damage_high = 5 + unarmed_effectiveness = 10 + brute_modifier = 1.2 + burn_modifier = 1.5 + +/obj/item/bodypart/leg/left/ghetto/Initialize(mapload, ...) + . = ..() + ADD_TRAIT(src, TRAIT_EASY_ATTACH, INNATE_TRAIT) + +/obj/item/bodypart/leg/right/ghetto + name = "right peg leg" + desc = "Fashioned from what looks suspiciously like a table leg, this peg leg brings a whole new meaning to 'dining on the go.' It's a bit wobbly and creaks ominously with every step, but at least you can claim to have the most well-balanced diet on the seven seas." + icon = 'icons/mob/human/species/ghetto.dmi' + icon_static = 'icons/mob/human/species/ghetto.dmi' + limb_id = BODYPART_ID_PEG + icon_state = "peg_r_leg" + bodytype = BODYTYPE_PEG + should_draw_greyscale = FALSE + unarmed_damage_low = 2 + unarmed_damage_high = 5 + unarmed_effectiveness = 10 + brute_modifier = 1.2 + burn_modifier = 1.5 + +/obj/item/bodypart/leg/right/ghetto/Initialize(mapload, ...) + . = ..() + ADD_TRAIT(src, TRAIT_EASY_ATTACH, INNATE_TRAIT) diff --git a/icons/mob/human/bodyparts.dmi b/icons/mob/human/bodyparts.dmi index d6e4472973a328fa22250471a71c9a647190085b..78be880423c1ea7988b9dc3b75a7af1bac9e0466 100644 GIT binary patch delta 12912 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 XFXAXf=`Z|{_)|sc@qMI%`MduC@WUfP delta 12180 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�fqUNnXh9ly#3Cj7i^pk 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index dd55b451101..b6ddcc5e209 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5879,6 +5879,7 @@ #include "code\modules\surgery\advanced\bioware\vein_threading.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" +#include "code\modules\surgery\bodyparts\ghetto_parts.dm" #include "code\modules\surgery\bodyparts\head.dm" #include "code\modules\surgery\bodyparts\head_hair_and_lips.dm" #include "code\modules\surgery\bodyparts\helpers.dm"