mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
656 lines
33 KiB
Plaintext
656 lines
33 KiB
Plaintext
//Procedures in this file: Gneric surgery steps
|
|
//////////////////////////////////////////////////////////////////
|
|
// COMMON STEPS //
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/
|
|
surgery_name = "Robotic Surgery"
|
|
can_infect = 0
|
|
|
|
/datum/surgery_step/robotics/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if (isslime(target))
|
|
return 0
|
|
if (target_zone == O_EYES) //there are specific steps for eye surgery
|
|
return 0
|
|
if (!hasorgans(target))
|
|
return 0
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if (affected == null)
|
|
return 0
|
|
if (affected.status & ORGAN_DESTROYED)
|
|
return 0
|
|
if (!(affected.robotic == ORGAN_ROBOT || affected.robotic == ORGAN_LIFELIKE)) //VOREStation Edit - No good on ORGAN_NANOFORM
|
|
return 0
|
|
if(coverage_check(user, target, affected, tool))
|
|
return 0
|
|
return 1
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Unscrew Hatch Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/unscrew_hatch
|
|
surgery_name = "Unscrew Hatch"
|
|
allowed_tools = list(
|
|
/obj/item/weapon/coin = 50,
|
|
/obj/item/weapon/material/knife = 50
|
|
)
|
|
|
|
allowed_procs = list(IS_SCREWDRIVER = 100)
|
|
|
|
req_open = 0
|
|
|
|
min_duration = 90
|
|
max_duration = 110
|
|
|
|
/datum/surgery_step/robotics/unscrew_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(..())
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
return affected && affected.open == 0 && target_zone != O_MOUTH
|
|
|
|
/datum/surgery_step/robotics/unscrew_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>", \
|
|
"<span class='filter_notice'>You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Starts to unscrew the maintenance hatch on [target]'s [affected.name]", "Unscrewing the maintenance hatch on \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/unscrew_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>", \
|
|
"<span class='notice'>You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",)
|
|
user.balloon_alert_visible("Opens the maintenance hatch on [target]'s [affected.name]", "Maintenance hatch opened on \the [affected.name]") // CHOMPEdit
|
|
affected.open = 1
|
|
|
|
/datum/surgery_step/robotics/unscrew_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='warning'>[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].</span>", \
|
|
"<span class='warning'>Your [tool] slips, failing to unscrew [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Slips, failing to unscrew [target]'s [affected.name]", "Your [tool] slips, failing to unscrew \the [affected.name]") // CHOMPEdit
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Open Hatch Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/open_hatch
|
|
surgery_name = "Open Hatch"
|
|
allowed_tools = list(
|
|
/obj/item/weapon/surgical/retractor = 100,
|
|
/obj/item/weapon/material/kitchen/utensil = 50
|
|
)
|
|
|
|
allowed_procs = list(IS_CROWBAR = 100)
|
|
|
|
min_duration = 30
|
|
max_duration = 40
|
|
|
|
/datum/surgery_step/robotics/open_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(..())
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
return affected && affected.open == 1
|
|
|
|
/datum/surgery_step/robotics/open_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>",
|
|
"<span class='filter_notice'>You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Starts to pry open the maintenance hatch on [target]'s [affected.name]", "Prying open the maintenance hatch on \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/open_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>", \
|
|
"<span class='notice'>You open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Opens the maintenance hatch on [target]'s [affected.name]", "Maintenance hatch on \the [affected.name] open") // CHOMPEdit
|
|
affected.open = 3
|
|
|
|
/datum/surgery_step/robotics/open_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='warning'>[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].</span>",
|
|
"<span class='warning'>Your [tool] slips, failing to open the hatch on [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Slips, failing to open the hatch on [target]'s [affected.name]", "Your [tool] slips, fialing to open the hatch on \the [affected.name]") // CHOMPEdit
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Close Hatch Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/close_hatch
|
|
surgery_name = "Close Hatch"
|
|
allowed_tools = list(
|
|
/obj/item/weapon/surgical/retractor = 100,
|
|
/obj/item/weapon/material/kitchen/utensil = 50
|
|
)
|
|
|
|
allowed_procs = list(IS_CROWBAR = 100)
|
|
|
|
min_duration = 70
|
|
max_duration = 100
|
|
|
|
/datum/surgery_step/robotics/close_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(..())
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
return affected && affected.open && target_zone != O_MOUTH
|
|
|
|
/datum/surgery_step/robotics/close_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool].</span>" , \
|
|
"<span class='filter_notice'>You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Begins closing and securing the hatch on [target]'s [affected.name]", "Closing and securing the hatch on \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/close_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].</span>", \
|
|
"<span class='notice'>You close and secure the hatch on [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Closes and secures the hatch on [target]'s [affected.name]", "Closed and secured the hatch on \the [affected.name]") // CHOMPEdit
|
|
affected.open = 0
|
|
affected.germ_level = 0
|
|
|
|
/datum/surgery_step/robotics/close_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='warning'>[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>",
|
|
"<span class='warning'>Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("[tool.name] slips, failing to close the htach on [target]'s [affected.name]", "[tool.name] slips, failing to close the htach on [target]'s [affected.name]") // CHOMPEdit
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Brute Repair Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/repair_brute
|
|
surgery_name = "Repair Robotic Brute"
|
|
allowed_tools = list(
|
|
/obj/item/weapon/weldingtool = 100,
|
|
/obj/item/weapon/pickaxe/plasmacutter = 50
|
|
)
|
|
|
|
min_duration = 50
|
|
max_duration = 60
|
|
|
|
/datum/surgery_step/robotics/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(..()) //CHOMPEdit begin. Added damage check.
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(istype(tool, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/welder = tool
|
|
if(affected.brute_dam == 0)
|
|
to_chat(user, "<span class='notice'>There is no damage to the internal structure here!</span>")
|
|
return SURGERY_FAILURE
|
|
else
|
|
if(!welder.isOn() || !welder.remove_fuel(1,user))
|
|
return 0
|
|
return affected && affected.open == 3 && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH // CHOMPEdit End.
|
|
|
|
/datum/surgery_step/robotics/repair_brute/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool].</span>" , \
|
|
"<span class='filter_notice'>You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].</span>")
|
|
user.balloon_alert_visible("Begins patching damage to [target]'s [affected.name]'s support structure", "Beggining to patch damage to \the [affected.name] support structure") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/repair_brute/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] finishes patching damage to [target]'s [affected.name] with \the [tool].</span>", \
|
|
"<span class='notice'>You finish patching damage to [target]'s [affected.name] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Finishes patching damage to [target]'s [affected.name]", "Patched samage to \the [affected.name]") // CHOMPEdit
|
|
affected.heal_damage(rand(30,50),0,1,1)
|
|
affected.disfigured = 0
|
|
|
|
/datum/surgery_step/robotics/repair_brute/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='warning'>[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].</span>",
|
|
"<span class='warning'>Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Slips, damaging the internal structure of [target]'s [affected.name]", "Your [tool.name] slips, damaging the internal structure of \the [affected.name]") // CHOMPEdit
|
|
target.apply_damage(rand(5,10), BURN, affected)
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Burn Repair Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/repair_burn
|
|
surgery_name = "Repair Robotic Burn"
|
|
allowed_tools = list(
|
|
/obj/item/stack/cable_coil = 100
|
|
)
|
|
|
|
min_duration = 50
|
|
max_duration = 50 //CHOMPedit
|
|
|
|
/datum/surgery_step/robotics/repair_burn/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(..())
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(istype(tool, /obj/item/stack/cable_coil))
|
|
var/obj/item/stack/cable_coil/C = tool
|
|
if(affected.burn_dam == 0)
|
|
user.balloon_alert_visible("There are no burnt wires here!") // CHOMPEdit
|
|
to_chat(user, "<span class='notice'>There are no burnt wires here!</span>")
|
|
return SURGERY_FAILURE
|
|
else
|
|
if(!C.can_use(5))
|
|
to_chat(user, "<span class='danger'>You need at least five cable pieces to repair this part.</span>") //usage amount made more consistent with regular cable repair
|
|
user.balloon_alert_visible("You need at least five cable pieces to repair this part.") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
else
|
|
C.use(5)
|
|
|
|
return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
|
|
|
|
/datum/surgery_step/robotics/repair_burn/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] begins to splice new cabling into [target]'s [affected.name].</span>" , \
|
|
"<span class='filter_notice'>You begin to splice new cabling into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Begins to splice new cabling into [target]'s [affected.name]", "Splcing new cabling into \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/repair_burn/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] finishes splicing cable into [target]'s [affected.name].</span>", \
|
|
"<span class='notice'>You finishes splicing new cable into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Finishes splicing cable into [target]'s [affected.name]", "Finished splicing new cable into [target]'s [affected.name]") // CHOMPEdit
|
|
affected.heal_damage(0,rand(30,50),1,1)
|
|
affected.disfigured = 0
|
|
|
|
/datum/surgery_step/robotics/repair_burn/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='warning'>[user] causes a short circuit in [target]'s [affected.name]!</span>",
|
|
"<span class='warning'>You cause a short circuit in [target]'s [affected.name]!</span>")
|
|
user.balloon_alert_visible("Causes a short circuit in [target]'s [affected.name]", "You cause a short circuit in \the [affected.name]") // CHOMPEdit
|
|
target.apply_damage(rand(5,10), BURN, affected)
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Robot Organ Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs
|
|
surgery_name = "Fix Robotic Organ"
|
|
allowed_tools = list(
|
|
/obj/item/stack/nanopaste = 100, \
|
|
/obj/item/weapon/surgical/bonegel = 30, \
|
|
)
|
|
|
|
allowed_procs = list(IS_SCREWDRIVER = 100)
|
|
|
|
min_duration = 70
|
|
max_duration = 70 //CHOMPedit
|
|
|
|
/datum/surgery_step/robotics/fix_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if (!hasorgans(target))
|
|
return
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(!affected) return
|
|
var/is_organ_damaged = 0
|
|
for(var/obj/item/organ/I in affected.internal_organs)
|
|
if(I.damage > 0 && (I.robotic >= ORGAN_ROBOT))
|
|
is_organ_damaged = 1
|
|
break
|
|
return affected.open == 3 && is_organ_damaged
|
|
|
|
/datum/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if (!hasorgans(target))
|
|
return
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
|
|
for(var/obj/item/organ/I in affected.internal_organs)
|
|
if(I && I.damage > 0)
|
|
if(I.robotic >= ORGAN_ROBOT)
|
|
user.visible_message("<span class='filter_notice'>[user] starts mending the damage to [target]'s [I.name]'s mechanisms.</span>", \
|
|
"<span class='filter_notice'>You start mending the damage to [target]'s [I.name]'s mechanisms.</span>" )
|
|
user.balloon_alert_visible("Starts mending the damage to [target]'s [I.name]'s mechanisms.", "Mending the damage to \the [I.name]'s mechanism") // CHOMPEdit
|
|
|
|
target.custom_pain("The pain in your [affected.name] is living hell!",1)
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/fix_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if (!hasorgans(target))
|
|
return
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
|
|
for(var/obj/item/organ/I in affected.internal_organs)
|
|
if(I && I.damage > 0)
|
|
if(I.robotic >= ORGAN_ROBOT)
|
|
user.visible_message("<span class='notice'>[user] repairs [target]'s [I.name] with [tool].</span>", \
|
|
"<span class='notice'>You repair [target]'s [I.name] with [tool].</span>" )
|
|
user.balloon_alert_visible("Repairs [target]'s [I.name]", "Repaired \the [I.name]") // CHOMPEdit
|
|
I.damage = 0
|
|
if(I.organ_tag == O_EYES)
|
|
target.sdisabilities &= ~BLIND
|
|
|
|
/datum/surgery_step/robotics/fix_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if (!hasorgans(target))
|
|
return
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
|
|
user.visible_message("<span class='warning'>[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!</span>", \
|
|
"<span class='warning'>Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!</span>")
|
|
user.balloon_alert_visible("Slips, gumming up the mechanisms inside [target]'s [affected.name]", "Your hand slips, gumming up the mechanisms inside of \the [affected.name]") // CHOMPEdit
|
|
|
|
target.adjustToxLoss(5)
|
|
affected.createwound(CUT, 5)
|
|
|
|
for(var/obj/item/organ/I in affected.internal_organs)
|
|
if(I)
|
|
I.take_damage(rand(3,5),0)
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Robot Organ Detaching Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/detatch_organ_robotic
|
|
surgery_name = "Detach Robotic Organ"
|
|
allowed_tools = list(
|
|
/obj/item/device/multitool = 100
|
|
)
|
|
|
|
min_duration = 90
|
|
max_duration = 110
|
|
|
|
/datum/surgery_step/robotics/detatch_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
|
|
return 0
|
|
if(affected.open < 3)
|
|
return 0
|
|
|
|
var/list/attached_organs = list() //Let's see if we have any organs able to be detached!
|
|
for(var/organ in target.internal_organs_by_name)
|
|
var/obj/item/organ/I = target.internal_organs_by_name[organ]
|
|
if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
|
|
attached_organs |= organ
|
|
|
|
if(!attached_organs.len) //No organs able to be detached!
|
|
return 0
|
|
|
|
return ..()
|
|
|
|
/datum/surgery_step/robotics/detatch_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/list/attached_organs = list() //Which organs can we detach?
|
|
for(var/organ in target.internal_organs_by_name)
|
|
var/obj/item/organ/I = target.internal_organs_by_name[organ]
|
|
if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
|
|
attached_organs |= organ
|
|
|
|
var/organ_to_remove = tgui_input_list(user, "Which organ do you want to prepare for removal?", "Organ Choice", attached_organs)
|
|
|
|
if(!organ_to_remove) //They chose cancel!
|
|
to_chat(user, "<span class='notice'>You decide against preparing any organs for removal.</span>")
|
|
return
|
|
target.op_stage.current_organ = organ_to_remove
|
|
|
|
user.visible_message("<span class='filter_notice'>[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].</span>", \
|
|
"<span class='filter_notice'>You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool].</span>" )
|
|
user.balloon_alert_visible("Starts to decouple [target]'s [target.op_stage.current_organ]", "Decoupling \the [target.op_stage.current_organ]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/detatch_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='notice'>[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool].</span>" , \
|
|
"<span class='notice'>You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Decoupled [target]'s [target.op_stage.current_organ]", "Decouple \the [target.op_stage.current_organ]") // CHOMPEdit
|
|
|
|
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
|
|
if(I && istype(I))
|
|
I.status |= ORGAN_CUT_AWAY
|
|
target.op_stage.current_organ = null
|
|
|
|
/datum/surgery_step/robotics/detatch_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='warning'>[user]'s hand slips, disconnecting \the [tool].</span>", \
|
|
"<span class='warning'>Your hand slips, disconnecting \the [tool].</span>")
|
|
user.balloon_alert_visible("Slips, disconnecting \the [tool]", "Your hand slips, disconnecting \the [tool]") // CHOMPEdit
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Robot Organ Attaching Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/attach_organ_robotic
|
|
surgery_name = "Attach Robotic Organ"
|
|
allowed_procs = list(IS_SCREWDRIVER = 100)
|
|
|
|
min_duration = 100
|
|
max_duration = 120
|
|
|
|
/datum/surgery_step/robotics/attach_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
|
|
return 0
|
|
if(affected.open < 3)
|
|
return 0
|
|
|
|
var/list/attachable_organs = list()
|
|
for(var/organ in target.internal_organs_by_name)
|
|
var/obj/item/organ/I = target.internal_organs_by_name[organ]
|
|
if(I && (I.status & ORGAN_CUT_AWAY) && (I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
|
|
attachable_organs |= organ
|
|
|
|
if(!attachable_organs.len)
|
|
return 0
|
|
|
|
return ..()
|
|
|
|
/datum/surgery_step/robotics/attach_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
|
|
var/list/attachable_organs = list()
|
|
for(var/organ in target.internal_organs_by_name)
|
|
var/obj/item/organ/I = target.internal_organs_by_name[organ]
|
|
if(I && (I.status & ORGAN_CUT_AWAY) && (I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
|
|
attachable_organs |= organ
|
|
|
|
var/organ_to_replace = tgui_input_list(user, "Which organ do you want to reattach?", "Organ Choice", attachable_organs)
|
|
if(!organ_to_replace) //They chose cancel!
|
|
to_chat(user, "<span class='notice'>You decide against reattaching any organs.</span>")
|
|
return
|
|
|
|
|
|
target.op_stage.current_organ = organ_to_replace
|
|
|
|
user.visible_message("<span class='filter_notice'>[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].</span>", \
|
|
"<span class='filter_notice'>You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Begins reattaching [target]'s [target.op_stage.current_organ]", "Reattaching \the [target.op_stage.current_organ]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/attach_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='notice'>[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool].</span>" , \
|
|
"<span class='notice'>You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].</span>")
|
|
user.balloon_alert_visible("Reattaches [target]'s [target.op_stage.current_organ]", "Reattached \the [target.op_stage.current_organ]") // CHOMPEdit
|
|
|
|
var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
|
|
if(I && istype(I))
|
|
I.status &= ~ORGAN_CUT_AWAY
|
|
target.op_stage.current_organ = null
|
|
|
|
/datum/surgery_step/robotics/attach_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='warning'>[user]'s hand slips, disconnecting \the [tool].</span>", \
|
|
"<span class='warning'>Your hand slips, disconnecting \the [tool].</span>")
|
|
user.balloon_alert_visible("Slips, disconnecting \the [tool]", "Your hand slips, disonnectng \the [tool]") // CHOMPEdit
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// MMI Insertion Surgery
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
/datum/surgery_step/robotics/install_mmi
|
|
surgery_name = "Install MMI"
|
|
allowed_tools = list(
|
|
/obj/item/device/mmi = 100
|
|
)
|
|
|
|
min_duration = 60
|
|
max_duration = 80
|
|
|
|
/datum/surgery_step/robotics/install_mmi/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(target_zone != BP_HEAD)
|
|
return
|
|
|
|
var/obj/item/device/mmi/M = tool
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
if(!(affected && affected.open == 3))
|
|
return 0
|
|
|
|
if(!istype(M))
|
|
return 0
|
|
|
|
/* VOREStation Edit - Don't worry about it. We can put these in regardless, because resleeving might make it useful after.
|
|
if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD)
|
|
to_chat(user, "<span class='danger'>That brain is not usable.</span>")
|
|
return SURGERY_FAILURE
|
|
*/
|
|
|
|
if(!(affected.robotic >= ORGAN_ROBOT))
|
|
to_chat(user, "<span class='danger'>You cannot install a computer brain into a meat skull.</span>")
|
|
user.balloon_alert(user, "You cannot install a computer brain into a meat skull") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!target.should_have_organ("brain"))
|
|
to_chat(user, "<span class='danger'>You're pretty sure [target.species.name_plural] don't normally have a brain.</span>")
|
|
user.balloon_alert(user, "You're pertty sure [target.species.name_plural] don't normall have a brain") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!isnull(target.internal_organs["brain"]))
|
|
to_chat(user, "<span class='danger'>Your subject already has a brain.</span>")
|
|
user.balloon_alert(user, "Your subject already has a brain") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
return 1
|
|
|
|
/datum/surgery_step/robotics/install_mmi/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] starts installing \the [tool] into [target]'s [affected.name].</span>", \
|
|
"<span class='filter_notice'>You start installing \the [tool] into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Starts installing \the [tool] into [target]'s [affected.name]", "Installing \the [tool] into \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/install_mmi/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] has installed \the [tool] into [target]'s [affected.name].</span>", \
|
|
"<span class='notice'>You have installed \the [tool] into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Installed \the [tool] into [target]'s [affected.name]", "Installed \the [tool] into \the [affected.name]") // CHOMPEdit
|
|
|
|
var/obj/item/device/mmi/M = tool
|
|
var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
|
|
target.internal_organs_by_name["brain"] = holder
|
|
user.drop_from_inventory(tool)
|
|
tool.loc = holder
|
|
holder.stored_mmi = tool
|
|
holder.update_from_mmi()
|
|
|
|
if(M.brainmob && M.brainmob.mind)
|
|
M.brainmob.mind.transfer_to(target)
|
|
target.languages = M.brainmob.languages
|
|
|
|
spawn(0) //Name yourself on your own damn time
|
|
var/new_name = target.real_name
|
|
while(target.client)
|
|
if(!target) return
|
|
var/try_name = tgui_input_text(target,"Pick a name for your new form!", "New Name", target.name)
|
|
var/clean_name = sanitizeName(try_name, allow_numbers = TRUE)
|
|
if(clean_name)
|
|
var/okay = tgui_alert(target,"New name will be '[clean_name]', ok?", "Confirmation",list("Cancel","Ok"))
|
|
if(okay == "Ok")
|
|
new_name = clean_name
|
|
break //ChompEDIT infinite rename bug
|
|
|
|
new_name = sanitizeName(new_name, allow_numbers = TRUE)
|
|
target.name = new_name
|
|
target.real_name = target.name
|
|
|
|
/datum/surgery_step/robotics/install_mmi/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='warning'>[user]'s hand slips.</span>", \
|
|
"<span class='warning'>Your hand slips.</span>")
|
|
user.balloon_alert_visible("Slips", "Your hand slips") // CHOMPEdit
|
|
|
|
/*
|
|
* Install a Diona Nymph into a Nymph Mech
|
|
*/
|
|
|
|
/datum/surgery_step/robotics/install_nymph
|
|
surgery_name = "Install Nymph"
|
|
allowed_tools = list(
|
|
/obj/item/weapon/holder/diona = 100
|
|
)
|
|
|
|
min_duration = 60
|
|
max_duration = 80
|
|
|
|
/datum/surgery_step/robotics/install_nymph/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
if(target_zone != BP_TORSO)
|
|
return
|
|
|
|
var/obj/item/weapon/holder/diona/N = tool
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
|
|
if(!(affected && affected.open == 3))
|
|
return 0
|
|
|
|
if(!istype(N))
|
|
return 0
|
|
|
|
if(!N.held_mob.client || N.held_mob.stat >= DEAD)
|
|
to_chat(user, "<span class='danger'>That nymph is not viable.</span>")
|
|
user.balloon_alert(user, "That nymph is not viable") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!(affected.robotic >= ORGAN_ROBOT))
|
|
to_chat(user, "<span class='danger'>You cannot install a nymph into a meat puppet.</span>")
|
|
user.balloon_alert(user, "You cannot install a nymph into a meat puppet") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!(affected.model != "Skrellian Exoskeleton"))
|
|
to_chat(user, "<span class='dangerou'>You're fairly certain a nymph can't pilot a normal robot.</span>")
|
|
user.balloon_alert(user, "You're fairly certain a nymph can't pilot a normal robot") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!target.should_have_organ("brain"))
|
|
to_chat(user, "<span class='danger'>You're pretty sure [target.species.name_plural] don't normally have a brain.</span>")
|
|
user.balloon_alert(user, "You're pretty sure [target.species.name_plural] don't normall have a brain") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
if(!isnull(target.internal_organs["brain"]))
|
|
to_chat(user, "<span class='danger'>Your subject already has a cephalon.</span>")
|
|
user.balloon_alert(user, "Your subject already has a cephalon") // CHOMPEdit
|
|
return SURGERY_FAILURE
|
|
|
|
return 1
|
|
|
|
/datum/surgery_step/robotics/install_nymph/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='filter_notice'>[user] starts setting \the [tool] into [target]'s [affected.name].</span>", \
|
|
"<span class='filter_notice'>You start setting \the [tool] into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Starts setting \the [tool] into [target]'s [affected.name]", "Setting \the into \the [affected.name]") // CHOMPEdit
|
|
..()
|
|
|
|
/datum/surgery_step/robotics/install_nymph/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
var/obj/item/organ/external/affected = target.get_organ(target_zone)
|
|
user.visible_message("<span class='notice'>[user] has installed \the [tool] into [target]'s [affected.name].</span>", \
|
|
"<span class='notice'>You have installed \the [tool] into [target]'s [affected.name].</span>")
|
|
user.balloon_alert_visible("Installed \the [tool] into [target]'s [affected.name]", "Installed \the [tool] into \the [affected.name]") // CHOMPEdit
|
|
|
|
var/obj/item/weapon/holder/diona/N = tool
|
|
var/obj/item/organ/internal/brain/cephalon/cephalon = new(target, 1)
|
|
target.internal_organs_by_name["brain"] = cephalon
|
|
var/mob/living/carbon/alien/diona/D = N.held_mob
|
|
user.drop_from_inventory(tool)
|
|
|
|
if(D && D.mind)
|
|
D.mind.transfer_to(target)
|
|
target.languages |= D.languages
|
|
|
|
qdel(D)
|
|
|
|
target.species = GLOB.all_species[SPECIES_DIONA]
|
|
|
|
add_verb(target,/mob/living/carbon/human/proc/diona_split_nymph) //CHOMPEdit TGPanel
|
|
add_verb(target,/mob/living/carbon/human/proc/regenerate) //CHOMPEdit TGPanel
|
|
|
|
spawn(0) //Name yourself on your own damn time
|
|
var/new_name = ""
|
|
while(!new_name)
|
|
if(!target) return
|
|
var/try_name = tgui_input_text(target,"Pick a name for your new form!", "New Name", target.name)
|
|
var/clean_name = sanitizeName(try_name, allow_numbers = TRUE)
|
|
if(clean_name)
|
|
var/okay = tgui_alert(target,"New name will be '[clean_name]', ok?", "Confirmation",list("Cancel","Ok"))
|
|
if(okay == "Ok")
|
|
new_name = clean_name
|
|
|
|
target.name = new_name
|
|
target.real_name = target.name
|
|
|
|
/datum/surgery_step/robotics/install_nymph/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
|
user.visible_message("<span class='warning'>[user]'s hand slips.</span>", \
|
|
"<span class='warning'>Your hand slips.</span>")
|
|
user.balloon_alert_visible("Slips", "Your hand slips") // CHOMPEdit
|