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"