diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index f0b73b21c..fdaf578cd 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -126,6 +126,9 @@ #define MARKINGS 17 #define WINGCOLOR 18 +#define NOMOUTH 19 + + //organ slots #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_APPENDIX "appendix" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index d45280be4..43f7dffb4 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -151,6 +151,7 @@ //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 +#define NUTRITION_LEVEL_ALMOST_FULL 535 #define NUTRITION_LEVEL_WELL_FED 450 #define NUTRITION_LEVEL_FED 350 #define NUTRITION_LEVEL_HUNGRY 250 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 168b31410..c436e5808 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -487,6 +487,9 @@ if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return 1 + if(!has_mouth()) + return 1 + if(nutrition < 100 && !blood) if(message) visible_message("[src] dry heaves!", \ diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 75b199d02..287dd4d29 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -318,15 +318,24 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/mob/living/carbon/human/H = C if(NOGENITALS in H.dna.species.species_traits) H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return. - // EDIT ENDS + if(NOMOUTH in species_traits) + for(var/obj/item/bodypart/head/head in C.bodyparts) + head.mouth = FALSE + + /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) if(C.dna.species.exotic_bloodtype) if(!new_species.exotic_bloodtype) C.dna.blood_type = random_blood_type() else C.dna.blood_type = new_species.exotic_bloodtype + + if(NOMOUTH in species_traits) + for(var/obj/item/bodypart/head/head in C.bodyparts) + head.mouth = TRUE + if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(TRUE) for(var/X in inherent_traits) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 6d93a5e13..150c9db70 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -65,6 +65,12 @@ var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]" to_chat(user, "You have to remove [who] [covered] first!") return 0 + if(!eater.has_mouth()) + if(eater == user) + to_chat(eater, "You have no mouth, and cannot eat.") + else + to_chat(user, "You can't feed [eater], because they have no mouth!") + return 0 return 1 /obj/item/reagent_containers/ex_act() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index a71cc199c..45f791b3c 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -34,6 +34,9 @@ var/lip_color = "white" //If the head is a special sprite var/custom_head + + // if head has mouth; may depend on species + var/mouth = TRUE /obj/item/bodypart/head/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index afa991ca7..a4f2041f0 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -120,6 +120,27 @@ return owner.vomit(stun = FALSE) -/obj/item/organ/stomach/ipc - name = "ipc stomach" + +/obj/item/organ/stomach/synthliz + name = "synthetic lizardperson stomach" icon_state = "stomach-ipc" + +// ipc power cell from oracle +/obj/item/organ/stomach/cell + name = "micro-cell" + icon_state = "microcell" + w_class = WEIGHT_CLASS_NORMAL + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_STOMACH + status = ORGAN_ROBOTIC + attack_verb = list("assault and battery'd") + desc = "A micro-cell, for IPC use only. Do not swallow." + +/obj/item/organ/stomach/cell/emp_act(severity) + switch(severity) + if(1) + owner.nutrition = 50 + to_chat(owner, "Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.") + if(2) + owner.nutrition = 250 + to_chat(owner, "Alert: EMP Detected. Cycling battery.") \ No newline at end of file diff --git a/hyperstation/code/modules/mob/living/carbon/carbon.dm b/hyperstation/code/modules/mob/living/carbon/carbon.dm index ec2f69c1d..3af2e9447 100644 --- a/hyperstation/code/modules/mob/living/carbon/carbon.dm +++ b/hyperstation/code/modules/mob/living/carbon/carbon.dm @@ -13,6 +13,11 @@ /mob/living/carbon/handle_status_effects() ..() handle_pain() + +/mob/living/carbon/has_mouth() + var/obj/item/bodypart/head/head = get_bodypart(BODY_ZONE_HEAD) + if(head && head.mouth) + return TRUE /mob/living/carbon/proc/handle_pain() var/pain_amount = 0 diff --git a/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm b/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm new file mode 100644 index 000000000..b3e22f9ef --- /dev/null +++ b/hyperstation/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -0,0 +1,58 @@ +// APC powercord: oracle port + +/obj/item/apc_powercord + name = "power cord" + desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise." + icon = 'icons/obj/power.dmi' + icon_state = "wire1" + + +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag) + return ..() + user.changeNext_move(CLICK_CD_MELEE) + var/mob/living/carbon/human/H = user + var/obj/item/organ/stomach/cell/battery = H.getorganslot(ORGAN_SLOT_STOMACH) + if(!battery) + to_chat(H, "You try to siphon energy from \the [target], but your power cell is gone!") + return + + if(istype(H) && H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL) + to_chat(user, "You are already fully charged!") + return + + if(istype(target, /obj/machinery/power/apc)) + var/obj/machinery/power/apc/A = target + if(A.cell && A.cell.charge > A.cell.maxcharge*0.25) + powerdraw_loop(A, H) + return + else + to_chat(user, "There is not enough charge to draw from that APC.") + return + + +/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H) + H.visible_message("[H] inserts a power connector into the [A].", "You begin to draw power from the [A].") + while(do_after(H, 10, target = A)) + if(!istype(A)) + return + if(loc != H) + to_chat(H, "You must keep your connector out while charging!") + break + if(A.cell.charge == 0) + to_chat(H, "The [A] doesn't have enough charge to spare.") + break + A.charging = 1 + if(A.cell.charge >= 500) + H.nutrition += 50 + A.cell.charge -= 250 + to_chat(H, "You siphon off some of the stored charge for your own use.") + else + H.nutrition += A.cell.charge/10 + A.cell.charge = 0 + to_chat(H, "You siphon off as much as the [A] can spare.") + break + if(H.nutrition > NUTRITION_LEVEL_WELL_FED) + to_chat(H, "You are now fully charged.") + break + H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") \ No newline at end of file diff --git a/hyperstation/code/modules/mob/mob_helpers.dm b/hyperstation/code/modules/mob/mob_helpers.dm index 00f9c8631..0a47f7b0a 100644 --- a/hyperstation/code/modules/mob/mob_helpers.dm +++ b/hyperstation/code/modules/mob/mob_helpers.dm @@ -27,3 +27,7 @@ mob/proc/checkloadappearance() else to_chat(H, "You either took too long or chose not to change. Alrighty. Remember, you have 90 seconds from spawn to get to a mirror and still do it if you wish.") return + +// oracle port +/mob/proc/has_mouth() + return FALSE \ No newline at end of file diff --git a/hyperstation/code/modules/surgery/organs/augments_arms.dm b/hyperstation/code/modules/surgery/organs/augments_arms.dm index 8430fcac5..933b584eb 100644 --- a/hyperstation/code/modules/surgery/organs/augments_arms.dm +++ b/hyperstation/code/modules/surgery/organs/augments_arms.dm @@ -23,3 +23,11 @@ w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP_ACCURATE attack_verb = list("slashed", "cut") + + +// oracle port +/obj/item/organ/cyberimp/arm/power_cord + name = "power cord implant" + desc = "An internal power cord hooked up to a battery. Useful if you run on volts." + contents = newlist(/obj/item/apc_powercord) + zone = "l_arm" \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index b0e6ab7bf..3cf1c4bc1 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 2aa99b95a..fe0e28949 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -261,7 +261,7 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/ipc + mutantstomach = /obj/item/organ/stomach/synthliz mutanteyes = /obj/item/organ/eyes/ipc exotic_bloodtype = "SY" diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm index f1f7c07a3..684ae707c 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -6,7 +6,7 @@ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL blacklisted = 0 sexes = 0 - species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING) + species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,NOMOUTH) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") @@ -16,8 +16,9 @@ mutant_heart = /obj/item/organ/heart/ipc mutantlungs = /obj/item/organ/lungs/ipc mutantliver = /obj/item/organ/liver/ipc - mutantstomach = /obj/item/organ/stomach/ipc + mutantstomach = /obj/item/organ/stomach/cell mutanteyes = /obj/item/organ/eyes/ipc + mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) // oracle port exotic_bloodtype = "HF"