diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm index 5442c621e1b..eb1efd8d54f 100644 --- a/code/__DEFINES/mob.dm +++ b/code/__DEFINES/mob.dm @@ -27,6 +27,7 @@ #define ORGAN_DEAD 1024 #define ORGAN_MUTATED 2048 #define ORGAN_ASSISTED 4096 +#define ORGAN_ORGANIC 8192 #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index acdee566889..af5c62e188f 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -42,7 +42,7 @@ implant_overlay = null origin_tech = "biotech=4" slot = "eye_ling" - //status = ORGAN_ORGANIC + status = ORGAN_ORGANIC /obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life() ..() @@ -63,8 +63,8 @@ implant_overlay = null origin_tech = "biotech=5;magnets=5" slot = "eye_ling" - //status = ORGAN_ORGANIC - aug_message = "You feel a minute twitch in our eyes, and darkness creeps away." + status = ORGAN_ORGANIC + aug_message = "We feel a minute twitch in our eyes, and darkness creeps away." /obj/item/organ/internal/cyberimp/eyes/thermals/ling/emp_act(severity) return diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 86a8360b01f..86e723bca8b 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/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/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 93b01f3951f..8eedb95a8de 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -57,8 +57,8 @@ return 1 /obj/machinery/recharge_station/Bumped(var/mob/AM) - move_inside(AM) - + move_inside(AM) + /obj/machinery/recharge_station/allow_drop() return 0 @@ -115,7 +115,7 @@ R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge) else if(istype(occupant, /mob/living/carbon/human)) var/mob/living/carbon/human/H = occupant - if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) + if(H.get_int_organ(/obj/item/organ/internal/cell) && H.nutrition < 450) H.nutrition = min(H.nutrition+recharge_speed_nutrition, 450) if(repairs) H.heal_overall_damage(repairs, repairs, 0, 1) @@ -210,14 +210,14 @@ /obj/machinery/recharge_station/verb/move_inside(var/mob/user = usr) set category = "Object" set src in oview(1) - + if(!user) return - + if (panel_open) usr << "Close the maintenance panel first." - return - + return + var/can_accept_user if(isrobot(user)) var/mob/living/silicon/robot/R = user @@ -232,17 +232,17 @@ R << "Without a power cell, you can't be recharged." //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO return - can_accept_user = 1 - + can_accept_user = 1 + else if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - + if(H.stat == DEAD) - return + return if(occupant) H << "The cell is already occupied!" - return - if(isnull(H.internal_organs_by_name["cell"])) + return + if(!H.get_int_organ(/obj/item/organ/internal/cell)) return can_accept_user = 1 @@ -261,4 +261,3 @@ build_icon() update_use_power(1) return - \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5dfabafe4a5..ead588f462d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -427,7 +427,7 @@ "\red You stab yourself in the eyes with [src]!" \ ) if(istype(H)) - var/obj/item/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/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 97ae4caba04..e89f3213b4f 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) switch(severity) if(0) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 25d819f63c2..51bd36c5839 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/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 90a25d9f4f3..c7d69593a1b 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) if(!istype(E)) // No eyes? No problem! return switch(safety) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 64389d8066a..0724ba4b292 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1575,9 +1575,9 @@ datum/preferences else O.robotize() else - var/obj/item/organ/internal/I = character.internal_organs_by_name[name] + var/obj/item/organ/internal/I = character.get_int_organ(name) if(I) - if(status == "assisted") + if(status == "assisted")//add an actual organ for this? I.mechassist() else if(status == "mechanical") I.robotize() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 4288b561f2d..5c1458a73e1 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,6 +2,7 @@ gender = MALE hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD) var/list/stomach_contents = list() + var/list/internal_organs = list() var/brain_op_stage = 0.0 var/list/datum/disease2/disease/virus2 = list() var/antibodies = 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index bdc1652231a..cb16f0eec19 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -256,8 +256,8 @@ else if(!client) msg += "[t_He] [t_has] suddenly fallen asleep.\n" - if(!get_int_organ(/obj/item/organ/internal/brain)) - msg += "It appears that it's brain is missing...\n" + if(!src.get_int_organ(/obj/item/organ/internal/brain)) + msg += "It appears that thier brain is missing...\n" var/list/wound_flavor_text = list() var/list/is_destroyed = list() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4c8b53ccfe7..ccb4219b62b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1313,14 +1313,14 @@ ..() /mob/living/carbon/human/proc/is_lung_ruptured() - var/obj/item/organ/internal/lungs/L = internal_organs_by_name["lungs"] + var/obj/item/organ/internal/lungs/L = get_int_organ(/obj/item/organ/internal/lungs) if(!L) return 0 return L.is_bruised() /mob/living/carbon/human/proc/rupture_lung() - var/obj/item/organ/internal/lungs/L = internal_organs_by_name["lungs"] + var/obj/item/organ/internal/lungs/L = get_int_organ(/obj/item/organ/internal/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 ec075fcf9f2..30c9e770d7c 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/internal/brain/B = internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/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/internal/brain/sponge = internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/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/internal/brain/sponge = internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/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/internal/brain/sponge = internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/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 0dc5851a8ee..2927b5dda34 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -1,13 +1,13 @@ /mob/living/carbon/human/proc/update_eyes() - var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) if(eyes) eyes.update_colour() regenerate_icons() -/mob/living/carbon/var/list/internal_organs = list() +///mob/living/carbon/var/list/internal_organs = list() /mob/living/carbon/human/var/list/organs = list() /mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs -/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too +//mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too // Takes care of organ related updates, such as broken and missing limbs /mob/living/carbon/human/proc/handle_organs() @@ -157,7 +157,7 @@ I use this to standardize shadowling dethrall code -- Crazylemon */ /mob/living/carbon/human/proc/named_organ_parent(var/organ_name) - if (!(organ_name in internal_organs_by_name)) + if (!get_int_organ(organ_name)) return null - var/obj/item/organ/O = internal_organs_by_name[organ_name] + var/obj/item/organ/internal/O = get_int_organ(organ_name) return O.parent_organ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 92c2e7049de..f99c680dc84 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -215,7 +215,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (radiation) - if((locate(src.internal_organs_by_name["resonant crystal"]) in src.internal_organs)) + if(src.get_int_organ(/obj/item/organ/internal/nucleation/resonant_crystal)) var/rads = radiation/25 radiation -= rads radiation -= 0.1 @@ -894,7 +894,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc //Vision //god knows why this is here var/obj/item/organ/internal/vision if(species.vision_organ) - vision = internal_organs_by_name[species.vision_organ] + vision = get_int_organ(/obj/item/organ/internal/eyes)//wot? if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means. eye_blind = 0 @@ -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/internal/heart/H = internal_organs_by_name["heart"] + var/obj/item/organ/internal/heart/H = get_int_organ(/obj/item/organ/internal/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 a8254337c8d..e3617463aa4 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -47,14 +47,14 @@ /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/internal/wryn/hivenode) in C.internal_organs) + if(C.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) C << "Your antennae tingle as you are overcome with pain..." C << "It feels like part of you has died." /datum/species/wryn/handle_attack_hand(var/mob/living/carbon/human/H, var/mob/living/carbon/human/M) if(M.a_intent == I_HARM) if(H.handcuffed) - if(!(locate(H.internal_organs_by_name["antennae"]) in H.internal_organs)) return + if(!H.get_int_organ(/obj/item/organ/internal/wryn/hivenode)) return var/turf/p_loc = M.loc var/turf/p_loc_m = H.loc @@ -62,9 +62,10 @@ H << "[M] grips your antennae and starts violently pulling!" do_after(H, 250, target = src) if(p_loc == M.loc && p_loc_m == H.loc) - qdel(H.internal_organs_by_name["antennae"]) + var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode H.remove_language("Wryn Hivemind") - new /obj/item/organ/internal/wryn/hivenode(M.loc) + node.remove(H) + node.loc = 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..." diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index ebb8674e889..5a01fa7ffca 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -137,19 +137,17 @@ 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) + //for(var/obj/item/organ/internal/organ in H.contents) + // if((organ in H.internal_organs)) + // qdel(organ) if(H.organs) H.organs.Cut() - if(H.internal_organs) H.internal_organs.Cut() + //if(H.internal_organs) H.internal_organs.Cut() if(H.organs_by_name) H.organs_by_name.Cut() - if(H.internal_organs_by_name) H.internal_organs_by_name.Cut() H.organs = list() H.internal_organs = list() H.organs_by_name = list() - H.internal_organs_by_name = list() for(var/limb_type in has_limbs) var/list/organ_data = has_limbs[limb_type] @@ -157,15 +155,12 @@ var/obj/item/organ/O = new limb_path(H) organ_data["descriptor"] = O.name - for(var/organ in has_organ) - var/organ_type = has_organ[organ] - //world << "[organ_type]"//debug print - H.internal_organs_by_name[organ] = new organ_type(H,1) - H.internal_organs += new organ_type + for(var/index in has_organ) + var/organ = has_organ[index] + H.internal_organs += new organ(null) for(var/obj/item/organ/internal/I in H.internal_organs) - if(!H.get_int_organ(I)) - I.insert(src) + I.insert(H) for(var/name in H.organs_by_name) H.organs |= H.organs_by_name[name] @@ -609,6 +604,7 @@ Returns the path corresponding to the corresponding organ It'll return null if the organ doesn't correspond, so include null checks when using this! */ +//Fethas Todo:Do i need to redo this? /datum/species/proc/return_organ(var/organ_slot) if(!(organ_slot in has_organ)) return null diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 96e834dd749..ec5998a989d 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -502,7 +502,7 @@ reagent_tag = PROCESS_SYN has_organ = list( - "brain" = /obj/item/organ/internal/mmi_holder/posibrain, + "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, "optics" = /obj/item/organ/internal/optical_sensor ) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 2065b63db67..faa638f401e 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/internal/eyes/eyes = internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) if(eyes) icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 897cfa1f9f1..aa18182ccc5 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -652,7 +652,7 @@ //Synthetic human mob goes here. if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(!isnull(H.internal_organs_by_name["cell"]) && H.a_intent == I_GRAB) + if(H.get_int_organ(/obj/item/organ/internal/cell) && H.a_intent == I_GRAB) if(emagged || stat & BROKEN) var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread s.set_up(3, 1, src) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 80c591d3cf9..898ef71febb 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/internal/eyes = l.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = l.get_int_organ(/obj/item/organ/internal/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 ba18e879729..a4a8a596b22 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/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 2d4a7bded8b..555710be247 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -63,8 +63,8 @@ M:drowsyness = max(M:drowsyness, 30/sober_str) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"] - if (istype(L)) + if (H.get_int_organ(/obj/item/organ/internal/liver)) + var/obj/item/organ/internal/liver/L = /obj/item/organ/internal/liver 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 ad4048c4efe..6c302321b89 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/internal/eyes/E = H.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/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 61f4b66255c..1d684dc5563 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -78,8 +78,8 @@ var/mob/living/carbon/human/H = M //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/internal/I = H.internal_organs_by_name[name] + for(var/name in H.internal_organs) + var/obj/item/organ/internal/I = H.get_int_organ(name) if(I.damage > 0) I.damage = max(I.damage-0.4, 0) ..() diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 7cafa8e6ab9..f2cc4c59d72 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/internal/eyes/eyes = target.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = target.get_int_organ(/obj/item/organ/internal/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]!" ) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index fb8c2d051c6..b358e1f8b25 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -7,13 +7,12 @@ parent_organ = "eyes" w_class = 1 - var/sight_flags = 0 + var/vision_flags = 0 var/list/eye_colour = list(0,0,0) var/list/old_eye_colour = list(0,0,0) var/flash_protect = 0 var/aug_message = "Your vision is augmented!" - /obj/item/organ/internal/cyberimp/eyes/proc/update_colour() if(!owner) return @@ -38,11 +37,12 @@ HMN.update_eyes() if(aug_message && !special) owner << "[aug_message]" - M.sight |= sight_flags + M.sight |= vision_flags + world << "[M.sight]" /obj/item/organ/internal/cyberimp/eyes/remove(var/mob/living/carbon/M, var/special = 0) ..() - M.sight ^= sight_flags + M.sight ^= vision_flags if(istype(owner,/mob/living/carbon/human) && eye_colour) var/mob/living/carbon/human/HMN = owner HMN.r_eyes = old_eye_colour[1] @@ -52,7 +52,7 @@ /obj/item/organ/internal/cyberimp/eyes/on_life() ..() - owner.sight |= sight_flags + owner.sight |= vision_flags /obj/item/organ/internal/cyberimp/eyes/emp_act(severity) if(!owner) @@ -77,14 +77,14 @@ eye_colour = rgb(0, 0, 0) implant_color = "#000000" origin_tech = "materials=6;programming=4;biotech=6;magnets=5" - sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS /obj/item/organ/internal/cyberimp/eyes/thermals name = "Thermals implant" desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." eye_colour = rgb(255, 204, 0) implant_color = "#FFCC00" - sight_flags = SEE_MOBS + vision_flags = SEE_MOBS flash_protect = -1 origin_tech = "materials=6;programming=4;biotech=5;magnets=5;syndicate=4" aug_message = "You see prey everywhere you look..." @@ -137,5 +137,6 @@ implant_color = "#101010" flash_protect = 2 // Welding with thermals will still hurt your eyes a bit. + /obj/item/organ/internal/cyberimp/eyes/shield/emp_act(severity) return \ No newline at end of file diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index e01a6c18247..7bbcd155cfb 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -8,6 +8,8 @@ status = ORGAN_ROBOT var/implant_color = "#FFFFFF" var/implant_overlay + tough = 1 //not easyly broken by combat damage + sterile = 1 //not very germy /obj/item/organ/internal/cyberimp/New(var/mob/M = null) if(iscarbon(M)) diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 0e909ec5b18..40466818695 100644 --- a/code/modules/surgery/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/internal/heart/heart = internal_organs_by_name["heart"] + var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart) if(heart) if(heart.damage > 1 && heart.damage < heart.min_bruised_damage) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 5b297ce24e4..9808f8d6233 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -32,19 +32,20 @@ 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 + var/obj/item/organ/internal/O = src + O.remove(owner) if(istype(owner, /mob/living/carbon/human)) - if((owner.internal_organs_by_name) && (src in owner.internal_organs_by_name)) - owner.internal_organs_by_name -= src - if((owner.organs) && (src in owner.organs)) - owner.organs -= src - if((owner.organs_by_name) && (src in owner.organs_by_name)) - owner.organs_by_name -= src -*/ + var/obj/item/organ/internal/O = src + O.remove(owner) + if((owner.organs) && (src in owner.organs)) + 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 @@ -101,8 +102,8 @@ var/list/organ_cache = list() owner.death() /obj/item/organ/process() - if(loc != owner) - owner = null + //if(loc != owner) + // owner = null //dead already, no need for more processing if(status & ORGAN_DEAD) @@ -289,10 +290,10 @@ var/list/organ_cache = list() if(!istype(owner)) return - if(is_primary_organ()) - owner.internal_organs_by_name[organ_tag] = null - owner.internal_organs_by_name -= organ_tag - owner.internal_organs_by_name -= null // uh what does this line even do this seems silly + //if(is_primary_organ())//Toddo from fethas:Do i need to move ths? + // owner.internal_organs_by_name[organ_tag] = null + // owner.internal_organs_by_name -= organ_tag + // owner.internal_organs_by_name -= null // uh what does this line even do this seems silly owner.internal_organs -= src @@ -320,10 +321,9 @@ var/list/organ_cache = list() owner = target processing_objects -= src - target.internal_organs |= src affected.internal_organs |= src - if (!(organ_tag in target.internal_organs_by_name)) - target.internal_organs_by_name[organ_tag] = src // In case multiple of the same type are inserted, only the first one is the primary organ + if (!target.get_int_organ(src)) + target.internal_organs |= src src.loc = target if(robotic) status |= ORGAN_ROBOT @@ -342,4 +342,4 @@ I use this so that this can be made better once the organ overhaul rolls out -- O = owner if (!istype(owner)) // You're not the primary organ of ANYTHING, bucko return 0 - return src == O.internal_organs_by_name[organ_tag] + return src == O.get_int_organ(organ_tag) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 708926a2e62..4e6e85292c0 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -71,7 +71,9 @@ if(internal_organs) for(var/obj/item/organ/internal/O in internal_organs) - qdel(O) + internal_organs -= O + O.remove(owner) + //qdel(O) return ..() @@ -95,11 +97,12 @@ if(contents.len) var/obj/item/removing = pick(contents) removing.loc = get_turf(user.loc) - var/obj/item/organ/O = removing + var/obj/item/organ/internal/O = removing if(istype(O)) O.status |= ORGAN_CUT_AWAY - spread_germs_to_organ(O,user) // This wouldn't be any cleaner than the actual surgery - O.removed(user) + if(!O.sterile) + spread_germs_to_organ(O,user) // This wouldn't be any cleaner than the actual surgery + O.remove(src) if(!(user.l_hand && user.r_hand)) user.put_in_hands(removing) user.visible_message("[user] extracts [removing] from [src] with [W]!") @@ -166,7 +169,8 @@ // Damage an internal organ if(internal_organs && internal_organs.len) var/obj/item/organ/internal/I = pick(internal_organs) - I.take_damage(brute / 2) + if(!I.tough)//mostly for cybernetic organs + I.take_damage(brute / 2) brute -= brute / 2 if(status & ORGAN_BROKEN && prob(40) && brute) diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm index dd10ec7920b..96de3ea89ac 100644 --- a/code/modules/surgery/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/internal/eyes/eyes = owner.get_int_organ("eyes")//owner.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = owner.get_int_organ(/obj/item/organ/internal/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/internal/eyes/eyes = owner.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/eyes = owner.get_int_organ(/obj/item/organ/internal/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 index 65543c4d739..6678c37033d 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -9,6 +9,8 @@ var/slot vital = 0 var/organ_action_name = null + var/sterile = 0 //can the organ be infected by germs? + var/tough = 0 //can organ be easily damaged? /obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0) if(!iscarbon(M) || owner == M) @@ -19,7 +21,9 @@ replaced.remove(M, special = 1) owner = M + M.internal_organs |= src + //M.internal_organs_by_name[src] |= src(H,1) loc = null if(organ_action_name) action_button_name = organ_action_name @@ -29,6 +33,7 @@ owner = null if(M) M.internal_organs -= src + //M.internal_organs_by_name[src] -= src if(vital && !special) M.death() @@ -192,6 +197,16 @@ 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) + var/mob/living/carbon/human/eyes = M + eyes.r_eyes = eye_colour[1] + eyes.g_eyes = eye_colour[2] + eyes.b_eyes = eye_colour[3] + eyes.update_eyes() + ..() + /obj/item/organ/internal/eyes/surgeryize() if(!owner) return @@ -200,6 +215,7 @@ owner.eye_blurry = 0 owner.eye_blind = 0 + /obj/item/organ/internal/liver name = "liver" icon_state = "liver" @@ -282,7 +298,7 @@ name = "inflamed appendix" ..() */ - +//shadowling 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." @@ -305,10 +321,34 @@ if(isturf(loc)) var/turf/T = loc var/light_count = T.get_lumcount() + world << "[light_count]" 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 + qdel(src) + +//debug and adminbus.... + +/obj/item/organ/internal/honktumor + name = "banana tumor" + desc = "A tiny yellow mass shaped like..a banana?" + icon_state = "honktumor" + origin_tech = "biotech=1" + w_class = 1 + parent_organ = "head" + slot = "brain_tumor" + health = 3 + +/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0) + + M.mutations.Add(CLUMSY) + M.dna.SetSEState(COMICBLOCK,1,1) + //genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED) + +/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0) + M.mutations.Remove(CLUMSY) + M.mutations.Remove(COMICBLOCK) + //genemutcheck(H,COMICBLOCK,null,MUTCHK_FORCED) \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 91ef793f92d..511ea19b000 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -88,7 +88,7 @@ ..() // Used for an MMI or posibrain being installed into a human. -/obj/item/organ/internal/mmi_holder +/obj/item/organ/internal/brain/mmi_holder name = "brain" organ_tag = "brain" parent_organ = "chest" @@ -97,7 +97,7 @@ slot = "brain" var/obj/item/device/mmi/stored_mmi -/obj/item/organ/internal/mmi_holder/proc/update_from_mmi() +/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi() if(!stored_mmi) return name = stored_mmi.name @@ -105,7 +105,7 @@ icon = stored_mmi.icon icon_state = stored_mmi.icon_state -/obj/item/organ/internal/mmi_holder/remove(var/mob/living/user) +/obj/item/organ/internal/brain/mmi_holder/remove(var/mob/living/user) if(stored_mmi) stored_mmi.loc = get_turf(src) if(owner.mind) @@ -117,7 +117,7 @@ holder_mob.unEquip(src) qdel(src) -/obj/item/organ/internal/mmi_holder/New() +/obj/item/organ/internal/brain/mmi_holder/New() ..() // This is very ghetto way of rebooting an IPC. TODO better way. spawn(1) @@ -125,7 +125,7 @@ owner.stat = CONSCIOUS owner.visible_message("\The [owner] twitches visibly!") -/obj/item/organ/internal/mmi_holder/posibrain/New() +/obj/item/organ/internal/brain/mmi_holder/posibrain/New() robotize() stored_mmi = new /obj/item/device/mmi/posibrain(src) ..() diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index a2f7daf573c..4cbad16a7f3 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -2,6 +2,8 @@ origin_tech = "biotech=5" icon_state = "xgibmid2" var/list/alien_powers = list() + tough = 1 + sterile = 1 /obj/item/organ/internal/xenos/New() for(var/A in alien_powers) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index dd33dbb40fc..7cfd46aa6a5 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -163,7 +163,8 @@ for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0) if(I.robotic < 2) - spread_germs_to_organ(I, user) + if(!I.sterile) + spread_germs_to_organ(I, user) user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) @@ -370,13 +371,13 @@ if(O.organ_tag == "limb") return 0 - else if(target.species.has_organ[O.organ_tag]) + else if(target.species.has_organ[O.organ_tag])//need to change this around for cybernetic implants if(O.damage > (O.max_damage * 0.75)) user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." return 2 - if(!target.internal_organs_by_name[O.organ_tag]) + if(!target.get_int_organ(O)) organ_missing = 1 else user << "\red \The [target] already has [o_a][O.organ_tag]." diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index c18f5eafb34..b1e2d8323be 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -319,7 +319,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/internal/I = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/internal/I = target.get_int_organ(target.op_stage.current_organ) if(I && istype(I)) I.status |= ORGAN_CUT_AWAY @@ -369,7 +369,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/internal/I = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/internal/I = target.get_int_organ(target.op_stage.current_organ) if(I && istype(I)) I.status &= ~ORGAN_CUT_AWAY @@ -414,7 +414,7 @@ user << "You're pretty sure [target.species.name_plural] don't normally have a brain." return 2 - if(!isnull(target.internal_organs["brain"])) + if(target.get_int_organ(/obj/item/organ/internal/brain/)) user << "Your subject already has a brain." return 2 @@ -432,11 +432,11 @@ "\blue You have installed \the [tool] into [target]'s [affected.name].") var/obj/item/device/mmi/M = tool - var/obj/item/organ/internal/mmi_holder/holder = new(target, 1) + var/obj/item/organ/internal/brain/mmi_holder/holder = new() if (istype(M, /obj/item/device/mmi/posibrain)) holder.robotize() - target.internal_organs_by_name["brain"] = holder + holder.insert(target) user.unEquip(tool) tool.forceMove(holder) holder.stored_mmi = tool diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index e71df599342..9fd30f31992 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -68,7 +68,7 @@ /proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user) if(!istype(user) || !istype(E)) return - + //world << "Germ spread: [E] : [E.owner]" var/germ_level = user.germ_level if(user.gloves) germ_level = user.gloves.germ_level diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 4955d200252..86fe433594c 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/internal/brain/B = H.internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/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/internal/brain/B = H.internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/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/internal/brain/B = H.internal_organs_by_name["brain"] + var/obj/item/organ/internal/brain/B = H.get_int_organ(/obj/item/organ/internal/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/internal/eyes/E = mob.internal_organs_by_name["eyes"] + var/obj/item/organ/internal/eyes/E = mob.get_int_organ(/obj/item/organ/internal/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 619678fd650..6677e3bcdf7 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ