From 0f61e09deb16e430b8b8165041e50b42f293359e Mon Sep 17 00:00:00 2001 From: Alphas00 <154434082+Alphas00@users.noreply.github.com> Date: Wed, 1 May 2024 11:56:05 +0200 Subject: [PATCH] Arousal menu options, Nibble buff, milk nutriment Added options in the arousal menu to feed yourself using your own organs or that of others you are pulling The Nibble now pumps venom over time if used against character you are pulling Milk now has a nutriment factor --- .../code/datums/mutations/fatfang.dm | 18 ++- .../chemistry/reagents/drink_reagents.dm | 1 + .../code/modules/arousal/arousalhud.dm | 131 +++++++++++++++++- 3 files changed, 143 insertions(+), 7 deletions(-) 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