From 80eb8285630c409cf2eb0a12150a16fbf15f541b Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 19 Dec 2015 22:39:47 -0500 Subject: [PATCH] this shit dosen't even compile yet... --- code/_onclick/hud/action.dm | 16 + code/datums/datumvars.dm | 4 +- code/datums/spells/inflict_handler.dm | 6 +- code/datums/spells/summonitem.dm | 2 +- code/game/asteroid.dm | 4 +- .../gamemodes/changeling/powers/panacea.dm | 9 + .../gamemodes/changeling/powers/revive.dm | 2 +- code/game/gamemodes/cult/runes.dm | 4 +- code/game/gamemodes/wizard/artefact.dm | 2 +- code/game/gamemodes/wizard/godhand.dm | 7 +- code/game/machinery/adv_med.dm | 4 +- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/flasher.dm | 2 +- code/game/objects/effects/aliens.dm | 19 +- code/game/objects/items.dm | 6 +- .../objects/items/devices/laserpointer.dm | 2 +- code/game/objects/items/devices/scanners.dm | 2 +- code/game/objects/items/weapons/defib.dm | 2 +- .../items/weapons/grenades/flashbang.dm | 2 +- code/game/objects/items/weapons/tools.dm | 2 +- .../stool_bed_chair_nest/alien_nests.dm | 6 +- code/modules/client/preferences.dm | 2 +- code/modules/food/recipes_microwave.dm | 2 +- code/modules/food/recipes_oven.dm | 2 +- code/modules/mining/equipment_locker.dm | 2 +- code/modules/mob/language.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 15 +- .../carbon/alien/humanoid/caste/drone.dm | 8 +- .../carbon/alien/humanoid/caste/hunter.dm | 1 + .../carbon/alien/humanoid/caste/sentinel.dm | 6 +- .../living/carbon/alien/humanoid/empress.dm | 8 +- .../mob/living/carbon/alien/humanoid/queen.dm | 8 +- .../mob/living/carbon/alien/larva/larva.dm | 2 + .../carbon/alien/special/alien_embryo.dm | 108 +++--- .../living/carbon/alien/special/facehugger.dm | 31 +- code/modules/mob/living/carbon/brain/MMI.dm | 12 +- .../mob/living/carbon/brain/brain_item.dm | 32 +- code/modules/mob/living/carbon/brain/death.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 4 +- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 6 +- .../mob/living/carbon/human/human_damage.dm | 8 +- .../mob/living/carbon/human/human_organs.dm | 10 +- .../mob/living/carbon/human/inventory.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/carbon/human/species/apollo.dm | 24 +- .../mob/living/carbon/human/species/golem.dm | 2 +- .../mob/living/carbon/human/species/shadow.dm | 2 +- .../living/carbon/human/species/species.dm | 21 +- .../living/carbon/human/species/station.dm | 34 +- .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/mob/living/carbon/life.dm | 9 + code/modules/mob/living/living.dm | 26 ++ .../mob/living/silicon/robot/component.dm | 2 +- .../simple_animal/hostile/mining_mobs.dm | 25 +- .../simple_animal/slaughter/slaughter.dm | 14 +- code/modules/mob/mob_grab.dm | 2 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/organs/organ_internal.dm | 171 --------- code/modules/organs/subtypes/xenos.dm | 66 ---- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/reagents/newchem/medicine.dm | 2 +- .../reagents/drink/reagents_alcohol.dm | 2 +- .../oldchem/reagents/reagents_admin.dm | 2 +- .../reagents/oldchem/reagents/reagents_med.dm | 2 +- .../designs/mechfabricator_designs.dm | 4 +- code/modules/surgery/eye.dm | 8 +- code/modules/surgery/implant.dm | 1 + code/modules/{ => surgery}/organs/blood.dm | 2 +- code/modules/surgery/organs/body_egg.dm | 53 +++ code/modules/surgery/organs/helpers.dm | 35 ++ code/modules/{ => surgery}/organs/organ.dm | 49 +-- .../{ => surgery}/organs/organ_external.dm | 12 +- .../{ => surgery}/organs/organ_icon.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 350 ++++++++++++++++++ .../{ => surgery}/organs/organ_stump.dm | 0 code/modules/{ => surgery}/organs/pain.dm | 4 +- .../modules/{ => surgery}/organs/robolimbs.dm | 0 code/modules/{ => surgery}/organs/skeleton.dm | 0 .../{ => surgery}/organs/subtypes/diona.dm | 97 ++--- .../{ => surgery}/organs/subtypes/machine.dm | 25 +- .../{ => surgery}/organs/subtypes/misc.dm | 26 +- .../organs/subtypes/nucleation.dm | 20 +- .../{ => surgery}/organs/subtypes/standard.dm | 0 .../organs/subtypes/unbreakable.dm | 0 .../{ => surgery}/organs/subtypes/wryn.dm | 9 +- code/modules/surgery/organs/subtypes/xenos.dm | 158 ++++++++ code/modules/{ => surgery}/organs/wound.dm | 0 code/modules/surgery/organs_internal.dm | 67 +++- code/modules/surgery/robotics.dm | 18 +- code/modules/virus2/effect.dm | 8 +- icons/obj/surgery.dmi | Bin 26775 -> 30051 bytes paradise.dme | 38 +- 95 files changed, 1140 insertions(+), 648 deletions(-) delete mode 100644 code/modules/organs/organ_internal.dm delete mode 100644 code/modules/organs/subtypes/xenos.dm rename code/modules/{ => surgery}/organs/blood.dm (99%) create mode 100644 code/modules/surgery/organs/body_egg.dm create mode 100644 code/modules/surgery/organs/helpers.dm rename code/modules/{ => surgery}/organs/organ.dm (87%) rename code/modules/{ => surgery}/organs/organ_external.dm (98%) rename code/modules/{ => surgery}/organs/organ_icon.dm (96%) create mode 100644 code/modules/surgery/organs/organ_internal.dm rename code/modules/{ => surgery}/organs/organ_stump.dm (100%) rename code/modules/{ => surgery}/organs/pain.dm (94%) rename code/modules/{ => surgery}/organs/robolimbs.dm (100%) rename code/modules/{ => surgery}/organs/skeleton.dm (100%) rename code/modules/{ => surgery}/organs/subtypes/diona.dm (81%) rename code/modules/{ => surgery}/organs/subtypes/machine.dm (84%) rename code/modules/{ => surgery}/organs/subtypes/misc.dm (81%) rename code/modules/{ => surgery}/organs/subtypes/nucleation.dm (62%) rename code/modules/{ => surgery}/organs/subtypes/standard.dm (100%) rename code/modules/{ => surgery}/organs/subtypes/unbreakable.dm (100%) rename code/modules/{ => surgery}/organs/subtypes/wryn.dm (64%) create mode 100644 code/modules/surgery/organs/subtypes/xenos.dm rename code/modules/{ => surgery}/organs/wound.dm (100%) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 9987fe47511..4461e1c8539 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -221,6 +221,22 @@ /datum/action/item_action/hands_free check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE +///prset for organ actions +/datum/action/item_action/organ_action + check_flags = AB_CHECK_ALIVE + +/datum/action/item_action/organ_action/CheckRemoval(mob/living/carbon/user) + if(!iscarbon(user)) + return 1 + if(target in user.internal_organs) + return 0 + return 1 + +/datum/action/item_action/organ_action/IsAvailable() + var/obj/item/organ/internal/I = target + if(!I.owner) + return 0 + return ..() //Preset for spells /datum/action/spell_action diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 89f4a277796..47818f24967 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1006,7 +1006,7 @@ client usr << "This can only be done to instances of type /mob/living/carbon" return - var/obj/item/organ/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs + var/obj/item/organ/internal/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs if(!M) usr << "Mob doesn't exist anymore" @@ -1017,7 +1017,7 @@ client return usr << "Removed [rem_organ] from [M]." - rem_organ.removed() + rem_organ.Remove(M) message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(M)]") log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(M)]") qdel(rem_organ) diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 7e8eb6b1641..ae985308ba5 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -28,9 +28,11 @@ if("gib_brain") if(ishuman(target)) var/mob/living/carbon/C = target - if(C.brain_op_stage != 4) // Their brain is already taken out - var/obj/item/organ/brain/B = new(C.loc) + var/obj/item/organ/internal/brain/B = C_target.get_int_organ(/obj/item/organ/internal/brain)//do we has brains? + if(B) + B.loc = get_turf(C_target) B.transfer_identity(C) + C_target.internal_organs -= B target.gib() if("disintegrate") target.dust() diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 438be56b522..b8a8b12a997 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -24,7 +24,7 @@ if(!marked_item) //linking item to the spell message = "" for(var/obj/item in hand_items) - if(istype(item, /obj/item/organ/brain)) //Yeah, sadly this doesn't work due to the organ system. + if(istype(item, /obj/item/organ/internal/brain)) //Yeah, sadly this doesn't work due to the organ system. break marked_item = item message += "You mark [item] for recall." diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm index cdb0cb7de64..d38e05c701b 100644 --- a/code/game/asteroid.dm +++ b/code/game/asteroid.dm @@ -61,7 +61,7 @@ var/global/max_secret_rooms = 6 walltypes = list(/turf/simulated/wall/r_wall=2,/turf/simulated/wall=2,/turf/simulated/mineral/random/high_chance=1) floortypes = list(/turf/simulated/floor,/turf/simulated/floor/engine) treasureitems = list(/obj/machinery/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2) - fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/appendix=2,/obj/structure/closet/crate/freezer=2, + fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/internal/appendix=2,/obj/structure/closet/crate/freezer=2, /obj/machinery/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3, /obj/item/weapon/tank/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1) @@ -72,7 +72,7 @@ var/global/max_secret_rooms = 6 treasureitems = list(/obj/item/device/soulstone=1, /obj/item/clothing/suit/space/cult=1, /obj/item/weapon/bedsheet/cult=2, /obj/item/clothing/suit/cultrobes=2, /mob/living/simple_animal/hostile/creature=3) fluffitems = list(/obj/effect/gateway=1,/obj/effect/gibspawner=1,/obj/structure/cult/talisman=1,/obj/item/toy/crayon/red=2, - /obj/item/organ/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/woodentable=2,/obj/item/weapon/ectoplasm=3, + /obj/item/organ/internal/heart=2, /obj/effect/decal/cleanable/blood=4,/obj/structure/table/woodentable=2,/obj/item/weapon/ectoplasm=3, /obj/item/clothing/head/helmet/space/cult=1, /obj/item/clothing/shoes/cult=1) if("wizden") diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 469283d1436..25fc19bd04b 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -10,6 +10,15 @@ /obj/effect/proc_holder/changeling/panacea/sting_action(var/mob/user) user << "We cleanse impurities from our form." + + var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg) + if(egg) + egg.Remove(user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.vomit(0) + egg.loc = get_turf(user) + user.reagents.add_reagent("mutadone", 10) user.reagents.add_reagent("potass_iodide", 10) user.reagents.add_reagent("charcoal", 20) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index f7cbbd4195f..797f8887767 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -57,7 +57,7 @@ O.trace_chemicals = list() O.wounds = list() O.wound_update_accuracy = 1 - for(var/obj/item/organ/IO in H.internal_organs) + for(var/obj/item/organ/internal/IO in H.internal_organs) IO.damage = 0 IO.trace_chemicals = list() H.updatehealth() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 18883600ad4..43bb42dbd8c 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -582,8 +582,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/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 17e60881cc5..1ec636f5db6 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -461,7 +461,7 @@ var/global/list/multiverse = list() if("cyborg") if(M.get_species() != "Machine") - for(var/obj/item/organ/O in M.organs) + for(var/obj/item/organ/internal/O in M.organs) O.robotize() M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(sword, slot_r_hand) diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index e8bdb02c764..63793e6424e 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -46,10 +46,11 @@ var/mob/M = target if(ishuman(M) || issmall(M)) var/mob/living/carbon/C_target = M - var/obj/item/organ/brain/B - if(C_target.brain_op_stage != 4) // Their brain is already taken out - B = new(C_target.loc) + var/obj/item/organ/internal/brain/B = C_target.get_int_organ(/obj/item/organ/internal/brain) + if(B) + B.loc = get_turf(C_target) B.transfer_identity(C_target) + C_target.internal_organs -= B var/datum/effect/system/spark_spread/sparks = new sparks.set_up(4, 0, M.loc) //no idea what the 0 is sparks.start() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 53e49224c6c..6a4e663b7a7 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -399,7 +399,7 @@ occupantData["extOrgan"] = extOrganData var/intOrganData[0] - for(var/obj/item/organ/I in H.internal_organs) + for(var/obj/item/organ/internal/I in H.internal_organs) var/organData[0] organData["name"] = I.name organData["desc"] = I.desc @@ -579,7 +579,7 @@ else dat += "[e.name]--Not Found" dat += "" - for(var/obj/item/organ/i in occupant.internal_organs) + for(var/obj/item/organ/internal/i in occupant.internal_organs) var/mech = i.desc var/infection = "None" switch (i.germ_level) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 4de2a851d18..08add7db621 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -132,7 +132,7 @@ if ((M.stat != 2) || (!M.client)) continue //They need a brain! - if ((istype(M, /mob/living/carbon/human)) && (M:brain_op_stage >= 4.0)) + if(istype(M, /mob/living/carbon/human) && !M.get_int_organ(/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 a04ecb252b0..4effab8bd78 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -349,7 +349,7 @@ scantemp = "Error: Unable to locate valid genetic data." nanomanager.update_uis(src) return - if (subject.brain_op_stage == 4.0) + if (!subject.get_int_organ(/obj/item/organ/internal/brain)) scantemp = "Error: No signs of intelligence detected." nanomanager.update_uis(src) return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index f22c68bb0f0..86a8360b01f 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -84,7 +84,7 @@ O.visible_message("[O] gasps and shields their eyes!") if (istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O - 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 (E && (E.damage > E.min_bruised_damage && prob(E.damage + 50))) flick("e_flash", O:flash) E.damage += rand(1, 2) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 59bfefa78c9..b86c330d762 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -322,8 +322,23 @@ /obj/structure/alien/egg/attack_hand(mob/user) - user << "It feels slimy." - + if(user.getorgan(/obj/item/organ/internal/xenos/plasmavessel)) + switch(status) + if(BURST) + user << "You clear the hatched egg." + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + qdel(src) + return + if(GROWING) + user << "The child is not developed yet." + return + if(GROWN) + user << "You retrieve the child." + Burst(0) + return + else + user << "It feels slimy." + user.changeNext_move(CLICK_CD_MELEE) /obj/structure/alien/egg/proc/GetFacehugger() return locate(/obj/item/clothing/mask/facehugger) in contents diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c535f53a753..5dfabafe4a5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -324,10 +324,10 @@ //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. //If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. -//Set disable_warning to 1 if you wish it to not give you outputs. +//Set disable_warning to 1 if you wish it to not give you outputs. /obj/item/proc/mob_can_equip(mob/M, slot, disable_warning = 0) if(!M) - return 0 + return 0 return M.can_equip(src, slot, disable_warning) @@ -427,7 +427,7 @@ "\red You stab yourself in the eyes with [src]!" \ ) if(istype(H)) - var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"] if(!eyes) return eyes.take_damage(rand(3,4), 1) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index ed55d931d8c..97ae4caba04 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -113,7 +113,7 @@ severity -= 1 severity = min(max(severity, 0), 4) var/mob/living/carbon/human/H = C - 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"] switch(severity) if(0) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e7337e1042d..41297357974 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -202,7 +202,7 @@ REAGENT SCANNER // user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") if (M.has_brain_worms()) user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.") - else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0) + else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain)) user.show_message("\red Subject is brain dead.") else if (M.getBrainLoss() >= 60) user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.") diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 0cef06f2fa2..d7d0ba827d8 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -383,7 +383,7 @@ defib.deductcharge(revivecost) add_logs(M, user, "revived", object="defibrillator") else - if(tplus > tlimit) + if(tplus > tlimit|| !H.get_int_organ(/obj/item/organ/internal/heart)) user.visible_message("[defib] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") else if(total_burn >= 180 || total_brute >= 180) user.visible_message("[defib] buzzes: Resuscitation failed - Severe tissue damage detected.") diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 260160a63c3..25d819f63c2 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -46,7 +46,7 @@ if(!eye_safety && 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"] flick("e_flash", M.flash) if (E) E.damage += eye_damage diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 73a9e6ebc7e..90a25d9f4f3 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -358,7 +358,7 @@ var/safety = user:eyecheck() if(ishuman(user)) var/mob/living/carbon/human/H = user - 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)) // No eyes? No problem! return switch(safety) diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 98e3d01e542..feafebd26f8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -16,7 +16,7 @@ if(buckled_mob && buckled_mob.buckled == src) var/mob/living/M = buckled_mob - if(isalien(user)) + if(user.get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)) unbuckle_mob() add_fingerprint(user) return @@ -50,9 +50,9 @@ if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) return - if(isalien(M)) + if(M.get_int_organ(/obj/item/organ/internal/alien/plasmavessel)) return - if(!isalien(user)) + if(!user.get_int_organ(/obj/item/organ/internal/alien/plasmavessel)) return unbuckle_mob() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e7987280d48..64389d8066a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1575,7 +1575,7 @@ datum/preferences else O.robotize() else - var/obj/item/organ/I = character.internal_organs_by_name[name] + var/obj/item/organ/internal/I = character.internal_organs_by_name[name] if(I) if(status == "assisted") I.mechassist() diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 98b8e782546..a9135316abe 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -76,7 +76,7 @@ /datum/recipe/microwave/brainburger items = list( /obj/item/weapon/reagent_containers/food/snacks/bun, - /obj/item/organ/brain + /obj/item/organ/internal/brain ) result = /obj/item/weapon/reagent_containers/food/snacks/brainburger diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index 914362ef45e..99d76a29526 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -352,7 +352,7 @@ /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/organ/brain + /obj/item/organ/internal/brain ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 9383a78588c..4ad70ebe1c4 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -988,7 +988,7 @@ /obj/item/weapon/hivelordstabilizer/afterattack(obj/item/M, mob/user) var/obj/item/asteroid/hivelord_core/C = M - if(!istype(C, /obj/item/asteroid/hivelord_core)) + if(!istype(C, /obj/item/organ/internal/hivelord_core)) user << "The stabilizer only works on hivelord cores." return ..() C.preserved = 1 diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 03ed2d630b4..a18f2fab8d0 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -363,7 +363,7 @@ var/mob/living/carbon/M = other if(!istype(M)) return 1 - if(locate(/obj/item/organ/wryn/hivenode) in M.internal_organs) + if(locate(/obj/item/organ/internal/wryn/hivenode) in M.internal_organs) return 1 return 0 diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 956453c4640..3c462638335 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -34,7 +34,10 @@ /mob/living/carbon/alien/New() verbs += /mob/living/carbon/verb/mob_sleep verbs += /mob/living/verb/lay_down - internal_organs += new /obj/item/organ/brain/xeno + internal_organs += new /obj/item/organ/internal/brain/xeno + internal_organs += new /obj/item/organ/internal/xenos/hivenode + for(var/obj/item/organ/internal/I in internal_organs) + I.Insert(src) ..() /mob/living/carbon/alien/get_default_language() @@ -258,9 +261,11 @@ Des: Gives the client of the alien an image on each infected mob. if (client) for (var/mob/living/C in mob_list) if(C.status_flags & XENO_HOST) - var/obj/item/alien_embryo/A = locate() in C - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]") - client.images += I + var/obj/item/organ/internal/body_egg/alien_embryo/A = C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo) + var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") + if(A) + var/I = image('icons/mob/alien.dmi', loc = owner, icon_state = "infected[stage]") + client.images += I return @@ -317,4 +322,4 @@ Des: Removes all infected images from the alien. playsound(T, S, volume, 1, range) return 1 - return 0 + return 0 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 201ab0e1f77..cff294c42cb 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -13,8 +13,12 @@ if(src.name == "alien drone") src.name = text("alien drone ([rand(1, 1000)])") src.real_name = src.name - verbs.Add(/mob/living/carbon/alien/humanoid/proc/resin,/mob/living/carbon/alien/humanoid/proc/corrosive_acid) - ..() + internal_organs += new /obj/item/organ/internal/xenos/plasmavessel/large + internal_organs += new /obj/item/organ/internal/xenos/resinspinner + internal_organs += new /obj/item/organ/internal/xenos/acid + //verbs.Add(/mob/living/carbon/alien/humanoid/proc/resin,/mob/living/carbon/alien/humanoid/proc/corrosive_acid) + //..() + //Drones use the same base as generic humanoids. //Drone verbs diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 6e4589b02c3..dca1719b0e3 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -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() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index d6b8a18fc7b..12d5c4e155c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -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 diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index 6d20f4e1e45..24c1809382f 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -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 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index f27ac91d398..690e2722ddc 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -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 diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 7a309ac28dd..28104b67a18 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -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 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 5494b199a87..f7bbbd5e985 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -2,7 +2,7 @@ // 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' @@ -10,30 +10,49 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds 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 << "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(4)) + owner << "Your stomach hurts." + if(prob(20)) + owner.adjustToxLoss(1) + if(5) + owner << "You feel something tearing its way out of your stomach..." + 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 << "Your throat feels sore." - if(prob(1)) - affected_mob << "Mucous runs down the back of your throat." - if(4) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(2)) - affected_mob << "Your muscles ache." - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(2)) - affected_mob << "Your stomach hurts." - if(prob(20)) - affected_mob.adjustToxLoss(1) - affected_mob.updatehealth() - if(5) - affected_mob << "You feel something tearing its way out of your stomach..." - 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,7 +119,7 @@ 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() @@ -131,7 +127,7 @@ Des: Removes the current icons located in the infected mob adds the current stag 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) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 351c7387826..d8ad905221e 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -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 == 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(loc == M) return 0 - L.visible_message("[src] leaps at [L]'s face!") + if(!sterile) M.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage - if(ishuman(L)) - var/mob/living/carbon/human/H = L + M.visible_message("[src] leaps at [M]'s face!") + + if(ishuman(M)) + var/mob/living/carbon/human/H = M if(H.head && H.head.flags & HEADCOVERSMOUTH) H.visible_message("[src] smashes against [H]'s [H.head]!") 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 diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 5e6b142038c..0fb95f6c22d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -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 << " This brain is too malformed to be able to use with the [src]." 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 << "You unlock and upend the MMI, spilling the brain onto the floor." 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 diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 10b8d580447..733f97df63a 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -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 << "You feel slightly disoriented. That's normal when you're just a [initial(src.name)]." 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 diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index efcfac98624..efb1b8e8d87 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -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) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3179f32d3f7..7ad0adf9eb7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index bac4225bd9c..fd1560b6ace 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 15761fb3421..26cd094ee3b 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -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 += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 38c7bb154f9..9a763813f06 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index df69c687ec4..ec075fcf9f2 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index c83c35bd61b..0dc5851a8ee 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -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) /* diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index e728fb2db9d..9ea472ea764 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 80640ce7bcf..92c2e7049de 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 8d0e64d44af..a8254337c8d 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -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 << "Your antennae tingle as you are overcome with pain..." C << "It feels like part of you has died." @@ -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 << "You hear a loud crunch as you mercilessly pull off [H]'s antennae." H << "You hear a loud crunch as your antennae is ripped off your head by [M]." H << "It's so quiet..." @@ -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) diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index aaa073879fb..c3930a8531a 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3727bd8de0a..7b7bf1c8096 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index e679991ed2e..ad225fec69d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -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] diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 1e85a1e2e52..96e834dd749 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -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" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d21aea4bde2..d9b00be4126 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -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])]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 33af21120de..8d6b835eb8b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -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 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c426c3d8f4c..580dd5e035e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -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) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 7eb1e62090c..7666fabff93 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -245,7 +245,7 @@ user << "Internal prosthetics:" 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 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 7b8b7617431..b3bce76f8b3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -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..." diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm index f5edb4ac363..e03d2b74a01 100644 --- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm +++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm @@ -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("[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.") for(var/mob/living/M in consumed_mobs) @@ -138,7 +138,7 @@ //////////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' @@ -146,7 +146,7 @@ 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("[user] raises [src] to their mouth and tears into it with their teeth!", \ "An unnatural hunger consumes you. You raise [src] to your mouth and devour it!") playsound(user, 'sound/misc/Demon_consume.ogg', 50, 1) @@ -159,8 +159,14 @@ user.bloodcrawl = BLOODCRAWL_EAT else user <<"...and you don't feel any different." - 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. diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index a40316ecb98..d1d05c3b7ac 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -360,7 +360,7 @@ assailant.attack_log += text("\[[time_stamp()]\] Pressed fingers into the eyes of [affecting.name] ([affecting.ckey])") affecting.attack_log += text("\[[time_stamp()]\] Had fingers pressed into their eyes by [assailant.name] ([assailant.ckey])") 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) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 2e34a1a5b45..46ee6eae9a1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -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 diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm deleted file mode 100644 index 46d7f01b0d9..00000000000 --- a/code/modules/organs/organ_internal.dm +++ /dev/null @@ -1,171 +0,0 @@ -#define PROCESS_ACCURACY 10 - -/**************************************************** - INTERNAL ORGANS DEFINES -****************************************************/ - - -// Brain is defined in brain_item.dm. -/obj/item/organ/heart - name = "heart" - icon_state = "heart-on" - organ_tag = "heart" - parent_organ = "chest" - dead_icon = "heart-off" - vital = 1 - -/obj/item/organ/lungs - name = "lungs" - icon_state = "lungs" - gender = PLURAL - organ_tag = "lungs" - parent_organ = "chest" - -/obj/item/organ/lungs/process() - ..() - - 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/kidneys - name = "kidneys" - icon_state = "kidneys" - gender = PLURAL - organ_tag = "kidneys" - parent_organ = "groin" - -/obj/item/organ/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/eyes - name = "eyeballs" - icon_state = "eyes" - gender = PLURAL - organ_tag = "eyes" - parent_organ = "head" - var/list/eye_colour = list(0,0,0) - -/obj/item/organ/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/eyes/surgeryize() - if(!owner) - return - owner.disabilities &= ~NEARSIGHTED - owner.sdisabilities &= ~BLIND - owner.eye_blurry = 0 - owner.eye_blind = 0 - -/obj/item/organ/liver - name = "liver" - icon_state = "liver" - organ_tag = "liver" - parent_organ = "groin" - -/obj/item/organ/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/appendix - name = "appendix" - icon_state = "appendix" - organ_tag = "appendix" - parent_organ = "groin" - - -/* -/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" - ..() -*/ \ No newline at end of file diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm deleted file mode 100644 index 7052237b163..00000000000 --- a/code/modules/organs/subtypes/xenos.dm +++ /dev/null @@ -1,66 +0,0 @@ -//XENOMORPH ORGANS -/obj/item/organ/xenos/eggsac - name = "egg sac" - parent_organ = "groin" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - parent_organ = "chest" - var/stored_plasma = 0 - var/max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/queen - name = "bloated plasma vessel" - stored_plasma = 200 - max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/sentinel - stored_plasma = 100 - max_plasma = 250 - -/obj/item/organ/xenos/plasmavessel/hunter - name = "tiny plasma vessel" - stored_plasma = 100 - max_plasma = 150 - -/obj/item/organ/xenos/acidgland - name = "acid gland" - parent_organ = "head" - -/obj/item/organ/xenos/hivenode - name = "hive node" - parent_organ = "chest" - -/obj/item/organ/xenos/resinspinner - name = "resin spinner" - parent_organ = "head" - -/obj/item/organ/xenos - name = "xeno organ" - icon = 'icons/effects/blood.dmi' - desc = "It smells like an accident in a chemical factory." - -/obj/item/organ/xenos/eggsac - name = "egg sac" - icon_state = "xgibmid1" - organ_tag = "egg sac" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - icon_state = "xgibdown1" - organ_tag = "plasma vessel" - -/obj/item/organ/xenos/acidgland - name = "acid gland" - icon_state = "xgibtorso" - organ_tag = "acid gland" - -/obj/item/organ/xenos/hivenode - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "hive node" - -/obj/item/organ/xenos/resinspinner - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "resin spinner" \ No newline at end of file diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 597a078b320..80c591d3cf9 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -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)) ) ) ) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 8d6294b4156..ba18e879729 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -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) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 0dd38567ccc..2d4a7bded8b 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -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) diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm index dd9e73a96b1..ad4048c4efe 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm @@ -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) diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm index 1a43b01f0e7..61f4b66255c 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -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) ..() diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index c3d48fdb88e..227cd4618a4 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -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") \ No newline at end of file diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 327a90170d9..7cafa8e6ab9 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -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]!") diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index a6cd4553270..b8a8f072545 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -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 diff --git a/code/modules/organs/blood.dm b/code/modules/surgery/organs/blood.dm similarity index 99% rename from code/modules/organs/blood.dm rename to code/modules/surgery/organs/blood.dm index f3f9c48b614..0e909ec5b18 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -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) diff --git a/code/modules/surgery/organs/body_egg.dm b/code/modules/surgery/organs/body_egg.dm new file mode 100644 index 00000000000..3a8580cf04f --- /dev/null +++ b/code/modules/surgery/organs/body_egg.dm @@ -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 << "You found an unknown alien organism in [owner]'s [parent_organ]!" + +/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 \ No newline at end of file diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm new file mode 100644 index 00000000000..755ca5e4417 --- /dev/null +++ b/code/modules/surgery/organs/helpers.dm @@ -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) \ No newline at end of file diff --git a/code/modules/organs/organ.dm b/code/modules/surgery/organs/organ.dm similarity index 87% rename from code/modules/organs/organ.dm rename to code/modules/surgery/organs/organ.dm index e7d4fd89eba..9ecda01a4e3 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -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 \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm similarity index 98% rename from code/modules/organs/organ_external.dm rename to code/modules/surgery/organs/organ_external.dm index 1c6ca1d176b..7810f5a51e3 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -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,8 +448,8 @@ 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 @@ -457,7 +457,7 @@ Note that amputating the affected organ does in fact remove the infection from t 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) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm similarity index 96% rename from code/modules/organs/organ_icon.dm rename to code/modules/surgery/organs/organ_icon.dm index e3e95e78df3..94b0aa5b95c 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/surgery/organs/organ_icon.dm @@ -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) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm new file mode 100644 index 00000000000..5a26ed82447 --- /dev/null +++ b/code/modules/surgery/organs/organ_internal.dm @@ -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()]\] removed a vital organ ([src]) from [key_name(M)] (INTENT: [uppertext(user.a_intent)])" + // M.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])" + // 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("[src] collapses in on itself!") + qdel(src) \ No newline at end of file diff --git a/code/modules/organs/organ_stump.dm b/code/modules/surgery/organs/organ_stump.dm similarity index 100% rename from code/modules/organs/organ_stump.dm rename to code/modules/surgery/organs/organ_stump.dm diff --git a/code/modules/organs/pain.dm b/code/modules/surgery/organs/pain.dm similarity index 94% rename from code/modules/organs/pain.dm rename to code/modules/surgery/organs/pain.dm index ebfc3442d54..76a91d8a7c2 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/surgery/organs/pain.dm @@ -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) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm similarity index 100% rename from code/modules/organs/robolimbs.dm rename to code/modules/surgery/organs/robolimbs.dm diff --git a/code/modules/organs/skeleton.dm b/code/modules/surgery/organs/skeleton.dm similarity index 100% rename from code/modules/organs/skeleton.dm rename to code/modules/surgery/organs/skeleton.dm diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm similarity index 81% rename from code/modules/organs/subtypes/diona.dm rename to code/modules/surgery/organs/subtypes/diona.dm index e41c8ce3c62..60875eff479 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/surgery/organs/subtypes/diona.dm @@ -149,35 +149,62 @@ /obj/item/organ/diona/process() return -/obj/item/organ/diona/strata +/obj/item/organ/internal/diona/strata name = "neural strata" - parent_organ = "chest" - -/obj/item/organ/diona/bladder - name = "gas bladder" - parent_organ = "head" - -/obj/item/organ/diona/polyp - name = "polyp segment" - parent_organ = "groin" - -/obj/item/organ/diona/ligament - name = "anchoring ligament" - parent_organ = "groin" - -/obj/item/organ/diona/node - name = "receptor node" - parent_organ = "head" - -/obj/item/organ/diona/nutrients - name = "nutrient vessel" - parent_organ = "chest" - -/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. + origin_tech = "biotech=3" + parent_organ = "chest" + slot = "heart" + +/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/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/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/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/internal/diona/nutrients + name = "nutrient vessel" + parent_organ = "chest" + organ_tag = "nutrient vessel" + icon = 'icons/mob/alien.dmi' + icon_state = "claw" + slot = "nutri_vessel" + +//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 diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm similarity index 84% rename from code/modules/organs/subtypes/machine.dm rename to code/modules/surgery/organs/subtypes/machine.dm index 3e651613164..b0de4619003 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -53,48 +53,51 @@ 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("\The [owner] twitches visibly!") -/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 @@ -102,7 +105,7 @@ 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,7 +117,7 @@ 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) @@ -122,7 +125,7 @@ owner.stat = CONSCIOUS owner.visible_message("\The [owner] twitches visibly!") -/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) ..() diff --git a/code/modules/organs/subtypes/misc.dm b/code/modules/surgery/organs/subtypes/misc.dm similarity index 81% rename from code/modules/organs/subtypes/misc.dm rename to code/modules/surgery/organs/subtypes/misc.dm index a2febc6d1e4..adab834919e 100644 --- a/code/modules/organs/subtypes/misc.dm +++ b/code/modules/surgery/organs/subtypes/misc.dm @@ -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 diff --git a/code/modules/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm similarity index 62% rename from code/modules/organs/subtypes/nucleation.dm rename to code/modules/surgery/organs/subtypes/nucleation.dm index 40d7745d86e..f174cf9d75d 100644 --- a/code/modules/organs/subtypes/nucleation.dm +++ b/code/modules/surgery/organs/subtypes/nucleation.dm @@ -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" - \ No newline at end of file + slot = "brain" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm similarity index 100% rename from code/modules/organs/subtypes/standard.dm rename to code/modules/surgery/organs/subtypes/standard.dm diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/surgery/organs/subtypes/unbreakable.dm similarity index 100% rename from code/modules/organs/subtypes/unbreakable.dm rename to code/modules/surgery/organs/subtypes/unbreakable.dm diff --git a/code/modules/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm similarity index 64% rename from code/modules/organs/subtypes/wryn.dm rename to code/modules/surgery/organs/subtypes/wryn.dm index 5d0c687f9f2..14a5d46dd8f 100644 --- a/code/modules/organs/subtypes/wryn.dm +++ b/code/modules/surgery/organs/subtypes/wryn.dm @@ -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" - \ No newline at end of file + parent_organ = "head" + slot = "hivenode" \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm new file mode 100644 index 00000000000..30f5f9af02f --- /dev/null +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -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) \ No newline at end of file diff --git a/code/modules/organs/wound.dm b/code/modules/surgery/organs/wound.dm similarity index 100% rename from code/modules/organs/wound.dm rename to code/modules/surgery/organs/wound.dm diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index b0b840d138c..967a9c06d22 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -45,6 +45,7 @@ user.visible_message("[user] carefully extracts the tumor from [target]'s brain!", \ "You extract the black tumor from [target]'s [braincase]. It quickly shrivels and burns away.") 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 << "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) + + 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("[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!") ////////////////////////////////////////////////////////////////// @@ -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,7 +327,7 @@ /datum/surgery_step/internal/replace_organ allowed_tools = list( - /obj/item/organ = 100 + /obj/item/organ/internal = 100 ) min_duration = 60 @@ -308,7 +335,7 @@ 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 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index fa6fd6f215f..62fa8fca992 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -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() diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 6a9fcd3ffad..4955d200252 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -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 << "Your eyes sting and water!" diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index dfef3e3dcbd98ccca236bf2cebb187d3f9cc8007..619678fd650e6f3861513d518138898a6862316e 100644 GIT binary patch literal 30051 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

}-N#TQE3y;r+>L6by#htt)|kI~R*@ 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 LMYiCnk?;Ql^xh(5 literal 26775 zcma&N2RK|`yEZ<$1VIulf@skrh~8VYAVe2Eh~9}hy66!tiQb9cyAdK1qW3zwFgjz5 zG2_3J{LXpL`ObU3|94%ZTzl`?YprMP=YH<{UTa4`*H9w4dG96&1R_yUR?r54u*`uU z8A5#ENa#?p9|(j^;-_QasbKA4yBN*i)6cudwma&%YEUyw`cedlJK zYU4m&Al{R1kY0TJHx2FOuBgIx77p>JT#p{0Z7}P|qa*I1&MT>oXf%vbic!=$el~h2 z@kzq)=i|=VXr{yhdfge+VASb~*521Uam=5d21@j46?~7*`o31mN_}*K0dY>)Q`fAL zBrH$g)A;^AwT_u%J?YKly}P#p*)u##ec#D^e8mC_NHm>-(mJk{%913{MnALRPe#z! zJ>jHjh)x`E1nB$)%P)<^B3$MDE#y|BZ#F4lvw8llu8IZ%xCe94LKAz&lLp%TZoT z_TjeEOdeqq!CHH-n=J(mVvLpU{!i!_s--?T>o$ZB z-+L_8sv%`OAdyOI_?3Ls@Z;9{k*x8euRTW$XzHS9#mA#epFN$$sAW z2a!trE-gu&dq^`Z($sHPIfD-8y;|SpDBV%!T^+hxC>jEX0s0WiN5j69&MvP#T_3#& zauOFwC$i11Y<{_QT>r**Ar_c73~u2Vbw;Nw1UYSdIn3-EY4)%(0PG@!L#PHQtJz`-)dqcJ*t=4GB624m< zXw>|9{24+-60s-{3$#9sz1(Vbr&q~@CWW%*UKau#^e9mgO&&Z0gL;3&zgW4ZMBeTB z`0?XflNm-k!wk8Z-f=$fU@9~P+nVKZ`|Caf?C$LR8&vw zH0)GEFrVseN1C_@Pfkv7AD|ge$}Lc@cG>T)SX)U|L)uclTW}cYRdsiG(}Jq0PfeD$ z9Ucr)){r{Ry^DP$6v^*T9YZ!70m4cmA7$>M1x*PyKKnG<(I~O{8CIibl)*##q$|=z z!#QDO;jY|lY)ot~=(4z&DZC~sB0>>Fg2fZSrhr~E^WSeAGOahN9O}9NWeB@?f4uJF z4Z;$UyEt;viZyMik5Y(}FK z!4aeF@|e1(zP^6nsq|^L@6~aC6)LCsy6$+I)&+J9T#dUSZDMMgO)cuq0wTC||ER6& zvX4R7`96q)gX2+UquJFORZv8Cq&%&{<*esz*zK?b;b(${5^Z~0RwG<~?{(4@#t!mx zFBu!)QACx?%}_L3F$IGaGKc{C`Q10DrpN`HCRn_obn?`!lO71#n*?rQyrREEyWmmR0I{qzppoR4lf?7pv| zA&%4-qc|RLsODx6dBsvbU0IPE;_Y+1vAG$YQp+*vRb5~!ulY3LesrH@Ug>vo1+gp* zhrm|wF_xv36_yg$kRma9mN|na#z!Bi1(GyB6iZq3`o`p?QN17!W*3J&WaJNX5dr`ABhJxhj(R`c;Fj zKQV_p&vcf<1VRVOvcOiVhk$ZrXUY30p3FM_JP=G_t^Az}(#L`U1SBfkArP^r(jC|B z64TYj6E?O`o(#IIs^eqVT^3NIg_i4DxK+d*wgwQs2>6^^UMX(n*OxFB_`!Z1&uOds z-9AL*S}&>eOG&G5#C_(E*%PHPBDr3Qv&8uFA~Njl%(p$;vULSRZme{4NF+%K(Rs&* zxp{;nW>l^(@5aQ(Pu;pIO}4MVm+~7Vn@N* zxhlUYlmUF@mO&=>EJKLrSMLOqRh#ba<*hx_spnCRwS49a>J@6QQunX5QgszAP4dsJ zrF;(VhvAbj@$qRH3$wD~#rCZo2S3-+B3D#Y+}IH5`j9Ab@>bs`@iRTk6zg&GEJ4|_ zp1QWl?N!^}u(grp4^H#XTSKySC4Gf<9@-<8WQ=t0B^4$8&KAdj^BZ>`1P!EmW(43d zA6}9wsIUgWDd66;MRVeGfju%=l}Y&R@$@ggVTZ=>_>;-(e0%BSzl0BW8e_$23Hxv~ z1F1Xpfvkr>5^RSvAw5Rd%hd_?7dd82!{DIf))~01sCs&ixRUna@=y;|ZddU#tjQFN zhQF<-;5G(=H2W?!VxFzzWRN#C`VQOsjEuoTmE@jJm(di8TKDqM=<2SMC@(Hr)3(*E zx5>p!!-hN(ty?dcdYH=`UcWW~4=yF`&v^sMks>SHW@ol1A9brW067)(6z&Dzt{MPt z*>DFZ=)69MoR)T>LbHw)Ux8#r2gzaicC3fZ07I`U`HNwUVOV^NS&dnxRQ(q}TtB+& z@@B=txqHy*Bha*S_8|QFloJH+(OBFVV-NOPklJ+=YBLEGZ4~OqdMjp8(!ar{StuuDELd-nB1% zh2bt`X7Jvd&7-@(>Q9%Jl3LyzJlr9wc0b=U{2d>=Q+tD#+!&k;QqLck;x86vWhM)? zKnBf+IC%6K{sfZDZCY%OlTJ(Vuf=e++r5Md8zs4)-z{};%r%`AZMGJctZK{GO^0Gh zc-d!~FVSdZ&dSW~JIo3?Q}rHPF-J!3gwoQX-_g-T=AA8Dgs`n4rchTX49=l&8j$X#%4Q`FgO)dVeyS^BoC(Z)cEhQzb@L z$>%XUN3>h)$*f?I1PjGGx{u3wm<+vY%i~8M)-hKlNbY4kef-hJy&A-E;-mY{=uL6_ zTY1aVD--O5nx%ogv~_ha(_nDF&*kNfD^oD|eNp#UhiC+p;ro(X$m58lCU&V(JrOFJ z#M{Zr3c_C`^|(I5ZRQ0Y%R2?Ol45u{Io*-tkhUY4h$cproz<@lgS@otIA% ziDQ=z&PB;Ej&D)lWDpg?fmPus%-xH=C!Faaio%jzY)Q&=`9#UiuAcLy<+$KMd7*Cl z2v$V|)a>R;yFZ^RFPp|I?8lFIHH}AV_x#L+VFJULJ{+jcYz{{G>W+(m^AhtX=x9h# zFzgn?R@*_hg@hC@@w@GQspzv#Z+Dp{-8*+Q=H`iP36T@n&Nn(uH394xg~5qwh2m0D z?g}}3Hk?%F2*txn)M@JhFo__OTXY}f!RlJemJ917|6IW?H_E<8Mwwt)A2PID72gzhP-|y)Y&6>AR5x@T8e|ZL1 zr-dBVpZ3&sTV1GOwGUUba#ImQvWLG#K(vLh(VDpZ(jB{AkZG5@S_vhJt98AsxTrA-AtGB?BzheJM_>iTRl%`mx9y$R$WCUk9qKnsXx!&aX-V% zx2X?9Hd{j(!gi}Y5u!HrG{O06mY~LRIi%&LDs4AU^WqxnC~3N8fxNc%$x}rOspm3| zMmOUFZ+G9v^4h0OtH9vup%}7^Er;1ar4zNawe-doB^p^w%*=ec6VJ?W zgKT%h={9#US6jjmi@q2N(1vc-cFZhp`esrAZ-KoFR;|@|*}Sn#_|Vg@zXl&44j?RD zS3E#2iw0$9hY(qr(|54%qaMc)a4NOW8TmIX+JZKR;e<1&$4JC6UWPHIZ=#_J77(tj z8McIygE-%op?Lb@la%z(evu+{anN+4+%%RmA@AdK}nm!O6m`;^mLssd6W*8>??! zne1uV%^K4>@sPwdIunRgTXI$0+1yI?mE-k(E`W29F)Jl_BI|l1q!heb`z*&US*OC} z>|tC&LQQjH=at6Ix9OMtri!E+f@~-CYG#8zQE=%!Xv(o!EWEKdF!uwq>zvFTD5$6c40ICmu3w>~d| z2coR4bN-*p9ZDOFqCGBGIFu4^o4yFEin_H#QP6TyN9^wIF+YW^r`4-pJ@dlY*a6FP z*B!nQ*Utc6EXF?uYN;}8L3l4Vm1}{a$HHP3<`6AmTZ|Y1%k^#Dzf8+y)7JWw@U%Jc z;^Iw(Ubz}!so9(D%>$)1V`d47On}Osz-P?X_gO$Yq?KlyzqRPqYPz)3c?iGlnfdfY zbAj}RcXUW**3j}{tWpBb0ZS>HNoh-z%bONh&VY?WVcYl^OLc?M4mlL3-591hBd?@r zLI<|LX-4>r0T8Jm{g-YLRd#VTANZ^y^Rp?oIo@U%^`3jfiG-gp`F+)r?v*Lp;a+k^ zi;khSqdA4bIs>sPntB#Vr(3|QOOUJKz(k%(W^@+xFrkFZ)^YxnFE|{tqVG`$tz8d{mE>-p{`EV0V^s>$-G`r+i>Ss{&VBb zgH>8B&&ZpuH_Tp}G1Lgy=eVe~5FB^-o;t3GI24#zGLorMZw=y`lhj+p#^>oVXnt*V zHg|ADOmR$-f%>&P8mI7%R-+jF0unDbeY(iv1oXBC3Ev*XS;kS1f94#`(g|@KdM%GcDOqrJqudgnSZ+0ipiHG}fa&=b+!MSpg5$4@q zi)Hhns5(2$Vyj0`AoBM!YDO(uBP|+rpQ_T{0Y>!-$I9qwjENrk0uAp(j_YHZ41=o05Hn8y5Ylk3&3#3crxSz#3?A;NqCdnXM?h(rdqQ zrtRewYTlvR3mNrhr5h_j;uyErG>{@&WPFPk0*oJe+n&oH%Xy>;X!7>?-n=>_1T8k1 z7g=462tUPxBuX4wU9r04WBBv_mQ1}sQ{na6xeqQ7P7a&;h>sA@fbVHwq$tt)HC3>56l9}r zI0>h!q+7ki=6(OZm%@cuaz=*QrwR1BSlr0;Gxo47!}wjpadl|tH~czVG$TuaXQr`1 zP6w*$`*4>U@@tJj2g(^|ZqCQ+&BsFN2F&>boR;ML8JGcPb9?@*qnHRb>bW3VKj)VF zC{I7Xq`7@`Y_+^86mT*c^=jHAMyvKl^tZ^ra#gFa(5VD#-buy1-Dw(STJ0dTF9Dvb z8GK29;OTks`R4~d`5%C2AX%*%FqxYhV8ah<;Sv{Txn?PpeuFtbzYgu-2`o3Lw8@(g zgiO>5XS%47CK%st^fvZ`pCntcsS_GVyRQC_^A;w#b@=PZtGKs1@?nxEHl_4+$~&yZ zFSuO6Uj)N(WZ8T4nUXG|_JDl-nJN0huq&W-cHdi-IXIu4kReK6w3@3|pJ`|DJLo{+ zdv}U*8zq0RF{6}e_3VNx1o~n2jiqH^`*jN7p|yS2BKvKsF}(t*vD{X9`wlDMhWqAd zL`eICP~i0AN1voteoN1lo~hj>GXxy_I~7;g^z~;qF)h!ZgO%dIcS>?65^?l;w|-1& zv3C!C3or$HaU}I>*HpX=@vU5M60fEThFixAzpn0C`qf+T2AR8_t;`w$Xs^XX$KH@R@LVS-~ZegoxpEXkOvB7q<0Dn7!Cn9oG-X@ca8d z!oumof0Osd01njlRfwO3(p~-ME)IpJvox6H3<*9D%Ir%uaRG5}!@I%GZFpBZl>HPV zQuk2Ykn0P9L^$|#t{?dnk|DYSw$jZZqB6g3_2o`C;oHqG16x}c9i6@2ZyXp<)$;6z zIFN25UJktCeWp)*dQ(n&B))%8@mQ27CjW_~tDiSmBn@$xEYlmpy@QY`5hrY3OCb2V zXDa_AOmr`w^?Ed4AO>joi#7omdCUwX&$;hK@oxOed=lXVq@i9 zoyXm}j^$R{fUCcF9BklNZtI3+G$_0$-G24-6Y0OqG!53mn(mq?Gv5|B1_0U4!^tY zhvq7X5DD7BI57R(2lp%cV&if$`s+TAIG+_vMC9(>RxT%<2|9nP{F7lFl-ajz@n)|yp+0+#E=kp++P6moi& z({c29ubzcG6!47fIPmcBm?R~$LPN2Q{OE<9GohRMy}~-Onb}#Dcd3aj$w70nr<7Al z(Lp~t-^M0xHLs|2J!)aXD4Yn3=?zR^U8?9+Y=w2c(dbV&#CRS+8_AlvTdf}E(5CvHZVib z!`3OV!V5G9o^UQ0P0q0c)1N{@90Z_vKqi@iJuk?UOT=HRJ zp5=n+8e8I1**xbV{k-yLv~PhsL^>}JMNke?9a!!(>K#C@>Eq$o`T8UKSJr|+2If{Q zTcI^cpXFcwIHfbX9u&YvjD3^}Y&+R+hBjT;opXe{;a0bG22)hwZ9UG8mvszjtA9Q7 zQY;_O@iFz+fhl9G?>}GSbu%VM*!zoIN(FKVQ(&t|Ih7Z8<;~TlmN&ou*c!vi&=LB@ zoa}&ccIqk!92*n>7bK?{`&H+-QlN=2 zt1D4CG#@y(-KnxN)yl1^1wdtcF>UFrWj98Kl860Cx%AP+sJJh3MbdMEXT>eds?@|t zhugnisJ)}vEM@(Ck>aUh3-NDKuRm6V63L#$}Y$X`uV$qZ2MJC>p5U^Ri+5N@7zm`C)EIK?TD3e!8 z#d0@TubDM`CFQt6h{1;22GG+#e!lFxIKC6YW_a?2%Vhb`1C$f6ZjI$S!ZTCrHglsm zfi`?x@|KqFj}rB2S@WKYtMg8F8ANnJ=^gJiwwJe{w5<|CA!6-WEx@6lLu^5oFO=;j z)bku23YVSbLDyFY3mO7<%O5y@1}RrB&f5Df!lYlF;NA*?Bmki4Au8hYP%<@U-u~qD zbc|FPXXQcsb9EW}zqvJ7u{L`4Fj;feTQIXUR#mcj90vR+1=6(;A%_88D zN-1Ga2EQ+krBV)zo@7{Q{yfrrRcOUWpWaq98nGxl>{SN{o-yn5{z*fWAg$v zUpW%bWdwD*P6(P;%IN57zvA4g@^{9O$&~Idap~Zmr|p6FB!G6^&l#V;Z4mu*l4K=N zb08*@Qkhih)+?G`&p`Gyp7sZ_*e*nFf=_krTViO%`}4a+CZ!?e`R8H>F&UgjM5}4L z)eP^xWu8Iu7~Vadw`Q){qI*@)N{9}AVrnX$^|mwzYt-PH*GZBS+l+S`#|;F8MltkJ zW&>k2HlY{0iNA`bW{G~a>7zkF_N6|LsyPi22`+PU3uRVX85aL|({laW^!1k}DzCc= zvdLy7&>zWQJQ>3|f&97?#hgC@g1PXp^7G#V6^s#%PHKnk+m2W?6Dg#o@;l&t{d(E3 z^!X-{#Wzb}L9fgS)rY4!$|DxpHh&L-z7eR+A#S?j(1?9NrK|TVHMF#>c<&8Xbl8L) ziP@D@bFd3?j{0UIC0TV!NMmSE0bXIzSrN2!?Ct3`J3mEo+IYG{|E<*ps+>E_Ilg)7 z403QIg7tQ`vA{h-&@QbLC}n@~@XatfWVV(@Awi|Y4oJtZvuX0(V2pksJ@=&a|Gag1Kd)D!{tsD6%{OVXjdTdy(h{cX{6cV*h*9inLrq^ zsH@qziPwIpCrtCokwCwMQNGg`>f1)p65}5a`zPQi4yFYb^5h7@OhIXnOnO#!n%|GI zQJ|1aKhrqvxp-12g$|*fZ29f5{f^0_=$M#k?C%WVxnu0Jwu28mx+#?Oq;1lIlqaWw zykWdSIoK^t#W4aU2@@{ABED*>?Z604WK=X*Nr0$%bX`d_U22;NEpU4EXe>SIhto~E z7@JP{R=rg>2YZR??}^DE_;wT$y5c@};(Z0e2G|nhLbT)syuBSL!&3XmbVRep@DzAUxBlv)xamOdUx6rWVXD(Syhfbku=XNSJ zgq1FlaO$r4ZbmI7;x!OqKL8y0f-z-#d;44=8nVd){M7i=)PYHpcHHisTbS*Y#i^Cy z6S61WzxGzHjwG{`dsIsGewOL2W^ZMobYZXx-CX_q9}T)3I3Q9_DWx9!?XM{ z;y00{j_R(}sb2pv{KjH&rS9`FD2IHREQRpFDGbVxcV1wqf z)g1%4<-M&JYz9Z@2Y&FlP0jV74dEQTVy^Cw<==L2J2b{>**-jWExMRMuMC&nK|bEcPq!wC7aDjL@%%+R5C3?{k=LyUwzuyji+G)|O~Ub3JMAulvl)2i)7Y6RFZax zMpmTrAQJ|ysj{4P?1q0~b?3=brf;?^{p5eQT8>|RuVvVxe7HP>h)Ql|rW+ov35V7r zdT3)lk47mS&uhjuBATc6iR|P}ivkcEXKtjX@zs*{C2~WzWQbxq z7!`Q@c_OLJbf{_b0MSZ1dvxAD@Ga^(w-FRUMoc@Og~N7BYvG-oXJND~8sDw!s>3YR zfkczB?gCk&U>R^!&TeN=Mk*jggAAKqzB9Nd+O#dW(oh_T>Q$4qBvXB$E5K?eI z?w*8S=khwN>tf+Wqzp0;F4U6xB^g@n*8KwN*T0F=d=P@_`yQvzP2R+WPoZGrA*`fhP0)Gwb-n^sv(?slZFZ;Ly)RgY)x6WXhqs*VC?X?r)@4 z76P|E+Tx1zH2WMbXH}tOiwcxP8x*WJV+Zn0MhHL1(a_F6S^R0n&;RsYX6E=7B0c59 zuL-t~0=D-d@8N!u92{jIo;}?u$tq!jUSOapUZjh>_#|=DJ;DZY_h)l5<&{9#^OrBe zW@x~-vhiXQK7&i&01YZYyQnlin%2FF9)$fi1l7_Xb^e0QnTpkw=dr4)&SNwmi;70< z?U4{OWQUkmvoX8SZDky$Vjj*1N|oK~89v=#Di)s9%N3(5-S4_O8MFipT2Q8_$5Slj z?Ps|{43EV=WAZj8%U+!AFQl(oDls&n8dy97P(v|75TA1w2Dgvk^)E&?R4Ncv8I510 zPk-UZ`krnbPre9|Y&2S`XJ3smgn zzsIWxAvRYjk&SeGU9-?>CLqpih3o6vdSA@*U3uccE7a(X`GDd0jE@ZmMv14x1T{Zx z`kewMkCHGN0cuQUEjpLd3#$6n5SGU}x+c`S>&vz`5{}%q;t5Pho1`yIJjfs|0R50u9 z=nc!K_%#YlN#TSv-T&RU;7(FzVU+vtC+7nmF8)jEJAnR3{TH@HW|zQ+*BhLn@pU#} zoI6H!X!jxLON2i{?2q(@^H9qDzM=@ib%{O*oqf~s@@`IjF1zXkPKhld%F6dz>c*4% z-%s>e(c`@6aj*&seRE|$LeE0tuw|+NWF$^!6c~8&R`!*(Q(;}(H-^+RHOQITHR~ae z^DU)Ps%L5kiZ25sO4N%cC;bjl%7-~|Q$`_uMmyzC|28{#A$g9~ZbtXoGSpUQU>$h0>hp;}>BO3SE!{sh2 zCZZ)GQqt;3++yeE9^as$VSa*)CCYx?RQ1pIPL)beW}rr@uL{>qpYB!)-d7=67|HH+ zrh3cCWj%fKZFCVp%Rm4xGv=1jjfepH0PND3Y(lSvvi+i@lQ-FqCdxW(r{@crduT-6P$XqoHj6O5mXWgHKGw4uf~uVamg#8u54&dpfQCnpQ1VQuY>E&7lzAb^1Re7r?ON&t{Q^n9C^))>pf zhZdFWGik_OO<4MtJ`FdenhY9~#yA?(j|GAblKn!PIdc{^&8rHtE|&0nDxe+8D+^79 zVt~k*4vvmt7!q0Cu3z|<)fN@ZwEhZPONWy>p|jA65j9q)e9x@y$adNxbJ5f#8XN7r z`FUecKbDcz7Y%G$#Kt-D1x(rb{Hvs&T=+R)uCA~l1Al{oz28ja-#$2M3Rci*7_t6E z2p)Jx)J%xbi!{Gbx3*)14_-z!VTPSw7=D5ViN20oH@_| zC!Z&_ZaQ?MyWULgD4SFVUvdqnj+U2!IapBA57Wkb){PkSM-kv>dlCDn=aDjp;GJ}g z3@Y&EN?oSSxVJEVFUznLGmhZg}kTuzw12GTs_%%5Z> zE{>dqt>i-MrM{}_v$LJ#pC1KSKS{8%QY8QQHG%pES9BqoJS*>SkMMAsDQjpjiu>dA zM%m`hzp zH-OefbILe7Cpd(}Y+3Tt@TI3;oCWQq10Rgq)Zq+I^#54{bbN=;;je6Mx$v90NL2v* zft>kJfT@F*oDrNO->GFyO&!O01ySJaIJsSxp@s9mH80iG7ymJ9EfShyvyEt(ts1TWHD)613rjzbZg;jG3B0RH>)b%fInP!|+#Q~#%f{qHKl ze?Qq%9eXTNkBlShqwu=VTMqAXzoV%+?th<<=MSJmDbP-0jy6K=qnd z^?qj65Zf&cg51wNavy3x0Ibn|A;|5^9naW=ysGmatuHc2+P`4`QF;>oCwXEA87zQW zC4LxqtGmvc!HzZ)5Wn4Sv728eT&6a>rgSIujM&9Z<4tF>8iMRV8{1U5GhY3UW%&(9 zEmrGGaFK$6g8ckOY}^6x+`H4oYfsIzs=A|NpD&20Hq7tHfsc{Q-EOFj-Y8N#C3vxV zdx-U*l;y<{F=!9iYr9!2XaApwTL@PxC@uR~IpgJ%1m6{=j_u>KasG|uC#9vY0VJ)_ zOK}*)UghNsr^`sR;8Y9yzJdxf0S8A4_}--$=QxK{fVYqOeVQ$+G*jRZ5oHs?fNvQVt=Jcz{}eL~8ts1rV#wO(dybzp`j#Nel$b7D#k0(?iO* zc?vP+)8O6BZ9|NWX0e%n*Tf#!@Ot#JgvQbUID$c!=owze7Gk8b-fF$jRq+YDy<};L z#m*z4QC%FA03hzC(LgcnnQ~t|J>BX=kdy5WAs?C$~0tf8iG8#ksngYcsh8A z(g#;#WhU{3Zfx9@j)AGFL`O>nz8CcECe7j(C-ges9hKBBFgYyYFnOkX%hkH z{VuCBWVKfS*n0A6qp~;Pv@^&_{y$O#b@w;m<`3b0Krbl0+=9NTNt;u|{OdeW0$d=5 ztK)VOV9Z1i#RFmC{zjR9IJ#QEe`yewrr-mWq%9cxK3=5O;M)!B5cn)%i}C|NjUsFz zHR_*)h><1+s+EWr6;Xa^p-N0FAALG6Y-OIyy1aTVboDUg+N$ zalLjHg{7mbYsb}!Ff4VqU4AnPxBQyeMYXgWprex_lm$>iwN0E=gb;KL^L*wnFVuiw zzb!9Wj3evW#O{sB&z;zrZMG${`es_f!^_JnUov4;`ytTJyX*C+4>Vx0;shW-e;J|L zWh$`s{%VKd22rBStW%{aNf+zlCg(q>Fa|AN7zdUPqYKd&fyREozWgLy{Qnnj{tqG_ z!7L?)9i^BR+!X2h2kkqn7r#yYrL>4<>!Vf#PJMp|p1L z6O6N1)ob<%M{Xcy3HE}#a=ltnhIN*LPhZ?1*BblE%7WG4r}#iot7YtQ1mxOkE`o_B z_Qzb)(+mWBSK;rBWc@Ik>UWD@nSGD5fAaqW`4m3?P77pLjd1*_gAAP40Ed62GSB4n zkqwLxAZR3WPK2@sPYsk)^(Tc%zp=DnKa! zq{u6qD$A>j=E=Q-^EnEu_5g|fZA|fUkn)fp`{udqbe*d^xFVZ>i60Z-cO%u9<(1|qPzfKz< z+q-N}XVeL5B+fg-VMLMjz(Cs8XrY2s?LP!z(b_5%QM?QJ+uC(->03NFS zN!#u}_9@x&Xz;%&B_iZY@JD#sn*d`s!kS+vFyfI9%z`D2Cmc2F;j6v7;z^YqL)`oX zeL-{UZYti?p=spvi>yJipAbk1KQ8LMlUa1)iWhnVzcavM#|@bTYZz zDmPZn^tgEcB{%qLhfFF{zPwzO5@|yRC00=mkWsE&3NKun0!_hP;PQuhk-7WVz~M>s zVIHw8^xD~)@CU}{Q^F+NzNs>I?;5nNX&qpuo#;5VrKb9fI?80d5pQo01Bih^cOkop zZc-`f{i8-VO^og4FwXxnch1$efo;*Ru z!&_}FMt+t&E(lt}<^fyrf@CB9??cV^BXnA-dYK|{DQd@_l8@wZ0SUuF#^0ZjnK zz6EFkl(UuPhEM`g$M?7B9V3nbQC#Tx_OQ}}D6#xfz z_m8%cZM1ak^@OqB7TfxSpI_c+Ul+O`Lipu5>i5m^ViQkcl9Udtu67Yep?E}JQ#f9{ z`lZ^2n;j}7Ep0|j!>?exJzHxP6j1}^SpgJSL|Fy4qMLWah6nfIjCcq$)a8Nu#uKnt z)-ZJXC?443SJzg&6r?EuABQ%Oew#m(wm6I=;U{B#4_c#dKq8SnqOYwiEhp_DK{Ti- zf{xBn&bV!!PeqLa$CLkPwQs@Unx$x`9dBS?#8_Xym-2-aaI>#3c+u*Mh;s*`nV{<% zywZV?+Z9JkH5Osd+v$ZIXIHMHkxneISMOV{gkA84*w9&n4EDg@x4R`ZPQt*N;{TL; zGk@jY{K(-snLU6@m+hT07fZgoMUd#l{$#YYVyBkSc z3Pd|}=2T5AH%NKR}-PCs*sU-E0K+RBykYxV(51o(SPz3={ro zuvfP~{b+pbp2yZt^0KnBMZ^f(*4(%F^Nw#t(t_ZhGG_ z%D;9fZ!x3_|LbB}Z|+w9>^fBWts4L3W#%=_Z^zF}3O_L}cGmYYAr7+rsaHM{r1|C) z6&kdn5Y%pWhvDjSDq>am%5U|vdd4Ve=4_QaGIsvbE9Vw|SdQ-pw@#FY{WK9Hl4FtP zYGg-=VCi~UXLNBQ=`hUu1e)^XFd=TkH;0bX@XfMk$IwE%fruas@7VB?GXZiz2`SZFp@QF# zB?%ec@G+(2mJY6$o`w5t%?OiVuR!Q?s?^QmUYn2soc(vCc;5UG_@jRq)Wdys3yW3f z0y2pg2ESUaJpf${xL8IP9W5)-HZX4+u>W!2A@5ek`>mas%$dtz8ed(I>O8WwU_}of za{BlkNJMTW>d~)jv4K_m3%_Y1%kH{uu@3Q-`ZHaLbcviVBQHzA?2j=mQH*!!v4!sB zJbrgMfAhgnzhS5>u*|a!Z%(^Sv(u9P-p?WNc%4q#p*cq~YUz>kujHE-Qp5TGUZ|G_ z48c8y9ITq$ikCiMwAia5ODPOg0IZEa3*NfF z7rZ-xIqeKyKgbR%fqsrKGx4GT%vn{U3`Dii!W*B?!H#=Uzlj+Lc*?XD9<89{a%?1XC^=al9<_xAs*BXBbqkkJ4`Yw5H7Z3OrLM!=`X zoSdHk4pc!wCDoC&1U2nIE`-h#5FZ)7Gw#MAxbR)lo3%vZ z9P;;l2;h`KMG@JgH(4J(blcs~!Y97Bc?=)^g@|&F>71JBL?QDz+xjkU4Lg#5T1i4$}US;KxiroFewezX)S3DEP z94PEHWtY~NBsCDuesAYHbdvNUqriR_Ytf8PJOY#%0e;?3N$5LGp?i(Pdw>!_H3q3Q zOdV=y513~=?Bd`*wq+SYtw0a#!C2^(Lx!pu>1X3{_{HH&7po*1_nObasQxH^ zcREawp`ti9HyDaJUlSwS77P~nyE17b`=5pbu4}lasw%KDK30P8@q)1ZWb;5CwZU2r zb2NX_0xtqL<0GGmP|$R|H&4pW){vFO0-NDqV_#uEh7spWIb>fpOpT71(R|c^~_6;ccDVfv;`PMH z9G^@exHLP@l=3uu-WF1X`eM;fY}qUR$6kPF-203HLxM9a62bKkgFd*|dWnmy3;y=F zBL-y)kf%B4YQS4?>-^H~uOB^3Cin1-);uI_x$cC??+QZ$s?9Ldgo;O@9k2+6+w50u z4^T@!Bi~*>5!29k{fVGsSiB%o^B+$e^YY!6_8Dpyc>g~uR)$!S2&ZPjn4$e@)bqD~j($vo_atA!}20NT~U9jF(nPDN${rp+gc%^KFpV=yW z@QRkS&6F5DhR8S0N{opaFZO7vw4;=w%7B`6Ab(%4fc16ih4WLwRrhEmMXk{t&%K5E z2tKRoiL~_e^t_3kT7#cblHz6!d+jb#&XiL4VR>pO*4sb&Vo{x|SBgJ|htFX>D;BHd zgzZBx_#4Sp7#(}tCo`rbPxbk~EG?;l0df%Yo1VSz{=d?(|9O&%^~D4MKAhhCfO?A} ze3G~I3BdDO*|iSe@FczbdEq6h8eLcq7(Tg$60b0d?OWJ$jHha1q{HcjXNWd3fb3DR z*5PsQ5N~X6$712&xBNui>8T@Ohlk8jrZ-bNZ&{*%|@*B z^WcS>l8K)s=e{mbe%<=k?$Ykl%c;w@E}%s4 z|L$YDb%v1B?d;I0950+NA2x8)YoNy3^piFE#zCBPW7s-0^+5&C+wXHz5>duRbh2&^ zMfqzBNn*kXTQc?SzAZT97JVi8Q;?EIxu@Q zm~g+Io?eJ0s0G!glwe3|8+VzGTI-dm2ZmXVSTU1!RK6mizk*3#%-{?G(|27)a9z?H z`4zhJ<ygsXF9?L)E~gpg3W|vd zT)FbK$e)>sNmc^(vjTPPch1yi;@Ro3Bm6Xrj@CiHTsbv?l9#p!^_XyWO4LB&oxW8} z39<>;*FMy3-ecnS^>6PeDm|XQ#U777ojYk}ZzdtXpcGnr5nWF1^(UvMbMr*L)h}42 zq5Sy+nwgIjNM?Bi>fu{XdEKGt5F)`NFR^+%5$1U_9-1)UNj*aw%Mo;1s3xru7-`Q& zLzH%NFsmmNo~O3Quh^ets@An{uxOC0W^UEm=H5b`B^Y#2SRce6dBNoeL1LJJGvt~>Bfry3(sSHaqMP2@4$Z`6LLZ3UPG{nO7eN`N0!8x%>gWV*Ao z%Vs6SlL@5eDTcl-z_i^2GeH$`WYTgx@AC6~;Z3W09p5a4(DxQKE;q;q*J+lJUz*F> zoV`93ZkhIy=OWhWl~-s2=nFccx!AmpHySAVDk3ZND0B(-ne_D=Z4M>*32}pW%T+08 z^^MnB;HSam2@M!{%YWEc<~pK{t*v!HlgZsrifbRvF+-TIr*J=~F4r9=n#A^J9Ta|NB_he~txm_t+hOKCZ?c zP8)WN4Zo;AIe`J>;5=q=mJS_?*n#d8*-raqf_9 zhG;LPu;G8+s*)s#r$1KUP7*5!$&k$tDOoR>?c~jgl%PpqJe*Y&AEw?mw;T$?PB=yXvJBTqM(55`q$rXoC>f;)$q%_ zC-H$1n>)QWB=w(jjw6PHSCL-WV^3@h>Lke9Z6%>v7Uflm%)3la|0LmTrp zY5e!JYgo4VdM@Xj-20eA__A=&u)jucOA>UFuP8*}o4^=&tVpJG(nBzy_HYqWmmhOd zD8IMWPSOMNMa$X=p4gLu{E}UTGj3Y7uUc^3(R}lJYhhbX6mdF%Y*RL|A`cwD73tO0 zPFiXejqBVTX5WZb{59&A+G9Mi+RZHdB_YjO_D)&y6)zP{#_;5%b|MXiF13iJ0iKQn zpT|r6UKC3dvN>ZiS!~!gUrgYWO*e(zCQOLf*4DCTcf{!cufQI9 z-`PGgLi#TEr#`nt%F7J&>;=mcuxDoon#GXq`ESZOZ{NIsFC+&W|1xsp6_7-TpS53C zf!*QWoZpsX#%GMR-jr!)>|SFg45hGvgxKg|oE z1py}~r=ay*A=7qJWrowOQoGZhYioSxZS1M~_*83_*t?$h;gFI^T$v#vk@x(_|MVjo z+&?mhp47HP-J;6ir9{7Ejn{bA^Y%tk?_y=D_&2jNXp3Cx{s*6_UUlhf^dK&*MGY8EWF!HG@T^O7*G74dJR|8dl{LT zhbv%2|LI&Kh_C*k`$3XciI6JhXh7Vba}YO@^tx|grr-l36X~2;Wu9|A#neY@We+7{ zmwB7#1DK(5)`YZB#jCK<4RaYRTf%i6hR*$%4b~aZ88(g;sNES)OwuS|eb)N8(X7UH zq0ow8D5HqYZ(=5s;w;q4;Eh=$cZj4hS3B3zP(YgEA$wco z@j(8UI;zV7wRzuRmzJIRBQi*adTaum{eh@evtJ76=k_`gLw+BOsNd7>XxAq(N3Q_WbPVlRs44KIpI9MX(JNX_D2UhLL=9sjM;p~EY$oc8uRzE4Qx%!-=_ z6*aZW^|th$wbI)U;jXcwpY$Q9fKX-22maO6D;#<8($%OC(7YJ?tVW z^RLlzD?=NbcrbBycYAtz4)IIb+?mJt$D|Y#j)z-wP#BQ(qse-YA3Z(jD#!2Q{;MV+ zQROO#wU4IbLZ5{mSKc@i@G5vl)|YkobCf+IDrz1bNfUsFfRh*tQe~niWx)i7+Cd=^ zq%XgJvAVjN^ORUQ%YTji}>>lnRZ!Ez4N|r;d5OI~yIR zbXaYz1lV{51t~#*tZyNK=0YwRBPY`ZNZi}z@cG9=Ql36#DJwiOJw003#-`Ef_8bsZ z5-mrRVS$E4+o!@pvaesiQc_V7LDvNYNFadVLJ%{*4g{T(Q#^5Vd)YKiI#I~uRaQll zWZ@~)JMi=8w-zjN&CjaNQbf#_yf>hh*2BX?@I5oB1@>}RRhMYoMwTW+=b&@ZL&yC! zoa+ML$=}H_!%A-+Vun6_#J{{~24-fGmtSXn!2kakj>~qB^_s%oKZrke-jVm3g+%R; z7s~Z068`e0bbBrQV1$&OKbO&iA8_gLGt2&&bl6-`zJH&x)=~r{CEWtzJD2#aTa192 zEKDU&$>0AjNJ00$aYEelB_RS?#Vj@DRbvAO>FeG)* z->&!{eSLn7v}hPKC>5ZBa!vh+>P;^6)CS9LZ|{1Fe3GP8-g_i$<8VB;I<9@V9An0) zAW280`xPg~4S^vv!)hC_=pz7a$=k|F(-mmMhflbZL+jHmmqkQG#_QZJi`urv932H` z=|1Usz+d;AEjW+G0;cWE39 zP!SQmhP?7}+B>n4mrm|aNv?;F$Y#F6y%NaoL>JwuTs$R?PCS?jd0bRgNa9i>^DkX{ zUf$ix6>&2657^r7%^xEvAdcq0tNPVzd^wE)Ps>lKAaVZS){(t5MYGN*1XCb??$A}c zR4qP|n_~!j6wJo?N7m~;f4gtffzxCYBhPY+C>nz=nURnT%EP3Si*%GjLgb{O7equ* z*sotkkdkA;p1tqP#QA%AIzBs_+l!Op&f}=2Xp-;mzIt;8_qnKP>bLV5Q$*2nkOTRp z2*S!Dm z0S_!d{lEwFrlzLWzP@)ZMA>b1<`fY_P6HL>2blM@I({RP{OtQW_MD?W0D>#J@F6sVr4WG)~-5|G|;6 zb$0y08QMzcNPWOlx26@EiluZQT!s`}$4nmqjxFN}C#AR_h5Uu$A4xOQ(#Roc?=3fp z-mvjT>8XH84-naNa=YNCi{K|6W$zmVLT{nNldQG^&djzYJMTtDqwPTn`L^lrYx@lrsgV@R_8o2n^aDN|OMHk+1hVaFR% zP}p=!poRQHQ`7wBqmT#hmN_`e&P4d__*($S;?D3}Ej~i#{#2I3>gnKn9e&tO_p>s~ zQ`Ydn&beRn)TN7EiHTq3u;i?kqY@Jn!|>A?9TyXG zK4YDnu3v~^>g<|%F-K3}lBa0c=_QYU&0&N`G#TQJ_Gk{ugH89V-6u7{uwzx+r0We( zizBmV{P1Z0x~+Rc_8lU4=s)2M9j>6iKXq=7y0=f>@d+*(bNqw6SsUlkS&(?Ii!9U@ zn3UaGBSME)3By@(Ww;1UqsKoW``+(7+DG#Qr=0gR7pT0SpNKi$r#$pT9CKhO^t81* z1{4W#UgmU8r<;I1j10DPjD7Lp8TuU-^*vr{=6p_nFQ;bYeC4z8rw$4O>Kshs3++aX zr6aDzBd+kK)m7K-HNRA#L()VnjwBC^HjSY6zlo2je6qAhxk9ahy--#1hHLL$=#d1< zF$cJ86+#wvXHqCUEi?<53OfL)$2vD{6!{b1zh2+bFO@vxbM|{bz7uzH$!nSrzrN#q zn~efWO-;=J_L}?8_jgbFr4VN@o%a${d3kwy1h`HH_$)3fBZXKm&<>J*zp_;8e>Tx5 z7iFUGw|Ag!YWl%&-VBOnc_62um-X&#)*M9D*d~5Kj@i)0m<&3(=2+!IQtgQ#t*Z;Q zC=~Nh1^>lFIc5y6!lHox*b%y#66#6^5v!^&uri^wLwFCZ+c|&?A6;cX{ zy85bNX?J`+F517dEbsbL=Z3fTjGJ)2YE!-E@$4Aqk-vLS`L)lYb_-24(Vl4z$e-=X zzl;icekxn0rKOe3$H%8!{?He_x(C9LGsGQ;f!7v)PV|W&y;y_VMijVsf zhzw>Evma?Jrm`oDWXbg^DjWqxbqruu8%DS7So8Ac9_}uYo^pRcOudp(MlBcdmG`UA zlui2AVPRyg(4i29t)60uT-fG{s2vU3`0&X6P8AFxV|Z1)X@?IoM{OpaY{jXI!MATi z7gudJ_NUwlLO4AtzpN_O3qTj z_XP4!p_LcxcuKy%TzP7Ky2NpQ^$Qrq5EOdh^_h2P=ImmaeiOAq|JwCwE7y^cS^_U)D`aW~o~uUNEy zS+eqoRqBK)m+1)>WVv>D+9+G1J7s6&A!l1WL9%v~DV5iN;-o#?<-IbAi@hHQCtJUf z5%IF4qb%wZEen(QoG&R;y(8~V+rz3ix1e0{VJY-BSsPP8OvM7to((fGbnY0;2ZwD^ zX)=(`UAuqogeZiQ>imCxpxuZi+2f~_D%{l>NWJCfQ{9yR%grb*Eq(db-V0yPMXG#X zfR9hTcJRi{n|nQQP5iH2dHB^R10=}iV+Ams&Giqw_adxCm$kGv^jWpFw8B;Lwi+V@ zF?Fy+>hXt2k|vKk$_&3`0H@-?;c~^KF6OM=hf@*G$;OsYA*6wy892C4li%2wK@#?K z_|qF0RfVyEf&BsV;IJIG@_5y5$m|DyrGmJIa*MiG&b z-Q)KuAow*q{+YL9#-?*aH=cYJQ48{;-fE;?{8rNdFDYvtVPjsEM5bm{ps_C6jzPaLJ!3i8inpLRYsUfnn?!`xHbMrZ3mZ2|p zC~m0o$;o?QW{uOAeBUd?&f%k{iK-PHD8NNEe%&GQ2z%z8V7^Mb7Z zE@;!+LEQkCiykYdv@=sgM#Yml1YSJAVP5PME^3#A(P!Ty3Xn@kNT7q1+}wm^<>U-a zOq}Z6b#-acXf%2Av?_ZZ?5Ek@lalHa?|2)LnV#jvwE~ze68VE73`DXP71ekGde%}o zOLg_g;f+_ZvAh3p(mjs@wMN(WpFDf^>Ez0LOhwp4TN3Gk^8Ekfnc@90fFPZp2N1Nz z41HEgA05WSFk_nMyUTc`oFM%y*+su5z{W)f0W!l|xtV7XuDu|Tg|ol6w|DnBvUDd8 zhFt>J5h;~7S^Jb(G3!BNULH|=e7t#E@V>u*T~y@}*-;5{iB9CIMp1r~YV7MegDMhl z?jOsgb^>_9BZ~QZNdsmmASDNi`Kbp10g~T4tt>27{4DCN0srCEt5>aiJ{K3yW^Ncf zlK#UTsq(dAI3T;AWSkifsG(T@C!&cFVdIKO&Wst%k^K)DeG){uEc zL}m~j3@*AqFZsVt7KrVsY;DE~N? zCF@TOm>83N$NR@}X4(4dugS{3M~K#|E-x;6*E8k92z`MH{8HFi{mU&qEaWn^R!c}CnBV)>qIlpxsz;|bo+hn8NpPQ- zSll%(L#;j7?$5YI0>t@{V&-U)YJ5O3Qso60ROxhG4^HtbLe!CH*J)te@3LK z%5Qjh@77R2>b=DyD_&m*x3&pOuOw{UC{R)rW{tsZwkGI)`w^Oy3fl@z4UMP;oj_BW z@T|U-H$FWFSeP7_${AWwx__wwF{U5nqgfBqeai(9VF`1h4 zuvl2{5{dJn7?Wb9V7<=5c2o$Lo%7#_l+e*jcqXK(po7vcaS14G)uLc%PmT$Vn~mLq zUf;2vHuOM@8YwK2=+U7?U^@?@UmpQulq9S@iGegKV(S<81s$~1R0xe;CUMWwfoW&| z^ESGLa8re~{N_Y81?kUE%8;qWgu}F@o1C98CG<4})}KzM+TU)t_ z%IBu}`U{iHuQ^X6{JQK#AyxcYikL=u`RN=fg8*SPP3k!ozcE>h8d4BhCpQ!#;80!eCSPvM` zpJShz*1p7gKc;^0IX&Au{3&}QhnG_S@0*ui*-i+1;hy)aTb30Od-#Fpbw%q~JgIUc zeFKfOkdRjW>5IjHOMd{dB)Gge7K_$^-7NE=0AhNclR<%D=;>XIm)I88|WmJcU9*gaAo{u)c~{>@Dav$79MTP{7X*n4+`#0CAl((M8v zM~d%yUqjZCt~s&+qo~ZV`OT47R8VmC+aN|h-P#%Skzg&T>RF{&dFhzMDs+c$%YKZt z^gtgVi@mua?UycH%HMevA5X@+arS`Z1(lcjB-OojTwO~&t+TE_EB2d?oij7(ob5X4 z`u*Yr^Gf>{9nZn`EERjmRnZ+Va3Y+}Dnkdg+EV>ls`1zw{VHB{fQ?_z%;b#Dc?Gac z0|n&^45c*HW+o%k98>jwK_L&a( zhddBP08KpWjA3l_Q9oHq12CY9fkDzVV00?dwnQ12=sZC`wYgC>wG;9yG>sn8PP;kR znx%i)>A*9H=nh_%sYIl%u8wY5T~l+Hn1wkQ(C%AZ*J-5Sk2uFT!SfF^gM*tpoQ+jf zAgCnt7=jc}_m}}_Sm`k-2^P8MKtyDQtiKR74b7Y6(`+|K9t$1Eyo)13)VS zF`;8C)t2RHm&LBh$V{x>;^!xa#2wJ2kdl=Z$LsKC5$=tPLD;G2}`7kE8&?%a9SO#FAZ$o~x(1%;_1uk~|FK zN3Pw?*%Di~WY{e6Axrj`H40~C@B1J{4|$cea@vLB`JBvJUSxC6u9{lYUTC*5F3JaO z0SL$!O0l!E4~~z=baiP!vpkWcq?QZU0vNR7{5%u_^h17l0^!Y*PrmdV8X8Kr z{Z~@#G0EOJxCjs*3Mh{I4!LU``v)oaq{W2=FAxso@9!TI7pJDA1ogS}4!D{{KiY3N z=}-^BFQeiqRqf~4aux~5{0HRbA6LqOY-WY+&B(gb(tp(l0Srj32v9T^n+T=*P#x3+ zY*<1{!NIcg0{Z0kpJPT`?*fk$W$o`@H|;ikB?Y4q@j#Yx`SS_JOrrZEXT+|F!W`-c zK!|{5ob@7Vvjq_;Z7u+2)gu8<=19uP5tG#~G#ZKyq~ztKy5a<|6I;f(f;S9hNBe#X z9S_mq^SZ=^pQtx0e$DWT5pmO^j$4IH%~g2@l9qJ5(kb;K?D6E_*&6&4bPk!xHkPft|iv+3p!rb4MUkvA8Q=zx?@c9)i1zzR}~()mc& z?*!>A4+#Okqr9R7MB7!*eYq<__D$9aI9vdfa9j&)$;`^0Ivc(5QC>EnSjVpg%g+Lp z2aq(}@jTG^*RNlXp|1ar+6RkM@Kd7Y4Cu#Ec*K#aK4T0?Fb+I$2zsEdr}jm~ HKKy?HS