diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 33fa4ebc..7de000c2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -715,6 +715,8 @@ if(creamed) //clean both to prevent a rare bug cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) + cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal")) + cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) creamed = FALSE //Turns a mob black, flashes a skeleton overlay diff --git a/hyperstation/icons/effects/cumoverlay.dmi b/hyperstation/icons/effects/cumoverlay.dmi new file mode 100644 index 00000000..542ce503 Binary files /dev/null and b/hyperstation/icons/effects/cumoverlay.dmi differ diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 8ab3c58a..db9f4c91 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -321,7 +321,7 @@ setArousalLoss(min_arousal) -/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE, mb_time = 30) //Used for climaxing with any living thing +/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE, mb_time = 30) //Used for climaxing with any living thing var/total_fluids = 0 var/datum/reagents/fluid_source = null @@ -331,13 +331,37 @@ if(!G.linked_organ) to_chat(src, "Your [G.name] is unable to produce it's own fluids, it's missing the organs for it.") return - fluid_source = G.linked_organ.reagents + fluid_source = G.linked_organ.reagents total_fluids = fluid_source.total_volume + if(mb_time) //Skip warning if this is an instant climax. src.visible_message("[src] is about to climax with [L]!", \ "You're about to climax with [L]!", \ "You're preparing to climax with someone!") - if(spillage) + + if(cover)//covering the partner in cum, this overrides other options. + if(do_after(src, mb_time, target = src) && in_range(src, L)) + fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) + total_fluids -= total_fluids*G.fluid_transfer_factor + if(B.total_fluids > 80) // now thats a big cum! + var/mutable_appearance/cumoverlaylarge = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlaylarge.icon_state = "cum_large" + L.add_overlay(cumoverlaylarge) + if(total_fluids > 5) + fluid_source.reaction(L.loc, TOUCH, 1, 0) + fluid_source.clear_reagents() + src.visible_message("[src] climaxes over [L][cover ? ", coating them":""], using [p_their()] [G.name]!", \ + "You orgasm over [L][cover ? ", drenching them":""], using your [G.name].", \ + "You have climaxed over someone[cover ? ", coating them":""], using your [G.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + var/mob/living/carbon/human/H = L + var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi') + cumoverlay.icon_state = "cum_normal" + L.add_overlay(cumoverlay) + if(G.can_climax) + setArousalLoss(min_arousal) + + if(spillage && !cover) if(do_after(src, mb_time, target = src) && in_range(src, L)) fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor) total_fluids -= total_fluids*G.fluid_transfer_factor @@ -354,17 +378,18 @@ setArousalLoss(min_arousal) else //knots and other non-spilling orgasms - if(do_after(src, mb_time, target = src) && in_range(src, L)) - fluid_source.trans_to(L, total_fluids) - total_fluids = 0 - src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ - "You ejaculate with [L], your [G.name] spilling nothing.", \ - "You have climaxed inside someone, your [G.name] spilling nothing.") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + if(!cover) + if(do_after(src, mb_time, target = src) && in_range(src, L)) + fluid_source.trans_to(L, total_fluids) + total_fluids = 0 + src.visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \ + "You ejaculate with [L], your [G.name] spilling nothing.", \ + "You have climaxed inside someone, your [G.name] spilling nothing.") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) - if(G.can_climax) - setArousalLoss(min_arousal) + if(G.can_climax) + setArousalLoss(min_arousal) //Hyper - antag code if(src.mind.special_role == ROLE_LEWD_TRAITOR) @@ -381,7 +406,7 @@ to_chat(L, "You feel your hormones change, and a motherly instinct take over.") //leting them know magic has happened. W.pregnant = 1 - var/obj/item/organ/genital/breasts/B = L.getorganslot("womb") + var/obj/item/organ/genital/breasts/B = L.getorganslot("breasts") if (B.fluid_mult < 0.5 && B) //pregnancy causes mammals to produce milk faster. no point setting their fluid, lower if they are already higher. B.fluid_mult = 0.5 @@ -550,7 +575,7 @@ return //Ok, now we check what they want to do. - var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container", "Remove condom", "Remove sounding rod") + var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner","Climax over partner", "Fill container", "Remove condom", "Remove sounding rod") switch(choice) if("Remove sounding rod") @@ -650,23 +675,23 @@ if(impreg == "Yes") //If we are impregging var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") if(spillage == "Yes") - mob_climax_partner(picked_organ, partner, TRUE, TRUE) + mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE) else - mob_climax_partner(picked_organ, partner, FALSE, TRUE) + mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE) else var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") if(spillage == "Yes") - mob_climax_partner(picked_organ, partner, TRUE, FALSE) + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) else - mob_climax_partner(picked_organ, partner, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) //Wow, im trash at coding, I need to find a better way of coding this, ill rewrite it later.-quote return else //If we arent impregging var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No") if(spillage == "Yes") - mob_climax_partner(picked_organ, partner, TRUE, FALSE) + mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE) else - mob_climax_partner(picked_organ, partner, FALSE, FALSE) + mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE) return else @@ -675,6 +700,15 @@ else //They either lack organs that can masturbate, or they didn't pick one. to_chat(src, "You cannot climax without choosing genitals.") return + if("Climax over partner") + var/obj/item/organ/genital/picked_organ + picked_organ = pick_climax_genitals() + if(picked_organ) + var/mob/living/partner = pick_partner() //Get someone + if(partner) + mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE) + else + to_chat(src, "You cannot do this alone.") if("Fill container") //We'll need hands and no restraints.