diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index e4cd4d66678..2ac4d4e69cc 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -176,8 +176,11 @@ if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) + var/damage_calculator = picked.get_damage(TRUE) //heal_damage returns update status T/F instead of amount healed so we dance gracefully around this if(picked.heal_damage(brute, burn, stamina, required_status)) update_damage_overlays() + return max(damage_calculator - picked.get_damage(TRUE), 0) + //Damages ONE bodypart randomly selected from damagable ones. //It automatically updates damage overlays if necessary diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 20a445a90de..8a8e275e699 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -241,10 +241,9 @@ return // heal ONE external organ, organ gets randomly selected from damaged ones. +/// needs to return amount healed in order to calculate things like tend wounds xp gain /mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) - adjustBruteLoss(-brute, FALSE) //zero as argument for no instant health update - adjustFireLoss(-burn, FALSE) - adjustStaminaLoss(-stamina, FALSE) + . = (adjustBruteLoss(-brute, FALSE) + adjustFireLoss(-burn, FALSE) + adjustStaminaLoss(-stamina, FALSE)) //zero as argument for no instant health update if(updating_health) updatehealth() update_stamina() diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm index 836c37fbc8f..64739fa1339 100644 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm @@ -23,12 +23,12 @@ "[user] starts reshaping [target]'s ligaments into a hook-like shape.", "[user] starts manipulating [target]'s ligaments.") -/datum/surgery_step/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You reshape [target]'s ligaments into a connective hook!", "[user] reshapes [target]'s ligaments into a connective hook!", "[user] finishes manipulating [target]'s ligaments.") new /datum/bioware/hooked_ligaments(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/hooked_ligaments name = "Hooked Ligaments" diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm index b29099f40c0..ad483bd2be7 100644 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm @@ -23,12 +23,12 @@ "[user] starts reinforce [target]'s ligaments.", "[user] starts manipulating [target]'s ligaments.") -/datum/surgery_step/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You reinforce [target]'s ligaments!", "[user] reinforces [target]'s ligaments!", "[user] finishes manipulating [target]'s ligaments.") new /datum/bioware/reinforced_ligaments(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/reinforced_ligaments name = "Reinforced Ligaments" diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm index a29d8d04419..0ecec896b02 100644 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm @@ -22,12 +22,12 @@ "[user] starts wrapping muscles around [target]'s circulatory system.", "[user] starts manipulating [target]'s circulatory system.") -/datum/surgery_step/muscled_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/muscled_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You reshape [target]'s circulatory system, adding a muscled membrane!", "[user] reshapes [target]'s circulatory system, adding a muscled membrane!", "[user] finishes manipulating [target]'s circulatory system.") new /datum/bioware/muscled_veins(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/muscled_veins name = "Threaded Veins" diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm index a02bb8d6d32..aec78edb080 100644 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm @@ -22,12 +22,12 @@ "[user] starts rerouting [target]'s nerves.", "[user] starts manipulating [target]'s nervous system.") -/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You successfully reroute [target]'s nervous system!", "[user] successfully reroutes [target]'s nervous system!", "[user] finishes manipulating [target]'s nervous system.") new /datum/bioware/grounded_nerves(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/grounded_nerves name = "Grounded Nerves" diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm index aedda27a0d6..38be1a35174 100644 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm @@ -22,12 +22,12 @@ "[user] starts splicing together [target]'s nerves.", "[user] starts manipulating [target]'s nervous system.") -/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You successfully splice [target]'s nervous system!", "[user] successfully splices [target]'s nervous system!", "[user] finishes manipulating [target]'s nervous system.") new /datum/bioware/spliced_nerves(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/spliced_nerves name = "Spliced Nerves" diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm index 09a6ab54fa6..dd89dfa7a04 100644 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ b/code/modules/surgery/advanced/bioware/vein_threading.dm @@ -22,12 +22,12 @@ "[user] starts weaving [target]'s circulatory system.", "[user] starts manipulating [target]'s circulatory system.") -/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You weave [target]'s circulatory system into a resistant mesh!", "[user] weaves [target]'s circulatory system into a resistant mesh!", "[user] finishes manipulating [target]'s circulatory system.") new /datum/bioware/threaded_veins(target) - return ..(default_display_results = FALSE) + return ..() /datum/bioware/threaded_veins name = "Threaded Veins" diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 873a70e1b10..27d3e622a3a 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -18,7 +18,7 @@ "[user] begins to sever [target]'s [parse_zone(target_zone)]!", "[user] begins to sever [target]'s [parse_zone(target_zone)]!") -/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/mob/living/carbon/human/L = target display_results(user, target, "You sever [L]'s [parse_zone(target_zone)].", "[user] severs [L]'s [parse_zone(target_zone)]!", @@ -28,4 +28,4 @@ target_limb.drop_limb() if(user.mind) user.mind.adjust_experience(/datum/skill/medical, experience_given) - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index 9421b8bee27..998aaadc173 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -29,7 +29,7 @@ "[user] begins to fix [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in fixing [target]'s brain.", "[user] successfully fixes [target]'s brain!", "[user] completes the surgery on [target]'s brain.") @@ -38,7 +38,7 @@ target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 60) //we set damage in this case in order to clear the "failing" flag var/cured_num = target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) experience_given = 2*cured_num - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorganslot(ORGAN_SLOT_BRAIN)) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index d017908e427..e81dea83bb8 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -31,7 +31,7 @@ "[user] checks for items in [target]'s [target_zone].", "[user] looks for something in [target]'s [target_zone].") -/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) +/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery = FALSE) var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST) if(tool) if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ)) @@ -43,7 +43,7 @@ "[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].") user.transferItemToLoc(tool, target, TRUE) CH.cavity_item = tool - return ..(default_display_results = FALSE) + return ..() else if(IC) display_results(user, target, "You pull [IC] out of [target]'s [target_zone].", @@ -51,7 +51,7 @@ "[user] pulls [IC.w_class > WEIGHT_CLASS_SMALL ? IC : "something"] out of [target]'s [target_zone].") user.put_in_hands(IC) CH.cavity_item = null - return ..(default_display_results = FALSE) + return ..() else to_chat(user, "You don't find anything in [target]'s [target_zone].") return 0 diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm index ffe03d41483..bcc7836343b 100644 --- a/code/modules/surgery/core_removal.dm +++ b/code/modules/surgery/core_removal.dm @@ -22,7 +22,7 @@ "[user] begins to extract a core from [target].", "[user] begins to extract a core from [target].") -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/mob/living/simple_animal/slime/slime = target if(slime.cores > 0) slime.cores-- @@ -34,9 +34,9 @@ if(slime.cores <= 0) slime.icon_state = "[slime.colour] baby slime dead-nocore" - return ..(default_display_results = FALSE) + return ..() else return 0 else to_chat(user, "There aren't any cores left in [target]!") - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index f2cbafa8b54..5fb613e16e5 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -24,7 +24,7 @@ "[user] begins to make an incision in [target]'s heart.", "[user] begins to make an incision in [target]'s heart.") -/datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) var/mob/living/carbon/human/H = target if (!(NOBLOOD in H.dna.species.species_traits)) @@ -33,7 +33,7 @@ "") H.bleed_rate += 10 H.adjustBruteLoss(10) - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/incise_heart/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(ishuman(target)) @@ -50,13 +50,14 @@ name = "graft coronary bypass" implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5) time = 90 + experience_given = 20 /datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to graft a bypass onto [target]'s heart...", "[user] begins to graft something onto [target]'s heart!", "[user] begins to graft something onto [target]'s heart!") -/datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) target.setOrganLoss(ORGAN_SLOT_HEART, 60) var/obj/item/organ/heart/heart = target.getorganslot(ORGAN_SLOT_HEART) if(heart) //slightly worrying if we lost our heart mid-operation, but that's life @@ -64,7 +65,7 @@ display_results(user, target, "You successfully graft a bypass onto [target]'s heart.", "[user] finishes grafting something onto [target]'s heart.", "[user] finishes grafting something onto [target]'s heart.") - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/coronary_bypass/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(ishuman(target)) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index ac254f7776b..26d6f76ae84 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -13,7 +13,7 @@ "[user] begins to wedge \the [tool] in [target]'s [parse_zone(target_zone)].", "[user] begins to wedge something in [target]'s [parse_zone(target_zone)].") -/datum/surgery_step/insert_pill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/reagent_containers/pill/tool, datum/surgery/surgery) +/datum/surgery_step/insert_pill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/reagent_containers/pill/tool, datum/surgery/surgery, default_display_results = FALSE) if(!istype(tool)) return 0 @@ -27,7 +27,7 @@ display_results(user, target, "You wedge [tool] into [target]'s [parse_zone(target_zone)].", "[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "[user] wedges something into [target]'s [parse_zone(target_zone)]!") - return ..(default_display_results = FALSE) + return ..() /datum/action/item_action/hands_free/activate_pill name = "Activate Pill" diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 50a8801ac3c..f697d48fa83 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -73,26 +73,32 @@ cost *= ED.value_multiplier return (cost-multi_surgery_adjust) -/datum/surgery_step/dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, display_results = TRUE) +/datum/surgery_step/dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/points_earned = check_value(target, surgery) user.visible_message("[user] dissects [target], discovering [points_earned] point\s of data!", "You dissect [target], finding [points_earned] point\s worth of discoveries, you also write a few notes.") SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_earned*PUBLIC_TECHWEB_GAIN)) - new /obj/item/research_notes(user.loc, points_earned*PRIVATE_TECHWEB_GAIN, "biology") + var/obj/item/research_notes/the_dossier =new /obj/item/research_notes(user.loc, points_earned*PRIVATE_TECHWEB_GAIN, "biology") + if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() + hand_dossier.merge(the_dossier) var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) target.apply_damage(80, BRUTE, L) ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]") repeatable = FALSE - experience_given = 1+(points_earned/BASE_HUMAN_REWARD) - return ..(default_display_results = FALSE) + experience_given = 1+(points_earned/(BASE_HUMAN_REWARD/10))//if BHR = 500, 10 XP on base surgery + return ..() /datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/points_earned = round(check_value(target, surgery) * 0.01) user.visible_message("[user] dissects [target]!", EXPDIS_FAIL_MSG) SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_earned*PUBLIC_TECHWEB_GAIN)) - new /obj/item/research_notes(user.loc, points_earned*PRIVATE_TECHWEB_GAIN, "biology") + var/obj/item/research_notes/the_dossier =new /obj/item/research_notes(user.loc, points_earned*PRIVATE_TECHWEB_GAIN, "biology") + if(!user.put_in_hands(the_dossier) && istype(user.get_inactive_held_item(), /obj/item/research_notes)) + var/obj/item/research_notes/hand_dossier = user.get_inactive_held_item() + hand_dossier.merge(the_dossier) var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) target.apply_damage(80, BRUTE, L) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 1c9207b0a5c..d50840291c2 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -10,6 +10,7 @@ name = "fix eyes" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25) time = 64 + experience_given = 5 /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) @@ -23,7 +24,7 @@ "[user] begins to fix [target]'s eyes.", "[user] begins to perform surgery on [target]'s eyes.") -/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") display_results(user, target, "You succeed in fixing [target]'s eyes.", @@ -34,7 +35,7 @@ target.cure_nearsighted(list(EYE_DAMAGE)) target.blur_eyes(35) //this will fix itself slowly. E.setOrganDamage(0) - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorgan(/obj/item/organ/brain)) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 4d8e0f75f08..6e8e3e18015 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -1,3 +1,5 @@ +#define PER_ITERATION_XP_CAP 3 //TW XP gain scales with repeated iterations. + /datum/surgery/healing steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -26,7 +28,7 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55) repeatable = TRUE time = 25 - experience_given = 2 + experience_given = 1 //scales with repeated iterations var/brutehealing = 0 var/burnhealing = 0 var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! @@ -48,11 +50,13 @@ /datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(..()) + experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss())) if(!..()) break + experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) -/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/umsg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons" var/tmsg = "[user] fixes some of [target]'s wounds" //see above var/urhealedamt_brute = brutehealing @@ -76,7 +80,7 @@ if(istype(surgery, /datum/surgery/healing)) var/datum/surgery/healing/the_surgery = surgery the_surgery.antispam = TRUE - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/heal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You screwed up!", @@ -214,3 +218,5 @@ "[user] screws up!", "[user] fixes some of [target]'s wounds.", TRUE) target.take_bodypart_damage(5,5) + +#undef PER_ITERATION_XP_CAP diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index 46c999bc228..ed04b918f03 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -24,19 +24,20 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 52 + experience_given = 10 /datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to cut out a damaged peice of [target]'s liver...", "[user] begins to make an incision in [target].", "[user] begins to make an incision in [target].") -/datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/mob/living/carbon/human/H = target H.setOrganLoss(ORGAN_SLOT_LIVER, 10) //not bad, not great display_results(user, target, "You successfully remove the damaged part of [target]'s liver.", "[user] successfully removes the damaged part of [target]'s liver.", "[user] successfully removes the damaged part of [target]'s liver.") - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/hepatectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) var/mob/living/carbon/human/H = target diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 754e8affaeb..2597464ea59 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -25,7 +25,7 @@ "[user] looks for an implant in [target]'s [target_zone].", "[user] looks for something in [target]'s [target_zone].") -/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(I) display_results(user, target, "You successfully remove [I] from [target]'s [target_zone].", "[user] successfully removes [I] from [target]'s [target_zone]!", @@ -50,7 +50,7 @@ else to_chat(user, "You can't find anything in [target]'s [target_zone]!") - return ..(default_display_results = FALSE) + return ..() /datum/surgery/implant_removal/mechanic name = "implant removal" diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 3a61500d9f3..1ba0464fa7e 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -8,6 +8,7 @@ name = "replace limb" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100) time = 32 + experience_given = 10 var/obj/item/bodypart/L = null // L because "limb" @@ -41,7 +42,7 @@ //SURGERY STEP SUCCESSES -/datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery) +/datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery, default_display_results = FALSE) if(L) if(istype(tool, /obj/item/organ_storage)) tool.icon_state = initial(tool.icon_state) @@ -56,4 +57,4 @@ log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]") else to_chat(user, "[target] has no organic [parse_zone(target_zone)] there!") - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index eb5c526eaa0..3b164188fdc 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -4,7 +4,7 @@ possible_locs = list(BODY_ZONE_CHEST) /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_FAT)) + if(HAS_TRAIT(target, TRAIT_FAT) && target.nutrition >= NUTRITION_LEVEL_WELL_FED) return 1 return 0 @@ -14,6 +14,7 @@ name = "cut excess fat" implements = list(TOOL_SAW = 100, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) time = 64 + experience_given = 2 /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...") @@ -32,20 +33,22 @@ name = "remove loose fat" implements = list(TOOL_RETRACTOR = 100, TOOL_SCREWDRIVER = 45, TOOL_WIRECUTTER = 35) time = 32 + experience_given = 0 //scales with fat removed /datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to extract [target]'s loose fat...", "[user] begins to extract [target]'s loose fat!", "[user] begins to extract something from [target]'s [target_zone].") -/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You extract [target]'s fat.", "[user] extracts [target]'s fat!", "[user] extracts [target]'s fat!") target.overeatduration = 0 //patient is unfatted var/removednutriment = target.nutrition target.set_nutrition(NUTRITION_LEVEL_WELL_FED) - removednutriment -= 450 //whatever was removed goes into the meat + removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat + experience_given = (round(removednutriment/30)) var/mob/living/carbon/human/H = target var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human @@ -59,4 +62,4 @@ newmeat.subjectjob = H.job newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment newmeat.forceMove(target.loc) - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 052ddb7f768..156c1ab4913 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -18,13 +18,14 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 42 + experience_given = 10 /datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s lungs...", "[user] begins to make an incision in [target].", "[user] begins to make an incision in [target].") -/datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/organ/lungs/L = H.getorganslot(ORGAN_SLOT_LUNGS) @@ -33,7 +34,7 @@ display_results(user, target, "You successfully excise [H]'s most damaged lobe.", "Successfully removes a piece of [H]'s lungs.", "") - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/lobectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(ishuman(target)) diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 1319b547d69..8196217ee4b 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -17,7 +17,7 @@ return TRUE -/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if ishuman(target) var/mob/living/carbon/human/H = target if (!(NOBLOOD in H.dna.species.species_traits)) @@ -25,9 +25,10 @@ "Blood pools around the incision in [H]'s [parse_zone(target_zone)].", "") H.bleed_rate += 3 - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/incise/nobleed //silly friendly! + experience_given = 1 //safer so not as much XP /datum/surgery_step/incise/nobleed/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to carefully make an incision in [target]'s [parse_zone(target_zone)]...", @@ -110,12 +111,12 @@ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") -/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) target.apply_damage(50, BRUTE, "[target_zone]") display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.", "[user] saws [target]'s [parse_zone(target_zone)] open!", "[user] saws [target]'s [parse_zone(target_zone)] open!") - return ..(default_display_results = FALSE) + return ..() //drill bone /datum/surgery_step/drill @@ -128,8 +129,8 @@ "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].", "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].") -/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You drill into [target]'s [parse_zone(target_zone)].", "[user] drills into [target]'s [parse_zone(target_zone)]!", "[user] drills into [target]'s [parse_zone(target_zone)]!") - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index bb804bdbe30..135008f3f0b 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -8,6 +8,7 @@ name = "reshape face" implements = list(TOOL_SCALPEL = 100, /obj/item/kitchen/knife = 50, TOOL_WIRECUTTER = 35) time = 64 + experience_given = 5 /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...") @@ -15,7 +16,7 @@ "[user] begins to alter [target]'s appearance.", "[user] begins to make an incision in [target]'s face.") -/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC)) REMOVE_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC) display_results(user, target, "You successfully restore [target]'s appearance.", @@ -42,7 +43,7 @@ if(ishuman(target)) var/mob/living/carbon/human/H = target H.sec_hud_set_ID() - return ..(default_display_results = FALSE) + return ..() /datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You screw up, leaving [target]'s appearance disfigured!", diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index b23fa6d5f09..5f262b40709 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -19,6 +19,7 @@ name = "add prosthetic" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) time = 32 + experience_given = 5 //won't get full XP if rejected var/organ_rejection_dam = 0 /datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -62,8 +63,8 @@ to_chat(user, "[tool] must be installed onto an arm.") return -1 -/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - . = ..(default_display_results = FALSE) +/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + . = ..() if(istype(tool, /obj/item/organ_storage)) tool.icon_state = initial(tool.icon_state) tool.desc = initial(tool.desc) @@ -74,6 +75,7 @@ L.attach_limb(target) if(organ_rejection_dam) target.adjustToxLoss(organ_rejection_dam) + experience_given -= (round(organ_rejection_dam/10)) display_results(user, target, "You succeed in replacing [target]'s [parse_zone(target_zone)].", "[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!", "[user] successfully replaces [target]'s [parse_zone(target_zone)]!") diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 10f1ec17a3a..30e08da31be 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -8,6 +8,7 @@ name = "remove embedded objects" time = 32 accept_hand = 1 + experience_given = 5 var/obj/item/bodypart/L = null @@ -22,7 +23,7 @@ user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") -/datum/surgery_step/remove_object/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/remove_object/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(L) if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -45,4 +46,4 @@ else to_chat(user, "You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!") - return ..(default_display_results = FALSE) + return ..() diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index caeadcf1ebd..535ea65df28 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -9,6 +9,7 @@ var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob. var/require_all_chems = TRUE //any on the list or all on the list? var/silicons_obey_prob = FALSE + /// The amount of a experience given for successfully completing the step. var/experience_given = 1 /datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) @@ -99,8 +100,7 @@ if(failure(user, target, target_zone, tool, surgery, fail_prob)) advance = TRUE if(chem_check_result) - if(.(user, target, target_zone, tool, surgery, try_to_fail)) //automatically re-attempt if failed for reason other than lack of required chemical - advance = TRUE + return .(user, target, target_zone, tool, surgery, try_to_fail) //automatically re-attempt if failed for reason other than lack of required chemical if(advance && !repeatable) surgery.status++ if(surgery.status > surgery.steps.len) @@ -122,7 +122,7 @@ display_results(user, target, "You succeed.", "[user] succeeds!", "[user] finishes.") - user?.mind.adjust_experience(/datum/skill/medical, experience_given) + user?.mind.adjust_experience(/datum/skill/medical, round(experience_given)) return TRUE /datum/surgery_step/proc/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0)