Bumps up Surgery XP gains, Fixes Surgery XP Gains, Fixes Surgery Failure Bug (#48231)

* works on my machine

* saving is a sin 1% of the time!

* works... on... my... machine...?

* i can't test this but it worked on my machine too

Co-Authored-By: Bobbahbrown <bobbahbrown@gmail.com>

* more testing /w TW

* caps XP gain (per iteration) for TW

* no skinnies

Co-authored-by: Bobbahbrown <bobbahbrown@gmail.com>
This commit is contained in:
moo
2020-01-02 17:48:15 -05:00
committed by skoglol
parent 3e4706d178
commit 4022d0c427
27 changed files with 95 additions and 68 deletions
@@ -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
+2 -3
View File
@@ -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()
@@ -23,12 +23,12 @@
"<span class='notice'>[user] starts reshaping [target]'s ligaments into a hook-like shape.</span>",
"<span class='notice'>[user] starts manipulating [target]'s ligaments.</span>")
/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, "<span class='notice'>You reshape [target]'s ligaments into a connective hook!</span>",
"<span class='notice'>[user] reshapes [target]'s ligaments into a connective hook!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s ligaments.</span>")
new /datum/bioware/hooked_ligaments(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/hooked_ligaments
name = "Hooked Ligaments"
@@ -23,12 +23,12 @@
"<span class='notice'>[user] starts reinforce [target]'s ligaments.</span>",
"<span class='notice'>[user] starts manipulating [target]'s ligaments.</span>")
/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, "<span class='notice'>You reinforce [target]'s ligaments!</span>",
"<span class='notice'>[user] reinforces [target]'s ligaments!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s ligaments.</span>")
new /datum/bioware/reinforced_ligaments(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/reinforced_ligaments
name = "Reinforced Ligaments"
@@ -22,12 +22,12 @@
"<span class='notice'>[user] starts wrapping muscles around [target]'s circulatory system.</span>",
"<span class='notice'>[user] starts manipulating [target]'s circulatory system.</span>")
/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, "<span class='notice'>You reshape [target]'s circulatory system, adding a muscled membrane!</span>",
"<span class='notice'>[user] reshapes [target]'s circulatory system, adding a muscled membrane!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s circulatory system.</span>")
new /datum/bioware/muscled_veins(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/muscled_veins
name = "Threaded Veins"
@@ -22,12 +22,12 @@
"<span class='notice'>[user] starts rerouting [target]'s nerves.</span>",
"<span class='notice'>[user] starts manipulating [target]'s nervous system.</span>")
/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, "<span class='notice'>You successfully reroute [target]'s nervous system!</span>",
"<span class='notice'>[user] successfully reroutes [target]'s nervous system!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s nervous system.</span>")
new /datum/bioware/grounded_nerves(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/grounded_nerves
name = "Grounded Nerves"
@@ -22,12 +22,12 @@
"<span class='notice'>[user] starts splicing together [target]'s nerves.</span>",
"<span class='notice'>[user] starts manipulating [target]'s nervous system.</span>")
/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, "<span class='notice'>You successfully splice [target]'s nervous system!</span>",
"<span class='notice'>[user] successfully splices [target]'s nervous system!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s nervous system.</span>")
new /datum/bioware/spliced_nerves(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/spliced_nerves
name = "Spliced Nerves"
@@ -22,12 +22,12 @@
"<span class='notice'>[user] starts weaving [target]'s circulatory system.</span>",
"<span class='notice'>[user] starts manipulating [target]'s circulatory system.</span>")
/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, "<span class='notice'>You weave [target]'s circulatory system into a resistant mesh!</span>",
"<span class='notice'>[user] weaves [target]'s circulatory system into a resistant mesh!</span>",
"<span class='notice'>[user] finishes manipulating [target]'s circulatory system.</span>")
new /datum/bioware/threaded_veins(target)
return ..(default_display_results = FALSE)
return ..()
/datum/bioware/threaded_veins
name = "Threaded Veins"
+2 -2
View File
@@ -18,7 +18,7 @@
"<span class='notice'>[user] begins to sever [target]'s [parse_zone(target_zone)]!</span>",
"<span class='notice'>[user] begins to sever [target]'s [parse_zone(target_zone)]!</span>")
/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, "<span class='notice'>You sever [L]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] severs [L]'s [parse_zone(target_zone)]!</span>",
@@ -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 ..()
+2 -2
View File
@@ -29,7 +29,7 @@
"<span class='notice'>[user] begins to fix [target]'s brain.</span>",
"<span class='notice'>[user] begins to perform surgery on [target]'s brain.</span>")
/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, "<span class='notice'>You succeed in fixing [target]'s brain.</span>",
"<span class='notice'>[user] successfully fixes [target]'s brain!</span>",
"<span class='notice'>[user] completes the surgery on [target]'s brain.</span>")
@@ -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))
+3 -3
View File
@@ -31,7 +31,7 @@
"<span class='notice'>[user] checks for items in [target]'s [target_zone].</span>",
"<span class='notice'>[user] looks for something in [target]'s [target_zone].</span>")
/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 @@
"<span class='notice'>[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].</span>")
user.transferItemToLoc(tool, target, TRUE)
CH.cavity_item = tool
return ..(default_display_results = FALSE)
return ..()
else
if(IC)
display_results(user, target, "<span class='notice'>You pull [IC] out of [target]'s [target_zone].</span>",
@@ -51,7 +51,7 @@
"<span class='notice'>[user] pulls [IC.w_class > WEIGHT_CLASS_SMALL ? IC : "something"] out of [target]'s [target_zone].</span>")
user.put_in_hands(IC)
CH.cavity_item = null
return ..(default_display_results = FALSE)
return ..()
else
to_chat(user, "<span class='warning'>You don't find anything in [target]'s [target_zone].</span>")
return 0
+3 -3
View File
@@ -22,7 +22,7 @@
"<span class='notice'>[user] begins to extract a core from [target].</span>",
"<span class='notice'>[user] begins to extract a core from [target].</span>")
/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, "<span class='warning'>There aren't any cores left in [target]!</span>")
return ..(default_display_results = FALSE)
return ..()
+5 -4
View File
@@ -24,7 +24,7 @@
"<span class='notice'>[user] begins to make an incision in [target]'s heart.</span>",
"<span class='notice'>[user] begins to make an incision in [target]'s heart.</span>")
/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, "<span class='notice'>You begin to graft a bypass onto [target]'s heart...</span>",
"<span class='notice'>[user] begins to graft something onto [target]'s heart!</span>",
"<span class='notice'>[user] begins to graft something onto [target]'s heart!</span>")
/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, "<span class='notice'>You successfully graft a bypass onto [target]'s heart.</span>",
"<span class='notice'>[user] finishes grafting something onto [target]'s heart.</span>",
"<span class='notice'>[user] finishes grafting something onto [target]'s heart.</span>")
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))
+2 -2
View File
@@ -13,7 +13,7 @@
"<span class='notice'>[user] begins to wedge \the [tool] in [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] begins to wedge something in [target]'s [parse_zone(target_zone)].</span>")
/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, "<span class='notice'>You wedge [tool] into [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!</span>",
"<span class='notice'>[user] wedges something into [target]'s [parse_zone(target_zone)]!</span>")
return ..(default_display_results = FALSE)
return ..()
/datum/action/item_action/hands_free/activate_pill
name = "Activate Pill"
@@ -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("<span class='notice'>[user] dissects [target], discovering [points_earned] point\s of data!</span>", "<span class='notice'>You dissect [target], finding [points_earned] point\s worth of discoveries, you also write a few notes.</span>")
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("<span class='notice'>[user] dissects [target]!</span>", 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)
+3 -2
View File
@@ -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 @@
"<span class='notice'>[user] begins to fix [target]'s eyes.</span>",
"<span class='notice'>[user] begins to perform surgery on [target]'s eyes.</span>")
/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("<span class='notice'>[user] successfully fixes [target]'s eyes!</span>", "<span class='notice'>You succeed in fixing [target]'s eyes.</span>")
display_results(user, target, "<span class='notice'>You succeed in fixing [target]'s eyes.</span>",
@@ -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))
+9 -3
View File
@@ -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, "<span class='warning'>You screwed up!</span>",
@@ -214,3 +218,5 @@
"<span class='warning'>[user] screws up!</span>",
"<span class='notice'>[user] fixes some of [target]'s wounds.</span>", TRUE)
target.take_bodypart_damage(5,5)
#undef PER_ITERATION_XP_CAP
+3 -2
View File
@@ -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, "<span class='notice'>You begin to cut out a damaged peice of [target]'s liver...</span>",
"<span class='notice'>[user] begins to make an incision in [target].</span>",
"<span class='notice'>[user] begins to make an incision in [target].</span>")
/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, "<span class='notice'>You successfully remove the damaged part of [target]'s liver.</span>",
"<span class='notice'>[user] successfully removes the damaged part of [target]'s liver.</span>",
"<span class='notice'>[user] successfully removes the damaged part of [target]'s liver.</span>")
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
+2 -2
View File
@@ -25,7 +25,7 @@
"<span class='notice'>[user] looks for an implant in [target]'s [target_zone].</span>",
"<span class='notice'>[user] looks for something in [target]'s [target_zone].</span>")
/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, "<span class='notice'>You successfully remove [I] from [target]'s [target_zone].</span>",
"<span class='notice'>[user] successfully removes [I] from [target]'s [target_zone]!</span>",
@@ -50,7 +50,7 @@
else
to_chat(user, "<span class='warning'>You can't find anything in [target]'s [target_zone]!</span>")
return ..(default_display_results = FALSE)
return ..()
/datum/surgery/implant_removal/mechanic
name = "implant removal"
+3 -2
View File
@@ -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, "<span class='warning'>[target] has no organic [parse_zone(target_zone)] there!</span>")
return ..(default_display_results = FALSE)
return ..()
+7 -4
View File
@@ -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("<span class='notice'>[user] begins to cut away [target]'s excess fat.</span>", "<span class='notice'>You begin to cut away [target]'s excess fat...</span>")
@@ -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, "<span class='notice'>You begin to extract [target]'s loose fat...</span>",
"<span class='notice'>[user] begins to extract [target]'s loose fat!</span>",
"<span class='notice'>[user] begins to extract something from [target]'s [target_zone].</span>")
/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, "<span class='notice'>You extract [target]'s fat.</span>",
"<span class='notice'>[user] extracts [target]'s fat!</span>",
"<span class='notice'>[user] extracts [target]'s fat!</span>")
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 ..()
+3 -2
View File
@@ -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, "<span class='notice'>You begin to make an incision in [target]'s lungs...</span>",
"<span class='notice'>[user] begins to make an incision in [target].</span>",
"<span class='notice'>[user] begins to make an incision in [target].</span>")
/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, "<span class='notice'>You successfully excise [H]'s most damaged lobe.</span>",
"<span class='notice'>Successfully removes a piece of [H]'s lungs.</span>",
"")
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))
+7 -6
View File
@@ -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 @@
"<span class='notice'>Blood pools around the incision in [H]'s [parse_zone(target_zone)].</span>",
"")
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, "<span class='notice'>You begin to <i>carefully</i> make an incision in [target]'s [parse_zone(target_zone)]...</span>",
@@ -110,12 +111,12 @@
"<span class='notice'>[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].</span>")
/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, "<span class='notice'>You saw [target]'s [parse_zone(target_zone)] open.</span>",
"<span class='notice'>[user] saws [target]'s [parse_zone(target_zone)] open!</span>",
"<span class='notice'>[user] saws [target]'s [parse_zone(target_zone)] open!</span>")
return ..(default_display_results = FALSE)
return ..()
//drill bone
/datum/surgery_step/drill
@@ -128,8 +129,8 @@
"<span class='notice'>[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].</span>")
/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, "<span class='notice'>You drill into [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] drills into [target]'s [parse_zone(target_zone)]!</span>",
"<span class='notice'>[user] drills into [target]'s [parse_zone(target_zone)]!</span>")
return ..(default_display_results = FALSE)
return ..()
+3 -2
View File
@@ -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("<span class='notice'>[user] begins to alter [target]'s appearance.</span>", "<span class='notice'>You begin to alter [target]'s appearance...</span>")
@@ -15,7 +16,7 @@
"<span class='notice'>[user] begins to alter [target]'s appearance.</span>",
"<span class='notice'>[user] begins to make an incision in [target]'s face.</span>")
/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, "<span class='notice'>You successfully restore [target]'s appearance.</span>",
@@ -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, "<span class='warning'>You screw up, leaving [target]'s appearance disfigured!</span>",
@@ -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, "<span class='warning'>[tool] must be installed onto an arm.</span>")
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, "<span class='notice'>You succeed in replacing [target]'s [parse_zone(target_zone)].</span>",
"<span class='notice'>[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!</span>",
"<span class='notice'>[user] successfully replaces [target]'s [parse_zone(target_zone)]!</span>")
@@ -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("<span class='notice'>[user] looks for [target]'s [parse_zone(user.zone_selected)].</span>", "<span class='notice'>You look for [target]'s [parse_zone(user.zone_selected)]...</span>")
/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, "<span class='warning'>You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!</span>")
return ..(default_display_results = FALSE)
return ..()
+3 -3
View File
@@ -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, "<span class='notice'>You succeed.</span>",
"<span class='notice'>[user] succeeds!</span>",
"<span class='notice'>[user] finishes.</span>")
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)