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