diff --git a/_maps/map_files/Campaign maps/nt_base/nt_base.dmm b/_maps/map_files/Campaign maps/nt_base/nt_base.dmm
index 381db7ed5c3..977e31aa3a0 100644
--- a/_maps/map_files/Campaign maps/nt_base/nt_base.dmm
+++ b/_maps/map_files/Campaign maps/nt_base/nt_base.dmm
@@ -21394,7 +21394,7 @@
pixel_x = -11
},
/obj/effect/decal/cleanable/blood/gibs/body,
-/obj/item/prop/organ/heart,
+/obj/item/organ/heart,
/turf/open/floor/tile/dark2{
dir = 8
},
diff --git a/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm b/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm
index f5dc9eb1b96..9ed559c6663 100644
--- a/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm
+++ b/_maps/map_files/Pillar_of_Spring/TGS_Pillar_of_Spring.dmm
@@ -8543,7 +8543,7 @@
/area/mainship/command/self_destruct)
"lcA" = (
/obj/machinery/optable,
-/obj/item/prop/organ/kidneys,
+/obj/item/organ/kidneys,
/turf/open/floor/cult,
/area/medical/morgue)
"lcL" = (
@@ -9573,11 +9573,11 @@
"mcR" = (
/obj/structure/toilet,
/obj/structure/closet/crate/freezer,
-/obj/item/prop/organ/kidneys,
-/obj/item/prop/organ/kidneys,
-/obj/item/prop/organ/kidneys,
-/obj/item/prop/organ/kidneys,
-/obj/item/prop/organ/kidneys,
+/obj/item/organ/kidneys,
+/obj/item/organ/kidneys,
+/obj/item/organ/kidneys,
+/obj/item/organ/kidneys,
+/obj/item/organ/kidneys,
/turf/open/floor/mainship/floor,
/area/mainship/medical/upper_medical)
"mdp" = (
diff --git a/_maps/map_files/gelida_iv/gelida_iv.dmm b/_maps/map_files/gelida_iv/gelida_iv.dmm
index b26e8f42cbc..b33d4197be5 100644
--- a/_maps/map_files/gelida_iv/gelida_iv.dmm
+++ b/_maps/map_files/gelida_iv/gelida_iv.dmm
@@ -23274,7 +23274,7 @@
pixel_x = -11
},
/obj/effect/decal/cleanable/blood/gibs/body,
-/obj/item/prop/organ/heart,
+/obj/item/organ/heart,
/turf/open/floor/tile/dark2{
dir = 8
},
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index ad05dcc8767..fdcd3aa0f27 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -210,17 +210,6 @@ GLOBAL_LIST_INIT(xenoupgradetiers, list(XENO_UPGRADE_BASETYPE, XENO_UPGRADE_INVA
///////////////////INTERNAL ORGANS DEFINES///////////////////
-#define ORGAN_ASSISTED 1
-#define ORGAN_ROBOT 2
-
-#define ORGAN_HEART 1
-#define ORGAN_LUNGS 2
-#define ORGAN_LIVER 3
-#define ORGAN_KIDNEYS 4
-#define ORGAN_BRAIN 5
-#define ORGAN_EYES 6
-#define ORGAN_APPENDIX 7
-
//organ slots
#define ORGAN_SLOT_APPENDIX "appendix"
#define ORGAN_SLOT_BRAIN "brain"
@@ -228,6 +217,7 @@ GLOBAL_LIST_INIT(xenoupgradetiers, list(XENO_UPGRADE_BASETYPE, XENO_UPGRADE_INVA
#define ORGAN_SLOT_EYES "eyes"
#define ORGAN_SLOT_HEART "heart"
#define ORGAN_SLOT_LIVER "liver"
+#define ORGAN_SLOT_STOMACH "stomach"
#define ORGAN_SLOT_LUNGS "lungs"
#define ORGAN_SLOT_KIDNEYS "kidneys"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 67fc9d7b579..a629aa5fd42 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -494,8 +494,8 @@
living_owner.adjustToxLoss(3)
if(prob(15))
living_owner.adjust_Losebreath(5)
- if(prob(15))
- living_owner.vomit()
+ if(carbon_owner && prob(15))
+ carbon_owner.vomit()
if(carbon_owner && prob(15))
var/datum/internal_organ/organ = pick(carbon_owner.internal_organs)
if(organ)
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index cd77a7c725e..71f65595d8f 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -112,7 +112,6 @@
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
-
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
desc = "It's red."
diff --git a/code/game/objects/effects/spawners/random/medical.dm b/code/game/objects/effects/spawners/random/medical.dm
index 1b3d2e978df..558d762a05d 100644
--- a/code/game/objects/effects/spawners/random/medical.dm
+++ b/code/game/objects/effects/spawners/random/medical.dm
@@ -100,13 +100,13 @@
name = "Random surgical organ spawner"
icon_state = "random_organ"
loot = list(
- /obj/item/prop/organ/brain,
- /obj/item/prop/organ/heart,
- /obj/item/prop/organ/lungs,
- /obj/item/prop/organ/kidneys,
- /obj/item/prop/organ/eyes,
- /obj/item/prop/organ/liver,
- /obj/item/prop/organ/appendix,
+ /obj/item/organ/brain,
+ /obj/item/organ/heart,
+ /obj/item/organ/lungs,
+ /obj/item/organ/kidneys,
+ /obj/item/organ/eyes,
+ /obj/item/organ/liver,
+ /obj/item/organ/appendix,
)
/obj/effect/spawner/random/medical/medbottle
diff --git a/code/game/objects/items/reagent_containers/food/condiment.dm b/code/game/objects/items/reagent_containers/food/condiment.dm
index 2d39a4e761f..b849b04284f 100644
--- a/code/game/objects/items/reagent_containers/food/condiment.dm
+++ b/code/game/objects/items/reagent_containers/food/condiment.dm
@@ -50,7 +50,7 @@
if(reagents.total_volume)
record_reagent_consumption(min(10, reagents.total_volume), reagents.reagent_list, user, M)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, 10)
+ reagents.trans_to(M, 10, transfer_to_stomach = TRUE)
playsound(M.loc,'sound/items/drink.ogg', 15, 1)
return 1
return 0
diff --git a/code/game/objects/items/reagent_containers/food/drinks.dm b/code/game/objects/items/reagent_containers/food/drinks.dm
index 8c9965b70f5..7cc4de2153d 100644
--- a/code/game/objects/items/reagent_containers/food/drinks.dm
+++ b/code/game/objects/items/reagent_containers/food/drinks.dm
@@ -36,7 +36,7 @@
record_reagent_consumption(min(gulp_size, reagents.total_volume), reagents.reagent_list, user)
if(reagents.total_volume)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, gulp_size)
+ reagents.trans_to(M, gulp_size, transfer_to_stomach = TRUE)
playsound(M.loc,'sound/items/drink.ogg', 15, 1)
return TRUE
else
@@ -56,7 +56,7 @@
if(reagents.total_volume)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, gulp_size)
+ reagents.trans_to(M, gulp_size, transfer_to_stomach = TRUE)
playsound(M.loc,'sound/items/drink.ogg', 15, 1)
return TRUE
diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm
index 6a10c4e6c41..cc961f883d5 100644
--- a/code/game/objects/items/reagent_containers/food/snacks.dm
+++ b/code/game/objects/items/reagent_containers/food/snacks.dm
@@ -113,10 +113,10 @@
*/
//Why is bitesize used instead of an actual portion???
record_reagent_consumption(bitesize, reagents.reagent_list, user, M)
- reagents.trans_to(M, bitesize)
+ reagents.trans_to(M, bitesize, transfer_to_stomach = TRUE)
else
record_reagent_consumption(reagents.total_volume, reagents.reagent_list, user, M)
- reagents.trans_to(M, reagents.total_volume)
+ reagents.trans_to(M, reagents.total_volume, transfer_to_stomach = TRUE)
bitecount++
On_Consume(M)
return TRUE
@@ -858,12 +858,12 @@
var/mob/living/carbon/human/H = M
var/datum/limb/E = H.get_limb("chest")
E.fracture()
- for (var/datum/internal_organ/I in E.internal_organs)
+ for(var/datum/internal_organ/I in E.internal_organs)
I.take_damage(rand(I.min_bruised_damage, I.min_broken_damage+1))
- if (!E.hidden && prob(60)) //set it snuggly
+ if(!E.hidden && prob(60)) //set it snuggly
E.hidden = surprise
E.cavity = 0
- else //someone is having a bad day
+ else //someone is having a bad day
E.createwound(CUT, 30)
surprise.embed_into(M, E)
qdel(src)
@@ -1555,7 +1555,7 @@
/obj/item/reagent_containers/food/snacks/lollipop/proc/handle_reagents()
var/fraction = min(FOOD_METABOLISM/reagents.total_volume, 1)
reagents.reaction(owner, INGEST, fraction)
- if(!reagents.trans_to(owner, FOOD_METABOLISM))
+ if(!reagents.trans_to(owner, FOOD_METABOLISM, transfer_to_stomach = TRUE))
reagents.remove_any(FOOD_METABOLISM)
/obj/item/reagent_containers/food/snacks/lollipop/process()
diff --git a/code/game/objects/items/reagent_containers/pill.dm b/code/game/objects/items/reagent_containers/pill.dm
index 50914a43f65..3d68c9fadb1 100644
--- a/code/game/objects/items/reagent_containers/pill.dm
+++ b/code/game/objects/items/reagent_containers/pill.dm
@@ -1,7 +1,3 @@
-////////////////////////////////////////////////////////////////////////////////
-/// Pills.
-////////////////////////////////////////////////////////////////////////////////
-
/obj/item/reagent_containers/pill
name = "pill"
icon = 'icons/obj/items/chemistry.dmi'
@@ -39,7 +35,7 @@
if(reagents.total_volume)
record_reagent_consumption(reagents.total_volume, reagents.reagent_list, user)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, reagents.total_volume)
+ reagents.trans_to(M, reagents.total_volume, transfer_to_stomach = TRUE)
qdel(src)
return TRUE
@@ -68,7 +64,7 @@
if(reagents.total_volume)
record_reagent_consumption(reagents.total_volume, reagents.reagent_list, user, M)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, reagents.total_volume)
+ reagents.trans_to(M, reagents.total_volume, transfer_to_stomach = TRUE)
qdel(src)
else
qdel(src)
diff --git a/code/game/objects/items/scanners.dm b/code/game/objects/items/scanners.dm
index 8e9fd72dfdf..ecc8ea0cc9c 100644
--- a/code/game/objects/items/scanners.dm
+++ b/code/game/objects/items/scanners.dm
@@ -82,7 +82,7 @@ REAGENT SCANNER
///Skill required to have the scanner auto refresh
var/upper_skill_threshold = SKILL_MEDICAL_NOVICE
///Current mob being tracked by the scanner
- var/mob/living/carbon/patient
+ var/mob/living/carbon/human/patient
///Current user of the scanner
var/mob/living/carbon/current_user
///Distance the current_user can be away from the patient and still get health data.
@@ -192,6 +192,24 @@ REAGENT SCANNER
)
data["has_chemicals"] = length(patient.reagents.reagent_list)
data["chemicals_lists"] = chemicals_lists
+
+ var/datum/internal_organ/stomach/belly = patient.get_organ_slot(ORGAN_SLOT_STOMACH) // should it be this way?
+ data["has_stomach_chemicals"] = length(belly.reagents.reagent_list)
+ var/list/stomach_chemicals_lists = list()
+ for(var/datum/reagent/reagent AS in belly.reagents.reagent_list)
+ if(!reagent.scannable)
+ data["has_unknown_chemicals"] = TRUE
+ continue
+ var/reagent_overdosed = FALSE
+ if(reagent.overdose_threshold && reagent.volume > reagent.overdose_threshold)
+ reagent_overdosed = TRUE
+ stomach_chemicals_lists["[reagent.name]"] = list(
+ "name" = reagent.name,
+ "amount" = round(reagent.volume, 0.1),
+ "od" = reagent_overdosed
+ )
+ data["stomach_chemicals_lists"] = stomach_chemicals_lists
+
data["species"] = patient.species.species_flags & ROBOTIC_LIMBS ? "robot" : "human"
var/list/limb_data_lists = list()
diff --git a/code/game/objects/items/tools/kitchen_tools.dm b/code/game/objects/items/tools/kitchen_tools.dm
index 9103ee1baff..edd3bc06f0b 100644
--- a/code/game/objects/items/tools/kitchen_tools.dm
+++ b/code/game/objects/items/tools/kitchen_tools.dm
@@ -35,7 +35,7 @@
if (reagents.total_volume > 0)
reagents.reaction(M, INGEST)
- reagents.trans_to(M, reagents.total_volume)
+ reagents.trans_to(M, reagents.total_volume, transfer_to_stomach = TRUE)
if(M == user)
visible_message(span_notice("[user] eats some [loaded] from \the [src]."))
M.reagents.add_reagent(/datum/reagent/consumable/nutriment, 1)
diff --git a/code/game/objects/machinery.dm b/code/game/objects/machinery.dm
index f7707b32d67..7ac7a34ca48 100644
--- a/code/game/objects/machinery.dm
+++ b/code/game/objects/machinery.dm
@@ -413,15 +413,8 @@
dat += ""
for(var/datum/internal_organ/i in occ["internal_organs"])
-
- var/mech = ""
- if(i.robotic == ORGAN_ASSISTED)
- mech = "Assisted:
"
- if(i.robotic == ORGAN_ROBOT)
- mech = "Mechanical:
"
-
dat += "
"
- dat += "[i.name] | N/A | [i.damage] | None:[mech] | | "
+ dat += "[i.name] | N/A | [i.damage] | | "
dat += "
"
dat += ""
diff --git a/code/game/objects/machinery/autodoc.dm b/code/game/objects/machinery/autodoc.dm
index 950860a9e07..7af99699b89 100644
--- a/code/game/objects/machinery/autodoc.dm
+++ b/code/game/objects/machinery/autodoc.dm
@@ -237,11 +237,8 @@
var/organdamagesurgery = 0
for(var/datum/internal_organ/I in L.internal_organs)
- if(I.robotic == ORGAN_ASSISTED||I.robotic == ORGAN_ROBOT)
- // we can't deal with these
- continue
if(I.damage > 0)
- if(I.organ_id == ORGAN_EYES) // treat eye surgery differently
+ if(I.slot == ORGAN_SLOT_EYES) // treat eye surgery differently
continue
if(organdamagesurgery > 0)
continue // avoid duplicates
@@ -372,7 +369,7 @@
else
occupant.reagents.add_reagent(/datum/reagent/medicine/spaceacillin,inject_per_second)
amount -= inject_per_second
- sleep(10*surgery_mod)
+ sleep(10 * surgery_mod)
if(ADSURGERY_DAMAGE)
say("Beginning organ restoration.")
@@ -386,15 +383,15 @@
if(S.limb_ref.body_part != GROIN)
open_encased(occupant, S.limb_ref)
- if(!istype(S.organ_ref,/datum/internal_organ/brain))
+ if(!istype(S.organ_ref, /datum/internal_organ/brain))
sleep(FIX_ORGAN_MAX_DURATION*surgery_mod)
else
if(S.organ_ref.damage > BONECHIPS_MAX_DAMAGE)
- sleep(HEMOTOMA_MAX_DURATION*surgery_mod)
- sleep(BONECHIPS_REMOVAL_MAX_DURATION*surgery_mod)
+ sleep(HEMOTOMA_MAX_DURATION * surgery_mod)
+ sleep(BONECHIPS_REMOVAL_MAX_DURATION * surgery_mod)
if(!surgery)
break
- if(istype(S.organ_ref,/datum/internal_organ))
+ if(istype(S.organ_ref, /datum/internal_organ))
S.organ_ref.heal_organ_damage(S.organ_ref.damage)
else
say("Organ is missing.")
@@ -411,7 +408,7 @@
say("Procedure has been deemed unnecessary.")
surgery_todo_list -= S
continue
- if(istype(S.organ_ref,/datum/internal_organ/eyes))
+ if(istype(S.organ_ref, /datum/internal_organ/eyes))
var/datum/internal_organ/eyes/E = S.organ_ref
if(E.eye_surgery_stage == 0)
@@ -1219,8 +1216,6 @@
var/datum/limb/L = i
for(var/x in L.internal_organs)
var/datum/internal_organ/I = x
- if(I.robotic == ORGAN_ASSISTED || I.robotic == ORGAN_ROBOT)
- continue
if(I.damage > 0)
N.fields["autodoc_manual"] += create_autodoc_surgery(L,ORGAN_SURGERY,ADSURGERY_DAMAGE,0,I)
needed++
diff --git a/code/game/objects/machinery/flasher.dm b/code/game/objects/machinery/flasher.dm
index eda7d506ce2..19e1e98cd50 100644
--- a/code/game/objects/machinery/flasher.dm
+++ b/code/game/objects/machinery/flasher.dm
@@ -83,10 +83,8 @@
else
L.flash_act()
-
L.Paralyze(strength)
-
/obj/machinery/flasher/emp_act(severity)
if(machine_stat & (BROKEN|NOPOWER))
..(severity)
diff --git a/code/game/objects/machinery/portable_reagent_tank.dm b/code/game/objects/machinery/portable_reagent_tank.dm
index 34a417e7dc7..2d3eb64a1e3 100644
--- a/code/game/objects/machinery/portable_reagent_tank.dm
+++ b/code/game/objects/machinery/portable_reagent_tank.dm
@@ -87,7 +87,7 @@
record_sippies(5, reagents.reagent_list, user)
playsound(user.loc,'sound/items/drink.ogg', 25, 2)
reagents.reaction(user, INGEST)
- reagents.trans_to(user, 5)
+ reagents.trans_to(user, 5, transfer_to_stomach = TRUE)
return TRUE
balloon_alert(user, "It's empty!")
diff --git a/code/game/objects/structures/prop.dm b/code/game/objects/structures/prop.dm
index b22640e2060..c1c13824c6d 100644
--- a/code/game/objects/structures/prop.dm
+++ b/code/game/objects/structures/prop.dm
@@ -933,40 +933,6 @@
icon = 'icons/Marine/mainship_props.dmi'
icon_state = "hangarbox"
-/obj/item/prop/organ
- name = "organ"
- desc = "It looks like it probably just plopped out. It's too decayed to be reinserted in a patient."
- icon = 'icons/obj/items/organs.dmi'
- icon_state = "heart"
-
-/obj/item/prop/organ/heart
- name = "heart"
- icon_state = "heart-off"
-
-/obj/item/prop/organ/brain
- name = "brain"
- icon_state = "brain1"
-
-/obj/item/prop/organ/appendix
- name = "appendix"
- icon_state = "appendix"
-
-/obj/item/prop/organ/lungs
- name = "lungs"
- icon_state = "lungs"
-
-/obj/item/prop/organ/kidneys
- name = "kidneys"
- icon_state = "kidneys"
-
-/obj/item/prop/organ/eyes
- name = "eyes"
- icon_state = "eyes"
-
-/obj/item/prop/organ/liver
- name = "liver"
- icon_state = "liver"
-
/obj/item/prop/aimodule
name = "AI module"
desc = "An AI Module for programming laws to an AI."
diff --git a/code/game/objects/structures/supplypod.dm b/code/game/objects/structures/supplypod.dm
index ecd56aa50f7..5e6c907ea5e 100644
--- a/code/game/objects/structures/supplypod.dm
+++ b/code/game/objects/structures/supplypod.dm
@@ -37,7 +37,6 @@ GLOBAL_LIST_INIT(pod_styles, list(\
var/damage = 0
var/effectStun = FALSE
var/effectLimb = FALSE
- var/effectOrgans = FALSE
var/effectGib = FALSE
var/effectStealth = FALSE
var/effectQuiet = FALSE
@@ -123,15 +122,6 @@ GLOBAL_LIST_INIT(pod_styles, list(\
continue
E.droplimb()
- if(effectOrgans && ishuman(L))
- var/mob/living/carbon/human/H = L
- for(var/datum/internal_organ/IO in H.internal_organs)
- var/destination = get_edge_target_turf(T, pick(GLOB.alldirs))
- var/obj/item/organ/O = IO.remove(H)
- O.forceMove(T)
- O.throw_at(destination, 2, 3)
- sleep(0.1 SECONDS)
-
if(effectGib)
L.adjustBruteLoss(5000)
L.gib()
diff --git a/code/modules/admin/verbs/centcom_podlauncher.dm b/code/modules/admin/verbs/centcom_podlauncher.dm
index 6af9f59582d..33d44a8ee2b 100644
--- a/code/modules/admin/verbs/centcom_podlauncher.dm
+++ b/code/modules/admin/verbs/centcom_podlauncher.dm
@@ -77,7 +77,6 @@
data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
- data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands
data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing
data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land
data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
@@ -241,9 +240,6 @@
if("effectLimb") //Toggle: Anyone carbon mob under the pod loses a limb when it lands
temp_pod.effectLimb = !temp_pod.effectLimb
. = TRUE
- if("effectOrgans") //Toggle: Anyone carbon mob under the pod loses a limb when it lands
- temp_pod.effectOrgans = !temp_pod.effectOrgans
- . = TRUE
if("effectBluespace") //Toggle: Deletes the pod after landing
temp_pod.bluespace = !temp_pod.bluespace
. = TRUE
diff --git a/code/modules/admin/verbs/podlauncher.dm b/code/modules/admin/verbs/podlauncher.dm
index 42e1495fb52..a84c7718e59 100644
--- a/code/modules/admin/verbs/podlauncher.dm
+++ b/code/modules/admin/verbs/podlauncher.dm
@@ -97,7 +97,6 @@
data["styleChoice"] = temp_pod.style
data["effectStun"] = temp_pod.effectStun
data["effectLimb"] = temp_pod.effectLimb
- data["effectOrgans"] = temp_pod.effectOrgans
data["effectBluespace"] = temp_pod.bluespace
data["effectStealth"] = temp_pod.effectStealth
data["effectQuiet"] = temp_pod.effectQuiet
@@ -271,10 +270,6 @@
temp_pod.effectLimb = !temp_pod.effectLimb
. = TRUE
- if("effectOrgans")
- temp_pod.effectOrgans = !temp_pod.effectOrgans
- . = TRUE
-
if("effectBluespace")
temp_pod.bluespace = !temp_pod.bluespace
. = TRUE
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
deleted file mode 100644
index 104ebd23b61..00000000000
--- a/code/modules/mob/living/brain/MMI.dm
+++ /dev/null
@@ -1,139 +0,0 @@
-/// this code sucks dont use it
-/obj/item/mmi
- name = "Man-Machine Interface"
- desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
- icon = 'icons/obj/items/assemblies.dmi'
- icon_state = "mmi_empty"
- w_class = WEIGHT_CLASS_NORMAL
-
- //these vars are so the mecha fabricator doesn't shit itself anymore. --NEO
-
- req_access = list(ACCESS_MARINE_RESEARCH)
-
- //Revised. Brainmob is now contained directly within object of transfer. MMI in this case.
-
- var/locked = 0
- var/mob/living/brain/brainmob = null//The current occupant.
-
-
-/obj/item/mmi/attackby(obj/item/O, mob/user)
- if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO
-
- var/obj/item/organ/brain/B = O
- if(B.obj_integrity <= 0)
- to_chat(user, span_warning("That brain is well and truly dead."))
- return
- else if(!B.brainmob)
- to_chat(user, span_warning("You aren't sure where this brain came from, but you're pretty sure it's a useless brain."))
- return
-
- visible_message(span_notice("[user] sticks \a [O] into \the [src]."))
-
- brainmob = O:brainmob
- O:brainmob = null
- brainmob.loc = src
- brainmob.container = src
- brainmob.set_stat(CONSCIOUS)
- GLOB.dead_mob_list -= brainmob//Update dem lists
- GLOB.alive_living_list += brainmob
-
- user.drop_held_item()
- qdel(O)
-
- name = "Man-Machine Interface: [brainmob.real_name]"
- icon_state = "mmi_full"
-
- locked = 1
-
- return
-
- if(istype(O,/obj/item/card/id) && brainmob)
- if(allowed(user))
- locked = !locked
- to_chat(user, span_notice("You [locked ? "lock" : "unlock"] the brain holder."))
- else
- to_chat(user, span_warning("Access denied."))
- return
- if(brainmob)
- O.attack(brainmob, user)//Oh noooeeeee
- return
- ..()
-
- //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data.
-/obj/item/mmi/attack_self(mob/user as mob)
- if(!brainmob)
- to_chat(user, span_warning("You upend the MMI, but there's nothing in it."))
- else if(locked)
- to_chat(user, span_warning("You upend the MMI, but the brain is clamped into place."))
- else
- to_chat(user, span_notice("You upend the MMI, spilling the brain onto the floor."))
- var/obj/item/organ/brain/brain = new(user.loc)
- brainmob.container = null//Reset brainmob mmi var.
- brainmob.loc = brain//Throw mob into brain.
- GLOB.alive_living_list -= brainmob//Get outta here
- brain.brainmob = brainmob//Set the brain to use the brainmob
- brainmob = null//Set mmi brainmob var to null
-
- icon_state = "mmi_empty"
- name = "Man-Machine Interface"
-
-/obj/item/mmi/proc/transfer_identity(mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->robot people.
- brainmob = new(src)
- brainmob.name = H.real_name
- brainmob.real_name = H.real_name
- brainmob.container = src
-
- name = "Man-Machine Interface: [brainmob.real_name]"
- icon_state = "mmi_full"
- locked = 1
- return
-
-/obj/item/mmi/radio_enabled
- name = "Radio-enabled Man-Machine Interface"
- desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio."
-
- var/obj/item/radio/radio = null//Let's give it a radio.
-
-/obj/item/mmi/radio_enabled/Initialize(mapload)
- . = ..()
- radio = new(src)//Spawns a radio inside the MMI.
- radio.broadcasting = 1//So it's broadcasting from the start.
-
-/obj/item/mmi/radio_enabled/verb/Toggle_Broadcasting()
- set name = "Toggle Broadcasting"
- set desc = "Toggle broadcasting channel on or off."
- set category = "MMI"
- set src = usr.loc//In user location, or in MMI in this case.
- set popup_menu = 0//Will not appear when right clicking.
-
- if(brainmob.stat)//Only the brainmob will trigger these so no further check is necessary.
- to_chat(brainmob, "Can't do that while incapacitated or dead.")
-
- radio.broadcasting = radio.broadcasting==1 ? 0 : 1
- to_chat(brainmob, span_notice("Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting."))
-
-/obj/item/mmi/radio_enabled/verb/Toggle_Listening()
- set name = "Toggle Listening"
- set desc = "Toggle listening channel on or off."
- set category = "MMI"
- set src = usr.loc
- set popup_menu = 0
-
- if(brainmob.stat)
- to_chat(brainmob, "Can't do that while incapacitated or dead.")
-
- radio.listening = radio.listening==1 ? 0 : 1
- to_chat(brainmob, span_notice("Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast."))
-
-/obj/item/mmi/emp_act(severity)
- if(!brainmob)
- return
- else
- switch(severity)
- if(1)
- brainmob.emp_damage += rand(20,30)
- if(2)
- brainmob.emp_damage += rand(10,20)
- if(3)
- brainmob.emp_damage += rand(0,10)
- ..()
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
deleted file mode 100644
index c319fba32d7..00000000000
--- a/code/modules/mob/living/brain/brain_item.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/obj/item/organ/brain
- name = "brain"
- max_integrity = 400 //They need to live awhile longer than other organs.
- desc = "A piece of juicy meat found in a person's head."
- icon_state = "brain2"
- flags_atom = NONE
- force = 1
- w_class = WEIGHT_CLASS_SMALL
- throwforce = 1
- throw_speed = 3
- throw_range = 5
- attack_verb = list("attacked", "slapped", "whacked")
- organ_type = /datum/internal_organ/brain
- organ_tag = ORGAN_SLOT_BRAIN
-
- var/mob/living/brain/brainmob = null
-
-/obj/item/organ/brain/xeno
- name = "thinkpan"
- desc = "It looks kind of like an enormous wad of purple bubblegum."
- icon = 'icons/mob/alien.dmi'
- icon_state = "chitin"
-
-
-/obj/item/organ/brain/proc/transfer_identity(mob/living/carbon/H)
- name = "[H]'s brain"
- brainmob = new(src)
- brainmob.name = H.real_name
- brainmob.real_name = H.real_name
- brainmob.timeofhostdeath = H.timeofdeath
- if(H.mind)
- H.mind.transfer_to(brainmob)
-
- to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain."))
-
-/obj/item/organ/brain/examine(mob/user)
- . = ..()
- if(brainmob?.client)//if thar be a brain inside... the brain.
- . += "You can feel the small spark of life still left in this one."
- else
- . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."
-
-/obj/item/organ/brain/removed(mob/living/target,mob/living/user)
- ..()
- var/mob/living/carbon/human/H = target
- var/obj/item/organ/brain/B = src
- if(istype(B) && istype(H))
- B.transfer_identity(target)
-
-/obj/item/organ/brain/replaced(mob/living/target)
-
- if(target.key)
- target.ghostize()
-
- if(brainmob)
- if(brainmob.mind)
- brainmob.mind.transfer_to(target)
- else
- target.key = brainmob.key
diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm
index 71bd879e5ab..5e21e54aa24 100644
--- a/code/modules/mob/living/brain/death.dm
+++ b/code/modules/mob/living/brain/death.dm
@@ -1,14 +1,4 @@
-/mob/living/brain/death(gibbing, deathmessage = "beeps shrilly as the MMI flatlines!", silent)
- if(stat == DEAD)
- return ..()
- if(!gibbing && istype(container, /obj/item/mmi)) //If not gibbing but in a container.
- container.icon_state = "mmi_dead"
- return ..()
-
-
/mob/living/brain/gib()
- if(istype(container, /obj/item/mmi))
- qdel(container)//Gets rid of the MMI if there is one
if(loc)
if(istype(loc,/obj/item/organ/brain))
qdel(loc)//Gets rid of the brain item
diff --git a/code/modules/mob/living/brain/emote.dm b/code/modules/mob/living/brain/emote.dm
deleted file mode 100644
index a518c9db5b0..00000000000
--- a/code/modules/mob/living/brain/emote.dm
+++ /dev/null
@@ -1,40 +0,0 @@
-/datum/emote/brain
- mob_type_allowed_typecache = list(/mob/living/brain)
- mob_type_blacklist_typecache = list()
-
-
-/datum/emote/brain/can_run_emote(mob/user, status_check = TRUE, intentional = FALSE)
- . = ..()
- var/mob/living/brain/B = user
- if(!istype(B) || (!(B.container && istype(B.container, /obj/item/mmi))))
- return FALSE
-
-
-/datum/emote/brain/alarm
- key = "alarm"
- message = "sounds an alarm."
- emote_type = EMOTE_AUDIBLE
-
-
-/datum/emote/brain/alert
- key = "alert"
- message = "lets out a distressed noise."
- emote_type = EMOTE_AUDIBLE
-
-
-/datum/emote/brain/flash
- key = "flash"
- message = "blinks their lights."
-
-
-/datum/emote/brain/notice
- key = "notice"
- message = "plays a loud tone."
- emote_type = EMOTE_AUDIBLE
-
-
-/datum/emote/brain/whistle
- key = "whistle"
- key_third_person = "whistles"
- message = "whistles."
- emote_type = EMOTE_AUDIBLE
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index ec65a88273e..f830572169b 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -28,11 +28,8 @@
return 1
//Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere
- if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act
- if(!(container && istype(container, /obj/item/mmi)))
- emp_damage = 0
- else
- emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with
+ if(emp_damage)
+ emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with
switch(emp_damage)
if(31 to INFINITY)
emp_damage = 30//Let's not overdo it
@@ -110,17 +107,3 @@
interactee?.check_eye(src)
return 1
-
-
-/*/mob/living/brain/emp_act(severity)
- if(!(container && istype(container, /obj/item/mmi)))
- return
- else
- switch(severity)
- if(1)
- emp_damage += rand(20,30)
- if(2)
- emp_damage += rand(10,20)
- if(3)
- emp_damage += rand(0,10)
- ..()*/
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 6a4f3d6ef30..059b33bad8c 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -64,7 +64,7 @@
return shock_damage
-/mob/living/carbon/vomit()
+/mob/living/carbon/proc/vomit()
if(stat == DEAD) //Corpses don't puke
return
@@ -72,25 +72,23 @@
return
TIMER_COOLDOWN_START(src, COOLDOWN_PUKE, 40 SECONDS) //5 seconds before the actual action plus 35 before the next one.
- to_chat(src, "You feel like you are about to throw up!")
+ to_chat(src, span_warning("You feel like you are about to throw up!"))
addtimer(CALLBACK(src, PROC_REF(do_vomit)), 5 SECONDS)
-
/mob/living/carbon/proc/do_vomit()
adjust_stagger(3 SECONDS)
add_slowdown(3)
- visible_message("[src] throws up!","You throw up!", null, 5)
+ visible_message(span_warning("[src] throws up!"), span_warning("You throw up!"), null, 5)
playsound(loc, 'sound/effects/splat.ogg', 25, TRUE, 7)
var/turf/location = loc
- if (istype(location, /turf))
+ if(istype(location, /turf))
location.add_vomit_floor(src, 1)
adjust_nutrition(-40)
adjustToxLoss(-3)
-
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/shaker)
if(health < get_crit_threshold())
return
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 0b5bef65ddf..e243284b25b 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -9,12 +9,11 @@
// Only make the limb drop if it's not too damaged
if(prob(100 - E.get_damage()))
// Override the current limb status
- //E.droplimb() // RUTGMC DELETION
- E.droplimb(silent = TRUE) // RUTGMC ADDITION START
+ E.droplimb(silent = TRUE)
visible_message(span_warning("[name] explodes violently into a bloody mess!"),
span_highdanger("You explode violently into a bloody mess!"),
- span_warning("You hear a terrible sound of breaking bones and ripping flesh!"), 3) // RUTGMC EDITION END
+ span_warning("You hear a terrible sound of breaking bones and ripping flesh!"), 3)
if(is_a_synth)
spawn_gibs()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index fca982b98c4..c8ec8344ffe 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -646,19 +646,17 @@
return FALSE
return ..()
-
///get_eye_protection()
///Returns a number between -1 to 2
/mob/living/carbon/human/get_eye_protection()
var/number = 0
- if(!species.has_organ["eyes"]) return 2//No eyes, can't hurt them.
+ if(!species.has_organ["eyes"])
+ return 2//No eyes, can't hurt them.
var/datum/internal_organ/eyes/I = get_organ_slot(ORGAN_SLOT_EYES)
if(!I)
return 2
- if(I.robotic == ORGAN_ROBOT)
- return 2
if(istype(head, /obj/item/clothing))
var/obj/item/clothing/C = head
@@ -670,7 +668,6 @@
return number
-
/mob/living/carbon/human/abiotic(full_body = 0)
if(full_body && ((src.l_hand && !( src.l_hand.flags_item & ITEM_ABSTRACT)) || (src.r_hand && !( src.r_hand.flags_item & ITEM_ABSTRACT)) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.wear_ear || src.gloves)))
return 1
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 69a3b8576da..3fb8014dbaa 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -25,14 +25,11 @@
var/health_deficiency = max(1 - (health / maxHealth) * 100, staminaloss)
- //RUTGMC EDIT ADDITION BEGIN - Preds
if(health_deficiency >= 50 && !(species?.species_flags & PARALYSE_RESISTANT))
-//RUTGMC EDIT ADDITION END
add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, TRUE, 0, NONE, TRUE, health_deficiency / 50)
else
remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
-
/mob/living/carbon/human/adjustBrainLoss(amount, silent = FALSE)
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 590f43c6feb..e5f06bcc801 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -61,14 +61,13 @@ Contains most of the procs that are called when a mob is attacked by something
/mob/living/carbon/human/emp_act(severity)
for(var/obj/O in src)
- if(!O) continue
+ if(!O)
+ continue
O.emp_act(severity)
for(var/datum/limb/O in limbs)
- if(O.limb_status & LIMB_DESTROYED) continue
+ if(O.limb_status & LIMB_DESTROYED)
+ continue
O.emp_act(severity)
- for(var/datum/internal_organ/I in O.internal_organs)
- if(I.robotic == 0) continue
- I.emp_act(severity)
..()
/mob/living/carbon/human/has_smoke_protection()
@@ -95,7 +94,6 @@ Contains most of the procs that are called when a mob is attacked by something
var/datum/internal_organ/lungs/L = get_organ_slot(ORGAN_SLOT_LUNGS)
L?.take_damage(1, TRUE)
-
//Returns 1 if the attack hit, 0 if it missed.
/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone)
@@ -412,7 +410,6 @@ Contains most of the procs that are called when a mob is attacked by something
visible_message(span_notice("[user] ripped off [src]'s heart!"), span_notice("You ripped off [src]'s heart!"))
remove_organ_slot(ORGAN_SLOT_HEART)
var/obj/item/organ/heart/heart = new
- heart.die()
user.put_in_hands(heart)
chestburst = 2
update_burst()
diff --git a/code/modules/mob/living/carbon/human/human_status_procs.dm b/code/modules/mob/living/carbon/human/human_status_procs.dm
index ac8f9e795be..31ee2e131fe 100644
--- a/code/modules/mob/living/carbon/human/human_status_procs.dm
+++ b/code/modules/mob/living/carbon/human/human_status_procs.dm
@@ -63,13 +63,17 @@
return //Machines don't throw up.
return ..()
+/mob/living/carbon/human/do_vomit()
+ . = ..()
+ var/datum/internal_organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
+ for(var/datum/reagent/our_reagent in belly.reagents.reagent_list)
+ belly.reagents.remove_reagent(our_reagent.type, our_reagent.volume / rand(2, 5)) // vomit out some reagents from our stomach
/mob/living/carbon/human/adjust_ear_damage(damage = 0, deaf = 0)
if(isspeciessynthetic(src))
return
return ..()
-
/mob/living/carbon/human/set_ear_damage(damage = 0, deaf = 0)
if(isspeciessynthetic(src))
return
diff --git a/code/modules/mob/living/carbon/human/life/handle_organs.dm b/code/modules/mob/living/carbon/human/life/handle_organs.dm
index 45e7a08c54d..cec33540fe4 100644
--- a/code/modules/mob/living/carbon/human/life/handle_organs.dm
+++ b/code/modules/mob/living/carbon/human/life/handle_organs.dm
@@ -40,7 +40,7 @@
if(E.is_broken() && E.internal_organs && prob(15))
var/datum/internal_organ/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.display_name]!", 1)
- I.take_damage(rand(3,5))
+ I.take_damage(rand(3, 5))
//Moving makes open wounds get infected much faster
if(!(E.limb_wound_status & LIMB_WOUND_DISINFECTED) && E.brute_dam >= 20)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 71759dc4685..4e9529fc639 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -104,6 +104,7 @@
ORGAN_SLOT_HEART = /datum/internal_organ/heart,
ORGAN_SLOT_LUNGS = /datum/internal_organ/lungs,
ORGAN_SLOT_LIVER = /datum/internal_organ/liver,
+ ORGAN_SLOT_STOMACH = /datum/internal_organ/stomach,
ORGAN_SLOT_KIDNEYS = /datum/internal_organ/kidneys,
ORGAN_SLOT_BRAIN = /datum/internal_organ/brain,
ORGAN_SLOT_APPENDIX = /datum/internal_organ/appendix,
@@ -159,8 +160,8 @@
organless_human.limbs += new/datum/limb/foot/l_foot(new_l_leg, organless_human)
organless_human.limbs += new/datum/limb/foot/r_foot(new_r_leg, organless_human)
- for(var/organ in has_organ)
- var/organ_type = has_organ[organ]
+ for(var/datum/internal_organ/organ AS in has_organ)
+ var/datum/internal_organ/organ_type = has_organ[organ]
organless_human.internal_organs_by_name[organ] = new organ_type(organless_human)
if(species_flags & ROBOTIC_LIMBS)
@@ -168,9 +169,6 @@
if(robotic_limb.limb_status & LIMB_DESTROYED)
continue
robotic_limb.add_limb_flags(LIMB_ROBOT)
- for(var/datum/internal_organ/my_cold_heart in organless_human.internal_organs)
- my_cold_heart.mechanize()
-
/datum/species/proc/hug(mob/living/carbon/human/H, mob/living/target)
if(H.zone_selected == "head")
diff --git a/code/modules/mob/living/carbon/human/zombie.dm b/code/modules/mob/living/carbon/human/zombie.dm
index fdf578343ba..f4230361587 100644
--- a/code/modules/mob/living/carbon/human/zombie.dm
+++ b/code/modules/mob/living/carbon/human/zombie.dm
@@ -14,8 +14,9 @@
ORGAN_SLOT_HEART = /datum/internal_organ/heart,
ORGAN_SLOT_LUNGS = /datum/internal_organ/lungs,
ORGAN_SLOT_LIVER = /datum/internal_organ/liver,
+ ORGAN_SLOT_STOMACH = /datum/internal_organ/stomach,
ORGAN_SLOT_KIDNEYS = /datum/internal_organ/kidneys,
- ORGAN_SLOT_BRAIN = /datum/internal_organ/brain/zombie,
+ ORGAN_SLOT_BRAIN = /datum/internal_organ/brain,
ORGAN_SLOT_APPENDIX = /datum/internal_organ/appendix,
ORGAN_SLOT_EYES = /datum/internal_organ/eyes
)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 2c363c84446..267107bda31 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -94,8 +94,6 @@
if(hallucination >= 20) // hallucinations require stacking before triggering
handle_hallucinations()
-
-
if(staminaloss > -max_stamina)
handle_staminaloss()
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index 86d24b3aec9..62945f7a3e1 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -88,7 +88,8 @@
//Internal organs hurt too
for(var/datum/internal_organ/O in M.internal_organs)
- if(O.damage) traumatic_shock += O.damage * 1.5
+ if(O.damage)
+ traumatic_shock += O.damage * 1.5
if(M.protection_aura)
traumatic_shock -= 20 + M.protection_aura * 20 //-40 pain for SLs, -80 for Commanders
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
index 473618de646..1b7690ac00a 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/carrier/abilities_carrier.dm
@@ -8,7 +8,6 @@
GLOBAL_LIST_INIT(hugger_type_list, list(
/obj/item/clothing/mask/facehugger/larval,
/obj/item/clothing/mask/facehugger/combat/slash,
-// /obj/item/clothing/mask/facehugger/combat/neuro, RU TGMC EDIT
/obj/item/clothing/mask/facehugger/combat/acid,
/obj/item/clothing/mask/facehugger/combat/resin,
))
@@ -16,7 +15,6 @@ GLOBAL_LIST_INIT(hugger_type_list, list(
GLOBAL_LIST_INIT(hugger_to_ammo, list(
/obj/item/clothing/mask/facehugger/larval = /datum/ammo/xeno/hugger,
/obj/item/clothing/mask/facehugger/combat/slash = /datum/ammo/xeno/hugger/slash,
-// /obj/item/clothing/mask/facehugger/combat/neuro = /datum/ammo/xeno/hugger/neuro, RU TGMC EDIT
/obj/item/clothing/mask/facehugger/combat/acid = /datum/ammo/xeno/hugger/acid,
/obj/item/clothing/mask/facehugger/combat/resin = /datum/ammo/xeno/hugger/resin,
))
@@ -25,7 +23,6 @@ GLOBAL_LIST_INIT(hugger_to_ammo, list(
GLOBAL_LIST_INIT(hugger_images_list, list(
LARVAL_HUGGER = image('icons/Xeno/actions.dmi', icon_state = LARVAL_HUGGER),
CLAWED_HUGGER = image('icons/Xeno/actions.dmi', icon_state = CLAWED_HUGGER),
-// NEURO_HUGGER = image('icons/Xeno/actions.dmi', icon_state = NEURO_HUGGER ), RU TGMC EDIT
ACID_HUGGER = image('icons/Xeno/actions.dmi', icon_state = ACID_HUGGER),
RESIN_HUGGER = image('icons/Xeno/actions.dmi', icon_state = RESIN_HUGGER),
))
@@ -443,7 +440,7 @@ GLOBAL_LIST_INIT(hugger_images_list, list(
victim.apply_damage(stamina_dmg, STAMINA)
var/datum/internal_organ/O
- for(var/i in list(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER))
+ for(var/i in list(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH))
O = victim.get_organ_slot(i)
O.take_damage(debuff, TRUE)
diff --git a/code/modules/mob/living/carbon/xenomorph/embryo.dm b/code/modules/mob/living/carbon/xenomorph/embryo.dm
index 85dccb814ea..33435bd6947 100644
--- a/code/modules/mob/living/carbon/xenomorph/embryo.dm
+++ b/code/modules/mob/living/carbon/xenomorph/embryo.dm
@@ -17,7 +17,6 @@
var/hivenumber = XENO_HIVE_NORMAL
var/admin = FALSE
-
/obj/item/alien_embryo/Initialize(mapload)
. = ..()
if(!isliving(loc))
@@ -221,7 +220,7 @@
var/mob/living/carbon/human/H = victim
H.apply_damage(200, BRUTE, H.get_limb("chest"), updating_health = TRUE) //lethal armor ignoring brute damage
var/datum/internal_organ/O
- for(var/i in list(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER, ORGAN_SLOT_KIDNEYS, ORGAN_SLOT_APPENDIX)) //Bruise all torso internal organs
+ for(var/i in list(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER, ORGAN_SLOT_KIDNEYS, ORGAN_SLOT_APPENDIX, ORGAN_SLOT_STOMACH)) //Bruise all torso internal organs
O = H.get_organ_slot(i)
if(!H.mind && !H.client) //If we have no client or mind, permadeath time; remove the organs. Mainly for the NPC colonist bodies
@@ -233,7 +232,6 @@
new /datum/wound/internal_bleeding(15, chest) //Apply internal bleeding to chest
chest.fracture()
-
victim.chestburst = 2
victim.update_burst()
log_combat(src, null, "chestbursted as a larva.")
diff --git a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
index 34a00f520cb..70f247decc9 100644
--- a/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xenomorph.dm
@@ -366,9 +366,6 @@
/mob/living/carbon/xenomorph/get_eye_protection()
return 2
-/mob/living/carbon/xenomorph/vomit()
- return
-
/mob/living/carbon/xenomorph/reagent_check(datum/reagent/R) //For the time being they can't metabolize chemicals.
return TRUE
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2ed59ba3a5d..980e0f8f9cf 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -619,11 +619,6 @@ below 100 is not dizzy
var/datum/action/A = X
A.update_button_icon()
-
-/mob/living/proc/vomit()
- return
-
-
/mob/living/proc/take_over(mob/M, bypass)
if(!M.mind)
to_chat(M, span_warning("You don't have a mind."))
diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm
index 73e629c7d0b..99b1f70b986 100644
--- a/code/modules/mob/living/living_health_procs.dm
+++ b/code/modules/mob/living/living_health_procs.dm
@@ -324,7 +324,6 @@
return ..()
-
/mob/living/carbon/human/revive(admin_revive = FALSE)
restore_all_organs()
@@ -350,6 +349,8 @@
I.heal_organ_damage(I.damage)
reagents.clear_reagents() //and clear all reagents in them
+ var/datum/internal_organ/stomach/belly = get_organ_slot(ORGAN_SLOT_STOMACH)
+ belly.reagents.clear_reagents()
REMOVE_TRAIT(src, TRAIT_UNDEFIBBABLE, TRAIT_UNDEFIBBABLE)
REMOVE_TRAIT(src, TRAIT_PSY_DRAINED, TRAIT_PSY_DRAINED)
dead_ticks = 0
@@ -358,7 +359,6 @@
update_hair()
return ..()
-
/mob/living/carbon/xenomorph/revive(admin_revive = FALSE)
set_plasma(xeno_caste.plasma_max)
sunder = 0
diff --git a/code/modules/organs/_organ.dm b/code/modules/organs/_organ.dm
new file mode 100644
index 00000000000..e1153728b13
--- /dev/null
+++ b/code/modules/organs/_organ.dm
@@ -0,0 +1,78 @@
+/datum/internal_organ
+ var/name = "organ"
+ /// Reference to the mob owning the organs
+ var/mob/living/carbon/human/owner = null
+ /// Reference to the limb we're inside of
+ var/datum/limb/parent_limb = BODY_ZONE_CHEST
+ /// amount of damage to the organ
+ var/damage = 0
+ /// amount of damage after which the organ gets bruised flag
+ var/min_bruised_damage = 10
+ /// amount of damage after which the organ gets broken flag
+ var/min_broken_damage = 30
+ /// State of the organ
+ var/organ_status = ORGAN_HEALTHY
+ /// What slot does it go in?
+ var/slot
+ /// Will peri affect this organ? Thus ignores eyes, ears and brain
+ var/peri_effect = FALSE
+
+//This is used in the create_organs() which transfers human datums to organs
+/datum/internal_organ/New(mob/living/carbon/carbon_mob)
+ ..()
+ if(!istype(carbon_mob))
+ return
+
+ carbon_mob.internal_organs |= src
+ owner = carbon_mob
+
+ var/mob/living/carbon/human/human = carbon_mob
+ var/datum/limb/limb = human.get_limb(parent_limb)
+ LAZYDISTINCTADD(limb.internal_organs, src)
+
+/datum/internal_organ/Destroy()
+ clean_owner()
+ return ..()
+
+///Signal handler to prevent hard del
+/datum/internal_organ/proc/clean_owner()
+ SIGNAL_HANDLER
+ owner = null
+
+/datum/internal_organ/proc/take_damage(amount, silent = FALSE)
+ if(SSticker.mode?.flags_round_type & MODE_NO_PERMANENT_WOUNDS)
+ return
+ if(amount <= 0)
+ heal_organ_damage(-amount)
+ return
+ damage += amount
+
+ var/datum/limb/parent = owner.get_limb(parent_limb)
+ if(!silent)
+ owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1)
+ set_organ_status()
+
+/datum/internal_organ/proc/heal_organ_damage(amount)
+ damage = max(damage - amount, 0)
+ set_organ_status()
+
+/// Set the correct organ state
+/datum/internal_organ/proc/set_organ_status()
+ if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/peridaxon) >= 0.1 && peri_effect) //0.1 just in case
+ if(organ_status != ORGAN_HEALTHY)
+ organ_status = ORGAN_HEALTHY
+ return TRUE
+ return FALSE
+ else if(damage > min_broken_damage)
+ if(organ_status != ORGAN_BROKEN)
+ organ_status = ORGAN_BROKEN
+ return TRUE
+ return FALSE
+ else if(damage > min_bruised_damage)
+ if(organ_status != ORGAN_BRUISED)
+ organ_status = ORGAN_BRUISED
+ return TRUE
+ return FALSE
+ else if(organ_status != ORGAN_HEALTHY)
+ organ_status = ORGAN_HEALTHY
+ return TRUE
diff --git a/code/modules/organs/limb_objects.dm b/code/modules/organs/limb_objects.dm
index 009885c5dcb..d3ca45f6c69 100644
--- a/code/modules/organs/limb_objects.dm
+++ b/code/modules/organs/limb_objects.dm
@@ -1,4 +1,3 @@
-
/obj/item/limb
icon = 'icons/mob/human_races/r_human.dmi'
item_icons = list(
diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm
index 4777b1465cf..84fe689a4c8 100644
--- a/code/modules/organs/limbs.dm
+++ b/code/modules/organs/limbs.dm
@@ -185,7 +185,7 @@
if(internal_organs && ((sharp && brute >= 10) || brute >= 20) && prob(5))
//Damage an internal organ
var/datum/internal_organ/I = pick(internal_organs)
- I.take_damage(brute / 2)
+ I.get_damage(brute / 2)
brute -= brute / 2
RU TGMC EDIT */
if(limb_status & LIMB_BROKEN && prob(40) && brute)
@@ -506,12 +506,11 @@ Note that amputating the affected organ does in fact remove the infection from t
owner.adjustToxLoss(1)
if (prob(1))
to_chat(owner, span_notice("You have a high fever!"))
-//Not technically a germ effect, but derived from it
+ //Not technically a germ effect, but derived from it
if(limb_status & LIMB_NECROTIZED)
for(var/datum/internal_organ/organ AS in internal_organs)
organ.take_damage(0.2, silent = TRUE) //1 point every 10 seconds, 100 seconds to bruise, five minutes to broken.
-
///Updating wounds. Handles natural damage healing from limb treatments and processes internal wounds
/datum/limb/proc/update_wounds(limb_regen_penalty = 1)
diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm
deleted file mode 100644
index 9f67598b0f4..00000000000
--- a/code/modules/organs/organ_alien.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-//XENOMORPH ORGANS
-/datum/internal_organ/xenos/eggsac
- name = "egg sac"
- parent_limb = "groin"
- removed_type = /obj/item/organ/xenos/eggsac
-
-/datum/internal_organ/xenos/plasmavessel
- name = "plasma vessel"
- parent_limb = "chest"
- removed_type = /obj/item/organ/xenos/plasmavessel
- var/stored_plasma = 0
- var/max_plasma = 500
-
-/datum/internal_organ/xenos/plasmavessel/queen
- name = "bloated plasma vessel"
- stored_plasma = 200
- max_plasma = 500
-
-/datum/internal_organ/xenos/plasmavessel/sentinel
- stored_plasma = 100
- max_plasma = 250
-
-/datum/internal_organ/xenos/plasmavessel/hunter
- name = "tiny plasma vessel"
- stored_plasma = 100
- max_plasma = 150
-
-/datum/internal_organ/xenos/acidgland
- name = "acid gland"
- parent_limb = "head"
- removed_type = /obj/item/organ/xenos/acidgland
-
-/datum/internal_organ/xenos/hivenode
- name = "hive node"
- parent_limb = "chest"
- removed_type = /obj/item/organ/xenos/hivenode
-
-/datum/internal_organ/xenos/resinspinner
- name = "resin spinner"
- parent_limb = "head"
- removed_type = /obj/item/organ/xenos/resinspinner
-
-/obj/item/organ/xenos
- name = "xeno organ"
- icon = 'icons/effects/blood.dmi'
- desc = "It smells like an accident in a chemical factory."
-
-/obj/item/organ/xenos/eggsac
- name = "egg sac"
- icon_state = "xgibmid1"
- organ_tag = "egg sac"
- organ_type = /datum/internal_organ/xenos/eggsac
-
-/obj/item/organ/xenos/plasmavessel
- name = "plasma vessel"
- icon_state = "xgibdown1"
- organ_tag = "plasma vessel"
- organ_type = /datum/internal_organ/xenos/plasmavessel
-
-/obj/item/organ/xenos/acidgland
- name = "acid gland"
- icon_state = "xgibtorso"
- organ_tag = "acid gland"
- organ_type = /datum/internal_organ/xenos/acidgland
-
-/obj/item/organ/xenos/hivenode
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "hive node"
- organ_type = /datum/internal_organ/xenos/hivenode
-
-/obj/item/organ/xenos/resinspinner
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "resin spinner"
- organ_type = /datum/internal_organ/xenos/resinspinner
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
deleted file mode 100644
index 7cd45adcf08..00000000000
--- a/code/modules/organs/organ_internal.dm
+++ /dev/null
@@ -1,403 +0,0 @@
-
-/****************************************************
- INTERNAL ORGANS
-****************************************************/
-
-
-/datum/internal_organ
- var/name = "organ"
- var/mob/living/carbon/human/owner = null
- var/vital //Lose a vital limb, die immediately.
- var/damage = 0 // amount of damage to the organ
- var/min_bruised_damage = 10
- var/min_broken_damage = 30
- var/parent_limb = "chest"
- var/robotic = 0 //1 for 'assisted' organs (e.g. pacemaker), 2 for actual cyber organ.
- var/removed_type //When removed, forms this object.
- var/robotic_type //robotic version of removed_type, used in mechanize().
- var/obj/item/organ/organ_holder // If not in a body, held in this item.
- var/list/transplant_data
- var/organ_id
- /// State of the organ
- var/organ_status = ORGAN_HEALTHY
- var/peri_effect = FALSE
-
-/datum/internal_organ/process()
- return 0
-
-/datum/internal_organ/Destroy()
- owner = null
- organ_holder = null
- return ..()
-
-/datum/internal_organ/New(mob/living/carbon/carbon_mob)
- ..()
- if(!istype(carbon_mob))
- return
-
- carbon_mob.internal_organs |= src
- owner = carbon_mob
- RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(clean_owner))
-
- if(!ishuman(carbon_mob))
- return
- var/mob/living/carbon/human/human = carbon_mob
- var/datum/limb/limb = human.get_limb(parent_limb)
- LAZYDISTINCTADD(limb.internal_organs, src)
-
-///Signal handler to prevent hard del
-/datum/internal_organ/proc/clean_owner()
- SIGNAL_HANDLER
- owner = null
-
-/datum/internal_organ/proc/take_damage(amount, silent= FALSE)
- if(SSticker.mode?.flags_round_type & MODE_NO_PERMANENT_WOUNDS)
- return
- if(amount <= 0)
- heal_organ_damage(-amount)
- return
- if(robotic == ORGAN_ROBOT)
- damage += (amount * 0.8)
- else
- damage += amount
-
- var/datum/limb/parent = owner.get_limb(parent_limb)
- if (!silent)
- owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1)
- set_organ_status()
-
-/// Set the correct organ state
-/datum/internal_organ/proc/set_organ_status()
- if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/peridaxon) >= 0.1 && peri_effect) //0.1 just in case
- if(organ_status != ORGAN_HEALTHY)
- organ_status = ORGAN_HEALTHY
- return TRUE
- return FALSE
- if(damage > min_broken_damage)
- if(organ_status != ORGAN_BROKEN)
- organ_status = ORGAN_BROKEN
- return TRUE
- return FALSE
- if(damage > min_bruised_damage)
- if(organ_status != ORGAN_BRUISED)
- organ_status = ORGAN_BRUISED
- return TRUE
- return FALSE
- if(organ_status != ORGAN_HEALTHY)
- organ_status = ORGAN_HEALTHY
- return TRUE
-
-/datum/internal_organ/proc/heal_organ_damage(amount)
- damage = max(damage - amount, 0)
- set_organ_status()
-
-/datum/internal_organ/proc/emp_act(severity)
- switch(robotic)
- if(0)
- return
- if(1)
- switch (severity)
- if (1.0)
- take_damage(20,0)
- return
- if (2.0)
- take_damage(7,0)
- return
- if(3.0)
- take_damage(3,0)
- return
- if(2)
- switch (severity)
- if (1.0)
- take_damage(40,0)
- return
- if (2.0)
- take_damage(15,0)
- return
- if(3.0)
- take_damage(10,0)
- return
-
-/datum/internal_organ/proc/mechanize() //Being used to make robutt hearts, etc
- if(robotic_type)
- robotic = ORGAN_ROBOT
- removed_type = robotic_type
-
-
-/datum/internal_organ/proc/mechassist() //Used to add things like pacemakers, etc
- robotic = ORGAN_ASSISTED
- min_bruised_damage = 15
- min_broken_damage = 35
-
-/****************************************************
- INTERNAL ORGANS TYPES
-****************************************************/
-
-/datum/internal_organ/heart // This is not set to vital because death immediately occurs in blood.dm if it is removed. Also, all damage effects are handled there.
- name = "heart"
- parent_limb = "chest"
- removed_type = /obj/item/organ/heart
- robotic_type = /obj/item/organ/heart/prosthetic
- organ_id = ORGAN_HEART
- peri_effect = TRUE
-
-/datum/internal_organ/heart/process()
- . = ..()
-
- if(organ_status == ORGAN_BRUISED && prob(5))
- owner.emote("me", 1, "grabs at [owner.p_their()] chest!")
- else if(organ_status == ORGAN_BROKEN && prob(20))
- owner.emote("me", 1, "clutches [owner.p_their()] chest!")
-
-/datum/internal_organ/heart/set_organ_status()
- var/old_organ_status = organ_status
- . = ..()
- if(!.)
- return
- owner.max_stamina_buffer += (old_organ_status - organ_status) * 25
- owner.maxHealth += (old_organ_status - organ_status) * 20
-
-/datum/internal_organ/heart/prosthetic //used by synthetic species
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/heart/prosthetic
-
-/datum/internal_organ/lungs
- name = "lungs"
- parent_limb = "chest"
- removed_type = /obj/item/organ/lungs
- robotic_type = /obj/item/organ/lungs/prosthetic
- organ_id = ORGAN_LUNGS
- peri_effect = TRUE
-
-/datum/internal_organ/lungs/process()
- ..()
-
- if((organ_status == ORGAN_BRUISED && prob(5)) || (organ_status == ORGAN_BROKEN && prob(20)))
- owner.emote("me", 1, "gasps for air!")
-
-/datum/internal_organ/lungs/set_organ_status()
- . = ..()
- if(!.)
- return
- owner.add_stamina_regen_modifier(name, organ_status * -0.40) // For example, bruised lungs will reduce stamina regen by 40%, broken by 80%
- owner.add_movespeed_modifier(id = name, override = TRUE, multiplicative_slowdown = organ_status) // Slowdown added when the heart is damaged
-
-
-/datum/internal_organ/lungs/take_damage(amount, silent= FALSE)
- owner.adjust_Losebreath(amount) //Hits of 1 damage or less won't do anything due to how losebreath works, but any stronger and we'll get the wind knocked out of us for a bit. Mostly just flavor.
- return ..()
-
-/datum/internal_organ/lungs/prosthetic
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/lungs/prosthetic
-
-
-/datum/internal_organ/liver
- name = "liver"
- parent_limb = "chest"
- removed_type = /obj/item/organ/liver
- robotic_type = /obj/item/organ/liver/prosthetic
- organ_id = ORGAN_LIVER
- peri_effect = TRUE
- ///lower value, higher resistance.
- var/alcohol_tolerance = 0.005
- ///How fast we clean out toxins/toxloss. Adjusts based on organ damage.
- var/filter_rate = 3
-
-/datum/internal_organ/liver/process()
- ..()
-
- //High toxins levels are dangerous if you aren't actively treating them. 100 seconds to hit bruised from this alone
- if(owner.getToxLoss() >= (80 - 20 * organ_status))
- //Healthy liver suffers on its own
- if (organ_status != ORGAN_BROKEN)
- take_damage(0.2, TRUE)
- //Damaged one shares the fun
- else
- var/datum/internal_organ/O = pick(owner.internal_organs)
- O?.take_damage(0.2, TRUE)
-
- // Heal a bit if needed and we're not busy. This allows recovery from low amounts of toxins.
- if(!owner.drunkenness && owner.getToxLoss() <= 15 && organ_status == ORGAN_HEALTHY)
- heal_organ_damage(0.04)
-
- // Do some reagent filtering/processing.
- for(var/datum/reagent/potential_toxin AS in owner.reagents.reagent_list)
- //Liver helps clear out any toxins but with drawbacks if damaged
- if(istype(potential_toxin, /datum/reagent/consumable/ethanol) || istype(potential_toxin, /datum/reagent/toxin))
- if(organ_status != ORGAN_HEALTHY)
- owner.adjustToxLoss(0.3 * organ_status)
- owner.reagents.remove_reagent(potential_toxin.type, potential_toxin.custom_metabolism * filter_rate * 0.1)
-
- //Heal toxin damage slowly if not damaged. If broken, increase it instead.
- owner.adjustToxLoss((2 - filter_rate) * 0.1)
- if(prob(organ_status)) //Just under once every three minutes while bruised, twice as often while broken.
- owner.vomit() //No stomach, so the liver can cause vomiting instead. Stagger and slowdown plus feedback that something's wrong.
-
-/datum/internal_organ/liver/set_organ_status()
- . = ..()
- if(!.)
- return
- filter_rate = initial(filter_rate) - organ_status
-
-/datum/internal_organ/liver/prosthetic
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/liver/prosthetic
- alcohol_tolerance = 0.003
-
-/datum/internal_organ/kidneys
- name = "kidneys"
- parent_limb = "groin"
- removed_type = /obj/item/organ/kidneys
- robotic_type = /obj/item/organ/kidneys/prosthetic
- organ_id = ORGAN_KIDNEYS
- peri_effect = TRUE
- ///Tracks the number of reagent/medicine datums we currently have
- var/current_medicine_count = 0
- ///How many drugs we can take before they overwhelm us. Decreases with damage
- var/current_medicine_cap = 5
- ///Additional medicine capacity given by the freyr module.
- var/freyr_medicine_cap = 3
- ///Whether we were over cap the last time we checked.
- var/old_overflow = FALSE
- ///Total medicines added since last tick
- var/new_medicines = 0
- ///Total medicines removed since last tick
- var/removed_medicines = 0
-
-/datum/internal_organ/kidneys/New(mob/living/carbon/carbon_mob)
- . = ..()
- if(!carbon_mob)
- return
- RegisterSignal(carbon_mob.reagents, COMSIG_NEW_REAGENT_ADD, PROC_REF(owner_added_reagent))
- RegisterSignal(carbon_mob.reagents, COMSIG_REAGENT_DELETING, PROC_REF(owner_removed_reagent))
-
-/datum/internal_organ/kidneys/clean_owner()
- if(owner?.reagents)
- UnregisterSignal(owner.reagents, list(COMSIG_NEW_REAGENT_ADD, COMSIG_REAGENT_DELETING))
- return ..()
-
-///Signaled proc. Check if the added reagent was under reagent/medicine. If so, increment medicine counter and potentially notify owner.
-/datum/internal_organ/kidneys/proc/owner_added_reagent(datum/source, reagent_type, amount)
- SIGNAL_HANDLER
- if(!ispath(reagent_type, /datum/reagent/medicine))
- return
- new_medicines++
-
-///Signaled proc. Check if the removed reagent was under reagent/medicine. If so, decrement medicine counter and potentially notify owner.
-/datum/internal_organ/kidneys/proc/owner_removed_reagent(datum/source, reagent_type)
- SIGNAL_HANDLER
- if(!ispath(reagent_type, /datum/reagent/medicine))
- return
- removed_medicines++
-
-/datum/internal_organ/kidneys/set_organ_status()
- . = ..()
- if(!.)
- return
- current_medicine_cap = initial(current_medicine_cap) - 2 * organ_status
-
-/datum/internal_organ/kidneys/process()
- ..()
-
- var/bypass = FALSE
-
- if(owner.bodytemperature <= 170) //No sense worrying about a chem cap if we're in cryo anyway. Still need to clear tick counts.
- bypass = TRUE
-
- var/medicine_cap = current_medicine_cap
-
- if(SEND_SIGNAL(owner, COMSIG_LIVING_UPDATE_PLANE_BLUR) & COMPONENT_CANCEL_BLUR)
- medicine_cap += freyr_medicine_cap
-
- current_medicine_count += new_medicines //We want to include medicines that were individually both added and removed this tick
- var/overflow = current_medicine_count - medicine_cap //This catches any case where a reagent was added with volume below its metabolism
- current_medicine_count -= removed_medicines //Otherwise, you can microdose infinite chems without kidneys complaining
-
- new_medicines = 0
- removed_medicines = 0
-
- if(overflow < 1 || bypass)
- if(old_overflow)
- to_chat(owner, span_notice("You don't feel as overwhelmed by all the drugs any more."))
- old_overflow = FALSE
- return
-
- if(!old_overflow)
- to_chat(owner, span_warning("All the different drugs in you are starting to make you feel off..."))
- old_overflow = TRUE
-
- owner.set_drugginess(3)
- if(prob(overflow * (organ_status + 1) * 10))
- owner.Confused(2 SECONDS * (organ_status + 1))
-
-/datum/internal_organ/kidneys/prosthetic
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/kidneys
-
-/datum/internal_organ/brain
- name = "brain"
- parent_limb = "head"
- removed_type = /obj/item/organ/brain
- robotic_type = /obj/item/organ/brain/prosthetic
- vital = TRUE
- organ_id = ORGAN_BRAIN
-
-/datum/internal_organ/brain/set_organ_status()
- var/old_organ_status = organ_status
- . = ..()
- if(!.)
- return
- owner.set_skills(owner.skills.modifyAllRatings(old_organ_status - organ_status))
- if(organ_status >= ORGAN_BRUISED)
- ADD_TRAIT(owner, TRAIT_DROOLING, BRAIN_TRAIT)
- else
- REMOVE_TRAIT(owner, TRAIT_DROOLING, BRAIN_TRAIT)
-
-/datum/internal_organ/brain/prosthetic //used by synthetic species
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/brain/prosthetic
-
-/datum/internal_organ/brain/xeno
- removed_type = /obj/item/organ/brain/xeno
- robotic_type = null
-
-/datum/internal_organ/brain/zombie
- vital = FALSE
-
-/datum/internal_organ/eyes
- name = "eyes"
- parent_limb = "head"
- removed_type = /obj/item/organ/eyes
- robotic_type = /obj/item/organ/eyes/prosthetic
- var/eye_surgery_stage = 0 //stores which stage of the eye surgery the eye is at
- organ_id = ORGAN_EYES
-
-/datum/internal_organ/eyes/process() //Eye damage replaces the old eye_stat var.
- ..()
- if(organ_status == ORGAN_BRUISED)
- owner.set_blurriness(20)
- if(organ_status == ORGAN_BROKEN)
- owner.set_blindness(20)
-
-/datum/internal_organ/eyes/prosthetic
- robotic = ORGAN_ROBOT
- removed_type = /obj/item/organ/eyes/prosthetic
-
-
-/datum/internal_organ/appendix
- name = "appendix"
- parent_limb = "groin"
- removed_type = /obj/item/organ/appendix
- organ_id = ORGAN_APPENDIX
-
-/datum/internal_organ/proc/remove(mob/user)
-
- if(!removed_type) return 0
-
- var/obj/item/organ/removed_organ = new removed_type(get_turf(user), src)
-
- if(istype(removed_organ))
- organ_holder = removed_organ
-
- return removed_organ
diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm
deleted file mode 100644
index 5bd3b540759..00000000000
--- a/code/modules/organs/organ_objects.dm
+++ /dev/null
@@ -1,225 +0,0 @@
-/obj/item/organ
- name = "organ"
- desc = "It looks like it probably just plopped out."
- icon = 'icons/obj/items/organs.dmi'
- item_icons = list(
- slot_l_hand_str = 'icons/mob/inhands/items/bodyparts_left.dmi',
- slot_r_hand_str = 'icons/mob/inhands/items/bodyparts_right.dmi',
- )
-
- icon_state = "appendix"
-
- max_integrity = 100 // Process() ticks before death.
-
- var/fresh = 3 // Squirts of blood left in it.
- var/dead_icon // Icon used when the organ dies.
- var/robotic // Is the limb prosthetic?
- var/organ_tag // What slot does it go in?
- var/organ_type = /datum/internal_organ // Used to spawn the relevant organ data when produced via a machine or spawn().
- var/datum/internal_organ/organ_data // Stores info when removed.
-
-/obj/item/organ/attack_self(mob/user as mob)
-
- // Convert it to an edible form, yum yum.
- if(!robotic && user.a_intent == INTENT_HELP && user.zone_selected == "mouth")
- bitten(user)
- return
-
-/obj/item/organ/Initialize(mapload, organ_datum)
- . = ..()
- create_reagents(5)
- if(organ_datum)
- organ_data = organ_datum
- else
- organ_data = new organ_type()
- if(!robotic)
- START_PROCESSING(SSobj, src)
-
-
-/obj/item/organ/Destroy()
- if(!robotic)
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/organ/process()
-
- if(robotic)
- STOP_PROCESSING(SSobj, src)
- return
-
- // Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature?
- if(istype(loc,/obj/item/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer))
- return
-
- if(fresh && prob(40))
- fresh--
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
- if(B)
- var/turf/TU = get_turf(src)
- var/list/L = list()
- if(B.data["blood_DNA"])
- L = list(B.data["blood_DNA"] = B.data["blood_type"])
- TU.add_blood(L, B.color)
- //blood_splatter(src,B,1)
-
- take_damage(rand(0,1))
- if(obj_integrity <= 0)
- die()
-
-/obj/item/organ/proc/die()
- name = "dead [initial(name)]"
- if(dead_icon) icon_state = dead_icon
- obj_integrity = 0
- STOP_PROCESSING(SSobj, src)
- //TODO: Grey out the icon state.
- //TODO: Inject an organ with peridaxon to make it alive again.
-
-// Brain is defined in brain_item.dm.
-/obj/item/organ/heart
- name = "heart"
- icon_state = "heart-on"
- organ_tag = ORGAN_SLOT_HEART
- fresh = 6 // Juicy.
- dead_icon = "heart-off"
- organ_type = /datum/internal_organ/heart
-
-/obj/item/organ/lungs
- name = "lungs"
- icon_state = "lungs"
- gender = PLURAL
- organ_tag = ORGAN_SLOT_LUNGS
- organ_type = /datum/internal_organ/lungs
-
-/obj/item/organ/kidneys
- name = "kidneys"
- icon_state = "kidneys"
- gender = PLURAL
- organ_tag = ORGAN_SLOT_KIDNEYS
- organ_type = /datum/internal_organ/kidneys
-
-/obj/item/organ/eyes
- name = "eyeballs"
- icon_state = "eyes"
- gender = PLURAL
- organ_tag = ORGAN_SLOT_EYES
- organ_type = /datum/internal_organ/eyes
- var/eye_colour
-
-/obj/item/organ/liver
- name = "liver"
- icon_state = "liver"
- organ_tag = ORGAN_SLOT_LIVER
- organ_type = /datum/internal_organ/liver
-
-/obj/item/organ/appendix
- name = "appendix"
- icon_state = "appendix"
- organ_type = /datum/internal_organ/appendix
- organ_tag = ORGAN_SLOT_APPENDIX
-
-//These are here so they can be printed out via the fabricator.
-/obj/item/organ/heart/prosthetic
- name = "circulatory pump"
- icon_state = "heart-prosthetic"
- robotic = ORGAN_ROBOT
- organ_type = /datum/internal_organ/heart/prosthetic
-
-/obj/item/organ/lungs/prosthetic
- robotic = ORGAN_ROBOT
- name = "gas exchange system"
- icon_state = "lungs-prosthetic"
- organ_type = /datum/internal_organ/lungs/prosthetic
-
-/obj/item/organ/kidneys/prosthetic
- robotic = ORGAN_ROBOT
- name = "prosthetic kidneys"
- icon_state = "kidneys-prosthetic"
- organ_type = /datum/internal_organ/kidneys/prosthetic
-
-
-/obj/item/organ/eyes/prosthetic
- robotic = ORGAN_ROBOT
- name = "visual prosthesis"
- icon_state = "eyes-prosthetic"
- organ_type = /datum/internal_organ/eyes/prosthetic
-
-/obj/item/organ/liver/prosthetic
- robotic = ORGAN_ROBOT
- name = "toxin filter"
- icon_state = "liver-prosthetic"
- organ_type = /datum/internal_organ/liver/prosthetic
-
-/obj/item/organ/brain/prosthetic
- robotic = ORGAN_ROBOT
- name = "cyberbrain"
- icon_state = "brain-prosthetic"
- organ_type = /datum/internal_organ/brain/prosthetic
-
-
-/obj/item/organ/proc/removed(mob/living/target,mob/living/user)
-
- if(!target || !user)
- return
-
- if(organ_data.vital)
- log_combat(user, target, "removed a vital organ ([src])", addition="(INTENT: [uppertext(user.a_intent)])")
- target.death()
-
-/obj/item/organ/eyes/removed(mob/living/target,mob/living/user)
-
- if(!eye_colour)
- eye_colour = list(0,0,0)
-
- ..() //Make sure target is set so we can steal their eye colour for later.
- var/mob/living/carbon/human/H = target
- if(istype(H))
- eye_colour = list(
- H.r_eyes ? H.r_eyes : 0,
- H.g_eyes ? H.g_eyes : 0,
- H.b_eyes ? H.b_eyes : 0
- )
-
- // Leave bloody red pits behind!
- H.r_eyes = 128
- H.g_eyes = 0
- H.b_eyes = 0
- H.update_body()
-
-/obj/item/organ/proc/replaced(mob/living/target)
- return
-
-/obj/item/organ/eyes/replaced(mob/living/target)
-
- // Apply our eye colour to the target.
- var/mob/living/carbon/human/H = target
- if(istype(H) && eye_colour)
- H.r_eyes = eye_colour[1]
- H.g_eyes = eye_colour[2]
- H.b_eyes = eye_colour[3]
- H.update_body()
-
-/obj/item/organ/proc/bitten(mob/user)
-
- if(robotic)
- return
-
- to_chat(user, span_notice("You take an experimental bite out of \the [src]."))
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
- if(B)
- var/turf/TU = get_turf(src)
- var/list/L = list()
- if(B.data["blood_DNA"])
- L = list(B.data["blood_DNA"] = B.data["blood_type"])
- TU.add_blood(L, B.color)
-
-
- user.temporarilyRemoveItemFromInventory(src)
- var/obj/item/reagent_containers/food/snacks/organ/O = new(get_turf(src))
- O.name = name
- O.icon_state = dead_icon ? dead_icon : icon_state
-
- // Pass over the blood.
- reagents.trans_to(O, reagents.total_volume)
-
- user.put_in_active_hand(O)
- qdel(src)
diff --git a/code/modules/organs/organ_props.dm b/code/modules/organs/organ_props.dm
new file mode 100644
index 00000000000..c7054309aeb
--- /dev/null
+++ b/code/modules/organs/organ_props.dm
@@ -0,0 +1,43 @@
+/obj/item/organ
+ name = "organ"
+ desc = "It looks like it probably just plopped out."
+ icon = 'icons/obj/items/organs.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/inhands/items/bodyparts_left.dmi',
+ slot_r_hand_str = 'icons/mob/inhands/items/bodyparts_right.dmi',
+ )
+
+/obj/item/organ/heart
+ name = "heart"
+ icon_state = "heart-on"
+
+/obj/item/organ/lungs
+ name = "lungs"
+ icon_state = "lungs"
+ gender = PLURAL
+
+/obj/item/organ/kidneys
+ name = "kidneys"
+ icon_state = "kidneys"
+ gender = PLURAL
+
+/obj/item/organ/liver
+ name = "liver"
+ icon_state = "liver"
+
+/obj/item/organ/appendix
+ name = "appendix"
+ icon_state = "appendix"
+
+/obj/item/organ/stomach
+ name = "stomach"
+ icon_state = "stomach"
+
+/obj/item/organ/eyes
+ name = "eyeballs"
+ icon_state = "eyes"
+ gender = PLURAL
+
+/obj/item/organ/brain
+ name = "brain"
+ icon_state = "brain2"
diff --git a/code/modules/organs/organs.dm b/code/modules/organs/organs.dm
new file mode 100644
index 00000000000..d19190ddc59
--- /dev/null
+++ b/code/modules/organs/organs.dm
@@ -0,0 +1,240 @@
+/datum/internal_organ/heart
+ name = "heart"
+ slot = ORGAN_SLOT_HEART
+ peri_effect = TRUE
+
+/datum/internal_organ/heart/process()
+ if(organ_status == ORGAN_BRUISED && prob(5))
+ owner.emote("me", 1, "grabs at [owner.p_their()] chest!")
+ else if(organ_status == ORGAN_BROKEN && prob(20))
+ owner.emote("me", 1, "clutches [owner.p_their()] chest!")
+
+/datum/internal_organ/heart/set_organ_status()
+ var/old_organ_status = organ_status
+ . = ..()
+ if(!.)
+ return
+ owner.max_stamina_buffer += (old_organ_status - organ_status) * 25
+ owner.maxHealth += (old_organ_status - organ_status) * 20
+
+/datum/internal_organ/lungs
+ name = "lungs"
+ slot = ORGAN_SLOT_LUNGS
+ peri_effect = TRUE
+
+/datum/internal_organ/lungs/process()
+ if((organ_status == ORGAN_BRUISED && prob(5)) || (organ_status == ORGAN_BROKEN && prob(20)))
+ owner.emote("me", 1, "gasps for air!")
+
+/datum/internal_organ/lungs/set_organ_status()
+ . = ..()
+ if(!.)
+ return
+ // For example, bruised lungs will reduce stamina regen by 40%, broken by 80%
+ owner.add_stamina_regen_modifier(name, organ_status * -0.40)
+ // Slowdown added when the heart is damaged
+ owner.add_movespeed_modifier(name, override = TRUE, multiplicative_slowdown = organ_status)
+
+//Hits of 1 damage or less won't do anything due to how losebreath works, but any stronger and we'll get the wind knocked out of us for a bit. Mostly just flavor.
+/datum/internal_organ/lungs/take_damage(amount, silent = FALSE)
+ owner.adjust_Losebreath(amount)
+ return ..()
+
+/datum/internal_organ/kidneys
+ name = "kidneys"
+ slot = ORGAN_SLOT_KIDNEYS
+ parent_limb = BODY_ZONE_PRECISE_GROIN
+ peri_effect = TRUE
+ ///Tracks the number of reagent/medicine datums we currently have
+ var/current_medicine_count = 0
+ ///How many drugs we can take before they overwhelm us. Decreases with damage
+ var/current_medicine_cap = 5
+ ///Whether we were over cap the last time we checked.
+ var/old_overflow = FALSE
+ ///Total medicines added since last tick
+ var/new_medicines = 0
+ ///Total medicines removed since last tick
+ var/removed_medicines = 0
+
+/datum/internal_organ/kidneys/New(mob/living/carbon/carbon_mob)
+ . = ..()
+ if(!owner)
+ return
+ RegisterSignal(owner.reagents, COMSIG_NEW_REAGENT_ADD, PROC_REF(owner_added_reagent))
+ RegisterSignal(owner.reagents, COMSIG_REAGENT_DELETING, PROC_REF(owner_removed_reagent))
+
+/datum/internal_organ/kidneys/clean_owner()
+ if(owner?.reagents)
+ UnregisterSignal(owner.reagents, list(COMSIG_NEW_REAGENT_ADD, COMSIG_REAGENT_DELETING))
+ return ..()
+
+///Signaled proc. Check if the added reagent was under reagent/medicine. If so, increment medicine counter and potentially notify owner.
+/datum/internal_organ/kidneys/proc/owner_added_reagent(datum/source, reagent_type, amount)
+ SIGNAL_HANDLER
+ if(!ispath(reagent_type, /datum/reagent/medicine))
+ return
+ new_medicines++
+
+///Signaled proc. Check if the removed reagent was under reagent/medicine. If so, decrement medicine counter and potentially notify owner.
+/datum/internal_organ/kidneys/proc/owner_removed_reagent(datum/source, reagent_type)
+ SIGNAL_HANDLER
+ if(!ispath(reagent_type, /datum/reagent/medicine))
+ return
+ removed_medicines++
+
+/datum/internal_organ/kidneys/set_organ_status()
+ . = ..()
+ if(!.)
+ return
+ current_medicine_cap = initial(current_medicine_cap) - 2 * organ_status
+
+/datum/internal_organ/kidneys/process()
+ current_medicine_count += new_medicines //We want to include medicines that were individually both added and removed this tick
+ var/overflow = current_medicine_count - current_medicine_cap //This catches any case where a reagent was added with volume below its metabolism
+ current_medicine_count -= removed_medicines //Otherwise, you can microdose infinite chems without kidneys complaining
+
+ new_medicines = 0
+ removed_medicines = 0
+
+ //No sense worrying about a chem cap if we're in cryo anyway. Still need to clear tick counts.
+ if(overflow < 1 || owner.bodytemperature <= 170)
+ if(old_overflow)
+ to_chat(owner, span_notice("You don't feel as overwhelmed by all the drugs any more."))
+ old_overflow = FALSE
+ return
+
+ if(!old_overflow)
+ to_chat(owner, span_warning("All the different drugs in you are starting to make you feel off..."))
+ old_overflow = TRUE
+
+ owner.set_drugginess(3)
+ if(prob(overflow * (organ_status + 1) * 10))
+ owner.Confused(2 SECONDS * (organ_status + 1))
+
+/datum/internal_organ/liver
+ name = "liver"
+ slot = ORGAN_SLOT_LIVER
+ peri_effect = TRUE
+ ///lower value, higher resistance.
+ var/alcohol_tolerance = 0.005
+ ///How fast we clean out toxins/toxloss. Adjusts based on organ damage.
+ var/filter_rate = 3
+
+/datum/internal_organ/liver/process()
+ //High toxins levels are dangerous if you aren't actively treating them. 100 seconds to hit bruised from this alone
+ if(owner.getToxLoss() >= (80 - 20 * organ_status))
+ //Healthy liver suffers on its own
+ if(organ_status != ORGAN_BROKEN)
+ take_damage(0.2, TRUE)
+ //Damaged one shares the fun
+ else
+ var/datum/internal_organ/O = pick(owner.internal_organs)
+ O?.take_damage(0.2, TRUE)
+
+ // Heal a bit if needed and we're not busy. This allows recovery from low amounts of toxins.
+ if(!owner.drunkenness && owner.getToxLoss() <= 15 && organ_status == ORGAN_HEALTHY)
+ heal_organ_damage(0.04)
+
+ // Do some reagent filtering/processing.
+ for(var/datum/reagent/potential_toxin AS in owner.reagents.reagent_list)
+ //Liver helps clear out any toxins but with drawbacks if damaged
+ if(istype(potential_toxin, /datum/reagent/consumable/ethanol) || istype(potential_toxin, /datum/reagent/toxin))
+ if(organ_status != ORGAN_HEALTHY)
+ owner.adjustToxLoss(0.3 * organ_status)
+ owner.reagents.remove_reagent(potential_toxin.type, potential_toxin.custom_metabolism * filter_rate * 0.1)
+
+ //Heal toxin damage slowly if not damaged. If broken, increase it instead.
+ owner.adjustToxLoss((2 - filter_rate) * 0.1)
+ if(prob(organ_status)) //Just under once every three minutes while bruised, twice as often while broken.
+ owner.vomit() //No stomach, so the liver can cause vomiting instead. Stagger and slowdown plus feedback that something's wrong.
+
+/datum/internal_organ/liver/set_organ_status()
+ . = ..()
+ if(!.)
+ return
+ filter_rate = initial(filter_rate) - organ_status
+
+/datum/internal_organ/appendix
+ name = "appendix"
+ slot = ORGAN_SLOT_APPENDIX
+ parent_limb = BODY_ZONE_PRECISE_GROIN
+ peri_effect = TRUE
+
+/datum/internal_organ/stomach
+ name = "stomach"
+ slot = ORGAN_SLOT_STOMACH
+ peri_effect = TRUE
+ ///The rate that the stomach will transfer reagents to the body
+ var/metabolism_efficiency = 0.05 // the lowest we should go is 0.025
+ /// Our reagents
+ var/datum/reagents/reagents = new /datum/reagents(1000)
+
+/datum/internal_organ/stomach/process()
+ var/mob/living/carbon/human/body = owner
+
+ // digest food, send all reagents that can be metabolized to the body
+ for(var/datum/reagent/bit AS in reagents?.reagent_list)
+ //Do not transfer over more then we have
+ var/amount_max = bit.volume
+
+ // Transfer the amount of reagents based on volume with a min amount of 1u
+ var/rate_minimum = max(bit.custom_metabolism, 0.25)
+ var/amount = min((round(metabolism_efficiency * amount_max, 0.05) + rate_minimum), amount_max)
+
+ if(amount <= 0)
+ continue
+
+ // transfer the reagents over to the body at the rate of the stomach metabolim
+ // this way the body is where all reagents that are processed and react
+ // the stomach manages how fast they are feed in a drip style
+ reagents.trans_to(body, amount)
+
+ //If the stomach is not damage exit out
+ if(damage < min_bruised_damage)
+ return
+
+ if(prob(0.0125 * damage) || damage > min_broken_damage && prob(0.05 * damage))
+ body.vomit()
+ to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down it's contents!"))
+ return
+
+/datum/internal_organ/eyes
+ name = "eyeballs"
+ slot = ORGAN_SLOT_EYES
+ parent_limb = BODY_ZONE_HEAD
+ ///stores which stage of the eye surgery the eye is at
+ var/eye_surgery_stage = 0
+
+/datum/internal_organ/eyes/process()
+ if(organ_status == ORGAN_BRUISED)
+ owner.set_blurriness(20)
+ if(organ_status == ORGAN_BROKEN)
+ owner.set_blindness(20)
+
+/datum/internal_organ/brain
+ name = "brain"
+ parent_limb = BODY_ZONE_HEAD
+ var/mob/living/brain/brainmob = null
+
+/datum/internal_organ/brain/set_organ_status()
+ var/old_organ_status = organ_status
+ . = ..()
+ if(!.)
+ return
+ owner.set_skills(owner.skills.modifyAllRatings(old_organ_status - organ_status))
+ if(organ_status >= ORGAN_BRUISED)
+ ADD_TRAIT(owner, TRAIT_DROOLING, BRAIN_TRAIT)
+ else
+ REMOVE_TRAIT(owner, TRAIT_DROOLING, BRAIN_TRAIT)
+
+// I'm not sure if this proc is even used
+/datum/internal_organ/brain/proc/transfer_identity(mob/living/carbon/H)
+ name = "[H]'s brain"
+ brainmob = new(src)
+ brainmob.name = H.real_name
+ brainmob.real_name = H.real_name
+ brainmob.timeofhostdeath = H.timeofdeath
+ if(H.mind)
+ H.mind.transfer_to(brainmob)
+
+ to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain."))
diff --git a/code/modules/predator/yautja/chems.dm b/code/modules/predator/yautja/chems.dm
index 5143326824e..ea8da893fc3 100644
--- a/code/modules/predator/yautja/chems.dm
+++ b/code/modules/predator/yautja/chems.dm
@@ -17,7 +17,7 @@
to_chat(L, span_userdanger("Something feels off!"))
L.AdjustParalyzed(20)
-/datum/reagent/thwei/on_mob_life(mob/living/L, metabolism)
+/datum/reagent/thwei/on_mob_life(mob/living/carbon/L, metabolism)
. = ..()
if(isyautja(L))
L.blood_volume += 3
diff --git a/code/modules/reagents/holder.dm b/code/modules/reagents/holder.dm
index 0d64f8bfc9f..6b7b3600819 100644
--- a/code/modules/reagents/holder.dm
+++ b/code/modules/reagents/holder.dm
@@ -146,35 +146,50 @@
* Transfer some stuff from this holder to a target object
*
* Arguments:
- * * obj/target - Target to attempt transfer to
+ * * atom/target - Target to attempt transfer to
* * amount - amount of reagent volume to transfer
* * multiplier - multiplies amount of each reagent by this number
* * preserve_data - if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
* * no_react - passed through to [/datum/reagents/proc/add_reagent]
- * * mob/transfered_by - used for logging
- * * remove_blacklisted - skips transferring of reagents with can_synth = FALSE
- * * method - passed through to [/datum/reagents/proc/react_single] and [/datum/reagent/proc/on_transfer]
- * * show_message - passed through to [/datum/reagents/proc/react_single]
- * * round_robin - if round_robin=TRUE, so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors
- */
-/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
- var/list/cached_reagents = reagent_list
- if (!target || !total_volume)
+ * * transfer_to_stomach - does it goes to stomach like from pills and food?
+ * */
+/datum/reagents/proc/trans_to(
+ atom/target,
+ amount = 1,
+ multiplier = 1,
+ preserve_data = TRUE,
+ no_react = FALSE,
+ transfer_to_stomach = FALSE
+)
+ if(!target || !total_volume)
return
- if (amount < 0)
+ if(amount < 0)
return
+ var/list/cached_reagents = reagent_list
var/datum/reagents/R
if(istype(target, /datum/reagents))
R = target
else
- if(!target.reagents)
+ if(transfer_to_stomach && ishuman(target))
+ var/mob/living/carbon/human/eater = target
+ var/datum/internal_organ/stomach/belly = eater.get_organ_slot(ORGAN_SLOT_STOMACH)
+ if(belly.organ_status != ORGAN_HEALTHY && prob(belly.damage * 3))
+ var/expel_amount = round(amount, CHEMICAL_QUANTISATION_LEVEL)
+ if(expel_amount > 0 )
+ eater.vomit()
+ var/datum/limb/chest/torso = eater.get_limb(belly.parent_limb) // eating with bruised stomach will get you infections
+ torso.germ_level += expel_amount * 15 // 10 units are 150 germ level and etc.
+ return
+ R = belly.reagents
+ else if(!target.reagents)
return
- R = target.reagents
- amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
+ else
+ R = target.reagents
+ amount = min(min(amount, total_volume), R.maximum_volume - R.total_volume)
var/part = amount / total_volume
var/trans_data = null
- for(var/reagent in cached_reagents)
+ for(var/reagent AS in cached_reagents)
var/datum/reagent/T = reagent
var/transfer_amount = T.volume * part
if(preserve_data)
@@ -190,7 +205,7 @@
return amount
/// Copies the reagents to the target object
-/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1)
+/datum/reagents/proc/copy_to(obj/target, amount = 1, multiplier = 1, preserve_data = 1)
var/list/cached_reagents = reagent_list
if(!target || !total_volume)
return
diff --git a/code/modules/reagents/reagents/drink.dm b/code/modules/reagents/reagents/drink.dm
index a09b1a05436..5534f1abc76 100644
--- a/code/modules/reagents/reagents/drink.dm
+++ b/code/modules/reagents/reagents/drink.dm
@@ -491,7 +491,7 @@
adj_dizzy = 6
taste_description = "your brains smashed out by a lemon wrapped around a gold brick"
-/datum/reagent/consumable/drink/gargle_blaster/on_mob_life(mob/living/L, metabolism)
+/datum/reagent/consumable/drink/gargle_blaster/on_mob_life(mob/living/carbon/human/L, metabolism)
switch(current_cycle)
if(15 to 45)
L.adjust_timed_status_effect(2 SECONDS, /datum/status_effect/speech/slurring/drunk)
diff --git a/code/modules/reagents/reagents/medical.dm b/code/modules/reagents/reagents/medical.dm
index 93979474cc0..b75b9108b1e 100644
--- a/code/modules/reagents/reagents/medical.dm
+++ b/code/modules/reagents/reagents/medical.dm
@@ -1,6 +1,3 @@
-
-// All reagents related to medicine
-
/datum/reagent/medicine
name = "Medicine"
taste_description = "bitterness"
@@ -1025,7 +1022,6 @@
if(prob(20))
L.hallucination += 15
-
/datum/reagent/medicine/ultrazine/addiction_act_stage3(mob/living/L, metabolism)
if(prob(10))
to_chat(L, span_warning("[pick("You need more.", "It's hard to go on like this.", "You want more. You need more.", "Just take another hit. Now.", "One more.")]"))
@@ -1052,7 +1048,7 @@
L.adjustBrainLoss(0.1*effect_str, TRUE)
if(prob(15) && ishuman(L))
var/mob/living/carbon/human/H = L
- var/affected_organ = pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER, ORGAN_SLOT_KIDNEYS)
+ var/affected_organ = pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_LIVER, ORGAN_SLOT_KIDNEYS, ORGAN_SLOT_STOMACH)
var/datum/internal_organ/I = H.get_organ_slot(affected_organ)
I.take_damage(5.5 * effect_str)
@@ -1254,19 +1250,19 @@
taste_description = "punishment"
taste_multi = 8
-/datum/reagent/hypervene/on_mob_life(mob/living/L, metabolism)
+/datum/reagent/hypervene/on_mob_life(mob/living/carbon/human/L, metabolism)
L.reagent_shock_modifier -= PAIN_REDUCTION_HEAVY //Significant pain while metabolized.
if(prob(5)) //causes vomiting
L.vomit()
return ..()
-/datum/reagent/hypervene/overdose_process(mob/living/L, metabolism)
+/datum/reagent/hypervene/overdose_process(mob/living/carbon/human/L, metabolism)
L.apply_damages(effect_str, effect_str)
if(prob(10)) //heavy vomiting
L.vomit()
L.reagent_shock_modifier -= PAIN_REDUCTION_VERY_HEAVY * 1.25//Massive pain.
-/datum/reagent/hypervene/overdose_crit_process(mob/living/L, metabolism)
+/datum/reagent/hypervene/overdose_crit_process(mob/living/carbon/human/L, metabolism)
L.apply_damages(2*effect_str, 2*effect_str)
if(prob(50)) //violent vomiting
L.vomit()
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 3856839e9a6..8063e541617 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -81,20 +81,18 @@
success_sound = 'sound/misc/surgery/organ1.ogg'
failure_sound = 'sound/misc/surgery/organ2.ogg'
-
/datum/surgery_step/internal/fix_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected, checks_only)
if(..())
if(affected.body_part == HEAD)//brain and eye damage is fixed by a separate surgery
return SURGERY_CANNOT_USE
for(var/datum/internal_organ/I in affected.internal_organs)
- if(I.damage > 0 && I.robotic != ORGAN_ROBOT)
+ if(I.damage > 0)
return SURGERY_CAN_USE
return SURGERY_CANNOT_USE
-
/datum/surgery_step/internal/fix_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected)
for(var/datum/internal_organ/I in affected.internal_organs)
- if(I?.damage > 0 && I.robotic != ORGAN_ROBOT)
+ if(I?.damage > 0)
user.visible_message(span_notice("[user] starts treating damage to [target]'s [I.name] with the surgical membrane."), \
span_notice("You start treating damage to [target]'s [I.name] with the surgical membrane.") )
target.balloon_alert_to_viewers("Fixing...")
@@ -104,7 +102,7 @@
/datum/surgery_step/internal/fix_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected)
for(var/datum/internal_organ/I in affected.internal_organs)
- if(I?.damage > 0 && I.robotic != ORGAN_ROBOT)
+ if(I?.damage > 0)
user.visible_message(span_notice("[user] treats damage to [target]'s [I.name] with surgical membrane."), \
span_notice("You treat damage to [target]'s [I.name] with surgical membrane.") )
@@ -126,57 +124,3 @@
I.take_damage(dam_amt,0)
target.updatehealth()
affected.update_wounds()
-
-
-
-/datum/surgery_step/internal/fix_organ_robotic //For artificial organs
- allowed_tools = list(
- /obj/item/stack/nanopaste = 100,
- /obj/item/tool/surgery/bonegel = 30,
- /obj/item/tool/screwdriver = 70,
- )
-
- min_duration = 60
- max_duration = 80
-
-/datum/surgery_step/internal/fix_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected, checks_only)
- if(..())
- if(affected.body_part == HEAD)//brain and eye damage is fixed by a separate surgery
- return SURGERY_CANNOT_USE
- for(var/datum/internal_organ/I in affected.internal_organs)
- if(I.damage > 0 && I.robotic == ORGAN_ROBOT)
- return SURGERY_CAN_USE
- return SURGERY_CANNOT_USE
-
-/datum/surgery_step/internal/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected)
- for(var/datum/internal_organ/I in affected.internal_organs)
- if(I?.damage > 0 && I.robotic == ORGAN_ROBOT)
- user.visible_message(span_notice("[user] starts mending the damage to [target]'s [I.name]'s mechanisms."), \
- span_notice("You start mending the damage to [target]'s [I.name]'s mechanisms.") )
-
- target.balloon_alert_to_viewers("Mending...")
- target.custom_pain("The pain in your [affected.display_name] is living hell!", 1)
- ..()
-
-/datum/surgery_step/internal/fix_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected)
- for(var/datum/internal_organ/I in affected.internal_organs)
- if(I?.damage > 0 && I.robotic == ORGAN_ROBOT)
- user.visible_message(span_notice("[user] repairs [target]'s [I.name] with [tool]."), \
- span_notice("You repair [target]'s [I.name] with [tool].") )
- I.damage = 0
- target.balloon_alert_to_viewers("Success")
- return ..()
-
-/datum/surgery_step/internal/fix_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/limb/affected)
- user.visible_message(span_warning("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.display_name] with \the [tool]!"), \
- span_warning("Your hand slips, gumming up the mechanisms inside of [target]'s [affected.display_name] with \the [tool]!"))
- target.balloon_alert_to_viewers("Slipped!")
-
- target.adjustToxLoss(5)
- affected.createwound(CUT, 5)
-
- for(var/datum/internal_organ/I in affected.internal_organs)
- if(I)
- I.take_damage(rand(3, 5), 0)
- target.updatehealth()
- affected.update_wounds()
diff --git a/icons/obj/items/organs.dmi b/icons/obj/items/organs.dmi
index 3cb475eceb9..b3cdbd53900 100644
Binary files a/icons/obj/items/organs.dmi and b/icons/obj/items/organs.dmi differ
diff --git a/tgmc.dme b/tgmc.dme
index 83a42fd6bdb..80c82e2454b 100644
--- a/tgmc.dme
+++ b/tgmc.dme
@@ -1580,12 +1580,9 @@
#include "code\modules\mob\living\say.dm"
#include "code\modules\mob\living\status_procs.dm"
#include "code\modules\mob\living\brain\brain.dm"
-#include "code\modules\mob\living\brain\brain_item.dm"
#include "code\modules\mob\living\brain\death.dm"
-#include "code\modules\mob\living\brain\emote.dm"
#include "code\modules\mob\living\brain\life.dm"
#include "code\modules\mob\living\brain\login.dm"
-#include "code\modules\mob\living\brain\MMI.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"
#include "code\modules\mob\living\carbon\carbon_defines.dm"
@@ -1787,11 +1784,11 @@
#include "code\modules\mob\new_player\sprite_accessories.dm"
#include "code\modules\mob\new_player\yautja_hair.dm"
#include "code\modules\orbits\spaceship.dm"
+#include "code\modules\organs\_organ.dm"
#include "code\modules\organs\limb_objects.dm"
#include "code\modules\organs\limbs.dm"
-#include "code\modules\organs\organ_alien.dm"
-#include "code\modules\organs\organ_internal.dm"
-#include "code\modules\organs\organ_objects.dm"
+#include "code\modules\organs\organ_props.dm"
+#include "code\modules\organs\organs.dm"
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\wound.dm"
#include "code\modules\paperwork\carbonpaper.dm"
diff --git a/tgui/packages/tgui/interfaces/CentcomPodLauncher.js b/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
index 01c49786927..e507246553e 100644
--- a/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
+++ b/tgui/packages/tgui/interfaces/CentcomPodLauncher.js
@@ -160,15 +160,6 @@ export const CentcomPodLauncher = (props, context) => {
`}
onClick={() => act('effectLimb')}
/>
-