Files
Bubberstation/code/modules/surgery/surgery.dm
SkyratBot 77c20e53bd [MIRROR] medical/security modsuit updates and modules [MDB IGNORE] (#15953)
* medical/security modsuit updates and modules (#69194)

tweaks the colors on the security modsuit to be lighter, i think i did that on the original pr but it got reverted due to merge conflicts
makes the standard quick carry module have nitrile level carrying instead of latex level
environmental bodybags are now always pressurized
adds medical and security hardlight bags, which are environmental bags you can use to move people through space, security ones can be sinched to prevent escape
adds a medical version of the prisoner capture module, for patient transport, prisoner capture and patient transport now use the medical/security holobags, medical one deploying them faster. when you move too far out of range the holobag dissipates
adds a defibrillator module, extends shock paddles
adds a thread ripper module, this module temporarily rips away the matter of clothing, to allow stuff like injections, surgery, defibrillation etc through it
adds a surgery processor module, essentially a portable surgery computer like borgs have
fixes a bug where you can unwield defibrillator paddles just after starting the do_after to defib onehanded
fixes a bug where the modsuit gps would have a broken name when renamed

* medical/security modsuit updates and modules

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
2022-09-04 12:57:06 +01:00

197 lines
7.1 KiB
Plaintext

/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/list/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species
var/location = BODY_ZONE_CHEST //Surgery location
var/requires_bodypart_type = BODYTYPE_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/mob/living/carbon/target //Operation target mob
var/obj/item/bodypart/operated_bodypart //Operable body part
var/datum/wound/operated_wound //The actual wound datum instance we're targeting
var/datum/wound/targetable_wound //The wound type this surgery targets
var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing.
var/speed_modifier = 0 //Step speed modifier
var/requires_real_bodypart = FALSE //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)
/// Organ being directly manipulated, used for checking if the organ is still in the body after surgery has begun
var/organ_to_manipulate
/datum/surgery/New(atom/surgery_target, surgery_location, surgery_bodypart)
..()
if(!surgery_target)
return
target = surgery_target
target.surgeries += src
if(surgery_location)
location = surgery_location
if(!surgery_bodypart)
return
operated_bodypart = surgery_bodypart
if(targetable_wound)
operated_wound = operated_bodypart.get_wound_type(targetable_wound)
operated_wound.attached_surgery = src
SEND_SIGNAL(surgery_target, COMSIG_MOB_SURGERY_STARTED, src, surgery_location, surgery_bodypart)
/datum/surgery/Destroy()
if(operated_wound)
operated_wound.attached_surgery = null
operated_wound = null
if(target)
target.surgeries -= src
target = null
operated_bodypart = null
return ..()
/datum/surgery/proc/can_start(mob/user, mob/living/patient) //FALSE to not show in list
. = TRUE
if(replaced_by == /datum/surgery)
return FALSE
// True surgeons (like abductor scientists) need no instructions
if(HAS_TRAIT(user, TRAIT_SURGEON) || (!isnull(user.mind) && HAS_TRAIT(user.mind, TRAIT_SURGEON)))
if(replaced_by) // only show top-level surgeries
return FALSE
else
return TRUE
if(!requires_tech && !replaced_by)
return TRUE
if(requires_tech)
. = FALSE
var/surgery_signal = SEND_SIGNAL(user, COMSIG_SURGERY_STARTING, src, patient)
if(surgery_signal & COMPONENT_FORCE_SURGERY)
return TRUE
if(surgery_signal & COMPONENT_CANCEL_SURGERY)
return FALSE
var/turf/patient_turf = get_turf(patient)
//Get the relevant operating computer
var/obj/machinery/computer/operating/opcomputer = locate_operating_computer(patient_turf)
if (isnull(opcomputer))
return .
if(replaced_by in opcomputer.advanced_surgeries)
return FALSE
if(type in opcomputer.advanced_surgeries)
return TRUE
/datum/surgery/proc/next_step(mob/living/user, modifiers)
if(location != user.zone_selected)
return FALSE
if(user.combat_mode)
return FALSE
if(step_in_progress)
return TRUE
var/try_to_fail = FALSE
if(LAZYACCESS(modifiers, RIGHT_CLICK))
try_to_fail = TRUE
var/datum/surgery_step/step = get_surgery_step()
if(step)
var/obj/item/tool = user.get_active_held_item()
if(step.try_op(user, target, user.zone_selected, tool, src, try_to_fail))
return TRUE
if(tool && 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, span_warning("This step requires a different tool!"))
return TRUE
return FALSE
/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(mob/surgeon)
SSblackbox.record_feedback("tally", "surgeries_completed", 1, type)
surgeon.mind.add_memory(
MEMORY_SUCCESSFUL_SURGERY,
list(
DETAIL_PROTAGONIST = surgeon,
DETAIL_DEUTERAGONIST = target,
DETAIL_SURGERY_TYPE = src,
),
story_value = STORY_VALUE_OKAY
)
qdel(src)
/// Returns a nearby operating computer linked to an operating table
/datum/surgery/proc/locate_operating_computer(turf/patient_turf)
if (isnull(patient_turf))
return null
var/obj/structure/table/optable/operating_table = locate(/obj/structure/table/optable, patient_turf)
var/obj/machinery/computer/operating/operating_computer = operating_table?.computer
if (isnull(operating_computer))
return null
if(operating_computer.machine_stat & (NOPOWER|BROKEN))
return null
return operating_computer
/datum/surgery/advanced
name = "advanced surgery"
requires_tech = 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"
custom_materials = list(/datum/material/iron=300, /datum/material/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"
custom_materials = list(/datum/material/iron=300, /datum/material/glass=100)
/obj/item/disk/surgery/debug/Initialize(mapload)
. = ..()
surgeries = list()
var/list/req_tech_surgeries = subtypesof(/datum/surgery)
for(var/datum/surgery/beep as anything in req_tech_surgeries)
if(initial(beep.requires_tech))
surgeries += beep
//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