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 dfef3e3dcbd..619678fd650 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/paradise.dme b/paradise.dme index d14841666f0..948894c7d8f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1547,24 +1547,6 @@ #include "code\modules\ninja\suit\shoes.dm" #include "code\modules\ninja\suit\suit.dm" #include "code\modules\ninja\suit\suit_initialisation.dm" -#include "code\modules\organs\blood.dm" -#include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_internal.dm" -#include "code\modules\organs\organ_stump.dm" -#include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\skeleton.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\subtypes\diona.dm" -#include "code\modules\organs\subtypes\machine.dm" -#include "code\modules\organs\subtypes\misc.dm" -#include "code\modules\organs\subtypes\nucleation.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\unbreakable.dm" -#include "code\modules\organs\subtypes\wryn.dm" -#include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\fax.dm" @@ -1855,6 +1837,26 @@ #include "code\modules\surgery\slime.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\organs\blood.dm" +#include "code\modules\surgery\organs\body_egg.dm" +#include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\organ.dm" +#include "code\modules\surgery\organs\organ_external.dm" +#include "code\modules\surgery\organs\organ_icon.dm" +#include "code\modules\surgery\organs\organ_internal.dm" +#include "code\modules\surgery\organs\organ_stump.dm" +#include "code\modules\surgery\organs\pain.dm" +#include "code\modules\surgery\organs\robolimbs.dm" +#include "code\modules\surgery\organs\skeleton.dm" +#include "code\modules\surgery\organs\wound.dm" +#include "code\modules\surgery\organs\subtypes\diona.dm" +#include "code\modules\surgery\organs\subtypes\machine.dm" +#include "code\modules\surgery\organs\subtypes\misc.dm" +#include "code\modules\surgery\organs\subtypes\nucleation.dm" +#include "code\modules\surgery\organs\subtypes\standard.dm" +#include "code\modules\surgery\organs\subtypes\unbreakable.dm" +#include "code\modules\surgery\organs\subtypes\wryn.dm" +#include "code\modules\surgery\organs\subtypes\xenos.dm" #include "code\modules\telesci\bscrystal.dm" #include "code\modules\telesci\gps.dm" #include "code\modules\telesci\telepad.dm"