diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 9501a56992..78b7bc81da 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -492,4 +492,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp . = "" if(HAS_TRAIT(src, TRAIT_DISSECTED)) - . += "This body has been dissected and analyzed. It is no longer worth experimenting on.
" \ No newline at end of file + . += "This body has been dissected and analyzed. It is no longer worth experimenting on.
" + var/dissectionmsg = "" + if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Extraterrestrial Dissection")) + dissectionmsg = " via Extraterrestrial Dissection. It is no longer worth experimenting on" + else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Experimental Dissection")) + dissectionmsg = " via Experimental Dissection" + else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection")) + dissectionmsg = " via Thorough Dissection" + . += "This body has been dissected and analyzed[dissectionmsg].
" \ No newline at end of file diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 6dc9441b0c..8179a91336 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -110,6 +110,7 @@ name = "Extraterrestrial Dissection" value_multiplier = 10 requires_tech = TRUE + replaced_by = null #undef BASE_HUMAN_REWARD diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index a220abba6c..4ac1c4d246 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,182 +1,23 @@ -<<<<<<< HEAD -/datum/surgery - var/name = "surgery" - var/desc = "surgery description" - var/status = 1 - var/list/steps = list() //Steps in a surgery - var/step_in_progress = 0 //Actively performing a Surgery - var/can_cancel = 1 //Can cancel this surgery after step 1 with cautery - var/list/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species - var/location = BODY_ZONE_CHEST //Surgery location - var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type - var/list/possible_locs = list() //Multiple locations - var/ignore_clothes = 0 //This surgery ignores clothes - var/mob/living/carbon/target //Operation target mob - var/obj/item/bodypart/operated_bodypart //Operable body part - var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing. - var/success_multiplier = 0 //Step success propability multiplier - var/requires_real_bodypart = 0 //Some surgeries don't work on limbs that don't really exist - var/lying_required = TRUE //Does the vicitm needs to be lying down. - -/datum/surgery/New(surgery_target, surgery_location, surgery_bodypart) - ..() - if(surgery_target) - target = surgery_target - target.surgeries += src - if(surgery_location) - location = surgery_location - if(surgery_bodypart) - operated_bodypart = surgery_bodypart - -/datum/surgery/Destroy() - if(target) - target.surgeries -= src - target = null - operated_bodypart = null - return ..() - - -/datum/surgery/proc/can_start(mob/user, mob/living/carbon/target) - // if 0 surgery wont show up in list - // put special restrictions here - return 1 - -/datum/surgery/proc/next_step(mob/user, intent) - if(step_in_progress) - return 1 - - var/try_to_fail = FALSE - if(intent == INTENT_DISARM) - try_to_fail = TRUE - - var/datum/surgery_step/S = get_surgery_step() - if(S) - var/obj/item/tool = user.get_active_held_item() - if(S.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) - return TRUE - if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache - return TRUE - if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it - to_chat(user, "This step requires a different tool!") - return TRUE - -/datum/surgery/proc/get_surgery_step() - var/step_type = steps[status] - return new step_type - -/datum/surgery/proc/get_surgery_next_step() - if(status < steps.len) - var/step_type = steps[status + 1] - return new step_type - else - return null - -/datum/surgery/proc/complete() - SSblackbox.record_feedback("tally", "surgeries_completed", 1, type) - qdel(src) - -/datum/surgery/proc/get_propability_multiplier() - var/propability = 0.5 - var/turf/T = get_turf(target) - - if(locate(/obj/structure/table/optable, T)) - propability = 1 - else if(locate(/obj/structure/table, T)) - propability = 0.8 - else if(locate(/obj/structure/bed, T)) - propability = 0.7 - - return propability + success_multiplier - -/datum/surgery/advanced - name = "advanced surgery" - -/datum/surgery/advanced/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - //Abductor scientists need no instructions - if(isabductor(user)) - var/mob/living/carbon/human/H = user - var/datum/species/abductor/S = H.dna.species - if(S.scientist) - return TRUE - - if(iscyborg(user)) - var/mob/living/silicon/robot/R = user - var/obj/item/surgical_processor/SP = locate() in R.module.modules - if(!SP) - return FALSE - if(type in SP.advanced_surgeries) - return TRUE - - var/turf/T = get_turf(target) - var/obj/structure/table/optable/table = locate(/obj/structure/table/optable, T) - if(!table || !table.computer) - return FALSE - if(table.computer.stat & (NOPOWER|BROKEN)) - return FALSE - if(type in table.computer.advanced_surgeries) - return TRUE - -/obj/item/disk/surgery - name = "Surgery Procedure Disk" - desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - icon_state = "datadisk1" - materials = list(MAT_METAL=300, MAT_GLASS=100) - var/list/surgeries - -/obj/item/disk/surgery/debug - name = "Debug Surgery Disk" - desc = "A disk that contains all existing surgery procedures." - icon_state = "datadisk1" - materials = list(MAT_METAL=300, MAT_GLASS=100) - -/obj/item/disk/surgery/debug/Initialize() - . = ..() - surgeries = subtypesof(/datum/surgery/advanced) - -//INFO -//Check /mob/living/carbon/attackby for how surgery progresses, and also /mob/living/carbon/attack_hand. -//As of Feb 21 2013 they are in code/modules/mob/living/carbon/carbon.dm, lines 459 and 51 respectively. -//Other important variables are var/list/surgeries (/mob/living) and var/list/internal_organs (/mob/living/carbon) -// var/list/bodyparts (/mob/living/carbon/human) is the LIMBS of a Mob. -//Surgical procedures are initiated by attempt_initiate_surgery(), which is called by surgical drapes and bedsheets. - - -//TODO -//specific steps for some surgeries (fluff text) -//more interesting failure options -//randomised complications -//more surgeries! -//add a probability modifier for the state of the surgeon- health, twitching, etc. blindness, god forbid. -//helper for converting a zone_sel.selecting to body part (for damage) - - -//RESOLVED ISSUES //"Todo" jobs that have been completed -//combine hands/feet into the arms - Hands/feet were removed - RR -//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0 -======= /datum/surgery var/name = "surgery" var/desc = "surgery description" var/status = 1 var/list/steps = list() //Steps in a surgery - var/step_in_progress = FALSE //Actively performing a Surgery - var/can_cancel = TRUE //Can cancel this surgery after step 1 with cautery + var/step_in_progress = 0 //Actively performing a Surgery + var/can_cancel = 1 //Can cancel this surgery after step 1 with cautery var/list/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species var/location = BODY_ZONE_CHEST //Surgery location var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type var/list/possible_locs = list() //Multiple locations - var/ignore_clothes = FALSE //This surgery ignores clothes + var/ignore_clothes = 0 //This surgery ignores clothes var/mob/living/carbon/target //Operation target mob var/obj/item/bodypart/operated_bodypart //Operable body part var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing. var/success_multiplier = 0 //Step success propability multiplier - var/requires_real_bodypart = FALSE //Some surgeries don't work on limbs that don't really exist + var/requires_real_bodypart = 0 //Some surgeries don't work on limbs that don't really exist var/lying_required = TRUE //Does the vicitm needs to be lying down. - var/self_operable = FALSE //Can the surgery be performed on yourself. - var/requires_tech = FALSE //handles techweb-oriented surgeries, previously restricted to the /advanced subtype (You still need to add designs) - var/replaced_by //type; doesn't show up if this type exists. Set to /datum/surgery if you want to hide a "base" surgery (useful for typing parents IE healing.dm just make sure to null it out again) + var/requires_tech = FALSE + var/replaced_by /datum/surgery/New(surgery_target, surgery_location, surgery_bodypart) ..() @@ -201,7 +42,7 @@ if(replaced_by == /datum/surgery) return FALSE - if(HAS_TRAIT(user, TRAIT_SURGEON) || HAS_TRAIT(user.mind, TRAIT_SURGEON)) + if(HAS_TRAIT(user, TRAIT_SURGEON)) if(replaced_by) return FALSE else @@ -217,10 +58,11 @@ if(iscyborg(user)) var/mob/living/silicon/robot/R = user var/obj/item/surgical_processor/SP = locate() in R.module.modules - if(!SP || (replaced_by in SP.advanced_surgeries)) - return FALSE - if(type in SP.advanced_surgeries) - return TRUE + if(SP) + if (replaced_by in SP.advanced_surgeries) + return FALSE + if(type in SP.advanced_surgeries) + return TRUE var/turf/T = get_turf(target) @@ -228,15 +70,16 @@ if(table) if(!table.computer) return FALSE - if(table.computer.stat & (NOPOWER|BROKEN) || (replaced_by in table.computer.advanced_surgeries)) + if(table.computer.stat & (NOPOWER|BROKEN)) + return . + if(replaced_by in table.computer.advanced_surgeries) return FALSE if(type in table.computer.advanced_surgeries) return TRUE - /datum/surgery/proc/next_step(mob/user, intent) if(step_in_progress) - return TRUE + return 1 var/try_to_fail = FALSE if(intent == INTENT_DISARM) @@ -252,7 +95,6 @@ if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it to_chat(user, "This step requires a different tool!") return TRUE - return FALSE /datum/surgery/proc/get_surgery_step() var/step_type = steps[status] @@ -275,8 +117,6 @@ if(locate(/obj/structure/table/optable, T)) propability = 1 - else if(locate(/obj/machinery/stasis, T)) - propability = 0.9 else if(locate(/obj/structure/table, T)) propability = 0.8 else if(locate(/obj/structure/bed, T)) @@ -303,12 +143,7 @@ /obj/item/disk/surgery/debug/Initialize() . = ..() - surgeries = list() - var/list/req_tech_surgeries = subtypesof(/datum/surgery) - for(var/i in req_tech_surgeries) - var/datum/surgery/beep = i - if(beep.requires_tech) - surgeries += beep + surgeries = subtypesof(/datum/surgery/advanced) //INFO //Check /mob/living/carbon/attackby for how surgery progresses, and also /mob/living/carbon/attack_hand. @@ -329,5 +164,4 @@ //RESOLVED ISSUES //"Todo" jobs that have been completed //combine hands/feet into the arms - Hands/feet were removed - RR -//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0 ->>>>>>> 8fcf42eff9... Experimental Cobbisection [150+ Hours and Ready] (#44821) +//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0 \ No newline at end of file