mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 10:01:58 +00:00
## About The Pull Request This allows you to use a fishing rod during the "manipulate organs" step of the aforementioned surgery to snatch organs from a target. Unlike other fish sources, this one has a negative fishing difficulty of -20, which when summed with the default minigame difficulty should still result in a negative difficulty. In layman terms, this means the minigame is skipped here (unless you're wearing some clunky stuff like insulated or boxing gloves). It also has a wait time of 8 to 13 seconds versus the more random standard 3 to 25 seconds. A small side-effect of this is that explosions during the "manipulate organs" step will basically disembowel you, but it kinda fits anyway. By the by, because of this, there is a tiny chance bluespace fishing rods can yield you random organs. Worry not, they're newly generated, so you won't be snatching it from another player by accident (at least for now). ## Why It's Good For The Game It adds more possible weird and rare shenanigans involving surgery. ## Changelog 🆑 Add: You can use a fishing rod to snatch organs during organ manipulation surgery /🆑
180 lines
6.3 KiB
Plaintext
180 lines
6.3 KiB
Plaintext
#define MENU_OPERATION 1
|
|
#define MENU_SURGERIES 2
|
|
|
|
/obj/machinery/computer/operating
|
|
name = "operating computer"
|
|
desc = "Monitors patient vitals and displays surgery steps. Can be loaded with surgery disks to perform experimental procedures. Automatically syncs to operating tables within its line of sight for surgical tech advancement."
|
|
icon_screen = "crew"
|
|
icon_keyboard = "med_key"
|
|
circuit = /obj/item/circuitboard/computer/operating
|
|
interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_REQUIRES_STANDING
|
|
|
|
var/obj/structure/table/optable/table
|
|
var/list/advanced_surgeries = list()
|
|
var/datum/techweb/linked_techweb
|
|
light_color = LIGHT_COLOR_BLUE
|
|
|
|
var/datum/component/experiment_handler/experiment_handler
|
|
|
|
/obj/machinery/computer/operating/Initialize(mapload)
|
|
. = ..()
|
|
find_table()
|
|
return INITIALIZE_HINT_LATELOAD
|
|
|
|
/obj/machinery/computer/operating/post_machine_initialize()
|
|
. = ..()
|
|
if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb)
|
|
CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, src)
|
|
|
|
var/list/operating_signals = list(
|
|
COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_autopsy_experiment),
|
|
)
|
|
experiment_handler = AddComponent(
|
|
/datum/component/experiment_handler, \
|
|
allowed_experiments = list(/datum/experiment/autopsy), \
|
|
config_flags = EXPERIMENT_CONFIG_ALWAYS_ACTIVE, \
|
|
config_mode = EXPERIMENT_CONFIG_ALTCLICK, \
|
|
experiment_signals = operating_signals, \
|
|
)
|
|
|
|
/obj/machinery/computer/operating/Destroy()
|
|
for(var/direction in GLOB.alldirs)
|
|
table = locate(/obj/structure/table/optable) in get_step(src, direction)
|
|
if(table && table.computer == src)
|
|
table.computer = null
|
|
QDEL_NULL(experiment_handler)
|
|
return ..()
|
|
|
|
/obj/machinery/computer/operating/multitool_act(mob/living/user, obj/item/multitool/tool)
|
|
if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb))
|
|
linked_techweb = tool.buffer
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, params)
|
|
if(istype(O, /obj/item/disk/surgery))
|
|
user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."), \
|
|
span_notice("You begin to load a surgery protocol from \the [O]..."), \
|
|
span_hear("You hear the chatter of a floppy drive."))
|
|
var/obj/item/disk/surgery/D = O
|
|
if(do_after(user, 1 SECONDS, target = src))
|
|
advanced_surgeries |= D.surgeries
|
|
return TRUE
|
|
return ..()
|
|
|
|
/obj/machinery/computer/operating/proc/sync_surgeries()
|
|
if(!linked_techweb)
|
|
return
|
|
for(var/i in linked_techweb.researched_designs)
|
|
var/datum/design/surgery/D = SSresearch.techweb_design_by_id(i)
|
|
if(!istype(D))
|
|
continue
|
|
advanced_surgeries |= D.surgery
|
|
|
|
/obj/machinery/computer/operating/proc/find_table()
|
|
for(var/direction in GLOB.alldirs)
|
|
table = locate(/obj/structure/table/optable) in get_step(src, direction)
|
|
if(table)
|
|
table.computer = src
|
|
break
|
|
|
|
/obj/machinery/computer/operating/ui_state(mob/user)
|
|
return GLOB.standing_state
|
|
|
|
/obj/machinery/computer/operating/ui_interact(mob/user, datum/tgui/ui)
|
|
. = ..()
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "OperatingComputer", name)
|
|
ui.open()
|
|
|
|
/obj/machinery/computer/operating/ui_data(mob/user)
|
|
var/list/data = list()
|
|
var/list/all_surgeries = list()
|
|
for(var/datum/surgery/surgeries as anything in advanced_surgeries)
|
|
var/list/surgery = list()
|
|
surgery["name"] = initial(surgeries.name)
|
|
surgery["desc"] = initial(surgeries.desc)
|
|
all_surgeries += list(surgery)
|
|
data["surgeries"] = all_surgeries
|
|
|
|
//If there's no patient just hop to it yeah?
|
|
if(!table)
|
|
data["patient"] = null
|
|
return data
|
|
|
|
data["table"] = table
|
|
data["patient"] = list()
|
|
data["procedures"] = list()
|
|
if(!table.patient)
|
|
return data
|
|
var/mob/living/carbon/patient = table.patient
|
|
|
|
switch(patient.stat)
|
|
if(CONSCIOUS)
|
|
data["patient"]["stat"] = "Conscious"
|
|
data["patient"]["statstate"] = "good"
|
|
if(SOFT_CRIT)
|
|
data["patient"]["stat"] = "Conscious"
|
|
data["patient"]["statstate"] = "average"
|
|
if(UNCONSCIOUS, HARD_CRIT)
|
|
data["patient"]["stat"] = "Unconscious"
|
|
data["patient"]["statstate"] = "average"
|
|
if(DEAD)
|
|
data["patient"]["stat"] = "Dead"
|
|
data["patient"]["statstate"] = "bad"
|
|
data["patient"]["health"] = patient.health
|
|
|
|
// check here to see if the patient has standard blood reagent, or special blood (like how ethereals bleed liquid electricity) to show the proper name in the computer
|
|
var/blood_id = patient.get_blood_id()
|
|
if(blood_id == /datum/reagent/blood)
|
|
data["patient"]["blood_type"] = patient.dna?.blood_type
|
|
else
|
|
var/datum/reagent/special_blood = GLOB.chemical_reagents_list[blood_id]
|
|
data["patient"]["blood_type"] = special_blood ? special_blood.name : blood_id
|
|
|
|
data["patient"]["maxHealth"] = patient.maxHealth
|
|
data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
|
|
data["patient"]["bruteLoss"] = patient.getBruteLoss()
|
|
data["patient"]["fireLoss"] = patient.getFireLoss()
|
|
data["patient"]["toxLoss"] = patient.getToxLoss()
|
|
data["patient"]["oxyLoss"] = patient.getOxyLoss()
|
|
if(patient.surgeries.len)
|
|
for(var/datum/surgery/procedure in patient.surgeries)
|
|
var/datum/surgery_step/surgery_step = GLOB.surgery_steps[procedure.steps[procedure.status]]
|
|
var/chems_needed = surgery_step.get_chem_list()
|
|
var/alternative_step
|
|
var/alt_chems_needed = ""
|
|
var/alt_chems_present = FALSE
|
|
if(surgery_step.repeatable)
|
|
var/datum/surgery_step/next_step = procedure.get_surgery_next_step()
|
|
if(next_step)
|
|
alternative_step = capitalize(next_step.name)
|
|
alt_chems_needed = next_step.get_chem_list()
|
|
alt_chems_present = next_step.chem_check(patient)
|
|
else
|
|
alternative_step = "Finish operation"
|
|
data["procedures"] += list(list(
|
|
"name" = capitalize("[patient.parse_zone_with_bodypart(procedure.location)] [procedure.name]"),
|
|
"next_step" = capitalize(surgery_step.name),
|
|
"chems_needed" = chems_needed,
|
|
"alternative_step" = alternative_step,
|
|
"alt_chems_needed" = alt_chems_needed,
|
|
"chems_present" = surgery_step.chem_check(patient),
|
|
"alt_chems_present" = alt_chems_present
|
|
))
|
|
return data
|
|
|
|
/obj/machinery/computer/operating/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
switch(action)
|
|
if("sync")
|
|
sync_surgeries()
|
|
if("open_experiments")
|
|
experiment_handler.ui_interact(usr)
|
|
return TRUE
|
|
|
|
#undef MENU_OPERATION
|
|
#undef MENU_SURGERIES
|