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)