diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/WorkInProgress/Cib/MedicalSideEffects.dm index 3419cf54426..cfaea6a7b07 100644 --- a/code/WorkInProgress/Cib/MedicalSideEffects.dm +++ b/code/WorkInProgress/Cib/MedicalSideEffects.dm @@ -23,11 +23,11 @@ /datum/medical_effect/proc/cure(mob/living/carbon/human/H) for(var/R in cures) if(H.reagents.has_reagent(R)) - H <<"\red [cure_message]" + if (cure_message) + H <<"\blue [cure_message]" return 1 return 0 - // MOB HELPERS // =========== /mob/living/carbon/human/var/list/datum/medical_effect/side_effects = list() @@ -39,16 +39,20 @@ M.start = life_tick return - var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect + var/T = side_effects[name] + if (!T) + return - for(var/T in L) - var/datum/medical_effect/M = new T - if(M.name == name) - M.strength = strength - M.start = life_tick - side_effects += M + var/datum/medical_effect/M = new T + if(M.name == name) + M.strength = strength + M.start = life_tick + side_effects += M /mob/living/carbon/human/proc/handle_medical_side_effects() + //Going to handle those things only every few ticks. + if(life_tick % 15 != 0) + return 0 var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect for(var/T in L) @@ -60,18 +64,14 @@ for (var/datum/medical_effect/M in side_effects) if (!M) continue var/strength_percent = sin((life_tick - M.start) / 2) - log_debug ("[src], tick [life_tick] : Processing [M], Current phase: [strength_percent]") // Only do anything if the effect is currently strong enough if(strength_percent >= 0.4) - log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]") if (M.cure(src) || M.strength > 50) - log_debug ("[src], tick [life_tick] : [M] cured or reached end of lifecycle") side_effects -= M - del(M) + M = null else if(life_tick % 45 == 0) - log_debug ("[src], tick [life_tick] : Activating [M] ") M.on_life(src, strength_percent*M.strength) // Effect slowly growing stronger M.strength+=0.08 @@ -92,7 +92,6 @@ H.custom_pain("You feel a throbbing pain in your head!",1) if(31 to INFINITY) H.custom_pain("You feel an excrutiating pain in your head!",1) - H.adjustBrainLoss(1) // BAD STOMACH // =========== @@ -110,7 +109,6 @@ H.custom_pain("Your stomach hurts.",0) if(31 to INFINITY) H.custom_pain("You feel sick.",1) - H.adjustToxLoss(1) // CRAMPS // ====== @@ -129,7 +127,6 @@ if(31 to INFINITY) H.emote("me",1,"flinches as all the muscles in their body cramp up.") H.custom_pain("There's pain all over your body.",1) - H.adjustToxLoss(1) // ITCH // ==== @@ -147,5 +144,4 @@ H.custom_pain("You want to scratch your itch badly.",0) if(31 to INFINITY) H.emote("me",1,"shivers slightly.") - H.custom_pain("This itch makes it really hard to concentrate.",1) - H.adjustToxLoss(1) \ No newline at end of file + H.custom_pain("This itch makes it really hard to concentrate.",1) \ No newline at end of file diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index da3f4cd3b9c..d4c7f2b9df3 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -16,6 +16,7 @@ var/global/list/chemical_reactions_list //list of all /datum/chemical_reactio var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 +var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12 var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. //Languages/species/whitelist. @@ -76,6 +77,13 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al surgery_steps += S sort_surgeries() + //Medical side effects. List all effects by their names + paths = typesof(/datum/medical_effect)-/datum/medical_effect + for(var/T in paths) + var/datum/medical_effect/M = new T + side_effects[M.name] = T + + //Languages and species. paths = typesof(/datum/language)-/datum/language for(var/T in paths) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c192e2c765c..7c17f882cac 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -92,7 +92,7 @@ I.take_damage(rand(3,5)) //Special effects for limbs. - if(E.name in list("l_hand","l_arm","r_hand","r_arm")) + if(E.name in list("l_hand","l_arm","r_hand","r_arm") && (broken||malfunction)) var/obj/item/c_hand //Getting what's in this hand if(E.name == "l_hand" || E.name == "l_arm") c_hand = l_hand @@ -100,8 +100,7 @@ c_hand = r_hand if (c_hand) - if (broken||malfunction) - u_equip(c_hand) + u_equip(c_hand) if(broken) emote("me", 1, "screams in pain and drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!") @@ -125,39 +124,11 @@ paralysis = 10 //Check arms and legs for existence - var/canstand_l = 1 //Can stand on left leg - var/canstand_r = 1 //Can stand on right leg - var/legispeg_l=0 - var/legispeg_r=0 - var/hasleg_l = 1 //Have left leg - var/hasleg_r = 1 //Have right leg - var/hasarm_l = 1 //Have left arm - var/hasarm_r = 1 //Have right arm - var/datum/organ/external/E - E = get_organ("l_leg") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_l = 0 - hasleg_l = 0 - legispeg_l=E.status & ORGAN_PEG - E = get_organ("r_leg") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_r = 0 - hasleg_r = 0 - legispeg_r=E.status & ORGAN_PEG - E = get_organ("l_foot") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED) && !legispeg_l) - canstand_l = 0 - E = get_organ("r_foot") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED) && !legispeg_r) - canstand_r = 0 - E = get_organ("l_arm") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - hasarm_l = 0 - E = get_organ("r_arm") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - hasarm_r = 0 + can_stand = 2 //can stand on both legs + var/datum/organ/external/E = organs_by_name["l_foot"] + if(E.status & ORGAN_DESTROYED) + can_stand-- - // Can stand if have at least one full leg (with leg and foot parts present, or an entire pegleg) - // Has limbs to move around if at least one arm or leg is at least partially there - can_stand = canstand_l||canstand_r - has_limbs = hasleg_l||hasleg_r||hasarm_l||hasarm_r + E = organs_by_name["r_foot"] + if(E.status & ORGAN_DESTROYED) + can_stand-- \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 1001405ecf1..14171bd8697 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -44,7 +44,6 @@ // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 - var/has_fat=0 // Has a _fat variant /datum/organ/external/New(var/datum/organ/external/P) if(P) @@ -77,18 +76,14 @@ if(status & ORGAN_DESTROYED) return 0 - if(status & (ORGAN_ROBOT|ORGAN_PEG)) + if(status & ORGAN_ROBOT) brute *= 0.66 //~2/3 damage for ROBOLIMBS burn *= 0.66 //~2/3 damage for ROBOLIMBS //If limb took enough damage, try to cut or tear it off if(body_part != UPPER_TORSO && body_part != LOWER_TORSO) //as hilarious as it is, getting hit on the chest too much shouldn't effectively gib you. if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) - if(body_part != HEAD) - if ( (sharp && prob(8 * brute)) || (brute > 20 && prob(2 * brute)) ) - droplimb(1) - return - else if( (sharp && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) ) + if( (sharp && prob(5 * brute)) || (brute > 20 && prob(2 * brute)) ) droplimb(1) return @@ -104,7 +99,7 @@ if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) - var/can_cut = (prob(brute*2) || sharp) && !(status & (ORGAN_ROBOT|ORGAN_PEG)) + var/can_cut = (prob(brute*2) || sharp) && !(status & ORGAN_ROBOT) // If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break) if(brute) @@ -138,7 +133,7 @@ burn = max(0, burn - can_inflict) //If there are still hurties to dispense if (burn || brute) - if (status & (ORGAN_ROBOT|ORGAN_PEG)) + if (status & ORGAN_ROBOT) droplimb(1) //Robot limbs just kinda fail at full damage. else //List organs we can pass it to @@ -165,10 +160,6 @@ if(status & ORGAN_ROBOT && !robo_repair) return - // Can't fix peglegs. - if(status & ORGAN_PEG) - return - //Heal damage on the individual wounds for(var/datum/wound/W in wounds) if(brute == 0 && burn == 0) @@ -191,6 +182,28 @@ var/result = update_icon() return result +/* +This function completely restores a damaged organ to perfect condition. +*/ +/datum/organ/external/proc/rejuvenate() + damage_state = "00" + status = 0 + perma_injury = 0 + brute_dam = 0 + burn_dam = 0 + + // handle internal organs + for(var/datum/organ/internal/current_organ in internal_organs) + current_organ.rejuvenate() + + // remove embedded objects and drop them on the floor + for(var/obj/implanted_object in implants) + if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. + implanted_object.loc = owner.loc + implants -= implanted_object + + owner.updatehealth() + /datum/organ/external/proc/createwound(var/type = CUT, var/damage) if(damage == 0) return @@ -226,7 +239,7 @@ //Possibly trigger an internal wound, too. var/local_damage = brute_dam + burn_dam + damage - if(damage > 10 && type != BURN && local_damage > 20 && prob(damage) && !(status & (ORGAN_ROBOT|ORGAN_PEG))) + if(damage > 10 && type != BURN && local_damage > 20 && prob(damage) && !(status & ORGAN_ROBOT)) var/datum/wound/internal_bleeding/I = new (15) wounds += I owner.custom_pain("You feel something rip in your [display_name]!", 1) @@ -270,13 +283,12 @@ return //Bone fracurtes - if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & (ORGAN_ROBOT|ORGAN_PEG)) && !(istype(owner, /mob/living/carbon/human/slime))) + if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) src.fracture() if(!(status & ORGAN_BROKEN)) perma_injury = 0 update_germs() - update_icon() return //Updating germ levels. Handles organ germ levels and necrosis. @@ -285,10 +297,6 @@ #define GANGREN_LEVEL_TERMINAL 2500 #define GERM_TRANSFER_AMOUNT germ_level/500 /datum/organ/external/proc/update_germs() - if(status & (ORGAN_ROBOT|ORGAN_PEG)) //how does robot limb have da germs? - if(germ_level > 0) - germ_level = 0 - return if(germ_level > 0 && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs //Syncing germ levels with external wounds for(var/datum/wound/W in wounds) @@ -304,7 +312,7 @@ if(germ_level > GANGREN_LEVEL_TWO) germ_level++ owner.adjustToxLoss(1) - +/* if(germ_level > GANGREN_LEVEL_TERMINAL) if (!(status & ORGAN_DEAD)) status |= ORGAN_DEAD @@ -313,17 +321,17 @@ if (prob(10)) //Spreading the fun if (children) //To child organs for (var/datum/organ/external/child in children) - if (!(child.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT|ORGAN_PEG))) + if (!(child.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT))) child.germ_level += round(GERM_TRANSFER_AMOUNT) if (parent) - if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT|ORGAN_PEG))) + if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT))) parent.germ_level += round(GERM_TRANSFER_AMOUNT) +*/ - -//Updating wounds. Handles wound natural healing, internal bleedings and infections +//Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections /datum/organ/external/proc/update_wounds() - if((status & (ORGAN_ROBOT|ORGAN_PEG))) //Robotic limbs don't heal or get worse. + if((status & ORGAN_ROBOT)) //Robotic limbs don't heal or get worse. return for(var/datum/wound/W in wounds) @@ -335,18 +343,21 @@ // Internal wounds get worse over time. Low temperatures (cryo) stop them. if(W.internal && !W.is_treated() && owner.bodytemperature >= 170) - if(!owner.reagents.has_reagent("bicaridine")) //bicard stops internal wounds from growing bigger with time + if(!owner.reagents.has_reagent("bicaridine")) //bicard stops internal wounds from growing bigger with time, and also stop bleeding W.open_wound(0.1 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.07 * W.damage * wound_update_accuracy) + owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy) + + owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy)//Bicaridine slows Internal Bleeding if(prob(1 * wound_update_accuracy)) owner.custom_pain("You feel a stabbing pain in your [display_name]!",1) - //overdose of bicaridine begins healing IB - if(owner.reagents.get_reagent_amount("bicaridine") >= 30) - W.damage = max(0, W.damage - 0.2) + //overdose of bicaridine begins healing IB + if(owner.reagents.get_reagent_amount("bicaridine") >= 30) + W.damage = max(0, W.damage - 0.2) // slow healing var/heal_amt = 0 + if (W.damage < 15) //this thing's edges are not in day's travel of each other, what healing? heal_amt += 0.2 @@ -370,6 +381,8 @@ // sync the organ's damage with its wounds src.update_damages() + if (update_icon()) + owner.UpdateDamageIcon(1) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. /datum/organ/external/proc/update_damages() @@ -384,7 +397,7 @@ else if(W.damage_type == BURN) burn_dam += W.damage - if(!(status & (ORGAN_ROBOT|ORGAN_PEG)) && W.bleeding()) + if(!(status & ORGAN_ROBOT) && W.bleeding()) W.bleed_timer-- status |= ORGAN_BLEEDING @@ -402,10 +415,6 @@ var/n_is = damage_state_text() if (n_is != damage_state) damage_state = n_is - if(status & ORGAN_DESTROYED) - owner.update_body(1) - else - owner.UpdateDamageIcon(1) return 1 return 0 @@ -491,23 +500,11 @@ if(LEG_RIGHT) if(status & ORGAN_ROBOT) organ = new /obj/item/robot_parts/r_leg(owner.loc) - else if(status & ORGAN_PEG) - //organ = new /obj/item/stack/sheet/wood(owner.loc) - owner.visible_message(\ - "\red \The [owner]'s [display_name] snaps!",\ - "\red Your [display_name] snaps!",\ - "You hear wood being split.") else organ= new /obj/item/weapon/organ/r_leg(owner.loc, owner) if(LEG_LEFT) if(status & ORGAN_ROBOT) organ = new /obj/item/robot_parts/l_leg(owner.loc) - else if(status & ORGAN_PEG) - //organ = new /obj/item/stack/sheet/wood(owner.loc) - owner.visible_message(\ - "\red \The [owner]'s [display_name] snaps!",\ - "\red Your [display_name] snaps!",\ - "You hear wood being split.") else organ= new /obj/item/weapon/organ/l_leg(owner.loc, owner) if(HAND_RIGHT) @@ -549,7 +546,7 @@ var/lol = pick(cardinal) step(organ,lol) - owner.regenerate_icons() + owner.update_body(1) /**************************************************** @@ -596,24 +593,11 @@ src.status &= ~ORGAN_SPLINTED src.status &= ~ORGAN_ATTACHABLE src.status &= ~ORGAN_DESTROYED - src.status &= ~ORGAN_PEG src.status |= ORGAN_ROBOT for (var/datum/organ/external/T in children) if(T) T.robotize() -/datum/organ/external/proc/peggify() - src.status &= ~ORGAN_BROKEN - src.status &= ~ORGAN_BLEEDING - src.status &= ~ORGAN_SPLINTED - src.status &= ~ORGAN_ATTACHABLE - src.status &= ~ORGAN_DESTROYED - src.status &= ~ORGAN_ROBOT - src.status |= ORGAN_PEG - for (var/datum/organ/external/T in children) - if(T) - T.droplimb(1,1) - /datum/organ/external/proc/mutate() src.status |= ORGAN_MUTATED owner.update_body() @@ -631,22 +615,11 @@ return 1 return 0 -/datum/organ/external/get_icon(gender="",isFat=0) - //stand_icon = new /icon(icobase, "torso_[g][fat?"_fat":""]") - if (status & ORGAN_ROBOT) - return new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") - if(gender) - gender="_[gender]" - var/fat="" - if(isFat && has_fat) - fat="_fat" - var/icon_state="[icon_name][gender][fat]" - var/baseicon=owner.race_icon +/datum/organ/external/get_icon(gender="") if (status & ORGAN_MUTATED) - baseicon=owner.deform_icon - if (status & ORGAN_PEG) - baseicon='icons/mob/human_races/o_peg.dmi' - return new /icon(baseicon, icon_state) + return new /icon(owner.deform_icon, "[icon_name][gender ? "_[gender]" : ""]") + else + return new /icon(owner.race_icon, "[icon_name][gender ? "_[gender]" : ""]") /datum/organ/external/proc/is_usable() @@ -661,9 +634,8 @@ icon_name = "torso" display_name = "chest" max_damage = 75 - min_broken_damage = 55 + min_broken_damage = 40 body_part = UPPER_TORSO - has_fat=1 /datum/organ/external/groin @@ -671,7 +643,7 @@ icon_name = "groin" display_name = "groin" max_damage = 50 - min_broken_damage = 40 + min_broken_damage = 30 body_part = LOWER_TORSO /datum/organ/external/l_arm @@ -679,7 +651,7 @@ display_name = "left arm" icon_name = "l_arm" max_damage = 50 - min_broken_damage = 30 + min_broken_damage = 20 body_part = ARM_LEFT /datum/organ/external/l_leg @@ -687,7 +659,7 @@ display_name = "left leg" icon_name = "l_leg" max_damage = 50 - min_broken_damage = 30 + min_broken_damage = 20 body_part = LEG_LEFT icon_position = LEFT @@ -696,7 +668,7 @@ display_name = "right arm" icon_name = "r_arm" max_damage = 50 - min_broken_damage = 30 + min_broken_damage = 20 body_part = ARM_RIGHT /datum/organ/external/r_leg @@ -704,7 +676,7 @@ display_name = "right leg" icon_name = "r_leg" max_damage = 50 - min_broken_damage = 30 + min_broken_damage = 20 body_part = LEG_RIGHT icon_position = RIGHT @@ -713,7 +685,7 @@ display_name = "left foot" icon_name = "l_foot" max_damage = 30 - min_broken_damage = 25 + min_broken_damage = 15 body_part = FOOT_LEFT icon_position = LEFT @@ -722,7 +694,7 @@ display_name = "right foot" icon_name = "r_foot" max_damage = 30 - min_broken_damage = 25 + min_broken_damage = 15 body_part = FOOT_RIGHT icon_position = RIGHT @@ -731,7 +703,7 @@ display_name = "right hand" icon_name = "r_hand" max_damage = 30 - min_broken_damage = 25 + min_broken_damage = 15 body_part = HAND_RIGHT /datum/organ/external/l_hand @@ -739,7 +711,7 @@ display_name = "left hand" icon_name = "l_hand" max_damage = 30 - min_broken_damage = 25 + min_broken_damage = 15 body_part = HAND_LEFT /datum/organ/external/head @@ -747,21 +719,19 @@ icon_name = "head" display_name = "head" max_damage = 75 - min_broken_damage = 55 + min_broken_damage = 40 body_part = HEAD var/disfigured = 0 /datum/organ/external/head/get_icon() if (!owner) - return ..() + return ..() var/g = "m" if(owner.gender == FEMALE) g = "f" - var/baseicon=owner.race_icon if (status & ORGAN_MUTATED) - baseicon=owner.deform_icon - if (status & ORGAN_PEG) - baseicon='icons/mob/human_races/o_peg.dmi' - return new /icon(baseicon, "[icon_name]_[g]") + . = new /icon(owner.deform_icon, "[icon_name]_[g]") + else + . = new /icon(owner.race_icon, "[icon_name]_[g]") /datum/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) ..(brute, burn, sharp, used_weapon, forbidden_limbs) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index a3b1d59fe42..cb5148f105c 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -11,6 +11,9 @@ var/min_broken_damage = 30 var/parent_organ = "chest" +/datum/organ/internal/proc/rejuvenate() + damage=0 + /datum/organ/internal/proc/is_bruised() return damage >= min_bruised_damage diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index e71edfbed06..985862b0463 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -158,43 +158,6 @@ target.UpdateDamageIcon() del(tool) - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ - "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) - -/datum/surgery_step/limb/attach_plank - allowed_tools = list(/obj/item/stack/sheet/wood=100) - can_infect = 0 - - min_duration = 80 - max_duration = 100 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/obj/item/robot_parts/p = tool - if (p.part) - if (!(target_zone in p.part)) - return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) - return ..() && affected.status & ORGAN_ATTACHABLE - - begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ - "You start attaching [tool] where [target]'s [affected.display_name] used to be.") - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ - "\blue You have attached [tool] where [target]'s [affected.display_name] used to be.") - affected.peggify() - target.update_body() - target.updatehealth() - target.UpdateDamageIcon() - var/obj/item/stack/sheet/wood/peg = tool - peg.use(1) - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \