From ccad1678ea9d1b12abd97c6aa3f5e0a628db0127 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 04:20:41 +0100 Subject: [PATCH] New gential; Anus Ass cheeks next. and works with fleshlights and vibrators. --- _maps/_basemap.dm | 2 +- code/__HELPERS/mobs.dm | 1 + code/modules/client/preferences.dm | 9 ++ code/modules/client/preferences_savefile.dm | 6 +- .../code/modules/arousal/arousalhud.dm | 5 +- hyperstation/code/obj/fleshlight.dm | 85 ++++++++++-------- hyperstation/code/obj/vibrator.dm | 6 +- hyperstation/icons/obj/fleshlight.dmi | Bin 4186 -> 4369 bytes hyperstation/icons/obj/genitals/butt.dmi | Bin 0 -> 182 bytes .../code/modules/arousal/arousal.dm | 9 +- .../code/modules/arousal/organs/anus.dm | 25 ++++++ .../code/modules/arousal/organs/genitals.dm | 17 ++++ .../modules/client/preferences_savefile.dm | 2 + tgstation.dme | 1 + 14 files changed, 115 insertions(+), 53 deletions(-) create mode 100644 hyperstation/icons/obj/genitals/butt.dmi create mode 100644 modular_citadel/code/modules/arousal/organs/anus.dm diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 06d39087..34c6dc44 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ce17243b..5f6d0248 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -192,6 +192,7 @@ "inflatable_belly" = FALSE, "belly_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, + "has_anus" = FALSE, "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_amount" = 2, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ab40a77c..9bc42104 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -142,6 +142,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "hide_belly" = FALSE, "inflatable_belly" = FALSE, "belly_color" = "fff", + "has_anus" = FALSE, "has_balls" = FALSE, "balls_internal" = FALSE, "balls_color" = "fff", @@ -920,6 +921,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Inflation (Climax With):[features["inflatable_belly"] == 1 ? "Yes" : "No"]" dat += "" + + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

Anus

" + dat += "[features["has_anus"] == TRUE ? "Yes" : "No"]" + dat += "" + dat += "" dat += "" @@ -2502,6 +2509,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["has_vag"] == FALSE) features["has_womb"] = FALSE features["can_get_preg"] = FALSE + if("has_anus") + features["has_anus"] = !features["has_anus"] if("has_womb") features["has_womb"] = !features["has_womb"] if("can_get_preg") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ebd93b81..32c0f9e3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 23 +#define SAVEFILE_VERSION_MAX 24 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -423,11 +423,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //womb features S["feature_has_womb"] >> features["has_womb"] S["feature_can_get_preg"] >> features["can_get_preg"] //hyperstation 13 - //balls features + //belly features S["feature_has_belly"] >> features["has_belly"] S["feature_belly_color"] >> features["belly_color"] S["feature_hide_belly"] >> features["hide_belly"] S["feature_inflatable_belly"] >> features["inflatable_belly"] + //anus features + S["feature_has_anus"] >> features["has_anus"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 92850f06..8f5b61f5 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -9,8 +9,9 @@ var/mob/living/carbon/U = user for(var/obj/item/organ/genital/G in U.internal_organs) - if(!G.dontlist) - dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" + if(!G.nochange) + if(!G.dontlist) + dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" dat += {"
Contexual Options

"} var/obj/item/organ/genital/penis/P = user.getorganslot("penis") diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 19aff71e..0befcc44 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -100,7 +100,7 @@ /obj/item/portallight/examine(mob/user) . = ..() if(!portalunderwear) - . += "The device is unpaired, to pair, swipe against a pair of portal panties(TM). " + . += "The device is unpaired, to pair, swipe against a pair of portal panties. " else . += "The device is paired, and awaiting input. " @@ -117,12 +117,12 @@ else option = "Fuck" - var/obj/item/organ/genital/vagina/V - if(istype(portalunderwear.loc, /obj/item/organ/genital/vagina)) //Sanity check. Without this it will runtime. - V = portalunderwear.loc - if(!V) + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime error. + G = portalunderwear.loc + if(!G) return - var/mob/living/carbon/human/M = V.owner + var/mob/living/carbon/human/M = G.owner if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis! to_chat(user, "You don't see anywhere to use this on.") @@ -156,7 +156,7 @@ M.emote("moan") if(option == "Fuck")// normal fuck - to_chat(M, "You feel a [P.shape] shaped penis pumping through the portal into your vagina.")//message your partner and kinky! + to_chat(M, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [G.name].")//message your partner, and kinky! if(prob(30)) //30% chance to make them moan. C.emote("moan") if(prob(30)) //30% chance to make your partner moan. @@ -166,10 +166,10 @@ M.do_jitter_animation() //make your partner shake too! if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ - if(V.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill - M.mob_climax_outside(V, spillage = TRUE) + if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill + M.mob_climax_outside(G, spillage = TRUE) else - M.mob_climax_outside(V, spillage = FALSE) + M.mob_climax_outside(G, spillage = FALSE) if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) var/mob/living/carbon/human/O = C @@ -180,10 +180,10 @@ O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) //climax with their partner remotely, and impreg because people keep asking! if(option == "Lick") - to_chat(M, "You feel a tongue lick you through the portal against your vagina.") + to_chat(M, "You feel a tongue lick you through the portal against your [G.name].") M.adjustArousalLoss(10) if(option == "Touch") - to_chat(M, "You feel someone touching your vagina through the portal.") + to_chat(M, "You feel someone touching your [G.name] through the portal.") M.adjustArousalLoss(5) return @@ -193,13 +193,14 @@ //get their looks and vagina colour! cut_overlays()//remove current overlays - var/obj/item/organ/genital/vagina/V - if(istype(portalunderwear.loc, /obj/item/organ/genital/vagina)) //Sanity check. Without this it will runtime. - V = portalunderwear.loc - if(!V) + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime. + G = portalunderwear.loc + if(!G) useable = FALSE return - var/mob/living/carbon/human/H = V.owner + + var/mob/living/carbon/human/H = G.owner if(H) //if the portal panties are on someone. sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal") @@ -215,8 +216,12 @@ sleeve.color = "#" + H.dna.features["mcolor"] add_overlay(sleeve) - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") - organ.color = portalunderwear.loc.color + if(G.name == "vagina") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") + organ.color = portalunderwear.loc.color + if(G.name == "anus") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") + organ.color = "#" + H.dna.features["mcolor"] useable = TRUE add_overlay(organ) @@ -224,7 +229,7 @@ useable = FALSE //Hyperstation 13 portal underwear -//can be attached to vagina, just like the vibrator, still requires pairing with the portallight +//can be attached to vagina or anus, just like the vibrator, still requires pairing with the portallight /obj/item/portalpanties name = "portal panties" @@ -235,6 +240,7 @@ w_class = WEIGHT_CLASS_SMALL var/obj/item/portallight var/attached = FALSE + var/shapetype = "vagina" /obj/item/portalpanties/examine(mob/user) . = ..() @@ -267,33 +273,34 @@ var/obj/item/organ/genital/picked_organ var/mob/living/carbon/human/S = user var/mob/living/carbon/human/T = C - picked_organ = S.target_genitals(T) //allowing to pick organ for anus down the line + picked_organ = S.target_genitals(T) if(picked_organ) C.visible_message("[user] is trying to attach [src] to [T]!",\ "[user] is trying to put [src] on you!") - if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply. + if(!do_mob(user, C, 3 SECONDS))//warn them and have a delay of 5 seconds to apply. return - if(!(picked_organ.name == "vagina")) //only fits on a vagina - to_chat(user, "[src] can only be attached to a vagina.") - return + if((picked_organ.name == "vagina")||(picked_organ.name == "anus")) //only fits on a vagina or anus - if(!picked_organ.equipment) - to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") + src.shapetype = picked_organ.name + if(!picked_organ.equipment) + to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") + else + to_chat(user, "They already have [picked_organ.equipment.name] there.") + return + + if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in + return + src.attached = TRUE + picked_organ.equipment = src + + var/obj/item/portallight/P = portallight + //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. + if(P) //just to make sure + P.updatesleeve() else - to_chat(user, "They already have a [picked_organ.equipment.name] there.") + to_chat(user, "[src] can only be attached to a vagina or anus.") return - - if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in - return - src.attached = TRUE - picked_organ.equipment = src - - var/obj/item/portallight/P = portallight - //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. - if(P) //just to make sure - P.updatesleeve() - else to_chat(user, "You don't see anywhere to attach this.") diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm index b6655af9..51f49594 100644 --- a/hyperstation/code/obj/vibrator.dm +++ b/hyperstation/code/obj/vibrator.dm @@ -115,12 +115,10 @@ Code: if(G) switch(G.name) //just being fancy - if("penis") - to_chat(U, "[src] vibrates against your [G.name]!") if("breasts") to_chat(U, "[src] vibrates against your nipples!") - if("vagina") - to_chat(U, "[src] vibrates inside you!") + else + to_chat(U, "[src] vibrates against your [G.name]!") var/intencity = 6*mode U.adjustArousalLoss(intencity) //give pleasure diff --git a/hyperstation/icons/obj/fleshlight.dmi b/hyperstation/icons/obj/fleshlight.dmi index e40a8dd67fb7a9af8ef72213d33602e8ec50ab04..fe41d26e27b4b53357c57fe74f8b288cf5d15920 100644 GIT binary patch literal 4369 zcmb`Lc{G$^`^RTwj|>tOjV##`iijFvY+17mS+Z3aGGu3lNs=u~mdG;MQg&HJmNAKp zB@>buvKtdajHR)@)B8K;cYg0Vzw^HTynj5;{haGL*SYTJx}W=VeXl#t+*F^N^9&~d z0N^$>fLbud*MBc|R>nPn=q}F~w!^G!1EBZ)-5z=R26!TT0DzF(j8r0=NeT3f*kj2R zCh)GM1nbayYwQWG<8n~<YHD0wIS1y>nc8;j z7_m>P64GQQF7#HeQg7D9m~3X8#m?1#`NWFv8*AeEsK*(wJ#^;47EjEokW@jNx$x6x zN`V@Qo9q~*c4``pL*70D6Og=$7Jl2#jq?~uo95uE$Q+sd+;ZXIrKO|)FWrN__45S* zr=RucDJ(f2Z>_ltSj5|!H}aODvt&KU znd3>LXIgrST6E{Tn)5RE+S+{c`^Io}Yb!0`+8cWYu|I+bcJlwEP5Be&TBI7w%49*z z3ais7KgEksqQT zENEi4W!B@akS$mJ%e*~d^fIRR;KRt}UyAM@k-3NS%&YP;ainfz4!(uuIB4o}Kqr-U zAJz7bZbwq6jy@FNF?0eW-X)VFN8HL)z*1>zv-+hmljgcg-sm}awnypmTm*vnJM!K1Ep?7* z&(zE?_2)UtUY@b-avO>DE60w0Lsn8F57q^XM{D7Df>qSuw($Djm^1lt($bF%-+w`M z@&GJ!SK!B8h~*kw#7G~i0SG|~%(cTwy&jLko@Cxb-WBJAS;y(Ah zRJ*AZHB@RNR<(;7aq9X7x4`*yj~&=*c*!(Zp~{=`4qgxpuW_fjB|nUCC&Bh-@;E7> zp$m27ERD1x7_gE6=AyEpZ&a`1X^{~oVYzCeO0UM{Th{+bDEPi%mCio4f2ccMVuB|J z;wRV1A8Sap{=^^ve*BJ6N$HNt=LkO=b z@>L_v6`_f93YnU%T(`t6>NY~LQ)3w7JN1*l6C=#ha^n`|B4D&CeCbrKLN04jYY* zT|_9F^2G+lb_dG_2zASi-&0mmuJHsp7TBfqEpCShv^dq#PE*E-20Nc38y^)d4mP*G z?6b}ZS*wYB|n8G25TcO4zUE_NaGah(djB6MBg z_alDaZHde^Le;@5NW2$MgAvUIt%8Xn&?++(l$2{`~I! zV_i=lEW-hVz|D$ASMu19I36y4stl2y+nTXhu&;%PEYQB#oc!9mHS=wwEDEVoIcGRgRCUCbJ0U{Q`?dXaNmk*N4+X%X_E z4uo~vvowV=rs5zgt$8r@OHI)W_l`a>%BCESY6>ui9PN*{Nv&_E|Iy^zoL9Yl(P{nW zclxVL_p`m=7)!_$(hmGzNxCF;7ab9NhXv4;!&hckX3{P(v398(FSyl9FY3s2cww5Q ze+!t6EaBNV58W%E&A!5LPozBDyuld}Jf@Dk-Cngx$>=3vS57VL6x#(RclvhxpAz%H z8-+KwmrEMW?Q|SY_|hUJk%vqi*CF$Us5t-G4LI1ae%m9pfEas@-$P`-hy3*IW;m1P zbgQle={uN7$UgM)^tlYx)&(~7cE7z5aIS*yOf4i2Mlar%Zz*Y^J+}iVD~;!i58P1% zmug;nyo|y&u{*+G7q+2=gg|w3$A^cWJc^=Vz`VMM--c3R%GcjovHK=3tNGagEk99a z>)W`GuMm5yiwU8jrkl`0Uv-fhR4`4~Ey+T|7?-(tfnk%Dle==@&JHk!h~hRD)I}_G zH%)V5p3+u{vQiXbbHtXB1Zj)13DYd1@&8~4be|B8-dT0s{?m|n;-XF#@@B;>p-b^N z1Nd<3#o_si_G;|c=v5`S2KdFV(!K;ihzm~?r`~RHm;|it^x{QZN4#uUKuj!QKSp$*)#=MUN(l*Z2<9->b2@Q8 z{gi3?k&AVne~7DS{#gBfrP`sOc*Q5dErED?fKtapp31+(s$%=MLh4_Ur4#F{=+PtM zueX?n)`=$FhM=orPJd&5qNN04UuvGeD8v=NBOeNq%Xoi2SoSlldwEy|sk1{$Zyg`?EeZnEinG$zc`iw_xSQa*lG~D0({ZR{p z2?Dup@A^`FIXVVU(i7wff{wcUyl^kwTH-T>Ww!+Ioso!!v|aJ=p9XwI`(z>s{a96V zc-7JfH}v6r-*6g3p2>ZGX7tnulmsWJnrMgajcs^1eIGU2q1Z{fIMO6DrkRLadke_0KcY4B zTI+<-m*zu(OpK7p+!;n`+X**#(%JG=H$&#>NuLu!5QCR0AdRw~n%k}C=+-Q`mtB}} zV3jk$6HQ5L`rH+qlGS>1$BzR61-`c7Udn|RoPy_H1qlE29Ofbhb3`$8PS?VPUShM$ zm5mH`W~N4GMd{2$O6I)VWMwXQ2FU479k^VTyqw=Y{9^4Uya&d19*6Z1gs~M|bGrRk z%1#9Y0Aj7xH#ZGPwknBwV!QT*ye~zC8^}KfgUb~>?QvJkUVPPR zU?66vB?_vM$=i`p3N*&b&>tYj3+;fD=MWZK$5>^jgKeq|Nd0dC*TnS;*D^PluF(ft zo92{Tn0h{hZOICY`vW^=og2$_xPz@qUDD@|xlZ0@05FiKSCLW-wYRq)M?K0rVOj1X zHu&>gVxT%Nm8w;bWkX?ii+!>PT-M>U&CUXasqA0dF@uEiT;cE}5t~mg^BT0T-@nIr zyc~KD9ZQ3wu6Gk0pyA=lm7*%Sv8H(idn)mNg~ZDi|AYho>eLPC$pL#=sPvCI~uZXz+`a_ART2ra!9FqK6)H3Iyn@)-HxQRO0?O1wq z6kS^Nyry~}D-3MUa`mgh1g<&~U8oNo;Uq+~@XI*|+qh2viX$%>`@e>zfB)oWooub& z2+6xc?}A_?z2K0{x?W@FmML(d=e9CnowZH{ zlBRuVMSm%$TC_8h5M3#EjBW*dCe%9Lr;L$hbZKS(+Ofr78?~U|*LG+S<|uKi|G%UA z3!*~Lb2aY^#fr|p7_D$Ji!^^_U}y)FlauYtmXuuj7P>Rm6vbo(vx=2CpBkUoJpFWG z!PfR})ozw(eW4K^+LPWX&dYIQiSPHHRB^u}uSq=+{N8oW%mlq5-t0m;Jj;)T#gOQD zJ=iqxtd@sX8rpJVH4#Vu(A=DOSDy>4%<+fFqp7^77VC1$4)|$uvdQb06=j(bdg$s} zu^|Bcrtf75d0=Eji$G)pAV+?9EPdqD;hD67_O)35a*gvIyf}Ridp0dF_xN47XU`Hk zc1BlkSP^VvGdK4OKGMxxkWt}tON=hW|72pp5JT1=4G4i37XGcf#V;xg|;#{d&q^$5_pzdG&@`oq|M!bxK>obMPJ-G?7 zURq5bS#<_b*qQp45Si-UWT0@Q*^CB{Y?({@JKpe7nXRT`QvQ_m8)4(*_>M6ZV;-_r zuEh80Q#QdL^b*6ud`v8<=I?h9Hv5=CH1=XkV4TTf#p3lw2h*ncnZPWD=Z8_XI+cs} zRGV<4*B}7EDypxoY5BAm|2D>#bCVy{?=PtRO7QEwW)){|G3qKOQBOWUm#pzL^KvUw zqiyYS$cw9%p)>YYa5=BD39tbsCGK*XI}c3P#rJ`ruN6DkfU%i_ud+Eo6Vs+|01=@6 zAmR(TY!?utvbXNLM2tLM?4v5lc_iK6t5<0ff&79`1YY5fM>=!@04v8z0`+Qfe>iX2 zp3^bAlUE(WP&4fx+4|nvNSI_R`$KJ>^S#}~n6`S9u9LWxFEN7oSk{=S{82wLhy4a% zoVKLS9ZczD>_g40$a6sO;+;cnc#vCz%t(IGfE2@ILQYO4SuMN9j}(CiBi)pDWv`{f zkQ`GigXqn$9ya}Pn>XXP$#VsL(tUr4A6|zV=Zy^;K&N7NMlJ%P)DWYE8B?W#D6y)l zpwM>;ns8!-sM%V#Q&1?<+q2mcym%}n=JGkddL4zbzxI1uHo_(72kIL-d?k0P@Ywg# zd0!7*ZuDKn#teIL1;hT|2oXP6_SuTbT9r|G7sS(&vd@%|Os?_FEPUL7p%fgOI%3rI zGl;*n$}-hv)ZR2WRTg=pt_L zZJ@L7L#+RW-jqfw-TN= zMibiKc~EDm(qj9|UDp!6lRq-s)O8D@5_rWBP{5b4_|{jahl8XH*F~X8l%lE={Glu)$5%<;~O*6g2#d-@x@p zd8zSfLo94~DM0(;)1#1*fcxSc=|Jdj+Rx12AKE2%VNXJ1xaymXh`kLS$B!0XKf`uM z8?_flL0(rnCVmV0@@i?Rm$CnOzrnAjw8&8bADiGd(K12Oi*hoc8Q0KYORVl($A4l> zS(x_wnIhpzJ+RrXv1Pg3Ssy!tiA+42^XMdv31`jg2l#n?Ibh+*r>2H4H8IG2v|?uH^kZY@{> z$zotAH;z?_s{g6XJ!;Tf4MVZ~^9W}ScT4C2^Lu|*03or*3a6l~^xlo_K76Z8p=eCl z6d&C%>w#@AEkD`lx9(HIFLd91f2%-=0~b;v%(q`u3q9UhZIS#NN+TEf^gDxX?n@+s zY6yVz6EzK)w+$}o#{=X$(x8i;{P zPe40ETPrAW;PL>VV!`y_nW#GTLvOm#;(@bB9T%-C3xxd#r}#IM466e4qCu0J z^-bOyss}?}Tf-A4u!WY3Jg`Bd?J~8H^k6!_#6U?DV*9}Vq7VK*v-%6e{G8`WC+6GN zKJOea;YhWk{o8!wkc%-$F_l;LDB4pFTdjKTCW#t!#~%3iJCW+x$4AcsUszvYuzics zMTZun@#&-SXf#EwFE-bAKOI*)CU=N|9dARR7oDJEBba}!`pH?W^=8u4i$fxA4zC_3 z!}{d{GH$q}D<3mxVTY^EE5ZAp-z`2QZd*iCj2)sTGRS@Rzr^BMEH{#H8&Ib#G2JHA za+b4y8TyPH>1#R{qtUjW6Y>#cel-i$v{NfwS0Jo%Q--`Sz_Q@JRAIUz142sg(vPi$5HzYr zHSo${XFOuF8mA1+%O^f2r>nA`?W-9QR{wmFV#pa2)@W1>)3Y}bzg^JYq2S=JrFv+^ zQrJl33#A{8)6oJFrmB3@?P6AqiMx@lgjM;(drvBBfr!;Z4^&XaUWZ?z`%PgABQlD^UT={}~LM!JN|7BUgJI>IsCO*c9!Ru%6|= zyR)~SWS9%PtBa@;D4Y|leVL2bb%Qh00e-PuV@63d`)eDbOBNy*+(fb@;WT^imYfdQ zi`i3wB$4A64XT(J^Ci>HQV&c-ow7gmq{c+6R?q-rDVAxdL5)j|QSQX3F@Vh8T&;Hp zx7&SLgolh4X^`4Qcm~8e+n*QnbKWy0 z+L8C2rUC~Q3Fl^zL*-+i`L1R^uVQ!LL)w?Pg^lWZFEv8atCaN`Oc$^ssEnWZhl3v& zk+#(Yd(|unip;LrP54%a<>k>qwdoC4S~>-qh`-8y`O+>1@W3w)M%l)G(mNiCxXc)NoRr}!N*M&=lt8jfwi2l3Y3Q zgJtE0NUid$!};P5l1G^%By;&+q%aM3Q~HW*2|i|!0ohgXNQT!a1=4%e@a0X9{jO-5 zt_U4avm-mXQypMwW99aEqe{ve>zzwwu}=|l(x%P^Tw0qncf_0b;BQ->4|pq;?)Qx;N-N&VKo&I2u+oohSI?$UjH^cB#V_fX+A?vFHIJdAr_6c;rWm z0;QyacE-!Q{Q5u8BH2_@+^@7JEW?KQaN{m&O}@y-AEc>K;yfDyS6F= z-HR*jL8Vt$6T=nC(eH1dSB)kLpurtG*7R?Xhit3zc1+MoTtf8#etEYZ{&yxyd z8M(xk8f)#ABue)eg%Wl+{_%#+Hy|Jr_~z;df8HM$j1gE;2HvN}w-UB$9}_IV8_X_w zNB8fVJ|<)3;r*T6FMoqp*HF2JhU@PK3TuZ}d0HnY7WK@(9jW=uz zw)%0|K!s&BhziQ zsqBUKzTOmhE`KI;oH^4!5!A?>TvBN&vztSC(E2FooE&LYl13=i6YCQ>+wo zD`AWhMl$a6V5NwMU)cczx$En77|PxHSAQCnckWsucXSHem?of#3gR;K=>qpS76k>r z%1VC%hwrsW=q%`^%j5(HbrL=lGIHWts$kA?*uOO`pWFC-;Oan^M`~^#U?h9FRk!=! z1GL&6cqS1^oC?&h#M8gm_$Co4ac^lWPcNuQpF6uaJxhh3?sRRrmu-?MFp(a-HEjkz zbqb{DQ7_XvKY>5OseXhrP+oC6ErO&V-WNRdEa3i%4QJi4YtkfdIaf8ihb3HON?>%k zHYS>BYh&cP_lLJVf+Y@|r%hf?dcxAkd?9LObg&YQR%7*mDBZ3K8m;K)?}}>eEoE7y znSpvqySQ8`qeRp^+JGE-O-bcp%#qa)=bJ!1`dPpEvggtv794|ls_x8?pKt$n`a2We YviWJV+O++V^0NS-uVbv;sO230AG7@$l>h($ diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index beb5f8b9..4a9ff931 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -321,7 +321,7 @@ src.visible_message("[src] orgasms with [p_their()] [G.name]!", \ "You climax with your [G.name].", \ "You climax using your [G.name].") - + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) if(G.can_climax) setArousalLoss(min_arousal) @@ -522,10 +522,9 @@ var/list/worn_stuff = get_equipped_items() for(var/obj/item/organ/genital/G in T.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(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list return ret_organ diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm new file mode 100644 index 00000000..2652d361 --- /dev/null +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -0,0 +1,25 @@ +/obj/item/organ/genital/anus + name = "anus" + desc = "" + zone = "groin" + slot = "anus" + w_class = 3 + size = 0 + var/statuscheck = FALSE + masturbation_verb = "massage" + can_climax = FALSE //no poo poo 4 u + nochange = TRUE + + +/obj/item/organ/genital/anus/Initialize() + . = ..() + +/obj/item/organ/genital/anus/on_life() + if(QDELETED(src)) + return + if(!owner) + return + + + + diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 83bb73e8..9cba98e8 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -25,6 +25,7 @@ var/mode = "clothes" var/obj/item/equipment //for fun stuff that goes on the gentials/maybe rings down the line var/dontlist = FALSE + var/nochange = FALSE //stops people changing visablity. /obj/item/organ/genital/Initialize() . = ..() @@ -67,6 +68,8 @@ return owner.is_chest_exposed() if("groin") return owner.is_groin_exposed() + if("anus") + return owner.is_groin_exposed() return FALSE @@ -150,6 +153,8 @@ if (NOGENITALS in dna.species.species_traits) return //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in. + if(dna.features["has_anus"]) + give_anus() if(dna.features["has_vag"]) give_vagina() if(dna.features["has_womb"]) @@ -239,6 +244,18 @@ if(dna.features["inflatable_belly"]) //autohide bellies if they have the option ticked. B.inflatable = TRUE +/mob/living/carbon/human/proc/give_anus() + if(!dna) + return FALSE + if(NOGENITALS in dna.species.species_traits) + return FALSE + if(!getorganslot("anus")) + var/obj/item/organ/genital/anus/A = new + A.Insert(src) + if(A) + A.color = "#[skintone2hex(skin_tone)]" + A.update() + /mob/living/carbon/human/proc/give_breasts() diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 7b09b997..e2a7383d 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -96,6 +96,8 @@ WRITE_FILE(S["feature_belly_color"], features["belly_color"]) WRITE_FILE(S["feature_hide_belly"], features["hide_belly"]) WRITE_FILE(S["feature_inflatable_belly"], features["inflatable_belly"]) + //anus + WRITE_FILE(S["feature_has_anus"], features["has_anus"]) //gear loadout if(islist(chosen_gear)) diff --git a/tgstation.dme b/tgstation.dme index 0bca9ad0..cb439391 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3240,6 +3240,7 @@ #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" #include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\anus.dm" #include "modular_citadel\code\modules\arousal\organs\belly.dm" #include "modular_citadel\code\modules\arousal\organs\breasts.dm" #include "modular_citadel\code\modules\arousal\organs\eggsack.dm"