mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-12 09:54:03 +00:00
* 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>
197 lines
7.1 KiB
Plaintext
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
|