diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index c3eef1099e..70f90df8d0 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -47,6 +47,7 @@ // Damage above this value must be repaired with surgery. #define ROBOLIMB_REPAIR_CAP 30 +#define ORGAN_FLESH 0 // Normal organic organs. #define ORGAN_ASSISTED 1 // Like pacemakers, not robotic #define ORGAN_ROBOT 2 // Fully robotic, no organic parts #define ORGAN_LIFELIKE 3 // Robotic, made to appear organic diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 51039af253..8426edcfcf 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -196,6 +196,9 @@ #define O_VOICE "voicebox" #define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE) +// Augments +#define O_AUG_TSHADE "integrated thermolensing implant" + // Non-Standard organs #define O_MOUTH "mouth" #define O_CELL "cell" diff --git a/code/modules/organs/internal/bioaugment.dm b/code/modules/organs/internal/bioaugment.dm new file mode 100644 index 0000000000..52621e74c1 --- /dev/null +++ b/code/modules/organs/internal/bioaugment.dm @@ -0,0 +1,92 @@ +/* + * Augments. This file contains the base, and organic-targeting augments. + */ + +/obj/item/organ/internal/augment + name = "augment" + + icon_state = "cell_bay" + + parent_organ = BP_TORSO + + organ_verbs = list() // Verbs added by the organ when present in the body. + target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted? + forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. + + var/obj/item/integrated_object // Objects held by the organ, used for deployable things. + var/integrated_object_type // Object type the organ will spawn. + +/obj/item/organ/internal/augment/Initialize() + ..() + if(integrated_object_type) + integrated_object = new integrated_object_type(src) + integrated_object.canremove = FALSE + +/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE) + if(removed && integrated_object && integrated_object.loc != src) + if(isliving(integrated_object.loc)) + var/mob/living/L = integrated_object.loc + L.drop_from_inventory(integrated_object) + integrated_object.forceMove(src) + ..(removed) + +// The base organic-targeting augment. + +/obj/item/organ/internal/augment/bioaugment + name = "bioaugmenting implant" + + robotic = ORGAN_ROBOT + target_parent_classes = list(ORGAN_FLESH) + +// Jensen Shades. Your vision can be augmented. + +/obj/item/organ/internal/augment/bioaugment/thermalshades + name = "integrated thermolensing implant" + desc = "A miniscule implant that houses a pair of thermolensed sunglasses. Don't ask how they deploy, you don't want to know." + icon_state = "augment_shades" + dead_icon = "augment_shades_dead" + + w_class = ITEMSIZE_TINY + + organ_tag = O_AUG_TSHADE + + parent_organ = BP_HEAD + + organ_verbs = list(/mob/living/carbon/human/proc/toggle_shades) + + integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades + +/mob/living/carbon/human/proc/toggle_shades() + set name = "Toggle Integrated Thermoshades" + set desc = "Toggle your flash-proof, thermal-integrated sunglasses." + set category = "Augments" + + var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_TSHADE] + + if(glasses) + if(aug && aug.integrated_object == glasses) + drop_from_inventory(glasses) + aug.integrated_object.forceMove(aug) + if(!glasses) + to_chat(src, "Your [aug.integrated_object] retract into your skull.") + else if(!istype(glasses, /obj/item/clothing/glasses/hud/security/jensenshades)) + to_chat(src, "\The [glasses] block your shades from deploying.") + else if(istype(glasses, /obj/item/clothing/glasses/hud/security/jensenshades)) + var/obj/item/G = glasses + if(G.canremove) + to_chat(src, "\The [G] are not your integrated shades.") + else + drop_from_inventory(G) + to_chat(src, "\The [G] retract into your skull.") + qdel(G) + + else + if(aug && aug.integrated_object) + to_chat(src, "Your [aug.integrated_object] deploy.") + equip_to_slot(aug.integrated_object, slot_glasses, 0, 1) + if(!glasses || glasses != aug.integrated_object) + aug.integrated_object.forceMove(aug) + else + var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src)) + equip_to_slot(J, slot_glasses, 1, 1) + to_chat(src, "Your [aug.integrated_object] deploy.") diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c959ab3752..eef80e1750 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -36,7 +36,10 @@ var/list/organ_cache = list() var/list/will_assist_languages = list() var/list/datum/language/assists_languages = list() - var/list/organ_verbs // Verbs added by the organ when present in the body. + // Organ verb vars. + var/list/organ_verbs // Verbs added by the organ when present in the body. + var/list/target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted? + var/forgiving_class = TRUE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. /obj/item/organ/Destroy() @@ -429,12 +432,12 @@ var/list/organ_cache = list() all_organs |= owner.internal_organs for(var/obj/item/organ/O in all_organs) - if(!(O.status & ORGAN_DEAD) && O.organ_verbs) + if(!(O.status & ORGAN_DEAD) && O.organ_verbs && O.check_verb_compatability()) for(var/verb_type in O.organ_verbs) if(verb_type in organ_verbs) save_verbs |= verb_type - if(!removed && organ_verbs) + if(!removed && organ_verbs && check_verb_compatability()) for(var/verb_path in organ_verbs) owner.verbs |= verb_path else if(organ_verbs) @@ -445,3 +448,32 @@ var/list/organ_cache = list() /obj/item/organ/proc/handle_organ_proc_special() // Called when processed. return + +/obj/item/organ/proc/check_verb_compatability() // Used for determining if an organ should give or remove its verbs. I.E., FBP part in a human, no verbs. If true, keep or add. + if(owner) + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + var/obj/item/organ/O = H.get_organ(parent_organ) + if(forgiving_class) + if(O.robotic <= ORGAN_ASSISTED && robotic <= ORGAN_LIFELIKE) // Parent is organic or assisted, we are at most synthetic. + return TRUE + + if(O.robotic >= ORGAN_ROBOT && robotic >= ORGAN_ASSISTED) // Parent is synthetic, and we are biosynthetic at least. + return TRUE + + if(!target_parent_classes || !target_parent_classes.len) // Default checks, if we're not looking for a Specific type. + + if(O.robotic == robotic) // Same thing, we're fine. + return TRUE + + if(O.robotic < ORGAN_ROBOT && robotic < ORGAN_ROBOT) + return TRUE + + if(O.robotic > ORGAN_ASSISTED && robotic > ORGAN_ASSISTED) + return TRUE + + else + if(O.robotic in target_parent_classes) + return TRUE + + return FALSE diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 9fd6f77296..12bededf90 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/polaris.dme b/polaris.dme index 4c4221a50c..ab0c36d0e3 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2173,6 +2173,7 @@ #include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\wound.dm" #include "code\modules\organs\internal\appendix.dm" +#include "code\modules\organs\internal\bioaugment.dm" #include "code\modules\organs\internal\brain.dm" #include "code\modules\organs\internal\eyes.dm" #include "code\modules\organs\internal\heart.dm"