mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-09 23:21:02 +01:00
Merge pull request #175 from Alphas00/master
Web Weaver Webs, Genital Feeding, Genital Nutriment, Milk nutriment
This commit is contained in:
@@ -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("<span class='danger'>[user] nibbles [target]!</span>","<span class='userdanger'>[user] nibbles you!</span>")
|
||||
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("<span class='danger'>[user] pumps some venom in [target]!</span>","<span class='userdanger'>[user] pumps some venom in you!</span>")
|
||||
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
|
||||
|
||||
@@ -5,15 +5,20 @@
|
||||
gain_text = "<span class='notice'>You find yourself able to weave webs.</span>"
|
||||
lose_text = "<span class='notice'>You are no longer able to weave webs.</span>"
|
||||
category = CATEGORY_SEXUAL
|
||||
mob_trait = TRAIT_WEB_WEAVER
|
||||
///What action is linked with this quirk?
|
||||
var/datum/action/innate/wrap_target/linked_action
|
||||
var/datum/action/innate/wrap_target/linked_action1
|
||||
var/datum/action/innate/make_web/linked_action2
|
||||
|
||||
/datum/quirk/web_weaving/post_add()
|
||||
linked_action = new
|
||||
linked_action.Grant(quirk_holder)
|
||||
linked_action1 = new
|
||||
linked_action1.Grant(quirk_holder)
|
||||
linked_action2 = new
|
||||
linked_action2.Grant(quirk_holder)
|
||||
|
||||
/datum/quirk/web_weaving/remove()
|
||||
linked_action.Remove(quirk_holder)
|
||||
linked_action1.Remove(quirk_holder)
|
||||
linked_action2.Remove(quirk_holder)
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/wrap_target
|
||||
@@ -83,3 +88,20 @@
|
||||
|
||||
/obj/structure/spider/cocoon/quirk
|
||||
max_integrity = 20
|
||||
|
||||
/datum/action/innate/make_web
|
||||
name = "weave"
|
||||
desc = "spins a sticky web."
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "stickyweb1"
|
||||
background_icon_state = "bg_alien"
|
||||
|
||||
/datum/action/innate/make_web/Activate()
|
||||
var/turf/T = get_turf(owner)
|
||||
owner.visible_message("<span class='warning'>[owner] begins spinning a web!</span>", "<span class='warning'>You begin spinning a web.</span>")
|
||||
if(!do_after(owner, 10 SECONDS, 1, null, 1))
|
||||
owner.visible_message("<span class='warning'>[owner] fails to spin a web!</span>", "<span class='warning'>You fail to spin web.</span>")
|
||||
return FALSE
|
||||
T.ChangeTurf(/obj/structure/spider/stickyweb)
|
||||
owner.visible_message("<span class='warning'>[owner] spin a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -203,6 +203,7 @@
|
||||
#define TRAIT_LIPOLICIDE_TOLERANCE "lipolicide_tolerance"
|
||||
#define TRAIT_WEAKLEGS "weak_legs"
|
||||
#define TRAIT_STRONGLEGS "strong_legs"
|
||||
#define TRAIT_WEB_WEAVER "web_weaving"
|
||||
|
||||
//Hyper
|
||||
#define TRAIT_MACROPHILE "macrophile" //likes the big
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
|
||||
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
||||
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk")
|
||||
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk", "Nutriment")
|
||||
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
|
||||
for(var/K in GLOB.breasts_shapes_list)
|
||||
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
. = ..()
|
||||
|
||||
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider) || HAS_TRAIT(mover, TRAIT_WEB_WEAVER))
|
||||
return TRUE
|
||||
else if(isliving(mover))
|
||||
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/poison/giant_spider))
|
||||
|
||||
@@ -893,6 +893,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Femcum</a>"
|
||||
if(/datum/reagent/consumable/alienhoney)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Honey</a>"
|
||||
if(/datum/reagent/consumable/nutriment)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Nutriment</a>"
|
||||
else
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Nothing?</a>"
|
||||
//This else is a safeguard for errors, and if it happened, they wouldn't be able to change this pref,
|
||||
@@ -940,6 +942,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Honey</a>"
|
||||
if(/datum/reagent/consumable/pinkmilk)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Strawberry Milk</a>"
|
||||
if(/datum/reagent/consumable/nutriment)
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Nutriment</a>"
|
||||
else
|
||||
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Nothing?</a>"
|
||||
//This else is a safeguard for errors, and if it happened, they wouldn't be able to change this pref,
|
||||
@@ -2381,6 +2385,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["balls_fluid"] = /datum/reagent/consumable/alienhoney
|
||||
if("Strawberry Milk")
|
||||
features["balls_fluid"] = /datum/reagent/consumable/pinkmilk
|
||||
if("Nutriment")
|
||||
features["balls_fluid"] = /datum/reagent/consumable/nutriment
|
||||
|
||||
if("egg_size")
|
||||
var/new_size
|
||||
@@ -2426,6 +2432,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["breasts_fluid"] = /datum/reagent/consumable/alienhoney
|
||||
if("Strawberry Milk")
|
||||
features["breasts_fluid"] = /datum/reagent/consumable/pinkmilk
|
||||
if("Nutriment")
|
||||
features["breasts_fluid"] = /datum/reagent/consumable/nutriment
|
||||
|
||||
if("breasts_color")
|
||||
var/new_breasts_color = input(user, "Breast Color:", "Character Preference", "#"+features["breasts_color"]) as color|null
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -34,9 +34,19 @@
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
|
||||
dat += "(Kiss a partner, or object.)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];feed=1'>Feed [user.pulling]</A>"
|
||||
dat += "(Feed a partner.)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];feedfrom=1'>Feed from [user.pulling]</A>"
|
||||
dat += "(Feed a partner.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Kiss</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<span class='linkOff'>Feed others</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<span class='linkOff'>Feed from others</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];feedyourself=1'>Feed yourself</A>"
|
||||
dat += "(Feed yourself with your own genitals)<BR>"
|
||||
|
||||
var/obj/item/organ/genital/belly/Belly = user.getorganslot("belly")
|
||||
if(Belly)
|
||||
@@ -202,6 +212,24 @@
|
||||
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
|
||||
return
|
||||
|
||||
if(href_list["feed"])
|
||||
if(usr.pulling)
|
||||
feed()
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
|
||||
return
|
||||
|
||||
if(href_list["feedfrom"])
|
||||
if(usr.pulling)
|
||||
feedfrom()
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
|
||||
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)
|
||||
@@ -282,6 +310,30 @@ obj/screen/arousal/proc/kiss()
|
||||
if (H)
|
||||
H.kisstarget(H.pulling)
|
||||
|
||||
obj/screen/arousal/proc/feed()
|
||||
if(usr.restrained(TRUE))
|
||||
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if (H)
|
||||
H.genitalfeed(H.pulling)
|
||||
|
||||
obj/screen/arousal/proc/feedfrom()
|
||||
if(usr.restrained(TRUE))
|
||||
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
|
||||
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, "<span class='warning'>You can't do that while restrained!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if (H)
|
||||
H.genitalfeedyourself()
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/menuremovecondom()
|
||||
|
||||
@@ -517,3 +569,136 @@ obj/screen/arousal/proc/kiss()
|
||||
if(cum_splatter_icon)
|
||||
cut_overlay(cum_splatter_icon)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/genitalfeed(mob/living/L, mb_time = 30)
|
||||
if(isliving(L)) //is your target living? Living people can resist your advances if they want to via moving.
|
||||
if(iscarbon(L))
|
||||
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, "<span class='warning'>You cannot feed someone when there is a condom over your [picked_organ.name].</span>")
|
||||
return
|
||||
if(P.sounding) //if the penis is sounded
|
||||
to_chat(src, "<span class='warning'>You cannot feed someone when there is a rod inside your [picked_organ.name].</span>")
|
||||
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, "<span class='warning'>Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
|
||||
return
|
||||
fluid_source = picked_organ.linked_organ.reagents
|
||||
total_fluids = fluid_source.total_volume
|
||||
|
||||
src.visible_message("<span class='love'>[src] starts to feed [L.name] with their [picked_organ.name].</span>", \
|
||||
"<span class='userlove'>You feed [L.name] with your [picked_organ.name].</span>")
|
||||
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
||||
fluid_source.trans_to(L, total_fluids)
|
||||
src.visible_message("<span class='love'>[src] uses [p_their()] [picked_organ.name] to feed [L.name]!</span>", \
|
||||
"<span class='userlove'>You used your [picked_organ.name] to feed [L.name] a total of [total_fluids]u's.</span>")
|
||||
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, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
|
||||
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, "<span class='warning'>You cannot feed from [picked_organ.name] when there is a condom over it.</span>")
|
||||
return
|
||||
if(P.sounding) //if the penis is sounded
|
||||
to_chat(src, "<span class='warning'>You cannot feed from [picked_organ.name] when there is a rod inside it.</span>")
|
||||
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, "<span class='warning'>The [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
|
||||
return
|
||||
fluid_source = picked_organ.linked_organ.reagents
|
||||
total_fluids = fluid_source.total_volume
|
||||
|
||||
src.visible_message("<span class='love'>[src] starts to feed from [L.name]'s [picked_organ.name].</span>", \
|
||||
"<span class='userlove'>You feed from [L.name]'s '[picked_organ.name].</span>")
|
||||
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
||||
fluid_source.trans_to(src, total_fluids)
|
||||
src.visible_message("<span class='love'>[src] feeds from [L.name]'s [picked_organ.name]!</span>", \
|
||||
"<span class='userlove'>You used [L.name]'s [picked_organ.name] to feed with a total of [total_fluids]u's.</span>")
|
||||
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, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
|
||||
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, "<span class='warning'>You cannot feed yourself when there is a condom over your [picked_organ.name].</span>")
|
||||
return
|
||||
if(P.sounding) //if the penis is sounded
|
||||
to_chat(src, "<span class='warning'>You cannot feed yourself when there is a rod inside your [picked_organ.name].</span>")
|
||||
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, "<span class='warning'>Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
|
||||
return
|
||||
fluid_source = picked_organ.linked_organ.reagents
|
||||
total_fluids = fluid_source.total_volume
|
||||
|
||||
src.visible_message("<span class='love'>[src] starts to feed themselves with their [picked_organ.name].</span>", \
|
||||
"<span class='userlove'>You feed yourself with your [picked_organ.name].</span>")
|
||||
if(do_after(src, mb_time))
|
||||
fluid_source.trans_to(src, total_fluids)
|
||||
src.visible_message("<span class='love'>[src] uses [p_their()] [picked_organ.name] to feed themselves!</span>", \
|
||||
"<span class='userlove'>You used your [picked_organ.name] to feed yourself a total of [total_fluids]u's.</span>")
|
||||
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, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user