diff --git a/GainStation13/code/datums/mutations/fatfang.dm b/GainStation13/code/datums/mutations/fatfang.dm
index 16eba2b3..0303b090 100644
--- a/GainStation13/code/datums/mutations/fatfang.dm
+++ b/GainStation13/code/datums/mutations/fatfang.dm
@@ -8,6 +8,7 @@
power = /obj/effect/proc_holder/spell/targeted/touch/fatfang
instability = 10
energy_coeff = 1
+ power_coeff = 1
/obj/effect/proc_holder/spell/targeted/touch/fatfang
name = "The Nibble"
@@ -28,7 +29,8 @@
icon_state = "power_feed"
///How much weight is added?
var/chem_to_add = 5
- ///What verb is used for the spell?
+
+ var/starttime = 0
/obj/item/melee/touch_attack/fatfang/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !iscarbon(target) || target == user)
@@ -36,10 +38,18 @@
if(!target || !chem_to_add)
return FALSE
-
- target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, chem_to_add)
-
target.visible_message("[user] nibbles [target]!","[user] nibbles you!")
+ if(target == user.pulling && ishuman(user.pulling))
+ starttime = world.time
+ user.dna.get_mutation(FATFANG).power.charge_max = 600 * GET_MUTATION_ENERGY(user.dna.get_mutation(FATFANG))
+ while(starttime + 300 > world.time && in_range(user, target))
+ if(do_mob(user, target, 10, 0, 1))
+ target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, (chem_to_add * GET_MUTATION_POWER(user.dna.get_mutation(FATFANG))/2))
+ target.visible_message("[user] pumps some venom in [target]!","[user] pumps some venom in you!")
+ else
+ user.dna.get_mutation(FATFANG).power.charge_max = 50 * GET_MUTATION_ENERGY(user.dna.get_mutation(FATFANG))
+ target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, chem_to_add * GET_MUTATION_POWER(user.dna.get_mutation(FATFANG)))
+
return ..()
/obj/item/dnainjector/antifang
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index de4a4b68..3c506574 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -222,6 +222,7 @@
glass_desc = "White and nutritious goodness!"
pH = 6.5
hydration = 3
+ nutriment_factor = 15 * REAGENTS_METABOLISM
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm
index 801d7c9d..5f43568b 100644
--- a/hyperstation/code/modules/arousal/arousalhud.dm
+++ b/hyperstation/code/modules/arousal/arousalhud.dm
@@ -36,11 +36,17 @@
dat += "(Kiss a partner, or object.)
"
dat += "Feed [user.pulling]"
dat += "(Feed a partner.)
"
+ dat += "Feed from [user.pulling]"
+ dat += "(Feed a partner.)
"
else
dat += "Kiss"
dat += "(Requires a partner)
"
- dat += "Feed"
+ dat += "Feed others"
dat += "(Requires a partner)
"
+ dat += "Feed from others"
+ dat += "(Requires a partner)
"
+ dat += "Feed yourself"
+ dat += "(Feed yourself with your own genitals)
"
var/obj/item/organ/genital/belly/Belly = user.getorganslot("belly")
if(Belly)
@@ -213,6 +219,17 @@
to_chat(usr, "You cannot do this alone!")
return
+ if(href_list["feedfrom"])
+ if(usr.pulling)
+ feedfrom()
+ else
+ to_chat(usr, "You cannot do this alone!")
+ return
+
+ if(href_list["feedyourself"])
+ feedyourself()
+ return
+
if(href_list["shrink_belly"])
var/obj/item/organ/genital/belly/E = usr.getorganslot("belly")
if(E.size > 0)
@@ -301,6 +318,22 @@ obj/screen/arousal/proc/feed()
if (H)
H.genitalfeed(H.pulling)
+obj/screen/arousal/proc/feedfrom()
+ if(usr.restrained(TRUE))
+ to_chat(usr, "You can't do that while restrained!")
+ return
+ var/mob/living/carbon/human/H = usr
+ if (H)
+ H.genitalfeedfrom(H.pulling)
+
+obj/screen/arousal/proc/feedyourself()
+ if(usr.restrained(TRUE))
+ to_chat(usr, "You can't do that while restrained!")
+ return
+ var/mob/living/carbon/human/H = usr
+ if (H)
+ H.genitalfeedyourself()
+
/mob/living/carbon/human/proc/menuremovecondom()
@@ -550,10 +583,10 @@ obj/screen/arousal/proc/feed()
if(picked_organ.name == "penis")//if the select organ is a penis
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom) //if the penis is condomed
- to_chat(src, "You cannot fill containers when there is a condom over your [picked_organ.name].")
+ to_chat(src, "You cannot feed someone when there is a condom over your [picked_organ.name].")
return
if(P.sounding) //if the penis is sounded
- to_chat(src, "You cannot fill containers when there is a rod inside your [picked_organ.name].")
+ to_chat(src, "You cannot feed someone when there is a rod inside your [picked_organ.name].")
return
if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
fluid_source = picked_organ.reagents
@@ -577,3 +610,95 @@ obj/screen/arousal/proc/feed()
else //They either lack organs that can climax, or they didn't pick one.
to_chat(src, "You cannot fill anything without choosing exposed genitals.")
return
+
+/mob/living/carbon/human/proc/genitalfeedfrom(mob/living/target, mb_time = 30)
+ var/mob/living/carbon/human/L = target
+ var/obj/item/organ/genital/picked_organ
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+ src << browse(null, "window=arousal")
+
+ var/list/genitals_list = list()
+ var/list/worn_stuff = L.get_equipped_items()
+
+ for(var/obj/item/organ/genital/G in L.internal_organs)
+ if(G.can_climax) //filter out what you can't masturbate with
+ if(G.is_exposed(worn_stuff)) //Nude or through_clothing
+ if(!G.dontlist)
+ genitals_list += G
+ if(genitals_list.len)
+ picked_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list
+ else
+ return
+
+ if(picked_organ)
+ //Good, got an organ, time to pick a container
+ if(picked_organ.name == "penis")//if the select organ is a penis
+ var/obj/item/organ/genital/penis/P = L.getorganslot("penis")
+ if(P.condom) //if the penis is condomed
+ to_chat(src, "You cannot feed from [picked_organ.name] when there is a condom over it.")
+ return
+ if(P.sounding) //if the penis is sounded
+ to_chat(src, "You cannot feed from [picked_organ.name] when there is a rod inside it.")
+ return
+ if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = picked_organ.reagents
+ else
+ if(!picked_organ.linked_organ)
+ to_chat(src, "The [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.")
+ return
+ fluid_source = picked_organ.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+
+ src.visible_message("[src] starts to feed from [L.name]'s [picked_organ.name].", \
+ "You feed from [L.name]'s '[picked_organ.name].")
+ if(do_after(src, mb_time, target = src) && in_range(src, L))
+ fluid_source.trans_to(src, total_fluids)
+ src.visible_message("[src] feeds from [L.name]'s [picked_organ.name]!", \
+ "You used [L.name]'s [picked_organ.name] to feed with a total of [total_fluids]u's.")
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
+ if(picked_organ.can_climax)
+ L.setArousalLoss(min_arousal)
+
+ else //They either lack organs that can climax, or they didn't pick one.
+ to_chat(src, "You cannot fill anything without choosing exposed genitals.")
+ return
+
+/mob/living/carbon/human/proc/genitalfeedyourself(mb_time = 30)
+ var/obj/item/organ/genital/picked_organ
+ var/total_fluids = 0
+ var/datum/reagents/fluid_source = null
+ src << browse(null, "window=arousal")
+ picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
+ if(picked_organ)
+ //Good, got an organ, time to pick a container
+ if(picked_organ.name == "penis")//if the select organ is a penis
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.condom) //if the penis is condomed
+ to_chat(src, "You cannot feed yourself when there is a condom over your [picked_organ.name].")
+ return
+ if(P.sounding) //if the penis is sounded
+ to_chat(src, "You cannot feed yourself when there is a rod inside your [picked_organ.name].")
+ return
+ if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
+ fluid_source = picked_organ.reagents
+ else
+ if(!picked_organ.linked_organ)
+ to_chat(src, "Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.")
+ return
+ fluid_source = picked_organ.linked_organ.reagents
+ total_fluids = fluid_source.total_volume
+
+ src.visible_message("[src] starts to feed themselves with their [picked_organ.name].", \
+ "You feed yourself with your [picked_organ.name].")
+ if(do_after(src, mb_time))
+ fluid_source.trans_to(src, total_fluids)
+ src.visible_message("[src] uses [p_their()] [picked_organ.name] to feed themselves!", \
+ "You used your [picked_organ.name] to feed yourself a total of [total_fluids]u's.")
+ SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
+ if(picked_organ.can_climax)
+ setArousalLoss(min_arousal)
+
+ else //They either lack organs that can climax, or they didn't pick one.
+ to_chat(src, "You cannot fill anything without choosing exposed genitals.")
+ return