diff --git a/baystation12.dme b/baystation12.dme
index a271554e66c..2518938c8c3 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1175,6 +1175,7 @@
#include "code\modules\surgery\eye.dm"
#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
+#include "code\modules\surgery\implant.dm"
#include "code\modules\surgery\other.dm"
#include "code\modules\surgery\ribcage.dm"
#include "code\modules\surgery\robolimbs.dm"
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index d0b8b90d6b5..566a587b8a0 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -66,6 +66,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
for(var/T in paths)
var/datum/surgery_step/S = new T
surgery_steps += S
+ sort_surgeries()
/* // Uncomment to debug chemical reaction list.
/client/verb/debug_chemical_list()
diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm
index a90389dc214..7710fb6a4f7 100644
--- a/code/datums/organs/organ_external.dm
+++ b/code/datums/organs/organ_external.dm
@@ -31,6 +31,7 @@
var/status = 0
var/open = 0
var/stage = 0
+ var/cavity = 0
var/obj/item/hidden = null
var/list/implants = list()
@@ -239,25 +240,65 @@
// process wounds, doing healing etc., only do this every 4 ticks to save processing power
if(owner.life_tick % wound_update_accuracy == 0)
update_wounds()
+
+ //Dismemberment
if(status & ORGAN_DESTROYED)
if(!destspawn && config.limbs_can_break)
droplimb()
return
- if(!(status & ORGAN_BROKEN))
- perma_injury = 0
if(parent)
if(parent.status & ORGAN_DESTROYED)
status |= ORGAN_DESTROYED
owner.update_body(1)
return
+
+ //Bone fracurtes
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
src.fracture()
- if(germ_level > 0)
- for(var/datum/wound/W in wounds) if(!W.bandaged && !W.salved)
- W.germ_level = max(W.germ_level, germ_level)
+ if(!(status & ORGAN_BROKEN))
+ perma_injury = 0
+
+ update_germs()
update_icon()
return
+//Updating germ levels. Handles organ germ levels and necrosis.
+#define GANGREN_LEVEL_ONE 100
+#define GANGREN_LEVEL_TWO 1000
+#define GANGREN_LEVEL_TERMINAL 2500
+#define GERM_TRANSFER_AMOUNT germ_level/500
+/datum/organ/external/proc/update_germs()
+ if(germ_level > 0 && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
+ //Syncing germ levels with external wounds
+ for(var/datum/wound/W in wounds)
+ if(!W.bandaged && !W.salved)
+ W.germ_level = max(W.germ_level, germ_level) //Wounds get all the germs
+ if (W.germ_level > germ_level) //Badly infected wounds raise internal germ levels
+ germ_level++
+
+ if(germ_level > GANGREN_LEVEL_ONE && prob(round(germ_level/100)))
+ germ_level++
+ owner.adjustToxLoss(1)
+
+ if(germ_level > GANGREN_LEVEL_TWO)
+ germ_level++
+ owner.adjustToxLoss(1)
+/*
+ if(germ_level > GANGREN_LEVEL_TERMINAL)
+ if (!(status & ORGAN_DEAD))
+ status |= ORGAN_DEAD
+ owner << "You can't feel your [display_name] anymore..."
+ owner.update_body(1)
+ if (prob(10)) //Spreading the fun
+ if (children) //To child organs
+ for (var/datum/organ/external/child in children)
+ if (!(child.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT)))
+ child.germ_level += round(GERM_TRANSFER_AMOUNT)
+ if (parent)
+ if (!(parent.status & (ORGAN_DEAD|ORGAN_DESTROYED|ORGAN_ROBOT)))
+ parent.germ_level += round(GERM_TRANSFER_AMOUNT)
+*/
+
//Updating wounds. Handles wound natural healing, internal bleedings and infections
/datum/organ/external/proc/update_wounds()
for(var/datum/wound/W in wounds)
@@ -281,14 +322,12 @@
// amount of healing is spread over all the wounds
W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1))
- if(W.germ_level > 100 && prob(10))
- owner.adjustToxLoss(1 * wound_update_accuracy)
- if(W.germ_level > 1000)
- owner.adjustToxLoss(1 * wound_update_accuracy)
-
// Salving also helps against infection
if(W.germ_level > 0 && W.salved && prob(2))
W.germ_level = 0
+ W.disinfected = 1
+
+
// sync the organ's damage with its wounds
src.update_damages()
diff --git a/code/datums/organs/wound.dm b/code/datums/organs/wound.dm
index b90ddfca81a..90909a3f62d 100644
--- a/code/datums/organs/wound.dm
+++ b/code/datums/organs/wound.dm
@@ -96,6 +96,23 @@
else if(damage_type == BURN)
return salved
+ // checks if wound is considered open for external infections
+ // untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger
+ proc/can_infect()
+ if (is_treated() && damage < 10)
+ return 0
+ if (disinfected)
+ return 0
+ var/dam_coef = round(damage/10)
+ switch (damage_type)
+ if (BRUISE)
+ return prob(dam_coef*5) && bleeding() //bruises only infectable if bleeding
+ if (BURN)
+ return prob(dam_coef*10)
+ if (CUT)
+ return prob(dam_coef*20)
+
+ return 0
// heal the given amount of damage, and if the given amount of damage was more
// than what needed to be healed, return how much heal was left
// set @heals_internal to also heal internal organ damage
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index c123ebde2bb..903bb1b1bf9 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -180,33 +180,39 @@ Implant Specifics:
"}
switch (severity)
if (2.0) //Weak EMP will make implant tear limbs off.
if (prob(50))
- if (ishuman(imp_in) && part)
- imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
- playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
- spawn(25)
- if (ishuman(imp_in) && part)
- //No tearing off these parts since it's pretty much killing
- //and you can't replace groins
- if (istype(part,/datum/organ/external/chest) || \
- istype(part,/datum/organ/external/groin) || \
- istype(part,/datum/organ/external/head))
- part.createwound(BRUISE, 60) //mangle them instead
- else
- part.droplimb(1)
- explosion(get_turf(imp_in), -1, -1, 2, 3, 3)
- del(src)
-
+ small_boom()
if (1.0) //strong EMP will melt implant either making it go off, or disarming it
- if (prob(50))
- activate() //50% chance of bye bye
- else
- meltdown() //50% chance of implant disarming
+ if (prob(70))
+ if (prob(50))
+ small_boom()
+ else
+ if (prob(50))
+ activate() //50% chance of bye bye
+ else
+ meltdown() //50% chance of implant disarming
spawn (20)
malfunction--
islegal()
return 0
+ proc/small_boom()
+ if (ishuman(imp_in) && part)
+ imp_in.visible_message("\red Something beeps inside [imp_in][part ? "'s [part.display_name]" : ""]!")
+ playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
+ spawn(25)
+ if (ishuman(imp_in) && part)
+ //No tearing off these parts since it's pretty much killing
+ //and you can't replace groins
+ if (istype(part,/datum/organ/external/chest) || \
+ istype(part,/datum/organ/external/groin) || \
+ istype(part,/datum/organ/external/head))
+ part.createwound(BRUISE, 60) //mangle them instead
+ else
+ part.droplimb(1)
+ explosion(get_turf(imp_in), -1, -1, 2, 3, 3)
+ del(src)
+
/obj/item/weapon/implant/chem
name = "chem"
desc = "Injects things."
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index d9505e3b53e..31f4ecdc19c 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -70,29 +70,37 @@
turfs += F
var/list/spawn_types = list()
+ var/max_number
vermin = rand(0,2)
switch(vermin)
if(VERM_MICE)
spawn_types = list(/mob/living/simple_animal/mouse/gray, /mob/living/simple_animal/mouse/brown, /mob/living/simple_animal/mouse/white)
+ max_number = 12
vermstring = "mice"
if(VERM_LIZARDS)
spawn_types = list(/mob/living/simple_animal/lizard)
+ max_number = 6
vermstring = "lizards"
if(VERM_SPIDERS)
spawn_types = list(/obj/effect/spider/spiderling)
vermstring = "spiders"
+
spawn(0)
- var/num = rand(1, 3)
+ var/num = rand(2,max_number)
while(turfs.len > 0 && num > 0)
var/turf/simulated/floor/T = pick(turfs)
turfs.Remove(T)
num--
+
+
if(vermin == VERM_SPIDERS)
var/obj/effect/spider/spiderling/S = new(T)
S.amount_grown = -1
else
var/spawn_type = pick(spawn_types)
new spawn_type(T)
+
+
/datum/event/infestation/announce()
command_alert("Bioscans indicate that [vermstring] have been breeding in [locstring]. Clear them out, before this starts to affect productivity.", "Vermin infestation")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 491a457e648..1adee6f3054 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -919,4 +919,33 @@
src.custom_pain("You feel a stabbing pain in your chest!", 1)
E.ruptured_lungs = 1
+/*
+/mob/living/carbon/human/verb/simulate()
+ set name = "sim"
+ set background = 1
+ var/damage = input("Wound damage","Wound damage") as num
+
+ var/germs = 0
+ var/tdamage = 0
+ var/ticks = 0
+ while (germs < 2501 && ticks < 100000 && round(damage/10)*20)
+ diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
+ ticks++
+ if (prob(round(damage/10)*20))
+ germs++
+ if (germs == 100)
+ world << "Reached stage 1 in [ticks] ticks"
+ if (germs > 100)
+ if (prob(10))
+ damage++
+ germs++
+ if (germs == 1000)
+ world << "Reached stage 2 in [ticks] ticks"
+ if (germs > 1000)
+ damage++
+ germs++
+ if (germs == 2500)
+ world << "Reached stage 3 in [ticks] ticks"
+ world << "Mob took [tdamage] tox damage"
+*/
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 478416aae1c..88b96a13deb 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -222,6 +222,7 @@ proc/get_damage_icon_part(damage_state, body_part)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
var/plant_color_mod = rgb(144,224,144)
+ var/necrosis_color_mod = rgb(10,50,0)
var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete
var/fat = (FAT in src.mutations)
@@ -283,6 +284,9 @@ proc/get_damage_icon_part(damage_state, body_part)
temp = new /icon(icobase, "[part.icon_name]")
if(part.status & ORGAN_ROBOT)
temp.GrayScale()
+ if(part.status & ORGAN_DEAD)
+ temp.ColorTone(necrosis_color_mod)
+ temp.SetIntensity(0.7)
else if(!skeleton)
if(husk)
temp.ColorTone(husk_color_mod)
diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm
index 9443b7aca34..027e323c576 100644
--- a/code/modules/surgery/appendix.dm
+++ b/code/modules/surgery/appendix.dm
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/appendectomy/
+ priority = 2
can_infect = 1
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 95d173acbe6..e0eaab854ff 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/glue_bone
+ priority = 2
required_tool = /obj/item/weapon/bonegel
allowed_tools = list(/obj/item/weapon/screwdriver)
can_infect = 1
diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm
index e809f3cb954..d08d6d98784 100644
--- a/code/modules/surgery/braincore.dm
+++ b/code/modules/surgery/braincore.dm
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/brain/
+ priority = 2
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return target_zone == "head" && hasorgans(target)
diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm
index 224afc5af83..8f100aee173 100644
--- a/code/modules/surgery/eye.dm
+++ b/code/modules/surgery/eye.dm
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/eye
+ priority = 2
can_infect = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target))
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 2e6e0c65d05..90ce1d81349 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/face
+ priority = 2
can_infect = 0
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target))
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
new file mode 100644
index 00000000000..1a64f37cf2b
--- /dev/null
+++ b/code/modules/surgery/implant.dm
@@ -0,0 +1,200 @@
+//Procedures in this file: Putting items in body cavity. Implant removal. Items removal.
+
+//////////////////////////////////////////////////////////////////
+// ITEM PLACEMENT SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/cavity
+ priority = 1
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && (target_zone != "chest" || target.op_stage.ribcage == 2)
+
+ proc/get_max_wclass(datum/organ/external/affected)
+ switch (affected.name)
+ if ("head")
+ return 1
+ if ("chest")
+ return 3
+ if ("groin")
+ return 2
+ return 0
+
+ proc/get_cavity(datum/organ/external/affected)
+ switch (affected.name)
+ if ("head")
+ return "cranial"
+ if ("chest")
+ return "thoracic"
+ if ("groin")
+ return "abdominal"
+ return ""
+
+/datum/surgery_step/cavity/make_space
+ required_tool = /obj/item/weapon/surgicaldrill
+ allowed_tools = list(/obj/item/weapon/pen,/obj/item/stack/rods)
+
+ min_duration = 60
+ max_duration = 80
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && !affected.cavity && !affected.hidden
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
+ "You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ affected.cavity = 1
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
+ "\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+
+/datum/surgery_step/cavity/close_space
+ priority = 2
+ required_tool = /obj/item/weapon/cautery
+ allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
+
+ min_duration = 60
+ max_duration = 80
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected.cavity
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \
+ "You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ affected.cavity = 0
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
+ "\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+
+/datum/surgery_step/cavity/place_item
+ priority = 0
+ required_tool = /obj/item
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ var/can_fit = !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
+ return ..() && can_fit
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
+ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+
+ user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
+ "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
+ if (tool.w_class > get_max_wclass(affected)/2 && prob(50))
+ user << "\red You tear some vessels trying to fit such big object in this cavity."
+ var/datum/wound/internal_bleeding/I = new (15)
+ affected.wounds += I
+ affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1)
+ user.drop_item()
+ affected.hidden = tool
+ tool.loc = target
+ affected.cavity = 0
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+
+//////////////////////////////////////////////////////////////////
+// IMPLANT/ITEM REMOVAL SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/cavity/implant_removal
+ required_tool = /obj/item/weapon/hemostat
+ allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
+
+ min_duration = 80
+ max_duration = 100
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
+ "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+
+ var/find_prob = 0
+ if (affected.implants.len)
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ if (imp.islegal())
+ find_prob +=60
+ else
+ find_prob +=40
+ if (isright(tool))
+ find_prob +=20
+ if (prob(find_prob))
+ user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
+ affected.implants -= imp
+ imp.loc = get_turf(target)
+ imp.imp_in = null
+ imp.implanted = 0
+ else if (affected.hidden)
+ user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
+ "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
+ affected.hidden.loc = get_turf(target)
+ if(!affected.hidden.blood_DNA)
+ affected.hidden.blood_DNA = list()
+ affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
+ affected.hidden.update_icon()
+ affected.hidden = null
+
+ else
+ user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
+ "\blue You could not find anything inside [target]'s [affected.display_name]." )
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/datum/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
+ "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+ if (affected.implants.len)
+ var/fail_prob = 10
+ if (!isright(tool))
+ fail_prob += 30
+ if (prob(fail_prob))
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
+ playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
+ spawn(25)
+ imp.activate()
+
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 3c3dd477b40..d75bb538f3d 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -5,6 +5,7 @@
/datum/surgery_step/fix_vein
+ priority = 2
required_tool = /obj/item/weapon/FixOVein
allowed_tools = list(/obj/item/weapon/cable_coil)
can_infect = 1
@@ -45,120 +46,3 @@
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
"\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
affected.take_damage(5, 0)
-
-//////////////////////////////////////////////////////////////////
-// IMPLANT REMOVAL SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/implant_removal
- required_tool = /obj/item/weapon/hemostat
- allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- return affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.display_name] with \the [tool].", \
- "You start poking around inside the incision on [target]'s [affected.display_name] with \the [tool]" )
- target.custom_pain("The pain in your chest is living hell!",1)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
-
- var/find_prob = 0
- if (affected.implants.len)
- var/obj/item/weapon/implant/imp = affected.implants[1]
- if (imp.islegal())
- find_prob +=60
- else
- find_prob +=40
- if (isright(tool))
- find_prob +=20
- if (prob(find_prob))
- user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
- "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
- affected.implants -= imp
- imp.loc = get_turf(target)
- imp.imp_in = null
- imp.implanted = 0
- else if (affected.hidden)
- user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
- "\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
- affected.hidden.loc = get_turf(target)
- if(!affected.hidden.blood_DNA)
- affected.hidden.blood_DNA = list()
- affected.hidden.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
- affected.hidden.update_icon()
- affected.hidden = null
-
- else
- user.visible_message("\blue [user] could not find anything inside [target]'s [affected.display_name], and pulls \the [tool] out.", \
- "\blue You could not find anything inside [target]'s [affected.display_name]." )
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
- affected.createwound(CUT, 20)
- if (affected.implants.len)
- var/fail_prob = 10
- if (!isright(tool))
- fail_prob += 30
- if (prob(fail_prob))
- var/obj/item/weapon/implant/imp = affected.implants[1]
- user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")
- playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
- spawn(25)
- imp.activate()
-
-//////////////////////////////////////////////////////////////////
-// ITEM PLACEMENT SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/item_place
- required_tool = /obj/item
-
- min_duration = 80
- max_duration = 100
- var/max_size = 2 //maximum w_class of item that fits.
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- if (affected.name in list("chest","groin","head"))
- max_size = 3
- else
- max_size = 2
- return affected.open == 2 && !(affected.status & ORGAN_BLEEDING) && tool.w_class <= max_size && !affected.hidden
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts putting [tool] inside the incision on [target]'s [affected.display_name].", \
- "You start putting [tool] inside the incision on [target]'s [affected.display_name]." )
- target.custom_pain("The pain in your chest is living hell!",1)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
-
- user.visible_message("\blue [user] puts [tool] inside [target]'s [affected.display_name].", \
- "\blue You put [tool] inside [target]'s [affected.display_name]." )
- if (tool.w_class > max_size/2 && prob(50))
- user << "\red You tear some vessels trying to fit such big object in this cavity."
- var/datum/wound/internal_bleeding/I = new (15)
- affected.wounds += I
- affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1)
- user.drop_item()
- affected.hidden = tool
- tool.loc = target
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.display_name] with \the [tool]!")
- affected.createwound(CUT, 20)
diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm
index 04c09cd02ed..de5325f9821 100644
--- a/code/modules/surgery/ribcage.dm
+++ b/code/modules/surgery/ribcage.dm
@@ -3,6 +3,7 @@
// GENERIC RIBCAGE SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage
+ priority = 2
can_infect = 1
blood_level = 1
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -195,4 +196,4 @@
var/datum/organ/external/chest/affected = target.get_organ("chest")
user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
"\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
- affected.createwound(CUT, 20)
\ No newline at end of file
+ affected.createwound(CUT, 20)
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 0b2919214da..62b9afb52c0 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -1,6 +1,7 @@
/* SURGERY STEPS */
/datum/surgery_step
+ var/priority = 0 //steps with higher priority would be attempted first
// type path referencing the required tool for this step
var/required_tool = null
@@ -78,6 +79,22 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
return 1 //don't want to do weapony things after surgery
return 0
+proc/sort_surgeries()
+ var/gap = surgery_steps.len
+ var/swapped = 1
+ while (gap > 1 || swapped)
+ swapped = 0
+ if(gap > 1)
+ gap = round(gap / 1.247330950103979)
+ if(gap < 1)
+ gap = 1
+ for(var/i = 1; gap + i <= surgery_steps.len; i++)
+ var/datum/surgery_step/l = surgery_steps[i] //Fucking hate
+ var/datum/surgery_step/r = surgery_steps[gap+i] //how lists work here
+ if(l.priority < r.priority)
+ surgery_steps.Swap(i, gap + i)
+ swapped = 1
+
/datum/surgery_status/
var/eyes = 0
var/face = 0
diff --git a/code/setup.dm b/code/setup.dm
index bb9989c098e..1812f920119 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -580,6 +580,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define ORGAN_ROBOT 128
#define ORGAN_SPLINTED 256
#define SALVED 512
+#define ORGAN_DEAD 1024
#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
diff --git a/html/changelog.html b/html/changelog.html
index 9559cb76328..2071172483a 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -58,6 +58,14 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
+