@@ -15,6 +15,7 @@
if(name == "alien hunter")
name = text("alien hunter ([rand(1, 1000)])")
real_name = name
internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/hunter
..()

/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
@@ -45,8 +45,10 @@
if(name == "alien sentinel")
name = text("alien sentinel ([rand(1, 1000)])")
real_name = name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin)
..()
internal_organs += new /obj/item/organ/internal/xenos/plasmavessel
internal_organs += new /obj/item/organ/internal/xenos/acid
internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
//..()

/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates()
..() //-Yvarov
@@ -48,8 +48,12 @@
break

real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/resin)
..()
internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/queen
internal_organs += new /obj/item/organ/internal/xenos/resinspinner
internal_organs += new /obj/item/organ/internal/xenos/acid
internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
internal_organs += new /obj/item/organ/internal/xenos/eggsac
//..()

/mob/living/carbon/alien/humanoid/empress

@@ -24,8 +24,12 @@
break

real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin)
..()
internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/lqueen
internal_organs += new /obj/item/organ/internal/xenos/resinspinner
internal_organs += new /obj/item/organ/internal/xenos/acid
internal_organs += new /obj/item/organ/internal/xenos/neurotoxin
internal_organs += new /obj/item/organ/internal/xenos/eggsac
// ..()


/mob/living/carbon/alien/humanoid/queen
@@ -25,6 +25,8 @@
regenerate_icons()
add_language("Xenomorph")
add_language("Hivemind")
internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/larva

..()

//This is fine, works the same as a human
@@ -2,38 +2,57 @@
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds

/obj/item/alien_embryo
/obj/item/organ/internal/body_egg/alien_embryo
name = "alien embryo"
desc = "All slimy and yuck."
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
var/mob/living/affected_mob
var/stage = 0

/obj/item/alien_embryo/New()
if(istype(loc, /mob/living))
affected_mob = loc
affected_mob.status_flags |= XENO_HOST
if(istype(affected_mob,/mob/living/carbon))
var/mob/living/carbon/H = affected_mob
H.med_hud_set_status()
processing_objects.Add(src)
spawn(0)
AddInfectionImages(affected_mob)
/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
qdel(src)
finder << "It's grown quite large, and writhes slightly as you look at it."
if(prob(10))
AttemptGrow(0)

/obj/item/alien_embryo/Destroy()
if(affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
if(istype(affected_mob,/mob/living/carbon))
var/mob/living/carbon/H = affected_mob
H.med_hud_set_status()
spawn(0)
RemoveInfectionImages(affected_mob)
return ..()
/obj/item/organ/internal/body_egg/alien_embryo/prepare_eat()
var/obj/S = ..()
S.reagents.add_reagent("sacid", 10)
return S

/obj/item/alien_embryo/process()
/obj/item/organ/internal/body_egg/alien_embryo/on_life()
switch(stage)
if(2, 3)
if(prob(2))
owner.emote("sneeze")
if(prob(2))
owner.emote("cough")
if(prob(2))
owner << "<span class='danger'>Your throat feels sore.</span>"
if(prob(2))
owner << "<span class='danger'>Mucous runs down the back of your throat.</span>"
if(4)
if(prob(2))
owner.emote("sneeze")
if(prob(2))
owner.emote("cough")
if(prob(4))
owner << "<span class='danger'>Your muscles ache.</span>"
if(prob(20))
owner.take_organ_damage(1)
if(prob(4))
owner << "<span class='danger'>Your stomach hurts.</span>"
if(prob(20))
owner.adjustToxLoss(1)
if(5)
owner << "<span class='danger'>You feel something tearing its way out of your stomach...</span>"
owner.adjustToxLoss(10)

/obj/item/organ/internal/body_egg/alien_embryo/egg_process()
if(!affected_mob) return
if(loc != affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
@@ -51,38 +70,15 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
spawn(0)
RefreshInfectionImage()

switch(stage)
if(2, 3)
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "<span class='danger'>Your throat feels sore.</span>"
if(prob(1))
affected_mob << "<span class='danger'>Mucous runs down the back of your throat.</span>"
if(4)
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(2))
affected_mob << "<span class='danger'>Your muscles ache.</span>"
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(2))
affected_mob << "<span class='danger'>Your stomach hurts.</span>"
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
if(5)
affected_mob << "<span class='danger'>You feel something tearing its way out of your stomach...</span>"
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
if(prob(50))
AttemptGrow()

/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
if(stage == 5 && prob(50))
//for(var/datum/surgery/S in owner.surgeries)
// if(S.location == "chest" && istype(S.get_surgery_step(), /datum/surgery_step/manipulate_organs))
// AttemptGrow(0)
// return
AttemptGrow()

/obj/item/organ/internal/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
var/list/candidates = get_candidates(BE_ALIEN,ALIEN_AFK_BRACKET,1)
var/client/C = null

@@ -123,15 +119,15 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
Proc: RefreshInfectionImage()
Des: Removes the current icons located in the infected mob adds the current stage
----------------------------------------*/
/obj/item/alien_embryo/proc/RefreshInfectionImage()
/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()

/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
----------------------------------------*/
/obj/item/alien_embryo/proc/AddInfectionImages()
/obj/item/organ/internal/body_egg/proc/AddInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
var/I = image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "infected[stage]")
@@ -141,7 +137,7 @@ Des: Adds the infection image to all aliens for this embryo
Proc: RemoveInfectionImage(C)
Des: Removes all images from the mob infected by this embryo
----------------------------------------*/
/obj/item/alien_embryo/proc/RemoveInfectionImages()
/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
for(var/image/I in alien.client.images)
@@ -103,6 +103,8 @@ var/const/MAX_ACTIVE_TIME = 400
Attach(hit_atom)

/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
if(!isliving(M))
return 0
if( (!iscorgi(M) && !iscarbon(M)) || isalien(M))
return 0
if(attached)
@@ -112,24 +114,26 @@ var/const/MAX_ACTIVE_TIME = 400
spawn(MAX_IMPREGNATION_TIME)
attached = 0

var/mob/living/L = M //just so I don't need to use :
if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0
if(M.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
return 0

if(loc == M) return 0

if(loc == L) return 0
if(stat != CONSCIOUS) return 0
if(locate(/obj/item/alien_embryo) in L) return 0
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage

L.visible_message("<span class='userdanger'>[src] leaps at [L]'s face!</span>")
M.visible_message("<span class='userdanger'>[src] leaps at [M]'s face!</span>")

if(ishuman(L))
var/mob/living/carbon/human/H = L
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.head && H.head.flags & HEADCOVERSMOUTH)
H.visible_message("<span class='userdanger'>[src] smashes against [H]'s [H.head]!</span>")
death()
return 0

if(iscarbon(M))
var/mob/living/carbon/target = L
var/mob/living/carbon/target = M
if(target.wear_mask)
if(prob(20))
return 0
@@ -144,7 +148,7 @@ var/const/MAX_ACTIVE_TIME = 400
src.loc = target
target.equip_to_slot(src, slot_wear_mask,,0)

if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
if(!sterile) M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
var/mob/living/simple_animal/pet/corgi/C = M
loc = C
@@ -154,7 +158,7 @@ var/const/MAX_ACTIVE_TIME = 400
GoIdle() //so it doesn't jump the people that tear it off

spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(L)
Impregnate(M)

return 1

@@ -234,7 +238,7 @@ var/const/MAX_ACTIVE_TIME = 400

return

/proc/CanHug(var/mob/M)
/proc/CanHug(var/mob/living/M)
if(!M || !ismob(M))
return 0

@@ -244,6 +248,9 @@ var/const/MAX_ACTIVE_TIME = 400
if(iscorgi(M))
return 1

if(M.get_int_organ(/obj/item/organ/internal/xenos/hivenode))
return 0

var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
@@ -17,10 +17,10 @@
// I'm using this for mechs giving MMIs HUDs now

attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/organ/brain/crystal ))
if(istype(O, /obj/item/organ/internal/brain/crystal ))
user << "<span class='warning'> This brain is too malformed to be able to use with the [src].</span>"
return
if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO
if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO
if(!O:brainmob)
user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
return
@@ -36,7 +36,7 @@
living_mob_list += brainmob

user.drop_item()
if(istype(O,/obj/item/organ/brain/xeno))
if(istype(O,/obj/item/organ/internal/brain/xeno))
name = "Man-Machine Interface: Alien - [brainmob.real_name]"
icon = 'icons/mob/alien.dmi'
icon_state = "AlienMMI"
@@ -67,10 +67,10 @@
else
user << "<span class='notice'>You unlock and upend the MMI, spilling the brain onto the floor.</span>"
if(alien)
var/obj/item/organ/brain/xeno/brain = new(user.loc)
var/obj/item/organ/internal/brain/xeno/brain = new(user.loc)
dropbrain(brain,get_turf(user))
else
var/obj/item/organ/brain/brain = new(user.loc)
var/obj/item/organ/internal/brain/brain = new(user.loc)
dropbrain(brain,get_turf(user))
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
@@ -89,7 +89,7 @@
return
//I made this proc as a way to have a brainmob be transferred to any created brain, and to solve the
//problem i was having with alien/nonalien brain drops.
dropbrain(var/obj/item/organ/brain/brain, var/turf/dropspot)
dropbrain(var/obj/item/organ/internal/brain/brain, var/turf/dropspot)
brainmob.container = null//Reset brainmob mmi var.
brainmob.loc = brain//Throw mob into brain.
respawnable_list += brainmob
@@ -1,4 +1,4 @@
/obj/item/organ/brain
/obj/item/organ/internal/brain
name = "brain"
health = 400 //They need to live awhile longer than other organs.
max_damage = 200
@@ -15,28 +15,27 @@
parent_organ = "head"
vital = 1

/obj/item/organ/brain/attack_self(mob/user as mob)
/obj/item/organ/internal/brain/attack_self(mob/user as mob)
return //let's not have players taken out of the round as easily as a click, once you have their brain.

/obj/item/organ/brain/surgeryize()
/obj/item/organ/internal/brain/surgeryize()
if(!owner)
return
owner.ear_damage = 0 //Yeah, didn't you...hear? The ears are totally inside the brain.
owner.ear_deaf = 0

/obj/item/organ/brain/xeno
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
icon_state = "brain-x-d"

/obj/item/organ/brain/New()
/obj/item/organ/internal/brain/New()
..()
spawn(5)
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud

/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H)
/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H)
name = "\the [H]'s [initial(src.name)]"
brainmob = new(src)
brainmob.name = H.real_name
@@ -49,14 +48,14 @@
brainmob << "<span class='notice'>You feel slightly disoriented. That's normal when you're just a [initial(src.name)].</span>"
callHook("debrain", list(brainmob))

/obj/item/organ/brain/examine(mob/user) // -- TLE
/obj/item/organ/internal/brain/examine(mob/user) // -- TLE
..(user)
if(brainmob && brainmob.client)//if thar be a brain inside... the brain.
user << "You can feel the small spark of life still left in this one."
else
user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."

/obj/item/organ/brain/removed(var/mob/living/user)
/obj/item/organ/internal/brain/Remove(var/mob/living/user)

if(!owner) return ..() // Probably a redundant removal; just bail
name = "[owner.real_name]'s brain"
@@ -68,13 +67,13 @@

owner.brain_op_stage = 4.0

var/obj/item/organ/brain/B = src
var/obj/item/organ/internal/brain/B = src
if(istype(B) && istype(owner))
B.transfer_identity(owner)

..()

/obj/item/organ/brain/replaced(var/mob/living/target)
/obj/item/organ/internal/brain/Insert(var/mob/living/target)

if(target.key)
target.ghostize()
@@ -88,19 +87,22 @@
target.key = brainmob.key
..()

/obj/item/organ/brain/slime
/obj/item/organ/internal/brain/prepare_eat()
return // Too important to eat.

/obj/item/organ/internal/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
icon = 'icons/mob/slimes.dmi'
icon_state = "green slime extract"

/obj/item/organ/brain/golem
/obj/item/organ/internal/brain/golem
name = "chem"
desc = "A tightly furled roll of paper, covered with indecipherable runes."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"

/obj/item/organ/brain/Destroy() //copypasted from MMIs.
/obj/item/organ/internal/brain/Destroy() //copypasted from MMIs.
if(brainmob)
qdel(brainmob)
brainmob = null
@@ -36,7 +36,7 @@
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
spawn(15)
if(animation) qdel(animation)
@@ -1,4 +1,4 @@
mob/living
/mob/living
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
var/datum/middleClickOverride/middleClickOverride = null

@@ -13,9 +13,9 @@

playsound(src.loc, 'sound/effects/gib.ogg', 100, 1, 10)

for(var/obj/item/organ/I in internal_organs)
for(var/obj/item/organ/internal/I in internal_organs)
if(istype(loc,/turf))
I.removed()
I.Remove(src)
spawn()
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)

@@ -250,7 +250,7 @@
if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"

if(species.show_ssd && (!species.has_organ["brain"] || brain_op_stage != 4) && stat != DEAD)
if(species.show_ssd && (!species.has_organ["brain"] || species.get_int_organ(/obj/item/organ/internal/brain)) && stat != DEAD)
if(!key)
msg += "<span class='deadsay'>[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.</span>\n"
else if(!client)
@@ -1294,7 +1294,7 @@
species.create_organs(src)

if(!client || !key) //Don't boot out anyone already in the mob.
for (var/obj/item/organ/brain/H in world)
for (var/obj/item/organ/internal/brain/H in world)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -1310,14 +1310,14 @@
..()

/mob/living/carbon/human/proc/is_lung_ruptured()
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
var/obj/item/organ/internal/lungs/L = internal_organs_by_name["lungs"]
if(!L)
return 0

return L.is_bruised()

/mob/living/carbon/human/proc/rupture_lung()
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
var/obj/item/organ/internal/lungs/L = internal_organs_by_name["lungs"]
if(!L)
return 0

@@ -18,7 +18,7 @@
if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number
ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS
if(species.can_revive_by_healing)
var/obj/item/organ/brain/B = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/B = internal_organs_by_name["brain"]
if(B)
if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD)
update_revive()
@@ -32,7 +32,7 @@
return 0 //godmode

if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount, 1)
brainloss = sponge.damage
@@ -46,7 +46,7 @@
return 0 //godmode

if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.damage = min(max(amount, 0),(maxHealth*2))
brainloss = sponge.damage
@@ -60,7 +60,7 @@
return 0 //godmode

if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
else
@@ -1,5 +1,5 @@
/mob/living/carbon/human/proc/update_eyes()
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name["eyes"]
if(eyes)
eyes.update_colour()
regenerate_icons()
@@ -24,7 +24,7 @@
bad_external_organs |= Ex

//processing internal organs is pretty cheap, do that first.
for(var/obj/item/organ/I in internal_organs)
for(var/obj/item/organ/internal/I in internal_organs)
I.process()

//handle_stance()
@@ -47,7 +47,7 @@
if (!lying && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/I = pick(E.internal_organs)
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
I.take_damage(rand(3,5))

@@ -143,12 +143,12 @@
/mob/living/carbon/human/proc/handle_trace_chems()
//New are added for reagents to random organs.
for(var/datum/reagent/A in reagents.reagent_list)
var/obj/item/organ/O = pick(organs)
var/obj/item/organ/internal/O = pick(organs)
O.trace_chemicals[A.name] = 100

/mob/living/carbon/human/proc/sync_organ_dna()
var/list/all_bits = internal_organs|organs
for(var/obj/item/organ/O in all_bits)
for(var/obj/item/organ/internal/O in all_bits)
O.set_dna(dna)

/*
@@ -111,7 +111,7 @@
if(!. || !I)
return

var/obj/item/organ/O = I //Organs shouldn't be removed unless you call droplimb.
var/obj/item/organ/internal/O = I //Organs shouldn't be removed unless you call droplimb.
if(istype(O) && O.owner == src)
return

@@ -892,7 +892,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc


//Vision //god knows why this is here
var/obj/item/organ/vision
var/obj/item/organ/internal/vision
if(species.vision_organ)
vision = internal_organs_by_name[species.vision_organ]

@@ -1207,7 +1207,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
/mob/living/carbon/human/proc/handle_heartbeat()
var/client/C = src.client
if(C && C.prefs.sound & SOUND_HEARTBEAT) //disable heartbeat by pref
var/obj/item/organ/heart/H = internal_organs_by_name["heart"]
var/obj/item/organ/internal/heart/H = internal_organs_by_name["heart"]

if(!H) //H.status will runtime if there is no H (obviously)
return
@@ -28,11 +28,11 @@
body_temperature = 286

has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes,
"appendix" = /obj/item/organ/appendix,
"antennae" = /obj/item/organ/wryn/hivenode
"heart" = /obj/item/organ/internal/heart,
"brain" = /obj/item/organ/internal/brain,
"eyes" = /obj/item/organ/internal/eyes,
"appendix" = /obj/item/organ/internal/appendix,
"antennae" = /obj/item/organ/internal/wryn/hivenode
)

flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
@@ -47,7 +47,7 @@

/datum/species/wryn/handle_death(var/mob/living/carbon/human/H)
for(var/mob/living/carbon/C in living_mob_list)
if(locate(/obj/item/organ/wryn/hivenode) in C.internal_organs)
if(locate(/obj/item/organ/internal/wryn/hivenode) in C.internal_organs)
C << "<span class='danger'><B>Your antennae tingle as you are overcome with pain...</B></span>"
C << "<span class='danger'>It feels like part of you has died.</span>"

@@ -64,7 +64,7 @@
if(p_loc == M.loc && p_loc_m == H.loc)
qdel(H.internal_organs_by_name["antennae"])
H.remove_language("Wryn Hivemind")
new /obj/item/organ/wryn/hivenode(M.loc)
new /obj/item/organ/internal/wryn/hivenode(M.loc)
M << "<span class='notice'>You hear a loud crunch as you mercilessly pull off [H]'s antennae.</span>"
H << "<span class='danger'><B>You hear a loud crunch as your antennae is ripped off your head by [M].</span></B>"
H << "<span class='danger'><span class='danger'><B>It's so quiet...</B></span>"
@@ -96,11 +96,11 @@

reagent_tag = PROCESS_ORG
has_organ = list(
"heart" = /obj/item/organ/heart,
"crystalized brain" = /obj/item/organ/brain/crystal,
"eyes" = /obj/item/organ/eyes/luminescent_crystal,
"strange crystal" = /obj/item/organ/nucleation/strange_crystal,
"resonant crystal" = /obj/item/organ/nucleation/resonant_crystal
"heart" = /obj/item/organ/internal/heart,
"crystalized brain" = /obj/item/organ/internal/brain/crystal,
"eyes" = /obj/item/organ/internal/eyes/luminescent_crystal,
"strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal,
"resonant crystal" = /obj/item/organ/internal/nucleation/resonant_crystal
)

/datum/species/nucleation/handle_post_spawn(var/mob/living/carbon/human/H)
@@ -15,7 +15,7 @@


has_organ = list(
"brain" = /obj/item/organ/brain/golem
"brain" = /obj/item/organ/internal/brain/golem
)

/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
@@ -13,7 +13,7 @@
blood_color = "#CCCCCC"
flesh_color = "#AAAAAA"
has_organ = list(
"brain" = /obj/item/organ/brain
"brain" = /obj/item/organ/internal/brain
)

flags = NO_BLOOD | NO_BREATHE | NO_SCAN
@@ -96,13 +96,13 @@

// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/brain,
"appendix" = /obj/item/organ/appendix,
"eyes" = /obj/item/organ/eyes
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/list/has_limbs = list(
@@ -133,7 +133,11 @@
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.

for(var/obj/item/organ/organ in H.contents)
if((organ in H.organs) || (organ in H.internal_organs))
if((organ in H.organs))
qdel(organ)

for(var/obj/item/organ/internal/organ in H.contents)
if((organ in H.internal_organs))
qdel(organ)

if(H.organs) H.organs.Cut()
@@ -155,6 +159,7 @@
for(var/organ in has_organ)
var/organ_type = has_organ[organ]
H.internal_organs_by_name[organ] = new organ_type(H,1)
internal_organs += new organ

for(var/name in H.organs_by_name)
H.organs |= H.organs_by_name[name]
@@ -279,13 +279,13 @@
icon_template = 'icons/mob/human_races/r_armalis.dmi'

has_organ = list(
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes,
"stack" = /obj/item/organ/stack/vox
"heart" = /obj/item/organ/internal/heart,
"lungs" = /obj/item/organ/internal/lungs,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"eyes" = /obj/item/organ/internal/eyes,
"stack" = /obj/item/organ/internal/stack/vox
)

/datum/species/kidan
@@ -326,7 +326,7 @@
//ventcrawler = 1 //ventcrawling commented out

has_organ = list(
"brain" = /obj/item/organ/brain/slime
"brain" = /obj/item/organ/internal/brain/slime
)

/datum/species/grey
@@ -407,12 +407,12 @@
reagent_tag = PROCESS_ORG

has_organ = list(
"nutrient channel" = /obj/item/organ/diona/nutrients,
"neural strata" = /obj/item/organ/diona/strata,
"response node" = /obj/item/organ/diona/node,
"gas bladder" = /obj/item/organ/diona/bladder,
"polyp segment" = /obj/item/organ/diona/polyp,
"anchoring ligament" = /obj/item/organ/diona/ligament
"nutrient channel" = /obj/item/organ/internal/diona/nutrients,
"neural strata" = /obj/item/organ/internal/diona/strata,
"response node" = /obj/item/organ/internal/diona/node,
"gas bladder" = /obj/item/organ/internal/diona/bladder,
"polyp segment" = /obj/item/organ/internal/diona/polyp,
"anchoring ligament" = /obj/item/organ/internal/diona/ligament
)

has_limbs = list(
@@ -502,9 +502,9 @@
reagent_tag = PROCESS_SYN

has_organ = list(
"brain" = /obj/item/organ/mmi_holder/posibrain,
"cell" = /obj/item/organ/cell,
"optics" = /obj/item/organ/optical_sensor
"brain" = /obj/item/organ/internal/mmi_holder/posibrain,
"cell" = /obj/item/organ/internal/cell,
"optics" = /obj/item/organ/internal/optical_sensor
)

vision_organ = "optics"
@@ -245,7 +245,7 @@ var/global/list/damage_icon_parts = list()
qdel(stand_icon)
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
var/icon_key = ""
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name["eyes"]

if(eyes)
icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
@@ -9,6 +9,8 @@

if(..())
. = 1
for(var/obj/item/organ/internal/O in internal_organs)
O.on_life()
handle_changeling()

handle_wetness()
@@ -478,6 +480,13 @@
if(see_override)
see_invisible = see_override


/mob/living/carbon/handle_actions()
..()
for(var/obj/item/I in internal_organs)
give_action_button(I, 1)


/mob/living/carbon/handle_hud_icons()
return

@@ -924,3 +924,29 @@
//used in datum/reagents/reaction() proc
/mob/living/proc/get_permeability_protection()
return 0

/mob/living/proc/handle_actions()
//Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent
for(var/datum/action/A in actions)
if(A.CheckRemoval(src))
A.Remove(src)
for(var/obj/item/I in src)
give_action_button(I, 1)
return

/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0)
if(I.action_button_name)
if(!I.action)
if(istype(I, /obj/item/organ/internal))
I.action = new/datum/action/item_action/organ_action
else if(I.action_button_is_hands_free)
I.action = new/datum/action/item_action/hands_free
else
I.action = new/datum/action/item_action
I.action.name = I.action_button_name
I.action.target = I
I.action.Grant(src)

if(recursive)
for(var/obj/item/T in I)
give_action_button(I, recursive - 1)
@@ -245,7 +245,7 @@
user << "<span class='notice'>Internal prosthetics:</span>"
organ_found = null
if(H.internal_organs.len)
for(var/obj/item/organ/O in H.internal_organs)
for(var/obj/item/organ/internal/O in H.internal_organs)
if(!(O.status & ORGAN_ROBOT))
continue
organ_found = 1
@@ -268,24 +268,38 @@

/mob/living/simple_animal/hostile/asteroid/hivelord/death()
if(stat != DEAD)
new /obj/item/asteroid/hivelord_core(src.loc)
new /obj/item/organ/internal/hivelord_core(src.loc)
..()

/obj/item/asteroid/hivelord_core
/obj/item/organ/internal/hivelord_core
name = "hivelord remains"
desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating."
icon = 'icons/obj/food/food.dmi'
icon_state = "boiledrorocore"
slot = "hivecore"
var/inert = 0
var/preserved = 0

/obj/item/asteroid/hivelord_core/New()
/obj/item/organ/internal/hivelord_core/New()
spawn(2400)
if(!preserved)
inert = 1
desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."

/obj/item/asteroid/hivelord_core/attack(mob/living/M as mob, mob/living/user as mob)
/obj/item/organ/internal/hivelord_core/on_life()
..()
if(owner)
owner.adjustBruteLoss(-1)
owner.adjustFireLoss(-1)
owner.adjustOxyLoss(-2)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
var/datum/reagent/blood/B = locate() in H.vessel.reagent_list //Grab some blood
var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
if(B && blood_volume < 560 && blood_volume)
B.volume += 2 // Fast blood regen

/obj/item/organ/internal/hivelord_core/attack(mob/living/M as mob, mob/living/user as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(inert)
@@ -304,6 +318,9 @@
qdel(src)
..()

/obj/item/organ/internal/hivelord_core/prepare_eat()
return null

/mob/living/simple_animal/hostile/asteroid/hivelordbrood
name = "hivelord brood"
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
@@ -93,7 +93,7 @@
new /obj/effect/decal/cleanable/blood (src.loc)
new /obj/effect/gibspawner/generic(get_turf(src))
new /obj/effect/gibspawner/generic(get_turf(src))
new /obj/item/weapon/demonheart(src.loc)
new /obj/item/organ/internal/heart/demonheart(src.loc)
playsound(get_turf(src),'sound/misc/demon_dies.ogg', 200, 1)
visible_message("<span class='danger'>[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.</span>")
for(var/mob/living/M in consumed_mobs)
@@ -138,15 +138,15 @@
//////////The Loot

//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
/obj/item/weapon/demonheart
/obj/item/organ/internal/heart/demonheart
name = "demon heart"
desc = "Still it beats furiously, emanating an aura of utter hate."
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart"
origin_tech = "combat=5;biotech=8"


/obj/item/weapon/demonheart/attack_self(mob/living/user)
/obj/item/organ/internal/heart/demonheart/attack_self(mob/living/user)
user.visible_message("<span class='warning'>[user] raises [src] to their mouth and tears into it with their teeth!</span>", \
"<span class='danger'>An unnatural hunger consumes you. You raise [src] to your mouth and devour it!</span>")
playsound(user, 'sound/misc/Demon_consume.ogg', 50, 1)
@@ -159,8 +159,14 @@
user.bloodcrawl = BLOODCRAWL_EAT
else
user <<"<span class='warning'>...and you don't feel any different.</span>"
qdel(src)

user.drop_item()
src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E

/obj/item/organ/internal/heart/demonheart/Remove(mob/living/carbon/M, special = 0)
..()
if(M.mind)
M.bloodcrawl = 0

//Objectives and helpers.

@@ -360,7 +360,7 @@
assailant.attack_log += text("\[[time_stamp()]\] <font color='red'>Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])</font>")
affecting.attack_log += text("\[[time_stamp()]\] <font color='orange'>Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])</font>")
msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.")
var/obj/item/organ/eyes/eyes = affected.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = affected.internal_organs_by_name["eyes"]
eyes.damage += rand(3,4)
if (eyes.damage >= eyes.min_broken_damage)
if(M.stat != 2)
@@ -167,7 +167,7 @@ proc/isovermind(A)
return 1
return 0

proc/isorgan(A)
/proc/isorgan(A)
if(istype(A, /obj/item/organ/external))
return 1
return 0

This file was deleted.

This file was deleted.

@@ -182,7 +182,7 @@
continue
// Where we're going, we don't need eyes.
// Prosthetic eyes will also protect against this business.
var/obj/item/organ/eyes = l.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes = l.internal_organs_by_name["eyes"]
if(!istype(eyes))
continue
l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
@@ -525,7 +525,7 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
if(prob(80))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(istype(E))
E.damage = max(E.damage-1, 0)
M.eye_blurry = max(M.eye_blurry-1 , 0)
@@ -63,7 +63,7 @@
M:drowsyness = max(M:drowsyness, 30/sober_str)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"]
var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if (istype(L))
L.take_damage(0.1, 1)
H.adjustToxLoss(0.1)
@@ -24,7 +24,7 @@
M.eye_blind = 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(istype(E))
E.damage = max(E.damage-5 , 0)
M.SetWeakened(0)
@@ -79,7 +79,7 @@

//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
for(var/name in H.internal_organs_by_name)
var/obj/item/organ/I = H.internal_organs_by_name[name]
var/obj/item/organ/internal/I = H.internal_organs_by_name[name]
if(I.damage > 0)
I.damage = max(I.damage-0.4, 0)
..()
@@ -984,7 +984,7 @@
name = "IPC Microbattery"
id = "ipc_cell"
build_type = MECHFAB
build_path = /obj/item/organ/cell
build_path = /obj/item/organ/internal/cell
materials = list(MAT_METAL=2000, MAT_GLASS=750)
construction_time = 200
category = list("Misc")
@@ -993,7 +993,7 @@
name = "IPC Optical Sensor"
id = "ipc_optics"
build_type = MECHFAB
build_path = /obj/item/organ/optical_sensor
build_path = /obj/item/organ/internal/optical_sensor
materials = list(MAT_METAL=1000, MAT_GLASS=2500)
construction_time = 200
category = list("Misc")
@@ -39,7 +39,7 @@
target.blinded += 1.5

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
"\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
@@ -69,7 +69,7 @@
target.op_stage.eyes = 2

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
"\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
@@ -100,7 +100,7 @@
target.op_stage.eyes = 3

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
"\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
@@ -136,7 +136,7 @@
target.op_stage.eyes = 0

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
"\red Your hand slips, searing [target]'s eyes with \the [tool]!")
@@ -130,6 +130,7 @@
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
user.drop_item()
affected.hidden = tool
target.internal_organs += tool
tool.loc = target
affected.cavity = 0

@@ -87,7 +87,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122

// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
var/obj/item/organ/heart/heart = internal_organs_by_name["heart"]
var/obj/item/organ/internal/heart/heart = internal_organs_by_name["heart"]

if(heart)
if(heart.damage > 1 && heart.damage < heart.min_bruised_damage)
@@ -0,0 +1,53 @@
/obj/item/organ/internal/body_egg
name = "body egg"
desc = "All slimy and yuck."
icon_state = "innards"
origin_tech = "biotech=5"
parent_organ = "chest"
slot = "parasite_egg"

/obj/item/organ/internal/body_egg/on_find(mob/living/finder)
..()
finder << "<span class='warning'>You found an unknown alien organism in [owner]'s [parent_organ]!</span>"

/obj/item/organ/internal/body_egg/New(loc)
if(iscarbon(loc))
src.Insert(loc)
return ..()

/obj/item/organ/internal/body_egg/Insert(var/mob/living/carbon/M, special = 0)
..()
owner.status_flags |= XENO_HOST
processing_objects.Add(src)
owner.med_hud_set_status()
spawn(0)
AddInfectionImages(owner)

/obj/item/organ/internal/body_egg/Remove(var/mob/living/carbon/M, special = 0)
processing_objects.Remove(src)
if(owner)
owner.status_flags &= ~(XENO_HOST)
owner.med_hud_set_status()
spawn(0)
RemoveInfectionImages(owner)
..()

/obj/item/organ/internal/body_egg/process()
if(!owner) return
if(!(src in owner.internal_organs))
Remove(owner)
return
egg_process()

/obj/item/organ/internal/body_egg/proc/egg_process()
return

/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()

/obj/item/organ/internal/body_egg/proc/AddInfectionImages()
return

/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages()
return
@@ -0,0 +1,35 @@
/mob/proc/get_int_organ(typepath) //int stands for internal
return

/mob/proc/get_organs_zone(zone)
return

/mob/proc/get_organ_slot(slot) //is it a brain, is it a brain_tumor?
return

/mob/living/carbon/get_int_organ(typepath)
return (locate(typepath) in internal_organs)


/mob/living/carbon/get_organs_zone(zone, var/subzones = 0)
var/list/returnorg = list()
if(subzones)
// Include subzones - groin for chest, eyes and mouth for head
//Fethas note:We have check_zone, i may need to remove the below
if(zone == "head")
returnorg = get_organs_zone("eyes") + get_organs_zone("mouth")
if(zone == "chest")
returnorg = get_organs_zone("groin")

for(var/obj/item/organ/internal/O in internal_organs)
if(parent_organ == O.parent_organ)
returnorg += O
return returnorg

/mob/living/carbon/get_organ_slot(slot)
for(var/obj/item/organ/internal/O in internal_organs)
if(slot == O.slot)
return O

/proc/is_int_organ(atom/A)
return istype(A, /obj/item/organ/internal)
@@ -4,7 +4,7 @@ var/list/organ_cache = list()
name = "organ"
icon = 'icons/obj/surgery.dmi'
var/dead_icon
var/mob/living/carbon/human/owner = null
var/mob/living/carbon/owner = null
var/status = 0
var/vital //Lose a vital limb, die immediately.
var/damage = 0 // amount of damage to the organ
@@ -27,7 +27,7 @@ var/list/organ_cache = list()
/obj/item/organ/Destroy()
if(!owner)
return ..()

/*
if(istype(owner, /mob/living/carbon))
if((owner.internal_organs) && (src in owner.internal_organs))
owner.internal_organs -= src
@@ -38,17 +38,12 @@ var/list/organ_cache = list()
owner.organs -= src
if((owner.organs_by_name) && (src in owner.organs_by_name))
owner.organs_by_name -= src
*/
if(src in owner.contents)
owner.contents -= src

return ..()

/obj/item/organ/attack_self(mob/user as mob)

// Convert it to an edible form, yum yum.
if(!robotic && user.a_intent == I_HARM)
bitten(user)
return

/obj/item/organ/proc/update_health()
return
@@ -260,11 +255,6 @@ var/list/organ_cache = list()
if(!istype(owner))
return

owner.internal_organs_by_name[organ_tag] = null
owner.internal_organs_by_name -= organ_tag
owner.internal_organs_by_name -= null
owner.internal_organs -= src

var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
if(affected) affected.internal_organs -= src

@@ -289,41 +279,12 @@ var/list/organ_cache = list()

owner = target
processing_objects -= src
target.internal_organs |= src
//target.internal_organs |= src
affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src
//target.internal_organs_by_name[organ_tag] = src
src.loc = target
if(robotic)
status |= ORGAN_ROBOT

/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)

// Apply our eye colour to the target.
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_eyes()
..()

/obj/item/organ/proc/bitten(mob/user)

if(robotic)
return

user << "\blue You take a bite out of \the [src]."

user.unEquip(src)
var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src))
O.name = name
O.icon_state = dead_icon ? dead_icon : icon_state

if(fingerprints) O.fingerprints = fingerprints.Copy()
if(fingerprintshidden) O.fingerprintshidden = fingerprintshidden.Copy()
if(fingerprintslast) O.fingerprintslast = fingerprintslast

user.put_in_active_hand(O)
qdel(src)

/obj/item/organ/proc/surgeryize()
return
@@ -70,7 +70,7 @@
qdel(C)

if(internal_organs)
for(var/obj/item/organ/O in internal_organs)
for(var/obj/item/organ/internal/O in internal_organs)
qdel(O)

return ..()
@@ -161,7 +161,7 @@
if(internal_organs && (brute_dam >= max_damage || (((sharp && brute >= 5) || brute >= 10) && prob(5))))
// Damage an internal organ
if(internal_organs && internal_organs.len)
var/obj/item/organ/I = pick(internal_organs)
var/obj/item/organ/internal/I = pick(internal_organs)
I.take_damage(brute / 2)
brute -= brute / 2

@@ -280,7 +280,7 @@ This function completely restores a damaged organ to perfect condition.
burn_dam = 0

// handle internal organs
for(var/obj/item/organ/current_organ in internal_organs)
for(var/obj/item/organ/internal/current_organ in internal_organs)
current_organ.rejuvenate()


@@ -448,16 +448,16 @@ Note that amputating the affected organ does in fact remove the infection from t

if(germ_level >= INFECTION_LEVEL_TWO)
//spread the infection to internal organs
var/obj/item/organ/target_organ = null //make internal organs become infected one at a time instead of all at once
for (var/obj/item/organ/I in internal_organs)
var/obj/item/organ/internal/target_organ = null //make internal organs become infected one at a time instead of all at once
for (var/obj/item/organ/internal/I in internal_organs)
if (I.germ_level > 0 && I.germ_level < min(germ_level, INFECTION_LEVEL_TWO)) //once the organ reaches whatever we can give it, or level two, switch to a different one
if (!target_organ || I.germ_level > target_organ.germ_level) //choose the organ with the highest germ_level
target_organ = I

if (!target_organ)
//figure out which organs we can spread germs to and pick one at random
var/list/candidate_organs = list()
for (var/obj/item/organ/I in internal_organs)
for (var/obj/item/organ/internal/I in internal_organs)
if (I.germ_level < germ_level)
candidate_organs |= I
if (candidate_organs.len)
@@ -33,7 +33,7 @@ var/global/list/limb_icon_cache = list()

/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(eyes) eyes.update_colour()

/obj/item/organ/external/head/removed()
@@ -48,7 +48,7 @@ var/global/list/limb_icon_cache = list()
return

if(species.has_organ["eyes"])
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eyes)
@@ -0,0 +1,350 @@
#define PROCESS_ACCURACY 10

/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
/obj/item/organ/internal
origin_tech = "biotech=2"
force = 1
w_class = 2
throwforce = 0
organ_tag = "guts"
parent_organ = "chest" //aka the zone
var/slot
vital = 0
var/organ_action_name = null

/obj/item/organ/internal/proc/Insert(mob/living/carbon/M, special = 0)//insert the thing into the slot
if(!iscarbon(M) || owner == M)
return

var/obj/item/organ/internal/replaced = M.get_organ_slot(slot)
if(replaced)
replaced.Remove(M, special = 1)

owner = M
M.internal_organs |= src
M.internal_organs_by_name[organ_tag] = src
loc = null
if(organ_action_name)
action_button_name = organ_action_name

/obj/item/organ/internal/proc/Remove(mob/living/carbon/M, special = 0)
owner = null
if(M)
M.internal_organs_by_name[organ_tag] = null
M.internal_organs_by_name -= organ_tag
M.internal_organs_by_name -= null
M.internal_organs -= src

loc = get_turf(M)
processing_objects |= src
var/datum/reagent/blood/organ_blood
if(reagents) organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
M.vessel.trans_to(src, 5, 1, 1)

if(vital && !special)
//if(user)
// user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [key_name(M)] (INTENT: [uppertext(user.a_intent)])</font>"
// M.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])</font>"
// msg_admin_attack("[key_name_admin(user)] removed a vital organ ([src]) from [key_name_admin(M)]")
M.death()


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/organ/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

return S

/obj/item/weapon/reagent_containers/food/snacks/organ
name = "appendix"
icon_state = "appendix"
icon = 'icons/obj/surgery.dmi'

reagents.add_reagent("nutriment",5)


/obj/item/organ/internal/Destroy()
if(owner)
Remove(owner, 1)
return

/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
if(robotic)
return

if(M == user && ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/weapon/reagent_containers/food/snacks/S = prepare_eat()
if(S)
H.unEquip()
H.put_in_active_hand(S)
if(fingerprints) S.fingerprints = fingerprints.Copy()
if(fingerprintshidden) S.fingerprintshidden = fingerprintshidden.Copy()
if(fingerprintslast) S.fingerprintslast = fingerprintslast
S.attack(H, H)
qdel(src)
else
..()


///THE ORGANS

// Brain is defined in brain_item.dm.
/obj/item/organ/internal/heart
name = "heart"
icon_state = "heart-on"
organ_tag = "heart"
parent_organ = "chest"
slot = "heart"
origin_tech = "biotech=3"
vital = 1
var/beating

/obj/item/organ/internal/heart/update_icon()
if(beating)
icon_state = "heart-on"
else
icon_state = "heart-off"

/obj/item/organ/internal/heart/Insert(mob/living/carbon/M, special = 0)
..()
beating = 1
update_icon()

/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/lungs
name = "lungs"
icon_state = "lungs"
gender = PLURAL
organ_tag = "lungs"
parent_organ = "chest"
slot = "lungs"
origin_tech = "biotech=2"

/obj/item/organ/internal/lungs/process()///Fethas note, Should this be organ on life?
..()
//to_do per fethas: Could we handle some of the species breathing in here?

if(!owner)
return

if (germ_level > INFECTION_LEVEL_ONE)
if(prob(5))
owner.emote("cough") //respitory tract infection

if(is_bruised())
if(prob(2))
spawn owner.custom_emote(1, "coughs up blood!")
owner.drip(10)
if(prob(4))
spawn owner.custom_emote(1, "gasps for air!")
owner.losebreath += 5

/obj/item/organ/internal/kidneys
name = "kidneys"
icon_state = "kidneys"
gender = PLURAL
organ_tag = "kidneys"
parent_organ = "groin"
slot = "kidneys"
origin_tech = "biotech=2"


/obj/item/organ/internal/kidneys/process()

..()

if(!owner)
return

// Coffee is really bad for you with busted kidneys.
// This should probably be expanded in some way, but fucked if I know
// what else kidneys can process in our reagent list.
var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list
if(coffee)
if(is_bruised())
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)
else if(is_broken())
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)


/obj/item/organ/internal/eyes
name = "eyeballs"
icon_state = "eyes"
gender = PLURAL
organ_tag = "eyes"
parent_organ = "head"
slot = "eyes"
origin_tech = "biotech=2"
var/list/eye_colour = list(0,0,0)

/obj/item/organ/internal/eyes/proc/update_colour()
if(!owner)
return
eye_colour = list(
owner.r_eyes ? owner.r_eyes : 0,
owner.g_eyes ? owner.g_eyes : 0,
owner.b_eyes ? owner.b_eyes : 0
)

/obj/item/organ/internal/eyes/Insert(mob/living/carbon/M, special = 0)
..()
// Apply our eye colour to the target.
if(istype(M) && eye_colour)
M.r_eyes = eye_colour[1]
M.g_eyes = eye_colour[2]
M.b_eyes = eye_colour[3]
M.update_eyes()


/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
return
owner.disabilities &= ~NEARSIGHTED
owner.sdisabilities &= ~BLIND
owner.eye_blurry = 0
owner.eye_blind = 0

/obj/item/organ/internal/liver
name = "liver"
icon_state = "liver"
organ_tag = "liver"
parent_organ = "groin"
slot = "liver"
origin_tech = "biotech=1"

/obj/item/organ/internal/liver/process()

..()

if(!owner)
return

if (germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
owner << "\red Your skin itches."
if (germ_level > INFECTION_LEVEL_TWO)
if(prob(1))
spawn owner.vomit()

if(owner.life_tick % PROCESS_ACCURACY == 0)

//High toxins levels are dangerous
if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("charcoal"))
//Healthy liver suffers on its own
if (src.damage < min_broken_damage)
src.damage += 0.2 * PROCESS_ACCURACY
//Damaged one shares the fun
else
var/obj/item/organ/O = pick(owner.internal_organs)
if(O)
O.damage += 0.2 * PROCESS_ACCURACY

//Detox can heal small amounts of damage
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("charcoal"))
src.damage -= 0.2 * PROCESS_ACCURACY

if(src.damage < 0)
src.damage = 0

// Get the effectiveness of the liver.
var/filter_effect = 3
if(is_bruised())
filter_effect -= 1
if(is_broken())
filter_effect -= 2

// Damaged liver means some chemicals are very dangerous
if(src.damage >= src.min_bruised_damage)
for(var/datum/reagent/R in owner.reagents.reagent_list)
// Ethanol and all drinks are bad
if(istype(R, /datum/reagent/ethanol))
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)

// Can't cope with toxins at all
for(var/toxin in list("toxin", "plasma", "sacid", "facid", "cyanide", "amanitin", "carpotoxin"))
if(owner.reagents.has_reagent(toxin))
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)

/obj/item/organ/internal/appendix
name = "appendix"
icon_state = "appendix"
organ_tag = "appendix"
parent_organ = "groin"
slot = "appendix"
origin_tech = "biotech=1"

/*
/obj/item/organ/appendix/removed()
if(owner)
var/inflamed = 0
for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
inflamed = 1
appendicitis.cure()
owner.resistances += appendicitis
if(inflamed)
icon_state = "appendixinflamed"
name = "inflamed appendix"
..()
*/

//shadowling brain tumor
/obj/item/organ/internal/shadowtumor
name = "black tumor"
desc = "A tiny black mass with red tendrils trailing from it. It seems to shrivel in the light."
icon_state = "blacktumor"
origin_tech = "biotech=4"
w_class = 1
organ_tag = "blacktumor"
parent_organ = "head"
slot = "brain_tumor"
health = 3

/obj/item/organ/internal/shadowtumor/New()
..()
processing_object.Add(src)

/obj/item/organ/internal/shadowtumor/Destroy()
processing_object.Remove(src)
..()

/obj/item/organ/internal/shadowtumor/process()
if(isturf(loc))
var/turf/T = loc
var/light_count = T.get_lumcount()
if(light_count > 4 && health > 0) //Die in the light
health--
else if(light_count < 2 && health < 3) //Heal in the dark
health++
if(health <= 0)
visible_message("<span class='warning'>[src] collapses in on itself!</span>")
qdel(src)
File renamed without changes.
@@ -118,8 +118,8 @@ mob/living/carbon/human/proc/handle_pain()


// Damage to internal organs hurts a lot.
for(var/obj/item/organ/I in internal_organs)
if(istype(I, /obj/item/organ/brain)) //the brain has no pain receptors, and brain damage is meant to be a stealthy damage type.
for(var/obj/item/organ/internal/I in internal_organs)
if(istype(I, /obj/item/organ/internal/brain)) //the brain has no pain receptors, and brain damage is meant to be a stealthy damage type.
continue
if(I.damage > 2) if(prob(2))
var/obj/item/organ/external/parent = get_organ(I.parent_organ)
File renamed without changes.
File renamed without changes.
@@ -149,35 +149,62 @@
/obj/item/organ/diona/process()
return

/obj/item/organ/diona/strata
/obj/item/organ/internal/diona/strata
name = "neural strata"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
origin_tech = "biotech=3"
parent_organ = "chest"
slot = "heart"

/obj/item/organ/diona/bladder
/obj/item/organ/internal/diona/bladder
name = "gas bladder"
parent_organ = "head"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
origin_tech = "biotech=3"
slot = "brain"

/obj/item/organ/diona/polyp
/obj/item/organ/internal/diona/polyp
name = "polyp segment"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
origin_tech = "biotech=3"
parent_organ = "groin"
slot = "kidneys"

/obj/item/organ/diona/ligament
/obj/item/organ/internal/diona/ligament
name = "anchoring ligament"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
origin_tech = "biotech=3"
parent_organ = "groin"
slot = "appendix"

/obj/item/organ/diona/node
/obj/item/organ/internal/diona/node
name = "receptor node"
organ_tag = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
origin_tech = "biotech=3"
parent_organ = "head"
slot = "eyes"

//TODO:Make absorb rads on insert

/obj/item/organ/diona/nutrients
/obj/item/organ/internal/diona/nutrients
name = "nutrient vessel"
parent_organ = "chest"
organ_tag = "nutrient vessel"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
slot = "nutri_vessel"

/obj/item/organ/diona
name = "diona nymph"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
//TODO:Make absorb light on insert.

/*/obj/item/organ/diona/removed(var/mob/living/user)
var/mob/living/carbon/human/H = owner
@@ -186,23 +213,3 @@
H.death()
if(prob(50) && spawn_diona_nymph_from_organ(src))
qdel(src) */

// These are different to the standard diona organs as they have a purpose in other
// species (absorbing radiation and light respectively)
/obj/item/organ/diona/nutrients
name = "nutrient vessel"
organ_tag = "nutrient vessel"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"

/obj/item/organ/diona/nutrients/removed()
return

/obj/item/organ/diona/node
name = "receptor node"
organ_tag = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"

/obj/item/organ/diona/node/removed()
return
@@ -53,56 +53,59 @@
robotize("Morpheus Cyberkinetics")
..()

/obj/item/organ/cell
/obj/item/organ/internal/cell
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
icon = 'icons/obj/power.dmi'
icon_state = "scell"
organ_tag = "cell"
parent_organ = "chest"
slot = "heart"
vital = 1

/obj/item/organ/cell/New()
/obj/item/organ/internal/cell/New()
robotize()
..()

/obj/item/organ/cell/replaced()
/obj/item/organ/internal/cell/Insert()
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
if(owner && owner.stat == DEAD)
owner.stat = CONSCIOUS
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")

/obj/item/organ/optical_sensor
/obj/item/organ/internal/optical_sensor
name = "optical sensor"
organ_tag = "optics"
parent_organ = "head"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
dead_icon = "camera_broken"
slot = "eyes"
// dead_icon = "camera_broken"

/obj/item/organ/optical_sensor/New()
/obj/item/organ/internal/optical_sensor/New()
robotize()
..()

// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/mmi_holder
/obj/item/organ/internal/mmi_holder
name = "brain"
organ_tag = "brain"
parent_organ = "chest"
vital = 1
max_damage = 200
slot = "brain"
var/obj/item/device/mmi/stored_mmi

/obj/item/organ/mmi_holder/proc/update_from_mmi()
/obj/item/organ/internal/mmi_holder/proc/update_from_mmi()
if(!stored_mmi)
return
name = stored_mmi.name
desc = stored_mmi.desc
icon = stored_mmi.icon
icon_state = stored_mmi.icon_state

/obj/item/organ/mmi_holder/removed(var/mob/living/user)
/obj/item/organ/internal/mmi_holder/Remove(var/mob/living/user)
if(stored_mmi)
stored_mmi.loc = get_turf(src)
if(owner.mind)
@@ -114,15 +117,15 @@
holder_mob.unEquip(src)
qdel(src)

/obj/item/organ/mmi_holder/New()
/obj/item/organ/internal/mmi_holder/New()
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
spawn(1)
if(owner && owner.stat == DEAD)
owner.stat = CONSCIOUS
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")

/obj/item/organ/mmi_holder/posibrain/New()
/obj/item/organ/internal/mmi_holder/posibrain/New()
robotize()
stored_mmi = new /obj/item/device/mmi/posibrain(src)
..()
@@ -1,10 +1,14 @@
//CORTICAL BORER ORGANS.
/obj/item/organ/borer
/obj/item/organ/internal/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
parent_organ = "head"
organ_tag = "brain"
slot = "borer"
vital = 1

/obj/item/organ/borer/process()
/obj/item/organ/internal/borer/process()

// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
for(var/chem in list("saline", "sailcylic", "meth", "mannitol"))
@@ -26,14 +30,7 @@
goo.basecolor = "#412464"
goo.update_icon()

/obj/item/organ/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
organ_tag = "brain"
desc = "A disgusting space slug."

/obj/item/organ/borer/removed(var/mob/living/user)
/obj/item/organ/internal/borer/Remove(var/mob/living/user)

..()

@@ -46,22 +43,23 @@
qdel(src)

//VOX ORGANS.
/obj/item/organ/stack
/obj/item/organ/internal/stack
name = "cortical stack"
icon_state = "brain-prosthetic"
parent_organ = "head"
organ_tag = "stack"
slot = "brain"
robotic = 2
vital = 1
var/backup_time = 0
var/datum/mind/backup

/obj/item/organ/stack/process()
/obj/item/organ/internal/stack/process()
if(owner && owner.stat != 2 && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind

/obj/item/organ/stack/vox
/obj/item/organ/internal/stack/vox
name = "vox cortical stack"

/obj/item/organ/stack/vox/stack
/obj/item/organ/internal/stack/vox/stack
@@ -1,33 +1,37 @@
//NUCLEATION ORGAN
/obj/item/organ/nucleation
/obj/item/organ/internal/nucleation
name = "nucleation organ"
icon = 'icons/obj/surgery.dmi'
desc = "A crystalized human organ. /red It has a strangely iridescent glow."

/obj/item/organ/nucleation/resonant_crystal
/obj/item/organ/internal/nucleation/resonant_crystal
name = "resonant crystal"
icon_state = "resonant-crystal"
organ_tag = "resonant crystal"
parent_organ = "head"
slot = "res_crystal"

/obj/item/organ/nucleation/strange_crystal
/obj/item/organ/internal/nucleation/strange_crystal
name = "strange crystal"
icon_state = "strange-crystal"
organ_tag = "strange crystal"
parent_organ = "chest"
slot = "heart"

/obj/item/organ/eyes/luminescent_crystal

/obj/item/organ/internal/eyes/luminescent_crystal
name = "luminescent eyes"
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
parent_organ = "head"
slot = "eyes"

New()
set_light(2)
/obj/item/organ/internal/eyes/luminescent_crystal/New()
set_light(2)

/obj/item/organ/brain/crystal
/obj/item/organ/internal/brain/crystal
name = "crystalized brain"
icon_state = "crystal-brain"
organ_tag = "crystalized brain"

slot = "brain"
File renamed without changes.
File renamed without changes.
@@ -1,11 +1,8 @@
//WRYN ORGAN
/obj/item/organ/wryn/hivenode
name = "antennae"
parent_organ = "head"

/obj/item/organ/wryn/hivenode
/obj/item/organ/internal/wryn/hivenode
name = "antennae"
organ_tag = "antennae"
icon = 'icons/mob/human_races/r_wryn.dmi'
icon_state = "antennae"

parent_organ = "head"
slot = "hivenode"
@@ -0,0 +1,158 @@
/obj/item/organ/internal/xenos
origin_tech = "biotech=5"
icon_state = "xgibmid2"
var/list/alien_powers = list()

/obj/item/organ/internal/xenos/New()
for(var/A in alien_powers)
if(ispath(A))
alien_powers -= A
alien_powers += new A(src)
..()

///can be changed if xenos get an update..
/obj/item/organ/internal/xenos/Insert(mob/living/carbon/M, special = 0)
..()
for(var/mob/living/carbon/alien/humanoid/verb/P in alien_powers)
verbs += P

/obj/item/organ/internal/alien/Remove(mob/living/carbon/M, special = 0)
for(var/mob/living/carbon/alien/humanoid/verb/P in alien_powers)
verbs -= P

..()

/obj/item/organ/internal/xenos/prepare_eat()
var/obj/S = ..()
S.reagents.add_reagent("sacid", 10)
return S

//XENOMORPH ORGANS

/obj/item/organ/internal/xenos/plasmavessel
name = "plasma vessel"
icon_state = "plasma"
origin_tech = "biotech=5;plasmatech=2"
w_class = 3
parent_organ = "chest"
slot = "plasmavessel"
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant, /mob/living/carbon/alien/humanoid/verb/transfer_plasma)


var/stored_plasma = 0
var/max_plasma = 500
var/heal_rate = 5
var/plasma_rate = 10

/obj/item/organ/internal/xenos/plasmavessel/prepare_eat()
var/obj/S = ..()
S.reagents.add_reagent("plasma", stored_plasma/10)
return S

/obj/item/organ/internal/xenos/plasmavessel/queen
name = "bloated plasma vessel"
icon_state = "plasma_large"
origin_tech = "biotech=6;plasma=3"
stored_plasma = 200
max_plasma = 500
plasma_rate = 25

/obj/item/organ/internal/xenos/plasmavessel/drone
name = "large plasma vessel"
icon_state = "plasma_large"
stored_plasma = 200
max_plasma = 500

/obj/item/organ/internal/xenos/plasmavessel/sentinel
stored_plasma = 100
max_plasma = 250

/obj/item/organ/internal/xenos/plasmavessel/hunter
name = "small plasma vessel"
icon_state = "plasma_tiny"
stored_plasma = 100
max_plasma = 150
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/plant)

/obj/item/organ/internal/xenos/plasmavessel/larva
name = "tiny plasma vessel"
icon_state = "plasma_tiny"
max_plasma = 100


/obj/item/organ/internal/xenos/plasmavessel/on_life()
//If there are alien weeds on the ground then heal if needed or give some plasma
if(locate(/obj/structure/alien/weeds) in owner.loc)
if(owner.health >= owner.maxHealth)
owner.adjustPlasma(plasma_rate)
else
var/heal_amt = heal_rate
if(!isalien(owner))
heal_amt *= 0.2
owner.adjustPlasma(plasma_rate*0.5)
owner.adjustBruteLoss(-heal_amt)
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)

/obj/item/organ/internal/xenos/plasmavessel/Insert(mob/living/carbon/M, special = 0)
..()
if(isalien(M))
var/mob/living/carbon/alien/A = M
A.updatePlasmaDisplay()

/obj/item/organ/internal/alien/plasmavessel/Remove(mob/living/carbon/M, special = 0)
..()
if(isalien(M))
var/mob/living/carbon/alien/A = M
A.updatePlasmaDisplay()


/obj/item/organ/internal/xenos/acidgland
name = "acid gland"
parent_organ = "head"
slot = "acidgland"
origin_tech = "biotech=5;materials=2;combat=2"
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/corrosive_acid)


/obj/item/organ/internal/xenos/hivenode
name = "hive node"
parent_organ = "head"
slot = "hivenode"
origin_tech = "biotech=5;magnets=4;bluespace=3"
w_class = 1
alien_powers = list(/mob/living/carbon/alien/humanoid/verb/whisp)

/obj/item/organ/internal/xenos/hivenode/Insert(mob/living/carbon/M, special = 0)
..()
M.faction |= "alien"

/obj/item/organ/internal/xenos/hivenode/Remove(mob/living/carbon/M, special = 0)
M.faction -= "alien"
..()

/obj/item/organ/internal/xenos/neurotoxin
name = "neurotoxin gland"
icon_state = "neurotox"
parent_organ = "head"
slot = "neurotoxingland"
origin_tech = "biotech=5;combat=5"
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/neurotoxin)

/obj/item/organ/internal/xenos/resinspinner
name = "resin spinner"
parent_organ = "head"
icon_state = "stomach-x"
slot = "resinspinner"
origin_tech = "biotech=5;materials=4"
alien_powers = list(/mob/living/carbon/alien/humanoid/proc/resin)

/obj/item/organ/internal/xenos/eggsac
name = "egg sac"
icon_state = "eggsac"
parent_organ = "groin"
slot = "eggsac"
w_class = 4
origin_tech = "biotech=8"
alien_powers = list(/mob/living/carbon/alien/humanoid/queen/verb/lay_egg)
File renamed without changes.
@@ -45,6 +45,7 @@
user.visible_message("<span class='notice'>[user] carefully extracts the tumor from [target]'s brain!</span>", \
"<span class='notice'>You extract the black tumor from [target]'s [braincase]. It quickly shrivels and burns away.</span>")
ticker.mode.remove_thrall(target.mind,0)
new /obj/item/organ/internal/shadowtumor(get_turf(target))

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/braincase = target.named_organ_parent("brain")
@@ -72,9 +73,10 @@

can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/embryo = 0
for(var/obj/item/alien_embryo/A in target)
var/obj/item/organ/internal/body_egg/alien_embryo/A = target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
if(A)
embryo = 1
break
//break

if (!hasorgans(target))
return
@@ -92,8 +94,32 @@
user.visible_message("\red [user] rips the larva out of [target]'s ribcage!",
"You rip the larva out of [target]'s ribcage!")

for(var/obj/item/alien_embryo/A in target)
A.loc = A.loc.loc
var/obj/item/organ/internal/body_egg/alien_embryo/A = target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
if(A)
user << "<span class='notice'>You found an unknown alien organism in [target]'s chest!</span>"
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)

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

if (!hasorgans(target))
return

var/obj/item/organ/internal/body_egg/alien_embryo/A = target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
if(A)
if(prob(50))
A.AttemptGrow(0)
user.visible_message("<span class='warning'>[user] accidentally pokes the xenomorph in [target]!</span>", "<span class='warning'>You accidentally poke the xenomorph in [target]!</span>")
else
target.adjustOxyLoss(30)
user.visible_message("<span class='warning'>[user] accidentally pokes [target] in the lungs!</span>", "<span class='warning'>You accidentally poke [target] in the lungs!</span>")


//////////////////////////////////////////////////////////////////
@@ -116,7 +142,7 @@
if(!affected)
return
var/is_organ_damaged = 0
for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I.damage > 0 && I.robotic < 2)
is_organ_damaged = 1
break
@@ -133,7 +159,7 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
if(I.robotic < 2)
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
@@ -153,7 +179,7 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
I.surgeryize()
if(I && I.damage > 0)
@@ -180,7 +206,7 @@
target.adjustToxLoss(10)
affected.createwound(CUT, 5)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
I.take_damage(dam_amt,0)

@@ -209,7 +235,7 @@

var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
attached_organs |= organ

@@ -234,7 +260,7 @@
user.visible_message("\blue [user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \
"\blue You have separated [target]'s [target.op_stage.current_organ] with \the [tool].")

var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
if(I && istype(I))
I.status |= ORGAN_CUT_AWAY

@@ -264,7 +290,7 @@

var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if((I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
removable_organs |= organ

@@ -287,9 +313,10 @@

// Extract the organ!
if(target.op_stage.current_organ)
var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/O = target.internal_organs_by_name[target.op_stage.current_organ]
if(O && istype(O))
O.removed(user)
O.Remove(user)
O.loc = get_turf(target)
target.op_stage.current_organ = null

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -300,15 +327,15 @@

/datum/surgery_step/internal/replace_organ
allowed_tools = list(
/obj/item/organ = 100
/obj/item/organ/internal = 100
)

min_duration = 60
max_duration = 80

can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

var/obj/item/organ/O = tool
var/obj/item/organ/internal/O = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!affected) return
var/organ_compatible
@@ -366,14 +393,14 @@
user.visible_message("\blue [user] has transplanted \the [tool] into [target]'s [affected.name].", \
"\blue You have transplanted \the [tool] into [target]'s [affected.name].")
user.drop_item(tool)
var/obj/item/organ/O = tool
var/obj/item/organ/internal/O = tool
if(istype(O))
O.replaced(target,affected)
O.Insert(target)

fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \
"\red Your hand slips, damaging \the [tool]!")
var/obj/item/organ/I = tool
var/obj/item/organ/internal/I = tool
if(istype(I))
I.take_damage(rand(3,5),0)

@@ -395,7 +422,7 @@

var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ

@@ -416,7 +443,7 @@
user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
"\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")

var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
if(I && istype(I))
I.status &= ~ORGAN_CUT_AWAY

@@ -220,7 +220,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!affected) return
var/is_organ_damaged = 0
for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I.damage > 0 && I.robotic >= 2)
is_organ_damaged = 1
break
@@ -232,7 +232,7 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
if(I.robotic >= 2)
user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
@@ -247,7 +247,7 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)

if(I && I.damage > 0)
if(I.robotic >= 2)
@@ -267,7 +267,7 @@
target.adjustToxLoss(5)
affected.createwound(CUT, 5)

for(var/obj/item/organ/I in affected.internal_organs)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
I.take_damage(rand(3,5),0)

@@ -292,7 +292,7 @@

var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
attached_organs |= organ

@@ -313,7 +313,7 @@
user.visible_message("\blue [user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \
"\blue You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].")

var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
if(I && istype(I))
I.status |= ORGAN_CUT_AWAY

@@ -341,7 +341,7 @@

var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(I && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ

@@ -361,7 +361,7 @@
user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
"\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")

var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
if(I && istype(I))
I.status &= ~ORGAN_CUT_AWAY

@@ -424,7 +424,7 @@
"\blue You have installed \the [tool] into [target]'s [affected.name].")

var/obj/item/device/mmi/M = tool
var/obj/item/organ/mmi_holder/holder = new(target, 1)
var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
if (istype(M, /obj/item/device/mmi/posibrain))
holder.robotize()

@@ -221,7 +221,7 @@
activate(var/mob/living/carbon/mob,var/multiplier)
if(istype(mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mob
var/obj/item/organ/brain/B = H.internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/B = H.internal_organs_by_name["brain"]
if (B.damage < B.min_broken_damage)
B.take_damage(5, 1)
else
@@ -442,7 +442,7 @@
activate(var/mob/living/carbon/mob,var/multiplier)
if(istype(mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mob
var/obj/item/organ/brain/B = H.internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/B = H.internal_organs_by_name["brain"]
if (B.damage < B.min_broken_damage)
B.take_damage(1, 1)
else
@@ -704,7 +704,7 @@ var/list/compatible_mobs = list(/mob/living/carbon/human)
activate(var/mob/living/carbon/mob,var/multiplier)
if(istype(mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mob
var/obj/item/organ/brain/B = H.internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/B = H.internal_organs_by_name["brain"]
if (B.damage < B.min_broken_damage)
B.take_damage(0.5, 1)
else
@@ -936,7 +936,7 @@ var/list/compatible_mobs = list(/mob/living/carbon/human)
name = "Watery Eyes"
stage = 1
activate(var/mob/living/carbon/human/mob,var/multiplier)
var/obj/item/organ/eyes/E = mob.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/E = mob.internal_organs_by_name["eyes"]
if(!istype(E) || (E.status & ORGAN_ROBOT)) // No eyes or robotic eyes? No problem!
return
mob << "<span class='warning'>Your eyes sting and water!</span>"
BIN +3.2 KB (110%) icons/obj/surgery.dmi
Binary file not shown.
@@ -1547,24 +1547,6 @@
#include "code\modules\ninja\suit\shoes.dm"
#include "code\modules\ninja\suit\suit.dm"
#include "code\modules\ninja\suit\suit_initialisation.dm"
#include "code\modules\organs\blood.dm"
#include "code\modules\organs\organ.dm"
#include "code\modules\organs\organ_external.dm"
#include "code\modules\organs\organ_icon.dm"
#include "code\modules\organs\organ_internal.dm"
#include "code\modules\organs\organ_stump.dm"
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\robolimbs.dm"
#include "code\modules\organs\skeleton.dm"
#include "code\modules\organs\wound.dm"
#include "code\modules\organs\subtypes\diona.dm"
#include "code\modules\organs\subtypes\machine.dm"
#include "code\modules\organs\subtypes\misc.dm"
#include "code\modules\organs\subtypes\nucleation.dm"
#include "code\modules\organs\subtypes\standard.dm"
#include "code\modules\organs\subtypes\unbreakable.dm"
#include "code\modules\organs\subtypes\wryn.dm"
#include "code\modules\organs\subtypes\xenos.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\fax.dm"
@@ -1855,6 +1837,26 @@
#include "code\modules\surgery\slime.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\surgery\tools.dm"
#include "code\modules\surgery\organs\blood.dm"
#include "code\modules\surgery\organs\body_egg.dm"
#include "code\modules\surgery\organs\helpers.dm"
#include "code\modules\surgery\organs\organ.dm"
#include "code\modules\surgery\organs\organ_external.dm"
#include "code\modules\surgery\organs\organ_icon.dm"
#include "code\modules\surgery\organs\organ_internal.dm"
#include "code\modules\surgery\organs\organ_stump.dm"
#include "code\modules\surgery\organs\pain.dm"
#include "code\modules\surgery\organs\robolimbs.dm"
#include "code\modules\surgery\organs\skeleton.dm"
#include "code\modules\surgery\organs\wound.dm"
#include "code\modules\surgery\organs\subtypes\diona.dm"
#include "code\modules\surgery\organs\subtypes\machine.dm"
#include "code\modules\surgery\organs\subtypes\misc.dm"
#include "code\modules\surgery\organs\subtypes\nucleation.dm"
#include "code\modules\surgery\organs\subtypes\standard.dm"
#include "code\modules\surgery\organs\subtypes\unbreakable.dm"
#include "code\modules\surgery\organs\subtypes\wryn.dm"
#include "code\modules\surgery\organs\subtypes\xenos.dm"
#include "code\modules\telesci\bscrystal.dm"
#include "code\modules\telesci\gps.dm"
#include "code\modules\telesci\telepad.dm"