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"