Frankenstein Station 13: Introducing dissections and alien organs to xenobiology (#29093)

* ddsadsa

ddsadsa

* moderate again

* revert

* beginning with rebase

* organssssssssss

* organs now process!

* analyzer finished! + mapping

* tool bit implementation and quality

* organs and fixes and reworks

* more organ work

* more organs done

* more organ progress!

* more organ work

* MORE. ORGANS.

* temp

* more organsssss

* ITS DONE!!!!!!!!

* oops

* also oops

* linter stuff

* forgot this + oops

* linter

* i forgot to save!

* lots of improvements and tweaks

* move icon over

* icon tweaks

* icon mistake

* oops

* dumb

* more icon validations

* i think thisll fix it?

* Apply suggestions from code review

Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* fixes

* fixes+tweaks

* fix

* oops

* linter

* i didnt save....

* this should give -some- warning

* forgot a span

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* beginning edits

* more fixed and tweaks with cooldowns

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* lots of tweaks

* more review changes

* comment change

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* returns start back to gland

* Apply suggestions from code review

Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* code review fixes

* trying to make surgery work....

* might as well push this

* perfection. now i need text

* text + small tweaks and bugfixing

* linting

* forgot to implement this

* deconflicting maps

* modifying for xenos again

* i guess this wasnt needed???

* added surgical belts to xeno

* minor swap

* quick fix

* small tweaks

* small tweak

* tiny tweak

* some slime updates

* more tweaks

* more updates

* first batch of fixes

* hiero audio fix

* robotic fauna fixes

* more rounds of bugfixes

* prevents teleporting

* tiny fix

* makes sharp more common

* misc fixes

* surgery and revenant fixes + extractor

* adds cursed organ logging

* small bananium organ tweak

* actually gives teleporter access

* adds a message to the analyzer

* can now drag naughts

* slime behavior tweaks

* headslug tweak, cant eat organs

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/mob/living/simple_animal/slime/slime_mob.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/mob/living/simple_animal/slime/slime_mob.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/revenant/revenant.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/datums/components/special_tastes.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/abduction/gland.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/abduction/gland.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* moved this

* major rework prep

* didnt save

* rework done

* small fix

* makes aliens draggable by crew after death

* shouldnt have cut this

* xeno organ tweak + tips

* oops

* fixes and tweaks to slimes

* not used

* temp revert

* rebase map files to master

* re-applying changes

* access fix

* access tweak

* big fix for new refactor

* more refactoring

* forgot a span

* Update code/datums/components/surgery_initiator.dm

Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* hiero only doesnt target dead megafauna

* various fixes

* fix requests

* fixed weird conflict markers

* deconflict

* deconflicting

* antimagic flags

* merge fixing

* Update code/modules/mining/lavaland/loot/hierophant_loot.dm

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>

* regen mesh fix

* small fixes

* tick fix

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* grammar

* Update code/modules/surgery/organs/organ_internal.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/surgery/organs/organ_internal.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology_organs.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>

* tweaks

---------

Signed-off-by: Kyani <65205627+EmeraldCandy@users.noreply.github.com>
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com>
Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: 1080pCat <96908085+1080pCat@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Kyani
2025-06-10 16:46:56 +00:00
committed by GitHub
co-authored by PollardTheDragon 1080pCat Luc warriorstar-orion BeagleGaming1 Burzah
parent 438b3d7c98
commit fdcf4899a2
107 changed files with 4269 additions and 742 deletions
@@ -720,3 +720,13 @@
materials = list(MAT_GLASS = 1000)
build_path = /obj/item/circuitboard/autochef
category = list("Misc. Machinery")
/datum/design/organ_analyzer
name = "Machine Design (Organ Analyzer)"
desc = "The circuit board for an organ analyzer."
id = "organ_analyzer"
req_tech = list("programming" = 3, "bluespace" = 3, "materials" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000)
build_path = /obj/item/circuitboard/organ_analyzer
category = list("Research Machinery")
@@ -295,6 +295,37 @@
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
category = list("Medical")
/datum/design/dissector
name = "Dissection Manager"
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs."
id = "dissection_manager"
req_tech = list("biotech" = 3, "materials" = 3, "programming" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500)
build_path = /obj/item/dissector
category = list("Medical")
/datum/design/improved_dissector
name = "Improved Dissection Manager"
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs. This one has had several improvements applied to it."
id = "dissection_manager_upgraded"
req_tech = list("biotech" = 7, "materials" = 6, "engineering" = 6)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 1500, MAT_GOLD = 2000)
build_path = /obj/item/dissector/upgraded
category = list("Medical")
// allows for perfect dissections, should be very hard to obtain.
/datum/design/alien_dissector
name = "Alien Dissection Manager"
desc = "A tool of alien origin, capable of near impossible levels of precision during dissections."
id = "dissection_manager_alien"
req_tech = list("biotech" = 7, "materials" = 7, "abductor" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 4500, MAT_DIAMOND = 3000, MAT_TITANIUM = 4000, MAT_PLASMA = 4000)
build_path = /obj/item/dissector/alien
category = list("Medical")
/////////////////////////////////////////
//////////Cybernetic Implants////////////
/////////////////////////////////////////
@@ -0,0 +1,194 @@
/obj/item/circuitboard/organ_analyzer
board_name = "Organ Analyzer"
icon_state = "science"
build_path = /obj/machinery/organ_analyzer
board_type = "machine"
origin_tech = "biotech=2"
req_components = list(
/obj/item/stock_parts/scanning_module = 2,
/obj/item/stock_parts/manipulator = 1,
)
/obj/machinery/organ_analyzer
name = "Organ Analysis Chamber"
desc = "A sophisticated machine made to break down and study samples of alien organs. Only revitalized organs are valid for analysis."
density = TRUE
anchored = TRUE
icon = 'icons/obj/xeno_organs.dmi'
icon_state = "organ_analyzer0"
idle_power_consumption = 40
layer = ABOVE_OBJ_LAYER
resistance_flags = FIRE_PROOF|ACID_PROOF
// what organ are we currently holding?
var/obj/item/organ/internal/contains_organ
// Are we actively taking apart an organ?
var/processing_organ = FALSE
// How long until the machine finishes?
var/time_to_complete = 15 SECONDS
// How good is the machine at giving credits for our work?
var/reward_coeff
COOLDOWN_DECLARE(process_organ)
/obj/machinery/organ_analyzer/Initialize(mapload)
. = ..()
component_parts = list()
component_parts += new /obj/item/circuitboard/organ_analyzer(null)
component_parts += new /obj/item/stock_parts/scanning_module(null)
component_parts += new /obj/item/stock_parts/scanning_module(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
RefreshParts()
update_appearance(UPDATE_OVERLAYS)
/obj/machinery/organ_analyzer/update_overlays()
underlays = null
if(contains_organ)
var/mutable_appearance/underlay_organ = mutable_appearance(layer = OBJ_LAYER, plane = GAME_PLANE)
underlay_organ.icon = icon = 'icons/obj/xeno_organs.dmi'
underlay_organ.icon_state = contains_organ.icon_state
underlay_organ.pixel_y = -3
underlays += underlay_organ
var/mutable_appearance/underlay_base = mutable_appearance(layer = BELOW_OBJ_LAYER, plane = GAME_PLANE)
underlay_base.icon = 'icons/obj/xeno_organs.dmi'
if(processing_organ)
underlay_base.icon_state += "organ_analyzer_on"
else
underlay_base.icon_state += "organ_analyzer_off"
underlays += underlay_base
/obj/machinery/organ_analyzer/RefreshParts()
reward_coeff = 0
for(var/obj/item/stock_parts/scanning_module/S in component_parts)
reward_coeff += S.rating
reward_coeff = reward_coeff / 2 // average the parts
/obj/machinery/organ_analyzer/screwdriver_act(mob/user, obj/item/I)
. = TRUE
if(processing_organ || contains_organ)
to_chat(user, "<span class='warning'>The machine cannot be opened while holding an organ! Remove it first.</span>")
return TRUE
default_deconstruction_screwdriver(user, "organ_analyzer1", "organ_analyzer0", I)
/obj/machinery/organ_analyzer/crowbar_act(mob/user, obj/item/I)
if(!panel_open)
return
. = TRUE
default_deconstruction_crowbar(user, I)
/obj/machinery/organ_analyzer/attack_hand(mob/user)
if(panel_open)
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
return
if(stat & (NOPOWER|BROKEN))
return
if(contains_organ)
if(processing_organ)
to_chat(user, "<span class='warning'>The machine is already analyzing the organ!</span>")
return
else
COOLDOWN_START(src, process_organ, time_to_complete)
processing_organ = TRUE
playsound(src, 'sound/machines/organ_analyzer.ogg', 60, FALSE)
update_appearance(UPDATE_OVERLAYS)
/obj/machinery/organ_analyzer/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/organ/internal))
to_chat(user, "<span class='warning'>The machines rejects [used]; it finds no possible potential in it.</span>")
return ITEM_INTERACT_COMPLETE
if(panel_open)
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
return ITEM_INTERACT_COMPLETE
var/obj/item/organ/internal/organ = used
if(organ.is_xeno_organ)
if(organ.type in GLOB.scanned_organs)
if(GLOB.scanned_organs[organ.type] >= 3) // No more than
to_chat(user, "<span class='warning'>The analyzer rejects the organ. It's gotten as much data as it can from this type of organ.</span>")
return ITEM_INTERACT_COMPLETE
else
GLOB.scanned_organs[organ.type]++
else
GLOB.scanned_organs += list(organ.type = 1)
contains_organ = organ
user.transfer_item_to(organ, src)
src.visible_message("[user] inserts [organ] into the recepticle.")
update_appearance(UPDATE_OVERLAYS)
return ITEM_INTERACT_COMPLETE
return ..()
/obj/machinery/organ_analyzer/AltClick(mob/user)
if(panel_open)
to_chat(user, "<span class='warning'>You can't interact with the machine while the panel is open!</span>")
return
if(processing_organ)
to_chat(user, "<span class='warning'>You cannot remove an organ currently being processed!</span>")
return
if(contains_organ)
user.put_in_hands(contains_organ)
contains_organ = null
update_appearance(UPDATE_OVERLAYS)
/obj/machinery/organ_analyzer/process()
..()
if(stat & (NOPOWER|BROKEN))
processing_organ = FALSE
update_appearance(UPDATE_OVERLAYS)
return
if(processing_organ && COOLDOWN_FINISHED(src, process_organ))
complete_analysis()
/obj/machinery/organ_analyzer/proc/complete_analysis()
playsound(src, 'sound/machines/ping.ogg', 50, FALSE)
processing_organ = FALSE
if(contains_organ.hidden_origin_tech)
handle_disk()
var/account = GLOB.station_money_database.get_account_by_department(DEPARTMENT_SCIENCE)
var/datum/money_account_database/main_station/station_db = GLOB.station_money_database
var/quality_modifier = 1
if(contains_organ.organ_quality == ORGAN_PRISTINE)
quality_modifier = 2
if(contains_organ.organ_quality == ORGAN_DAMAGED)
quality_modifier = 0.5
var/final_value = round((contains_organ.analyzer_price * reward_coeff) * quality_modifier)
station_db.credit_account(account, final_value, "Organ Analyzation Subsidy", "Xenobiology Organ Analyzer", FALSE)
SSblackbox.record_feedback("amount", "Organ_Analyzer_Revenue", final_value)
atom_say("Analysis complete. Depositing [final_value] credits into the science account.")
qdel(contains_organ)
contains_organ = null
update_appearance(UPDATE_OVERLAYS)
/obj/machinery/organ_analyzer/proc/handle_disk()
var/obj/item/disk/tech_disk/disk = new /obj/item/disk/tech_disk(src.loc)
var/datum/tech/tech
switch(contains_organ.hidden_origin_tech)
if(TECH_MATERIAL)
tech = new /datum/tech/materials
if(TECH_ENGINEERING)
tech = new /datum/tech/engineering
if(TECH_PLASMA)
tech = new /datum/tech/plasmatech
if(TECH_POWER)
tech = new /datum/tech/powerstorage
if(TECH_BLUESPACE)
tech = new /datum/tech/bluespace
if(TECH_BIO)
tech = new /datum/tech/biotech
if(TECH_COMBAT)
tech = new /datum/tech/combat
if(TECH_MAGNETS)
tech = new /datum/tech/magnets
if(TECH_PROGRAM)
tech = new /datum/tech/programming
if(TECH_TOXINS)
tech = new /datum/tech/toxins
if(TECH_SYNDICATE)
tech = new /datum/tech/syndicate
if(TECH_ABDUCTOR)
tech = new /datum/tech/abductor
tech.level = contains_organ.hidden_tech_level
disk.load_tech(tech)
@@ -0,0 +1,838 @@
/obj/item/dissector
name = "\improper Dissection Manager"
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs."
icon = 'icons/obj/surgery.dmi'
icon_state = "dissector"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
flags = CONDUCT
w_class = WEIGHT_CLASS_SMALL
tool_behaviour = TOOL_DISSECTOR
/obj/item/dissector/upgraded
name = "\improper Improved Dissection Manager"
desc = "An advanced handheld device that assists with the preparation and removal of non-standard alien organs. This one has had several improvements applied to it."
icon_state = "dissector_upgrade"
toolspeed = 0.6
// allows for perfect pristine organ extraction. Only available from non-lavaland abductor tech
/obj/item/dissector/alien
name = "\improper Alien Dissection Manager"
desc = "A tool of alien origin, capable of near impossible levels of precision during dissections."
icon_state = "dissector_alien"
origin_tech = "abductor=3"
toolspeed = 0.2
/obj/item/dissector/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SURGICAL, ROUNDSTART_TRAIT)
AddComponent(/datum/component/surgery_initiator)
RegisterSignal(src, COMSIG_BIT_ATTACH, PROC_REF(add_bit))
RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(remove_bit))
/datum/surgery_step/generic/dissect
name = "dissect"
allowed_tools = list(
/obj/item/dissector/alien = 100,
/obj/item/dissector/upgraded = 70,
/obj/item/organ_extractor = 60,
TOOL_DISSECTOR = 40,
/obj/item/scalpel/laser/manager = 10,
/obj/item/scalpel = 5,
/obj/item/wirecutters = 2,
/obj/item/kitchen/utensil/fork = 1,
)
preop_sound = 'sound/surgery/organ1.ogg'
success_sound = 'sound/surgery/organ2.ogg'
failure_sound = 'sound/effects/bone_break_1.ogg'
time = 1.5 SECONDS
/datum/surgery_step/generic/dissect/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
return ..()
/datum/surgery_step/generic/dissect/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
if(length(surgery.steps) <= surgery.step_number) // only procs if its the finishing step
if(isalien(target)) // xenos are special snowflakes
var/picked = pick_organ(target)
var/obj/item/organ/internal/alien/xeno = new picked(target.loc)
xeno.organ_quality = pick_quality(tool, surgery.get_surgery_step())
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[picked]", xeno.organ_quality))
target.surgery_container.xeno_specialized_organs -= picked
for(var/obj/item/organ/internal/alien/A in target.internal_organs)
if(A.type == xeno)
A.remove()
if(istype(tool, /obj/item/organ_extractor))
var/obj/item/organ_extractor/I = tool
I.insert_internal_organ_in_extractor(xeno)
else
if(istype(tool, /obj/item/organ_extractor)) // lets directly insert it into an organ extractor
var/obj/item/organ_extractor/I = tool
var/organ_type = pick_organ(target)
var/obj/item/organ/internal/organ = new organ_type(target.loc)
organ.organ_quality = pick_quality(tool, surgery.get_surgery_step())
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[organ.type]", organ.organ_quality))
I.insert_internal_organ_in_extractor(organ)
return SURGERY_STEP_CONTINUE
var/obj/item/xeno_organ/new_organ = new /obj/item/xeno_organ(target.loc)
if(length(target.surgery_container.custom_organ_states))
new_organ.icon_state = pick(target.surgery_container.custom_organ_states)
new_organ.true_organ_type = pick_organ(target)
new_organ.unknown_quality = pick_quality(tool, surgery.get_surgery_step())
user.put_in_inactive_hand(new_organ)
SSblackbox.record_feedback("nested tally", "xeno_organ_type", 1, list("[new_organ.true_organ_type]", new_organ.unknown_quality))
target.contains_xeno_organ = FALSE
return SURGERY_STEP_CONTINUE
/datum/surgery_step/generic/dissect/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
return SURGERY_STEP_RETRY
/datum/surgery_step/generic/dissect/proc/pick_organ(mob/living/target)
var/chosen_organ_type
if(!target.ignore_generic_organs && (prob(75) || !target.surgery_container.xeno_specialized_organs)) //if it has no specialized organs always roll generic
chosen_organ_type = pick(target.surgery_container.xeno_generic_organs)
else
chosen_organ_type = pick(target.surgery_container.xeno_specialized_organs)
return chosen_organ_type
/// Decides the quality of the new organ based off tool efficiency and tool bit mods
/datum/surgery_step/generic/dissect/proc/pick_quality(obj/item/I, datum/surgery_step/current_step)
if(istype(I, /obj/item/dissector/alien))
return ORGAN_PRISTINE
var/quality_chance
for(var/key in current_step.allowed_tools)
if(ispath(key) && istype(I, key))
quality_chance = allowed_tools[key]
break
else if(I.tool_behaviour == key)
quality_chance = allowed_tools[key]
break
var/inverted_chance = 100 - quality_chance
quality_chance += ((inverted_chance * 0.66) * -(I.bit_efficiency_mod - 1))
if(prob(quality_chance / 2)) // at best, ~50% chance
return ORGAN_PRISTINE
if(prob(quality_chance))
return ORGAN_NORMAL
return ORGAN_DAMAGED
// Dissections should always end in he dissect step for organ quality sake
/datum/surgery/dissect
name = "experimental dissection"
requires_bodypart = FALSE // most simplemobs wont have limbs
possible_locs = list(BODY_ZONE_CHEST)
target_mobtypes = list(/mob/living)
requires_organic_bodypart = FALSE
lying_required = FALSE
steps = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
/datum/surgery/dissect/can_start(mob/user, mob/living/target)
. = ..()
if(!.)
return FALSE
if(target.stat == DEAD && target.contains_xeno_organ)
return TRUE
return FALSE
/datum/surgery_step/fake_robotics
name = "fake robotics operations - do not use this parent object"
allowed_tools = list()
time = 10 SECONDS
/datum/surgery_step/fake_robotics/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_text[surgery.step_number]]")
if(tool && tool.tool_behaviour)
tool.play_tool_sound(user, 30)
return ..()
/datum/surgery_step/fake_robotics/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_success_text[surgery.step_number]]")
if(tool && tool.tool_behaviour)
tool.play_tool_sound(user, 30)
return SURGERY_STEP_CONTINUE
/datum/surgery_step/fake_robotics/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(surgery, /datum/surgery/dissect))
to_chat(user, "[target.surgery_container.dissection_failure_text[surgery.step_number]]")
if(tool && tool.tool_behaviour)
tool.play_tool_sound(user, 30)
return SURGERY_STEP_RETRY
/datum/surgery_step/fake_robotics/unscrew_hatch
name = "unscrew hatch"
allowed_tools = list(
TOOL_SCREWDRIVER = 100,
/obj/item/coin = 50,
/obj/item/kitchen/knife = 50
)
time = 1.6 SECONDS
/datum/surgery_step/fake_robotics/open_hatch
name = "open hatch"
allowed_tools = list(
TOOL_RETRACTOR = 100,
TOOL_CROWBAR = 100,
/obj/item/kitchen/utensil = 50
)
time = 2.4 SECONDS
/datum/surgery_step/fake_robotics/amputate
name = "remove component"
allowed_tools = list(
TOOL_MULTITOOL = 100
)
time = 5 SECONDS
/datum/xenobiology_surgery_container
/// Does this organ have custom icon states it should be choosing from
var/list/custom_organ_states = list()
/// Contains the results for any specialized organs this creature should have
var/list/xeno_specialized_organs = list()
/// Holds the list of all generic non-specific organs
var/static/list/xeno_generic_organs = list(
/obj/item/organ/internal/liver/xenobiology/toxic,
/obj/item/organ/internal/liver/xenobiology/detox,
/obj/item/organ/internal/heart/xenobiology/vestigial,
/obj/item/organ/internal/heart/xenobiology/incompatible,
/obj/item/organ/internal/appendix/xenobiology/feverish,
/obj/item/organ/internal/appendix/xenobiology/freezing,
/obj/item/organ/internal/kidneys/xenobiology/lethargic,
/obj/item/organ/internal/ears/xenobiology/colorful,
)
/// Contains the list for which paths are needed at each dissection step.
var/list/dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
/// Contains specialty text for each dissection step.
var/list/dissection_text = list(
"<span class='notice'>You begin prepping the subject for dissection...</span>",
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
/// Contains specialty text for dissection success steps
var/list/dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
/// Contains specialty text for dissection step failures
var/list/dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/goliath
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/tendril)
/datum/xenobiology_surgery_container/megacarp
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/megacarp)
/datum/xenobiology_surgery_container/morph
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/hungry)
/datum/xenobiology_surgery_container/hound
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/sharp)
/datum/xenobiology_surgery_container/sweating
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sweating)
/datum/xenobiology_surgery_container/watcher
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sinew)
/datum/xenobiology_surgery_container/migo
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/noisemaker)
/datum/xenobiology_surgery_container/spider
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/toxin_stinger)
/datum/xenobiology_surgery_container/hivelord
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/hyperactive)
/datum/xenobiology_surgery_container/goldgrub
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/metallic)
/datum/xenobiology_surgery_container/tomato
xeno_specialized_organs = list(/obj/item/organ/internal/liver/xenobiology/soupy)
/datum/xenobiology_surgery_container/herald
xeno_specialized_organs = list(/obj/item/organ/internal/lungs/xenobiology/mirror)
/datum/xenobiology_surgery_container/clown
xeno_specialized_organs = list(
/obj/item/organ/internal/heart/xenobiology/bananium,
/obj/item/organ/internal/heart/xenobiology/cursed_bananium,
)
/datum/xenobiology_surgery_container/revenant
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/electro_strands)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin prepping the subject for dissection...</span>",
"<span class='notice'>You begin to easily open up a surgical site from the ashen mound.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the nearly ashen pile!</span>",
"<span class='warning'>You struggle to get the surgical site open as ash crumples back in on itself!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/colossus
xeno_specialized_organs = list(/obj/item/organ/internal/cyberimp/mouth/xenobiology/vocal_remnants)
custom_organ_states = list("colossus1", "colossus2", "colossus3", "colossus4")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You make a careful incision into the subject's corpse.</span>",
"<span class='notice'>You clamp any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You force the dissection cavity open.</span>",
"<span class='notice'>You carefully begin severing the metal sections from the surrounding flesh.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You manage to cut away and seperate the metal from flesh.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The mixture of metal and flesh seems impossible to distinguish in some places!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/pandora
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/paradox)
custom_organ_states = list("hiero1", "hiero2")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/fake_robotics/unscrew_hatch,
/datum/surgery_step/fake_robotics/open_hatch,
/datum/surgery_step/fake_robotics/amputate,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin to unscrew the coverings.</span>",
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
"<span class='notice'>You carefully begin to disconnect the core from the surrounding power network.</span>",
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
"<span class='notice'>You remove the core from the metal housing!</span>",
)
dissection_failure_text = list(
"<span class='warning'>You begin to prep the subject for dissection...</span>",
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
)
/datum/xenobiology_surgery_container/legionnaire
xeno_specialized_organs = list(/obj/item/organ/internal/ears/xenobiology/sinister)
custom_organ_states = list("legion1", "legion2")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/amputate,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin sawing through the dense bone obstructions.</span>",
"<span class='notice'>With a sickening crunch, you begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>"
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You manage to detach the bones away from the dissection cavity.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>"
)
dissection_failure_text = list(
"<span class='notice'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='notice'>Your saw fails to find purchase against the hardened bone!</span>",
"<span class='notice'>The surrounding bone refuses to budge!</span>",
"<span class='notice'>The tool fails to remove the organ from the surrounding skeletal structure!</span>"
)
/datum/xenobiology_surgery_container/bubblegum
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/bloody_sack)
custom_organ_states = list("bubblegum1", "bubblegum2", "bubblegum3", "bubblegum4")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the corpse for dissection... If you can even call it that at this point</span>",
"<span class='notice'>You begin removing shards and chunks of bone, clearing a spot to safely cut deeper.</span>",
"<span class='notice'>You slowly cut your way into the pile, looking for anything other than formless flesh and bone...</span>",
"<span class='notice'>You begin clamping the mass amount of leaking arteries in the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You finally find something, and begin to remove a unidentifiable mass out of the mass!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You manage to clear out the dissection site of obstructive bone.</span>",
"<span class='notice'>You manage to cut deep enough until something of signifigance seems to reveal.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You begin removing shards and chunks of bone, clearing a spot to safely cut deeper.</span>",
"<span class='warning'>You slowly cut your way into the pile, looking for anything other than formless flesh and bone..</span>",
"<span class='warning'>You clamp the mass amount of leaking arteries in the surgical site.</span>",
"<span class='warning'>You force the dissection cavity open.</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/alien
xeno_specialized_organs = list(/obj/item/organ/internal/alien/hivenode)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/saw_carapace,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin sawing through the chitinous outer layer.</span>",
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You manage to saw through the armored exoskeleton.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You fail to get through the armored outer layer!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/alien/sentinel
xeno_specialized_organs = list(
/obj/item/organ/internal/alien/plasmavessel,
/obj/item/organ/internal/alien/acidgland,
/obj/item/organ/internal/alien/neurotoxin,
/obj/item/organ/internal/alien/hivenode,
)
/datum/xenobiology_surgery_container/alien/larva
xeno_specialized_organs = list(
/obj/item/organ/internal/alien/plasmavessel/larva,
/obj/item/organ/internal/alien/acidgland,
/obj/item/organ/internal/alien/neurotoxin,
/obj/item/organ/internal/alien/hivenode,
)
/datum/xenobiology_surgery_container/alien/queen
xeno_specialized_organs = list(
/obj/item/organ/internal/alien/plasmavessel/queen,
/obj/item/organ/internal/alien/acidgland,
/obj/item/organ/internal/alien/eggsac,
/obj/item/organ/internal/alien/neurotoxin,
/obj/item/organ/internal/alien/resinspinner,
)
/datum/xenobiology_surgery_container/alien/drone
xeno_specialized_organs = list(
/obj/item/organ/internal/alien/plasmavessel/drone,
/obj/item/organ/internal/alien/acidgland,
/obj/item/organ/internal/alien/resinspinner,
/obj/item/organ/internal/alien/hivenode,
)
/datum/xenobiology_surgery_container/alien/hunter
xeno_specialized_organs = list(
/obj/item/organ/internal/alien/plasmavessel/hunter,
/obj/item/organ/internal/alien/hivenode,
/obj/item/organ/internal/alien/resinspinner,
)
/datum/xenobiology_surgery_container/hierophant
xeno_specialized_organs = list(/obj/item/organ/internal/eyes/cybernetic/xenobiology/glowing)
custom_organ_states = list("hiero1", "hiero2")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/fake_robotics/unscrew_hatch,
/datum/surgery_step/fake_robotics/open_hatch,
/datum/surgery_step/fake_robotics/amputate,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin to unscrew the coverings.</span>",
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
"<span class='notice'>You carefully begin to disconnect the core from the surrounding power network.</span>",
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
"<span class='notice'>You remove the core from the metal housing!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
)
/datum/xenobiology_surgery_container/blobbernaut
xeno_specialized_organs = list(/obj/item/organ/internal/eyes/xenobiology/receptors)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin closing off one of the many leaking fluid sacks in the corpse.</span>",
"<span class='notice'>Your work area closed filled back in. You begin to re-open it.</span>",
"<span class='notice'>You begin closing off more leaking sacks and fluid veins.</span>",
"<span class='notice'>This damned dissection site <b>WON'T STOP CLOSING!</b></span>",
"<span class='notice'>You begin once again closing off more fluid sacks and leaking cavities....</span>",
"<span class='notice'>You at last begin to remove something from the cadaver...</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You easily pry apart the semi-liquid corpse.</span>",
"<span class='notice'>You close off one numerous leaking cavities.</span>",
"<span class='notice'>You manage to get the dissection site back open</span>",
"<span class='notice'>You close off more leaking sacks and fluid veins.</span>",
"<span class='notice'>You manage to get the dissection site back open... again.</span>",
"<span class='notice'>You finally get the leaking under control.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
"<span class='warning'>The you fail to open the incision site, it simply closes back up!</span>",
"<span class='warning'>The leakage is too intense, you cant get it under control!</span>",
"<span class='warning'>The tool fails to remove the organ from the goopy flesh!</span>",
)
/datum/xenobiology_surgery_container/terror_spider
xeno_specialized_organs = list(/obj/item/organ/internal/appendix/xenobiology/toxin_stinger/terror)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/amputate,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin sawing through the chitinout outer layer.</span>",
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You manage to saw through the hardened exoskeleton.</span>",
"<span class='notice'>You clamp any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>You begin to prep the subject for dissection...</span>",
"<span class='warning'>Your saw fails to find purchase against the reinforced exoskeleton!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/vetus
xeno_specialized_organs = list(/obj/item/organ/internal/cell/xenobiology/supercharged)
custom_organ_states = list("vetus1", "vetus2")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/fake_robotics/unscrew_hatch,
/datum/surgery_step/fake_robotics/open_hatch,
/datum/surgery_step/fake_robotics/amputate,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin to unscrew the coverings.</span>",
"<span class='notice'>You begin prying open the loose panel from the machine.</span>",
"<span class='notice'>You carefully begin to disconnect the core from the machinery without setting off any secondary explosions.</span>",
"<span class='notice'>You begin removing the core from the metal housing surrounding it.</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully remove any screws keeping the panel shut.</span>",
"<span class='notice'>You pry open the loose panels to expose the core within.</span>",
"<span class='notice'>You successfully disconnect the core from the power connectors.</span>",
"<span class='notice'>You remove the core from the metal housing!</span>",
)
dissection_failure_text = list(
"<span class='warning'>You begin to prep the subject for dissection...</span>",
"<span class='warning'>You cant get enough torque to unscrew the rusted fastenings off!</span>",
"<span class='warning'>You fail to find enough leverage to get the panel off!</span>",
"<span class='warning'>You cant find how to safely remove the core from its attached wiring!</span>",
"<span class='warning'>The tool fails to remove the core from the metal housing!</span>",
)
/datum/xenobiology_surgery_container/drake
xeno_specialized_organs = list(/obj/item/organ/internal/lungs/xenobiology/flame_sack)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/amputate,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin sawing through the hardened scales of the drake.</span>",
"<span class='notice'>You carefully begin removing the scales from the corpse</span>",
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You feel the resistance of the hardened scales give away to the saw.</span>",
"<span class='notice'>You pluck away the remaining scales from around the dissection site.</span>",
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You fail to find enough leverage to saw through the thick scales!</span>",
"<span class='warning'>You cant get a good enough grip on the loosened scales to pluck them off!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/headslug
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/contortion)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You carefully begin making a tiny incision in the diminutive creature.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You successfully make an incision into the tiny creature.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/basilisk
xeno_specialized_organs = list(/obj/item/organ/internal/kidneys/xenobiology/sweating)
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/drill,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/clamp_bleeders,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin drilling into the crystals to weakent he structure.</span>",
"<span class='notice'>You begin breaking apart the crystals preventing access to the subject.</span>",
"<span class='notice'>You begin removing the remaining pieces of obstructive material.</span>",
"<span class='notice'>You begin to make a careful incision into the subject's corpse.</span>",
"<span class='notice'>You begin clamping any cavities leaking fluids into the surgical site.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>",
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You drill a series of holes into the crystalline carapace.</span>",
"<span class='notice'>You crack open the crystalline lattice into many pieces.</span>",
"<span class='notice'>You colelct and remove the myriad of loose crystals.</span>",
"<span class='notice'>You successfully make an incision into the dissection site.</span>",
"<span class='notice'>You successfully clamp any leaking cavities.</span>",
"<span class='notice'>You successfully force the dissection cavity open.</span>",
"<span class='notice'>You remove some kind of unidentifiable mass from the subject!</span>",
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You fail to drill through the hardened crystals!</span>",
"<span class='warning'>You fail to get enough leverage to break apart the crystal lattice!</span>",
"<span class='warning'>You cant seem to get a good grip on the irregular chunks of material!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>Your hand slips, tearing some of the flesh from the subject and worsening the leakage!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>",
)
/datum/xenobiology_surgery_container/legion
xeno_specialized_organs = list(/obj/item/organ/internal/heart/xenobiology/squirming)
custom_organ_states = list("legion1", "legion2")
dissection_tool_step = list(
/datum/surgery_step/generic/dissect,
/datum/surgery_step/generic/amputate,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/retract_skin,
/datum/surgery_step/generic/cut_open,
/datum/surgery_step/generic/dissect,
)
dissection_text = list(
"<span class='notice'>You begin to prep the subject for dissection...</span>",
"<span class='notice'>You begin to saw through the thick skull plating.</span>",
"<span class='notice'>You make a careful incision into the subject's corpse.</span>",
"<span class='notice'>You begin cutting away at the small skulls continuing to bud up from the corpse.</span>",
"<span class='notice'>You begin forcing the dissection cavity open.</span>",
"<span class='notice'>You once again cut away at the budding skulls attempting to seal up the surgical site.</span>",
"<span class='notice'>You begin removing an unidentifiable mass out of the subject!</span>"
)
dissection_success_text = list(
"<span class='notice'>You successfully set up a dissection site.</span>",
"<span class='notice'>You manage to crack through the thick skull plating.</span>",
"<span class='notice'>You successfully make an incision into the dissection site</span>",
"<span class='notice'>You manage to cut away and control the growing buds.</span>",
"<span class='notice'>You force the dissection cavity open.</span>",
"<span class='notice'>You again manage to cut away and control the growing buds.</span>",
"<span class='notice'>You remove an unidentifiable mass out of the subject!</span>"
)
dissection_failure_text = list(
"<span class='warning'>The tool fails to get a grip on the corpse's surface!</span>",
"<span class='warning'>You cant get enough leverage to saw through the thick skull plating!</span>",
"<span class='warning'>Your hand slips, slicing open the corpse in a wrong spot with the tool!</span>",
"<span class='warning'>You fail to cut the buds away faster than they're regrowing!</span>",
"<span class='warning'>Your hand slips, tearing the edges of incision!</span>",
"<span class='warning'>You fail to cut the buds away faster than they're regrowing!</span>",
"<span class='warning'>The tool fails to remove the organ from the surrounding flesh!</span>"
)
File diff suppressed because it is too large Load Diff