diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index f54df12a0c4..96d8726d596 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -243,7 +243,7 @@
A.say("PLASMA FIST!")
D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \
"[A] has hit [D] with THE PLASMA FIST TECHNIQUE!")
- var/obj/item/organ/brain/B = D.getorgan(/obj/item/organ/brain)
+ var/obj/item/organ/internal/brain/B = D.getorgan(/obj/item/organ/internal/brain)
if(B)
B.loc = get_turf(D)
B.transfer_identity(D)
diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm
index c4ba6c45524..e82d3ce2003 100644
--- a/code/datums/spells/inflict_handler.dm
+++ b/code/datums/spells/inflict_handler.dm
@@ -29,7 +29,7 @@
if("gib_brain")
if(ishuman(target) || ismonkey(target))
var/mob/living/carbon/C_target = target
- var/obj/item/organ/brain/B = C_target.getorgan(/obj/item/organ/brain)
+ var/obj/item/organ/internal/brain/B = C_target.getorgan(/obj/item/organ/internal/brain)
if(B)
B.loc = get_turf(C_target)
B.transfer_identity(C_target)
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index 7b29e448844..2f8116ffe6b 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -44,7 +44,7 @@
name = "Instant Summons"
marked_item = null
- else if(marked_item && !marked_item.loc) //the item was destroyed at some point
+ else if(marked_item && marked_item.gc_destroyed) //the item was destroyed at some point
message = "You sense your marked item has been destroyed!"
name = "Instant Summons"
marked_item = null
@@ -53,44 +53,46 @@
var/obj/item_to_retrive = marked_item
var/infinite_recursion = 0 //I don't want to know how someone could put something inside itself but these are wizards so let's be safe
- while(!isturf(item_to_retrive.loc) && infinite_recursion < 10) //if it's in something you get the whole thing.
- if(ismob(item_to_retrive.loc)) //If its on someone, properly drop it
- var/mob/M = item_to_retrive.loc
+ if(!item_to_retrive.loc)
+ if(isorgan(item_to_retrive)) // Organs are usually stored in nullspace
+ var/obj/item/organ/internal/organ = item_to_retrive
+ if(organ.owner)
+ // If this code ever runs I will be happy
+ add_logs(user, organ.owner, "magically removed [organ.name] from", addition="INTENT: [uppertext(user.a_intent)]")
+ organ.Remove(organ.owner)
+ else
+ while(!isturf(item_to_retrive.loc) && infinite_recursion < 10) //if it's in something you get the whole thing.
+ if(ismob(item_to_retrive.loc)) //If its on someone, properly drop it
+ var/mob/M = item_to_retrive.loc
- if(issilicon(M)) //Items in silicons warp the whole silicon
- M.loc.visible_message("[M] suddenly disappears!")
- M.loc = user.loc
- M.loc.visible_message("[M] suddenly appears!")
- item_to_retrive = null
- break
+ if(issilicon(M)) //Items in silicons warp the whole silicon
+ M.loc.visible_message("[M] suddenly disappears!")
+ M.loc = user.loc
+ M.loc.visible_message("[M] suddenly appears!")
+ item_to_retrive = null
+ break
+ M.unEquip(item_to_retrive)
- M.unEquip(item_to_retrive)
+ if(iscarbon(M)) //Edge case housekeeping
+ var/mob/living/carbon/C = M
+ if(C.stomach_contents && item_to_retrive in C.stomach_contents)
+ C.stomach_contents -= item_to_retrive
- if(iscarbon(M)) //Edge case housekeeping
- var/mob/living/carbon/C = M
- if(C.internal_organs && item_to_retrive in C.internal_organs) //KALIMA!
- C.internal_organs -= item_to_retrive
- if(istype(marked_item,/obj/item/organ/brain)) //If this code ever runs I will be happy
- var/obj/item/organ/brain/B
- B.transfer_identity(C)
- add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")
- if(C.stomach_contents && item_to_retrive in C.stomach_contents)
- C.stomach_contents -= item_to_retrive
+ else
+ if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
+ var/obj/machinery/portable_atmospherics/P = item_to_retrive.loc
+ P.disconnect()
+ P.update_icon()
- else
- if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
- var/obj/machinery/portable_atmospherics/P = item_to_retrive.loc
- P.disconnect()
- P.update_icon()
+ item_to_retrive = item_to_retrive.loc
- item_to_retrive = item_to_retrive.loc
-
- infinite_recursion += 1
+ infinite_recursion += 1
if(!item_to_retrive)
return
- item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears!")
+ if(item_to_retrive.loc)
+ item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears!")
if(user.hand) //left active hand
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
index cf3b766282e..fd2ecdcce4c 100644
--- a/code/game/gamemodes/abduction/gland.dm
+++ b/code/game/gamemodes/abduction/gland.dm
@@ -175,8 +175,7 @@
/obj/item/organ/internal/gland/spiderman/activate()
owner << "You feel something crawling in your skin."
- if(uses == initial(uses))
- owner.faction += "spiders"
+ owner.faction |= "spiders"
new /obj/effect/spider/spiderling(owner.loc)
/obj/item/organ/internal/gland/egg
diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm
index 0f4b1f855ca..4440e9b63d9 100644
--- a/code/game/gamemodes/changeling/powers/headcrab.dm
+++ b/code/game/gamemodes/changeling/powers/headcrab.dm
@@ -7,7 +7,7 @@
/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user)
var/datum/mind/M = user.mind
- var/list/organs = user.getorganszone("head") + user.getorganszone("eyes")
+ var/list/organs = user.getorganszone("head", 1)
for(var/obj/item/organ/internal/I in organs)
I.Remove(user, 1)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 6d69be02b67..ab505d83329 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -529,8 +529,8 @@ var/list/sacrificed = list()
if(!(iscultist(V)))
victims += V//Checks for cult status and mob type
for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
- if(istype(I,/obj/item/organ/brain))
- var/obj/item/organ/brain/B = I
+ if(istype(I,/obj/item/organ/internal/brain))
+ var/obj/item/organ/internal/brain/B = I
victims += B.brainmob
else if(istype(I,/obj/item/device/mmi))
var/obj/item/device/mmi/B = I
diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm
index 5d5de93e57b..83ef7109156 100644
--- a/code/game/gamemodes/shadowling/shadowling_items.dm
+++ b/code/game/gamemodes/shadowling/shadowling_items.dm
@@ -100,3 +100,18 @@
td << "You enter the rift. Deafening chimes jingle in your ears. You are swallowed in darkness."
playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1)
qdel(td)
+
+
+/obj/item/organ/internal/shadowtumor
+ name = "black tumor"
+ icon_state = "blacktumor"
+ origin_tech = "biotech=4"
+ w_class = 1
+ zone = "head"
+ slot = "brain_tumor"
+
+/obj/item/organ/internal/shadowtumor/on_find(mob/living/finder)
+ finder << "You locate a small, pulsing black tumor in [owner]'s head!"
+ owner << "A small part of your head pulses with agony as the light impacts it!"
+
+// TODO: replace dethrall surgery with this + organ manipulation, somehow.
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm
index 874ebfa7aaa..f0d57d5784d 100644
--- a/code/game/gamemodes/wizard/godhand.dm
+++ b/code/game/gamemodes/wizard/godhand.dm
@@ -46,7 +46,7 @@
var/mob/M = target
if(ishuman(M) || ismonkey(M))
var/mob/living/carbon/C_target = M
- var/obj/item/organ/brain/B = C_target.getorgan(/obj/item/organ/brain)
+ var/obj/item/organ/internal/brain/B = C_target.getorgan(/obj/item/organ/internal/brain)
if(B)
B.loc = get_turf(C_target)
B.transfer_identity(C_target)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 6c76c19e864..c2613b9a80c 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -70,7 +70,7 @@
if ((M.stat != 2) || (!M.client))
continue
//They need a brain!
- if (ishuman(M) && !M.getorgan(/obj/item/organ/brain))
+ if (ishuman(M) && !M.getorgan(/obj/item/organ/internal/brain))
continue
if (M.ckey == find_key)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index a75a603344b..213c8d56a89 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -353,7 +353,7 @@
if (!check_dna_integrity(subject) || !istype(subject))
scantemp = "Unable to locate valid genetic data."
return
- if (!subject.getorgan(/obj/item/organ/brain))
+ if (!subject.getorgan(/obj/item/organ/internal/brain))
scantemp = "No signs of intelligence detected."
return
if (subject.suiciding == 1)
diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm
index c3a71b8f485..8fad18c31cc 100644
--- a/code/game/objects/items/body_egg.dm
+++ b/code/game/objects/items/body_egg.dm
@@ -6,6 +6,10 @@
zone = "chest"
slot = "parasite_egg"
+/obj/item/organ/internal/body_egg/on_find(mob/living/finder)
+ ..()
+ finder << "You found an unknown alien organism in [owner]'s [zone]!"
+
/obj/item/organ/internal/body_egg/New(loc)
if(iscarbon(loc))
src.Insert(loc)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 16769bb4b99..c4f2a7190e5 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -143,7 +143,7 @@ MASS SPECTROMETER
user << "\tSubject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage."
if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
user << "\tBloodstream analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals."
- if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
+ if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/internal/brain))
user << "\tSubject brain function is non-existant."
else if (M.getBrainLoss() >= 60)
user << "\tSevere brain damage detected. Subject likely to have mental retardation."
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
index ef5f43f7495..b59321db533 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
@@ -45,7 +45,7 @@
/datum/table_recipe/brainburger
name = "Brain burger"
reqs = list(
- /obj/item/organ/brain = 1,
+ /obj/item/organ/internal/brain = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/brain
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
index df5f99fb6bb..eb52389a1b8 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
@@ -78,7 +78,7 @@
/datum/table_recipe/braincake
name = "Brain cake"
reqs = list(
- /obj/item/organ/brain = 1,
+ /obj/item/organ/internal/brain = 1,
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brain
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 81a3f2a4cf5..06c4f46ae2c 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -110,9 +110,9 @@
if(87) //1% chance
new /obj/item/weed_extract(src)
if(88)
- new /obj/item/organ/brain(src)
+ new /obj/item/organ/internal/brain(src)
if(89)
- new /obj/item/organ/brain/alien(src)
+ new /obj/item/organ/internal/brain/alien(src)
if(90)
new /obj/item/organ/internal/heart(src)
if(91)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index f96c94af11a..529c9c4ad60 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -35,7 +35,7 @@
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
- internal_organs += new /obj/item/organ/brain/alien
+ internal_organs += new /obj/item/organ/internal/brain/alien
for(var/obj/item/organ/internal/I in internal_organs)
I.Insert(src)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index ac8b2f4405d..2e3a40ff237 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -34,7 +34,7 @@
/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/user)
var/no_queen = 1
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
- if(!Q.key || !Q.getorgan(/obj/item/organ/brain))
+ if(!Q.key || !Q.getorgan(/obj/item/organ/internal/brain))
continue
no_queen = 0
if(no_queen)
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index b62a11e5153..6995c025b0e 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -8,27 +8,41 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
icon_state = "larva0_dead"
var/stage = 0
+/obj/item/organ/internal/body_egg/alien_embryo/on_find(mob/living/finder)
+ ..()
+ if(stage < 4)
+ finder << "It's small and weak, barely the size of a foetus."
+ else
+ finder << "It's grown quite large, and writhes slightly as you look at it."
+ if(prob(10))
+ AttemptGrow(0)
+
+/obj/item/organ/internal/body_egg/alien_embryo/prepare_eat()
+ var/obj/S = ..()
+ S.reagents.add_reagent("sacid", 10)
+ return S
+
/obj/item/organ/internal/body_egg/alien_embryo/on_life()
switch(stage)
if(2, 3)
- if(prob(1))
+ if(prob(2))
owner.emote("sneeze")
- if(prob(1))
- owner.emote("cough")
- if(prob(1))
- owner << "Your throat feels sore."
- if(prob(1))
- owner << "Mucous runs down the back of your throat."
- if(4)
- if(prob(1))
- owner.emote("sneeze")
- if(prob(1))
+ if(prob(2))
owner.emote("cough")
if(prob(2))
+ owner << "Your throat feels sore."
+ if(prob(2))
+ owner << "Mucous runs down the back of your throat."
+ if(4)
+ if(prob(2))
+ owner.emote("sneeze")
+ if(prob(2))
+ owner.emote("cough")
+ if(prob(4))
owner << "Your muscles ache."
if(prob(20))
owner.take_organ_damage(1)
- if(prob(2))
+ if(prob(4))
owner << "Your stomach hurts."
if(prob(20))
owner.adjustToxLoss(1)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index ec1fd6b67fb..7412dd48ab0 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -18,11 +18,11 @@
var/mob/living/carbon/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm.
- var/obj/item/organ/brain/brain = null //The actual brain
+ var/obj/item/organ/internal/brain/brain = null //The actual brain
/obj/item/device/mmi/update_icon()
if(brain)
- if(istype(brain,/obj/item/organ/brain/alien))
+ if(istype(brain,/obj/item/organ/internal/brain/alien))
icon_state = "mmi_alien"
braintype = "Xenoborg" //HISS....Beep.
else
@@ -33,8 +33,8 @@
/obj/item/device/mmi/attackby(obj/item/O, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
- if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO
- var/obj/item/organ/brain/newbrain = O
+ if(istype(O,/obj/item/organ/internal/brain)) //Time to stick a brain in it --NEO
+ var/obj/item/organ/internal/brain/newbrain = O
if(brain)
user << "There's already a brain in the MMI!"
return
@@ -110,7 +110,7 @@
brainmob.container = src
if(istype(H))
- var/obj/item/organ/brain/newbrain = H.getorgan(/obj/item/organ/brain)
+ var/obj/item/organ/internal/brain/newbrain = H.getorgan(/obj/item/organ/internal/brain)
newbrain.loc = src
brain = newbrain
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 5df89ec19ae..21e701b4940 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -1,20 +1,48 @@
-/obj/item/organ/brain
+/obj/item/organ/internal/brain
name = "brain"
desc = "A piece of juicy meat found in a person's head."
- icon = 'icons/obj/surgery.dmi'
icon_state = "brain"
- force = 1.0
- w_class = 2.0
- throwforce = 0
throw_speed = 3
throw_range = 5
layer = 4.1
+ zone = "head"
+ slot = "brain"
+ vital = 1
origin_tech = "biotech=4"
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
+/obj/item/organ/internal/brain/Insert(mob/living/carbon/M, special = 0)
+ ..()
+ name = "brain"
+ if(brainmob)
+ if(M.key)
+ M.ghostize()
-/obj/item/organ/brain/New()
+ if(brainmob.mind)
+ brainmob.mind.transfer_to(M)
+ else
+ M.key = brainmob.key
+
+ qdel(brainmob)
+
+ //Update the body's icon so it doesnt appear debrained anymore
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.update_hair(0)
+
+/obj/item/organ/internal/brain/Remove(mob/living/carbon/M, special = 0)
+ ..()
+ if(!special)
+ transfer_identity(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.update_hair(0)
+
+/obj/item/organ/internal/brain/prepare_eat()
+ return // Too important to eat.
+
+/obj/item/organ/internal/brain/New()
..()
//Shifting the brain "mob" over to the brain object so it's easier to keep track of. --NEO
spawn(5)
@@ -22,19 +50,21 @@
brainmob.client.screen.len = null //clear the hud
-/obj/item/organ/brain/proc/transfer_identity(mob/living/carbon/H)
- name = "[H]'s brain"
+/obj/item/organ/internal/brain/proc/transfer_identity(mob/living/L)
+ name = "[L.name]'s brain"
brainmob = new(src)
- brainmob.name = H.real_name
- brainmob.real_name = H.real_name
- brainmob.dna = H.dna
- brainmob.timeofhostdeath = H.timeofdeath
- if(H.mind)
- H.mind.transfer_to(brainmob)
+ brainmob.name = L.real_name
+ brainmob.real_name = L.real_name
+ brainmob.timeofhostdeath = L.timeofdeath
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ brainmob.dna = C.dna
+ if(L.mind)
+ L.mind.transfer_to(brainmob)
brainmob << "You feel slightly disoriented. That's normal when you're just a brain."
-/obj/item/organ/brain/examine(mob/user)
+/obj/item/organ/internal/brain/examine(mob/user)
..()
if(brainmob && brainmob.client)
user << "You can feel the small spark of life still left in this one."
@@ -42,7 +72,7 @@
user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later."
-/obj/item/organ/brain/attack(mob/living/carbon/M, mob/user)
+/obj/item/organ/internal/brain/attack(mob/living/carbon/M, mob/user)
if(!istype(M))
return ..()
@@ -58,7 +88,7 @@
//since these people will be dead M != usr
- if(!M.getorgan(/obj/item/organ/brain))
+ if(!M.getorgan(/obj/item/organ/internal/brain))
user.drop_item()
for(var/mob/O in viewers(M, null))
if(O == (user || M))
@@ -74,35 +104,18 @@
else
user << "You insert [src] into your head." //LOL
- //this might actually be outdated since barring badminnery, a debrain'd body will have any client sucked out to the brain's internal mob. Leaving it anyway to be safe. --NEO
- if(M.key)
- M.ghostize()
-
- if(brainmob.mind)
- brainmob.mind.transfer_to(M)
- else
- M.key = brainmob.key
-
- qdel(brainmob)
-
- M.internal_organs += src
- loc = null
-
- //Update the body's icon so it doesnt appear debrained anymore
- if(ishuman(M))
- H.update_hair(0)
-
+ Insert(M)
else
..()
-/obj/item/organ/brain/alien
- name = "alien brain"
- desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
- icon_state = "brain-alien"
- origin_tech = "biotech=7"
-
-/obj/item/organ/brain/Destroy() //copypasted from MMIs.
+/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
if(brainmob)
qdel(brainmob)
brainmob = null
..()
+
+/obj/item/organ/internal/brain/alien
+ name = "alien brain"
+ desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
+ icon_state = "brain-alien"
+ origin_tech = "biotech=7"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index f97ddb1a3db..889c0826459 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -3,7 +3,7 @@
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
container.visible_message("[src]'s MMI flatlines!", \
"You hear something flatline.")
- if(istype(src,/obj/item/organ/brain/alien))
+ if(istype(src,/obj/item/organ/internal/brain/alien))
container.icon_state = "mmi_alien_dead"
else
container.icon_state = "mmi_dead"
@@ -23,6 +23,6 @@
if(container && istype(container, /obj/item/device/mmi))
qdel(container)//Gets rid of the MMI if there is one
if(loc)
- if(istype(loc,/obj/item/organ/brain))
+ if(istype(loc,/obj/item/organ/internal/brain))
qdel(loc)//Gets rid of the brain item
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index c9ff89d92bd..f2a6715af8e 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -173,7 +173,7 @@
var/appears_dead = 0
if(stat == DEAD || (status_flags & FAKEDEATH))
appears_dead = 1
- if(getorgan(/obj/item/organ/brain))//Only perform these checks if there is no brain
+ if(getorgan(/obj/item/organ/internal/brain))//Only perform these checks if there is no brain
if(suiciding)
msg += "[t_He] appears to have commited suicide... there is no hope of recovery.\n"
msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life"
@@ -252,7 +252,7 @@
else if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
- if(getorgan(/obj/item/organ/brain))
+ if(getorgan(/obj/item/organ/internal/brain))
if(istype(src,/mob/living/carbon/human/interactive))
msg += "[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.\n"
else if(!key)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 658bd354c0c..795c7e68da7 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -24,7 +24,7 @@
O.owner = src
internal_organs += new /obj/item/organ/internal/appendix
internal_organs += new /obj/item/organ/internal/heart
- internal_organs += new /obj/item/organ/brain
+ internal_organs += new /obj/item/organ/internal/brain
for(var/obj/item/organ/internal/I in internal_organs)
I.Insert(src)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 12266289786..db366b79fb0 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -168,7 +168,7 @@
standing += img_facial_s
//Applies the debrained overlay if there is no brain
- if(!H.getorgan(/obj/item/organ/brain))
+ if(!H.getorgan(/obj/item/organ/internal/brain))
standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s", "layer" = -HAIR_LAYER)
if((H.wear_suit) && (H.wear_suit.hooded) && (H.wear_suit.suittoggled == 1))
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 8f6db5b5086..86014c735ca 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -261,7 +261,7 @@
if(..()) //alive
- if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain))
+ if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/internal/brain))
death()
return
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 7a2a5379910..c04a2ccc65e 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -18,7 +18,7 @@
internal_organs += new /obj/item/organ/internal/appendix
internal_organs += new /obj/item/organ/internal/heart
- internal_organs += new /obj/item/organ/brain
+ internal_organs += new /obj/item/organ/internal/brain
for(var/obj/item/organ/internal/I in internal_organs)
I.Insert(src)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e37ec22d115..d430dc8ca55 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -106,7 +106,7 @@
//MMI stuff. Held togheter by magic. ~Miauw
if(!mmi || !mmi.brainmob)
mmi = new(src)
- mmi.brain = new /obj/item/organ/brain(mmi)
+ mmi.brain = new /obj/item/organ/internal/brain(mmi)
mmi.brain.name = "[real_name]'s brain"
mmi.locked = 1
mmi.icon_state = "mmi_full"
diff --git a/code/modules/surgery/appendectomy.dm b/code/modules/surgery/appendectomy.dm
deleted file mode 100644
index 9355890cb5f..00000000000
--- a/code/modules/surgery/appendectomy.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-/datum/surgery/appendectomy
- name = "appendectomy"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_appendix, /datum/surgery_step/close)
- species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- possible_locs = list("groin")
-
-
-//extract appendix
-/datum/surgery_step/extract_appendix
- name = "extract appendix"
- accept_hand = 1
- time = 64
- var/obj/item/organ/internal/appendix/A = null
-
-/datum/surgery_step/extract_appendix/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- A = locate() in target.internal_organs
- if(A)
- user.visible_message("[user] begins to extract [target]'s appendix.", "You begin to extract [target]'s appendix...")
- else
- user.visible_message("[user] looks for an appendix in [target].", "You look for an appendix in [target]...")
-
-/datum/surgery_step/extract_appendix/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(A)
- user.visible_message("[user] successfully removes [target]'s appendix!", "You successfully removes [target]'s appendix.")
- A.loc = get_turf(target)
- A.Remove(target)
- for(var/datum/disease/appendicitis in target.viruses)
- appendicitis.cure()
- target.resistances += /datum/disease/appendicitis
- else
- user << "You can't find an appendix in [target]!"
- return 1
diff --git a/code/modules/surgery/brain_removal.dm b/code/modules/surgery/brain_removal.dm
deleted file mode 100644
index 0d2426775a6..00000000000
--- a/code/modules/surgery/brain_removal.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/datum/surgery/brain_removal
- name = "brain removal"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain)
- species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- possible_locs = list("head")
- requires_organic_bodypart = 0
-
-
-//extract brain
-/datum/surgery_step/extract_brain
- name = "extract brain"
- implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
- time = 64
- var/obj/item/organ/brain/B = null
-
-/datum/surgery_step/extract_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- B = target.getorgan(/obj/item/organ/brain)
- if(B)
- user.visible_message("[user] begins to extract [target]'s brain.", "You begin to extract [target]'s brain...")
- else
- user.visible_message("[user] looks for a brain in [target].", "You look for a brain in [target]...")
-
-/datum/surgery_step/extract_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(B)
- user.visible_message("[user] successfully removes [target]'s brain!", "You successfully remove [target]'s brain.")
- B.loc = get_turf(target)
- B.transfer_identity(target)
- target.internal_organs -= B
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- H.update_hair(0)
- H.apply_damage(25,"brute","head")
- add_logs(user, target, "debrained", addition="INTENT: [uppertext(user.a_intent)]")
- else
- user << "You can't find a brain in [target]!"
- return 1
-
-
-//brain removal for aliens
-/datum/surgery/brain_removal/alien
- name = "alien brain removal"
- steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/extract_brain)
- species = list(/mob/living/carbon/alien/humanoid)
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index fe976b25824..4f872f6c047 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -2,8 +2,11 @@
name = "core removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/incise, /datum/surgery_step/extract_core)
species = list(/mob/living/simple_animal/slime)
- target_must_be_dead = 1
+/datum/surgery/core_removal/can_start(mob/user, mob/living/carbon/target)
+ if(target.stat == DEAD)
+ return 1
+ return 0
//extract brain
/datum/surgery_step/extract_core
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
deleted file mode 100644
index ed6813bf087..00000000000
--- a/code/modules/surgery/cybernetic_implants.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-#define MAX_BRAIN_IMPLANT 2
-#define MAX_CHEST_IMPLANT 3
-
-/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/implant, datum/surgery/surgery)
- user.visible_message("[user] begins to implant [target] with [implant].", "You begin to implant [target] with [implant]...")
-
-//[[[[EYES]]]]
-/datum/surgery/cybernetic_implant/eyes
- name = "eye cybernetic implant"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
- possible_locs = list("eyes")
-
-/datum/surgery_step/cybernetic_implant/eyes
- name = "insert eye cybernetic implant"
- implements = list(/obj/item/organ/internal/cyberimp/eyes = 100)
- time = 32
-
-/datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/eyes/implant, datum/surgery/surgery)
- if(implant)
- var/full = 0
- if(locate(/obj/item/organ/internal/cyberimp/eyes, target.internal_organs))
- full = 1
- insert(user,target,implant,target_zone,full)
- return 1
-
-//[[[[BRAIN]]]]
-/datum/surgery/cybernetic_implant/brain
- name = "brain cybernetic implant"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close)
- possible_locs = list("head")
- requires_organic_bodypart = 0
-
-/datum/surgery_step/cybernetic_implant/brain
- name = "insert brain cybernetic implant"
- implements = list(/obj/item/organ/internal/cyberimp/brain = 100)
- time = 32
-
-/datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/brain/implant, datum/surgery/surgery)
- if(implant)
- var/full = 0
- for(var/obj/item/I in target.internal_organs)
- if(istype(I,/obj/item/organ/internal/cyberimp/brain))
- full++
-
- if(full < MAX_BRAIN_IMPLANT)
- full = 0
- insert(user,target,implant,target_zone,full)
- return 1
-
-//[[[[CHEST]]]]
-/datum/surgery/cybernetic_implant/chest
- name = "torso cybernetic implant"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/chest, /datum/surgery_step/close)
- possible_locs = list("chest")
- requires_organic_bodypart = 0
-
-/datum/surgery_step/cybernetic_implant/chest
- name = "insert torso cybernetic implant"
- implements = list(/obj/item/organ/internal/cyberimp/chest = 100)
- time = 32
-
-/datum/surgery_step/cybernetic_implant/chest/success(mob/user, mob/living/carbon/target, target_zone, obj/item/organ/internal/cyberimp/chest/implant, datum/surgery/surgery)
- if(implant)
- var/full = 0
- for(var/obj/item/I in target.internal_organs)
- if(istype(I,/obj/item/organ/internal/cyberimp/chest))
- full++
- if(full < MAX_CHEST_IMPLANT)
- full = 0
-
- insert(user,target,implant,target_zone,full)
- return 1
-
-/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/organ/internal/cyberimp/implant,target_zone,full)
- if(full)
- user << "You can't seem to implant anything else into the [target]'s [target_zone]!"
- else
- user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!", "You insert [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone].")
- user.drop_item()
- implant.Insert(target)
\ No newline at end of file
diff --git a/code/modules/surgery/dethrall.dm b/code/modules/surgery/dethrall.dm
index bd54a7f3f6f..c421e8ece6e 100644
--- a/code/modules/surgery/dethrall.dm
+++ b/code/modules/surgery/dethrall.dm
@@ -3,14 +3,17 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/dethrall)
possible_locs = list("head")
+/datum/surgery/dethrall/can_start(mob/user, mob/living/carbon/target)
+ return is_thrall(target)
+
/datum/surgery_step/dethrall
name = "search head"
accept_hand = 1
time = 70
- var/obj/item/organ/brain/B = null
+ var/obj/item/organ/internal/brain/B = null
/datum/surgery_step/dethrall/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- B = target.getorgan(/obj/item/organ/brain)
+ B = target.getorgan(/obj/item/organ/internal/brain)
if(B)
user.visible_message("[user] begins looking around in [target]'s head.", "You begin looking for foreign influences on [target]'s brain...")
@@ -19,8 +22,6 @@
if(!is_thrall(target))
user << "You are unable to locate anything on [target]'s brain."
return 1
- user << "You locate a small, pulsing black tumor on the side of [target]'s brain and begin to remove it."
- target << "A small part of your head pulses with agony as the light impacts it."
sleep(30)
user.visible_message("[user] begins removing something from [target]'s head.", \
"You begin carefully extracting the tumor...")
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index 06117fb80d7..83821b42e1d 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -23,7 +23,7 @@
return 1
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(target.getorgan(/obj/item/organ/brain))
+ if(target.getorgan(/obj/item/organ/internal/brain))
user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!")
target.adjustBrainLoss(100)
else
diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm
index 1f01549e999..351e2eec06a 100644
--- a/code/modules/surgery/generic_steps.dm
+++ b/code/modules/surgery/generic_steps.dm
@@ -3,7 +3,7 @@
/datum/surgery_step/incise
name = "make incision"
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
- time = 24
+ time = 16
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].", "You begin to make an incision in [target]'s [parse_zone(target_zone)]...")
@@ -14,7 +14,7 @@
/datum/surgery_step/clamp_bleeders
name = "clamp bleeders"
implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15)
- time = 48
+ time = 24
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].", "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...")
@@ -29,7 +29,7 @@
/datum/surgery_step/retract_skin
name = "retract skin"
implements = list(/obj/item/weapon/retractor = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/wirecutters = 35)
- time = 32
+ time = 24
/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].", "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...")
@@ -40,7 +40,7 @@
/datum/surgery_step/close
name = "mend incision"
implements = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
- time = 32
+ time = 24
/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].", "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
@@ -75,7 +75,7 @@
/datum/surgery_step/saw
name = "saw bone"
implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
- time = 64
+ time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].", "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 021eddeb277..f3bbee0b6c9 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -33,7 +33,7 @@
break
var/P = input("Begin which procedure?", "Surgery", null, null) as null|anything in available_surgeries
- if(P && user.Adjacent(M) && (I in user))
+ if(P && user && user.Adjacent(M) && (I in user))
var/datum/surgery/S = available_surgeries[P]
var/datum/surgery/procedure = new S.type
if(procedure)
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb augmentation.dm
index d7ff7340302..fc8e72bdb75 100644
--- a/code/modules/surgery/limb augmentation.dm
+++ b/code/modules/surgery/limb augmentation.dm
@@ -61,11 +61,10 @@
if("head")
H.organs += new /obj/item/organ/limb/robot/head(src)
if("chest")
- var/datum/surgery_step/xenomorph_removal/xeno_removal = new
- xeno_removal.remove_xeno(user, target) // remove an alien if there is one
- H.organs += new /obj/item/organ/limb/robot/chest(src)
- for(var/datum/disease/appendicitis/A in H.viruses) //If they already have Appendicitis, Remove it
- A.cure(1)
+ for(var/obj/item/organ/internal/I in target.getorganszone(target_zone, 1))
+ if(I.status == ORGAN_ORGANIC) // FLESH IS WEAK
+ I.Remove(target, special = 1)
+ qdel(I)
user.drop_item()
qdel(tool)
H.update_damage_overlays(0)
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
new file mode 100644
index 00000000000..30ea86e3ea6
--- /dev/null
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -0,0 +1,111 @@
+/datum/surgery/organ_manipulation
+ name = "organ manipulation"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/saw,
+ /datum/surgery_step/manipulate_organs, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/close)
+ species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
+ possible_locs = list("chest", "head")
+ requires_organic_bodypart = 0
+
+/datum/surgery/organ_manipulation/soft
+ possible_locs = list("groin", "eyes", "mouth")
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/incise,
+ /datum/surgery_step/manipulate_organs, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/close)
+
+/datum/surgery/organ_manipulation/alien
+ name = "alien organ manipulation"
+ possible_locs = list("chest", "head", "groin", "eyes", "mouth")
+ species = list(/mob/living/carbon/alien/humanoid)
+ steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs)
+
+
+
+
+/datum/surgery_step/manipulate_organs
+ time = 64
+ name = "manipulate organs"
+ implements = list(/obj/item/organ/internal = 100)
+ var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55)
+ var/implements_mend = list(/obj/item/weapon/cautery = 100, /obj/item/weapon/weldingtool = 70, /obj/item/weapon/lighter = 45, /obj/item/weapon/match = 20)
+ var/current_type
+ var/obj/item/organ/internal/I = null
+
+/datum/surgery_step/manipulate_organs/New()
+ ..()
+ implements = implements + implements_extract + implements_mend
+
+/datum/surgery_step/manipulate_organs/tool_check(mob/user, obj/item/tool)
+ if(istype(tool, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = tool
+ if(!WT.isOn()) return 0
+
+ else if(istype(tool, /obj/item/weapon/lighter))
+ var/obj/item/weapon/lighter/L = tool
+ if(!L.lit) return 0
+
+ else if(istype(tool, /obj/item/weapon/match))
+ var/obj/item/weapon/match/M = tool
+ if(!M.lit) return 0
+
+ return 1
+
+
+/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ I = null
+ if(isorgan(tool))
+ current_type = "insert"
+ I = tool
+ if(target_zone != I.zone || target.getorganslot(I.slot))
+ user << "There is no room for [I] in [target]'s [parse_zone(target_zone)]!"
+ return -1
+
+ user.visible_message("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
+ "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...")
+
+ else if(implement_type in implements_extract)
+ current_type = "extract"
+ var/list/organs = target.getorganszone(target_zone)
+ if(!organs.len)
+ user << "There is no removeable organs in [target]'s [parse_zone(target_zone)]!"
+ return -1
+ else
+ for(var/obj/item/organ/internal/O in organs)
+ O.on_find(user)
+ organs -= O
+ organs[O.name] = O
+
+ I = input("Remove which organ?", "Surgery", null, null) as null|anything in organs
+ if(I && user && target && user.Adjacent(target) && user.get_active_hand() == tool)
+ I = organs[I]
+ if(!I) return -1
+ user.visible_message("[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
+ "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...")
+ else
+ return -1
+
+ else if(implement_type in implements_mend)
+ current_type = "mend"
+
+
+/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(current_type == "mend")
+ user.visible_message("[user] mend the incision in [target]'s [parse_zone(target_zone)].",
+ "You mend the incision in [target]'s [parse_zone(target_zone)].")
+ return 1
+ else if(current_type == "insert")
+ I = tool
+ user.drop_item()
+ I.Insert(target)
+ user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
+ "You insert [tool] into [target]'s [parse_zone(target_zone)].")
+
+ else if(current_type == "extract")
+ if(I && I.owner == target)
+ user.visible_message("[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
+ "You successfully extract [I] from [target]'s [parse_zone(target_zone)].")
+ add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
+ I.Remove(target)
+ I.loc = get_turf(target)
+ else
+ user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
+ "You can't extract anything from [target]'s [parse_zone(target_zone)]!")
+ return 0
\ No newline at end of file
diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm
index 18b4185ea52..a3f8d5de65b 100644
--- a/code/modules/surgery/organs/helpers.dm
+++ b/code/modules/surgery/organs/helpers.dm
@@ -11,8 +11,16 @@ mob/proc/getorganslot(slot)
mob/living/carbon/getorgan(typepath)
return (locate(typepath) in internal_organs)
-mob/living/carbon/getorganszone(zone)
+mob/living/carbon/getorganszone(zone, var/subzones = 0)
var/list/returnorg = list()
+ if(subzones)
+ if(zone == "head")
+ returnorg = getorganszone("eyes") + getorganszone("mouth")
+ // We don't have mouth organs now, but who knows?
+ if(zone == "chest")
+ returnorg = getorganszone("groin")
+
+
for(var/obj/item/organ/internal/O in internal_organs)
if(zone == O.zone)
returnorg += O
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index ae4e1e00a55..f37761f55a2 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -1,12 +1,15 @@
/obj/item/organ/internal
origin_tech = "biotech=2"
+ force = 1
+ w_class = 2
+ throwforce = 0
var/zone = "chest"
var/slot
var/vital = 0
var/organ_action_name = null
-/obj/item/organ/internal/proc/Insert(var/mob/living/carbon/M, special = 0)
- if(!iscarbon(M) || owner)
+/obj/item/organ/internal/proc/Insert(mob/living/carbon/M, special = 0)
+ if(!iscarbon(M) || owner == M)
return
var/obj/item/organ/internal/replaced = M.getorganslot(slot)
@@ -19,7 +22,8 @@
if(organ_action_name)
action_button_name = organ_action_name
-/obj/item/organ/internal/proc/Remove(var/mob/living/carbon/M, special = 0)
+
+/obj/item/organ/internal/proc/Remove(mob/living/carbon/M, special = 0)
owner = null
if(M)
M.internal_organs -= src
@@ -29,14 +33,42 @@
if(organ_action_name)
action_button_name = null
+/obj/item/organ/internal/proc/on_find(mob/living/finder)
+ return
+
/obj/item/organ/internal/proc/on_life()
return
+/obj/item/organ/internal/proc/prepare_eat()
+ var/obj/item/weapon/reagent_containers/food/snacks/S = new
+ S.name = name
+ S.desc = desc
+ S.icon = icon
+ S.icon_state = icon_state
+ S.origin_tech = origin_tech
+ S.w_class = w_class
+ S.reagents.add_reagent("nutriment", 5)
+
+ return S
+
/obj/item/organ/internal/Destroy()
if(owner)
Remove(owner, 1)
..()
+/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
+ if(M == user && ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(status == ORGAN_ORGANIC)
+ var/obj/item/weapon/reagent_containers/food/snacks/S = prepare_eat()
+ if(S)
+ H.drop_item()
+ H.put_in_active_hand(S)
+ S.attack(H, H)
+ qdel(src)
+ else
+ ..()
+
//Looking for brains?
//Try code/modules/mob/living/carbon/brain/brain_item.dm
@@ -57,17 +89,23 @@
else
icon_state = "heart-off"
-/obj/item/organ/internal/heart/Insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0)
..()
beating = 1
update_icon()
-/obj/item/organ/internal/heart/Remove(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/Remove(mob/living/carbon/M, special = 0)
..()
spawn(120)
beating = 0
update_icon()
+/obj/item/organ/internal/heart/prepare_eat()
+ var/obj/S = ..()
+ S.icon_state = "heart-off"
+ return S
+
+
/obj/item/organ/internal/appendix
name = "appendix"
@@ -84,12 +122,20 @@
icon_state = "appendix"
name = "appendix"
-/obj/item/organ/internal/appendix/Remove(var/mob/living/carbon/M, special = 0)
- for(var/datum/disease/appendicitis in M.viruses)
- appendicitis.cure()
+/obj/item/organ/internal/appendix/Remove(mob/living/carbon/M, special = 0)
+ for(var/datum/disease/appendicitis/A in M.viruses)
+ A.cure()
+ inflamed = 1
+ update_icon()
..()
-/obj/item/organ/internal/appendix/Insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/appendix/Insert(mob/living/carbon/M, special = 0)
..()
if(inflamed)
- M.AddDisease(new /datum/disease/appendicitis)
\ No newline at end of file
+ M.AddDisease(new /datum/disease/appendicitis)
+
+/obj/item/organ/internal/appendix/prepare_eat()
+ var/obj/S = ..()
+ if(inflamed)
+ S.reagents.add_reagent("????", 5)
+ return S
\ No newline at end of file
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 9a9196562fd..0801896b63a 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -5,7 +5,6 @@
var/step_in_progress = 0 //Actively performing a Surgery
var/list/species = list(/mob/living/carbon/human) //Acceptable Species
var/location = "chest" //Surgery location
- var/target_must_be_dead = 0 //Needs to be dead
var/requires_organic_bodypart = 1 //Prevents you from performing an operation on robotic limbs
var/list/possible_locs = list() //Multiple locations -- c0
var/ignore_clothes = 0 //This surgery ignores clothes
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index bd442c7c5a7..0b9c9980668 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -38,9 +38,11 @@
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
surgery.step_in_progress = 1
- preop(user, target, target_zone, tool, surgery)
- if(do_after(user, time, target = target))
+ if(preop(user, target, target_zone, tool, surgery) == -1)
+ surgery.step_in_progress = 0
+ return
+ if(do_after(user, time, target = target))
var/advance = 0
var/prob_chance = 100
diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm
deleted file mode 100644
index 97cabb6d003..00000000000
--- a/code/modules/surgery/xenomorph_removal.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/datum/surgery/xenomorph_removal
- name = "xenomorph removal"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/xenomorph_removal, /datum/surgery_step/close)
- species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- possible_locs = list("chest")
-
-
-
-//remove xeno from premises
-/datum/surgery_step/xenomorph_removal
- name = "remove foregin body"
- implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/shovel/spade = 65, /obj/item/weapon/cultivator = 50, /obj/item/weapon/crowbar = 35)
- time = 64
-
-/datum/surgery_step/xenomorph_removal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to search in [target]'s chest for a xenomorph embryo.", "You begin to search in [target]'s chest for a xenomorph embryo...")
-
-/datum/surgery_step/xenomorph_removal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(remove_xeno(user, target))
- user.visible_message("[user] successfully extracts the xenomorph embryo from [target]!", "You successfully extract the xenomorph embryo from [target].")
- else
- user.visible_message("[user] can't seem to find anything in [target]'s chest!", "You can't find anything in [target]'s chest!")
- return 1
-
-/datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target)
- var/obj/item/organ/internal/body_egg/alien_embryo/A = target.getorgan(/obj/item/organ/internal/body_egg/alien_embryo)
- if(A)
- user << "You found an unknown alien organism in [target]'s chest!"
- if(A.stage < 4)
- user << "It's small and weak, barely the size of a foetus."
- else
- user << "It's grown quite large, and writhes slightly as you look at it."
- if(prob(10))
- A.AttemptGrow()
-
- A.Remove(target)
- A.loc = get_turf(target)
- return 1
-
-
-/datum/surgery_step/xenomorph_removal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/organ/internal/body_egg/alien_embryo/A = target.getorgan(/obj/item/organ/internal/body_egg/alien_embryo)
- if(A)
- if(prob(50))
- A.AttemptGrow(0)
- user.visible_message("[user] accidentally pokes the xenomorph in [target]!", "You accidentally poke the xenomorph in [target]!")
- else
- target.adjustOxyLoss(30)
- user.visible_message("[user] accidentally pokes [target] in the lungs!", "You accidentally poke [target] in the lungs!")
- return 0
\ No newline at end of file
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index e3a0165745f..e1f7fe92119 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index c74ce5cdc57..f96c55342d3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1242,7 +1242,6 @@
#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
-#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
@@ -1489,11 +1488,8 @@
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\modules\shuttle\shuttle.dm"
-#include "code\modules\surgery\appendectomy.dm"
-#include "code\modules\surgery\brain_removal.dm"
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
-#include "code\modules\surgery\cybernetic_implants.dm"
#include "code\modules\surgery\dethrall.dm"
#include "code\modules\surgery\eye_surgery.dm"
#include "code\modules\surgery\gender_reassignment.dm"
@@ -1502,12 +1498,12 @@
#include "code\modules\surgery\implant_removal.dm"
#include "code\modules\surgery\limb augmentation.dm"
#include "code\modules\surgery\lipoplasty.dm"
+#include "code\modules\surgery\organ_manipulation.dm"
#include "code\modules\surgery\plastic_surgery.dm"
#include "code\modules\surgery\remove_embedded_object.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\surgery\surgery_step.dm"
#include "code\modules\surgery\tools.dm"
-#include "code\modules\surgery\xenomorph_removal.dm"
#include "code\modules\surgery\organs\augments_external.dm"
#include "code\modules\surgery\organs\augments_eyes.dm"
#include "code\modules\surgery\organs\augments_internal.dm"