From b95bc24defdbdac008409e3fe1746cd18589c701 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Fri, 17 May 2019 04:24:23 -0500 Subject: [PATCH] mission accomplished --- code/__DEFINES/citadel_defines.dm | 5 +++ .../code/modules/arousal/arousal.dm | 25 +++++++------- .../code/modules/arousal/organs/breasts.dm | 5 +++ .../code/modules/arousal/organs/genitals.dm | 31 +++++++----------- .../code/modules/arousal/organs/penis.dm | 3 ++ .../code/modules/arousal/organs/vagina.dm | 3 ++ .../icons/obj/genitals/penis_onmob.dmi | Bin 3364 -> 3880 bytes 7 files changed, 41 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index b150067717..9f5f52180c 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -76,6 +76,9 @@ #define MILK_RATE_MULT 1 #define MILK_EFFICIENCY 1 +#define AROUSAL_MINIMUM_DEFAULT 0 +#define AROUSAL_MAXIMUM_DEFAULT 100 +#define AROUSAL_START_VALUE 1 //Individual logging define #define INDIVIDUAL_LOOC_LOG "LOOC log" @@ -98,6 +101,8 @@ #define SKINTONE 40 //uses skin tones //Citadel istypes +#define isgenital(A) (istype(A, /obj/item/organ/genital)) + #define isborer(A) (istype(A, /mob/living/simple_animal/borer)) #define isipcperson(A) (is_species(A, /datum/species/ipc)) #define ismammal(A) (is_species(A, /datum/species/mammal)) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index a625829577..307cdff29f 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -1,13 +1,13 @@ //Mob vars /mob/living - var/arousalloss = 0 //How aroused the mob is. - var/min_arousal = 0 //The lowest this mobs arousal will get. default = 0 - var/max_arousal = 100 //The highest this mobs arousal will get. default = 100 - var/arousal_rate = 1 //The base rate that arousal will increase in this mob. - var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob. - var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types. - var/mb_cd_length = 100 //5 second cooldown for masturbating because fuck spam. - var/mb_cd_timer = 0 //The timer itself + var/arousalloss = 0 //How aroused the mob is. + var/min_arousal = AROUSAL_MINIMUM_DEFAULT //The lowest this mobs arousal will get. default = 0 + var/max_arousal = AROUSAL_MAXIMUM_DEFAULT //The highest this mobs arousal will get. default = 100 + var/arousal_rate = AROUSAL_START_VALUE //The base rate that arousal will increase in this mob. + var/arousal_loss_rate = AROUSAL_START_VALUE //How easily arousal can be relieved for this mob. + var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types. + var/mb_cd_length = 5 SECONDS //5 second cooldown for masturbating because fuck spam. + var/mb_cd_timer = 0 //The timer itself /mob/living/carbon/human canbearoused = TRUE @@ -22,8 +22,8 @@ //Species vars /datum/species - var/arousal_gain_rate = 1 //Rate at which this species becomes aroused - var/arousal_lose_rate = 1 //Multiplier for how easily arousal can be relieved + var/arousal_gain_rate = AROUSAL_START_VALUE //Rate at which this species becomes aroused + var/arousal_lose_rate = AROUSAL_START_VALUE //Multiplier for how easily arousal can be relieved var/list/cum_fluids = list("semen") var/list/milk_fluids = list("milk") var/list/femcum_fluids = list("femcum") @@ -77,7 +77,8 @@ updatearousal() /mob/living/proc/getPercentAroused() - return ((100 / max_arousal) * arousalloss) + var/percentage = ((100 / max_arousal) * arousalloss) + return percentage /mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage. if(!isnum(percentage) || percentage > 100 || percentage < 0) @@ -104,6 +105,8 @@ S = GLOB.breasts_shapes_list[G.shape] if(S?.alt_aroused) G.aroused_state = isPercentAroused(G.aroused_amount) + if(getArousalLoss() >= ((max_arousal / 100) * 33)) + G.aroused_state = TRUE else G.aroused_state = FALSE G.update_appearance() diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 31492500d7..1239a515cd 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -58,4 +58,9 @@ else color = "#[owner.dna.features["breasts_color"]]" string = "breasts_[lowertext(shape)]_[size]" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() + icon_state = sanitize_text(string) + diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 442281bf84..d13c2f6a97 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -92,7 +92,7 @@ var/list/genital_list = list() for(var/obj/item/organ/O in internal_organs) - if(istype(O, /obj/item/organ/genital)) + if(isgenital(O)) var/obj/item/organ/genital/G = O if(!G.internal) genital_list += G @@ -214,7 +214,10 @@ /mob/living/carbon/human/proc/give_ovipositor() + return /mob/living/carbon/human/proc/give_eggsack() + return + /mob/living/carbon/human/proc/give_vagina() if(!dna) return FALSE @@ -283,7 +286,8 @@ var/list/genitals_to_add = list() var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/list/standing = list() - var/size = null + var/size + var/aroused_state for(var/L in relevant_layers) //Less hardcode H.remove_overlay(L) @@ -291,7 +295,7 @@ //start scanning for genitals //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again for(var/obj/item/organ/O in H.internal_organs) - if(istype(O, /obj/item/organ/genital)) + if(isgenital(O)) var/obj/item/organ/genital/G = O if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes genitals_to_add += H.getorganslot(G.slot) @@ -303,6 +307,7 @@ for(var/obj/item/organ/genital/G in genitals_to_add) var/datum/sprite_accessory/S size = G.size + aroused_state = G.aroused_state switch(G.type) if(/obj/item/organ/genital/penis) S = GLOB.cock_shapes_list[G.shape] @@ -314,14 +319,14 @@ if(!S || S.icon_state == "none") continue var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) if(use_skintones && H.dna.features["genitals_use_skintone"]) genital_overlay.color = "#[skintone2hex(H.skin_tone)]" - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[G.aroused_state]_[layertext]" + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]" else switch(S.color_src) if("cock_color") @@ -330,21 +335,7 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" - if(MUTCOLORS) - if(fixed_mut_color) - genital_overlay.color = "#[fixed_mut_color]" - else - genital_overlay.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - genital_overlay.color = "#[fixed_mut_color2]" - else - genital_overlay.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - genital_overlay.color = "#[fixed_mut_color3]" - else - genital_overlay.color = "#[H.dna.features["mcolor3"]]" + standing += genital_overlay if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 2530a3095a..ac812e286d 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -50,6 +50,9 @@ else color = "#[owner.dna.features["cock_color"]]" string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() icon_state = sanitize_text(string) diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 6b55bd8e32..b8ef7029b6 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -58,6 +58,9 @@ else color = "#[owner.dna.features["vag_color"]]" string = "vagina" + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() icon_state = sanitize_text(string) diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi index d541920b5d9b79d8b3ef59f09f0e6c5768563746..2457759b732edd537fa4ac5d22d8abc7c0b13073 100644 GIT binary patch literal 3880 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 literal 3364 zcmY*b2UL?+8xAP48bbjE2|`lQSdmddh9CigiedrTLkK8X5K9o*BVjdQwSxGoXswaa zh83o=f&_>RMZh8u!bl7wU;=`K1jzh@9yzD?eCxjV{oZxn=RWtQtMeJ4l9mzx005qK zbZ`Rzc0i;zVCN30#Bf#TSLw^Z^}NR^6B84OL^3=)JUcu4@#DwR($deLKW~0or2+t# z000(sl1G~#e_l7&-6z#7`+eL>`lC#Yo3lH>mN|9>0FYHm^6-gq2)%JRIy@>S92E%w zBs?KJ>TvF~RX;^p@;0qGg|KRhLD+@{|9o3;r6%*&Ec*NQ zxjND5y=Mz<-y_cBH$p!ohX;D~tI+-LM;AZ7kzjNDFZj{ved@Ok`@HJdDW`UL@#WZ6 zf}2mtqvEvE^Co9xE)-tbEo&Ise66#_UB4H4p~5QSfcG5U6x z997l!hhRdtA?$9=SmdM24kl+F0Cp=lEj_T5&${0*p*^$jr>dQ<7Cyfa`+w9Hr^Fq6 zrlIh^G@7NW;sQw{EEdTsx|kt2{klJr{>1%?2Zc$?(Ydqu} zeJ}&7dUe9y7NPhu0G3t;yHMx4;$wfE0!%mxZ8lIa9&wJIld5D)6m6;WGyqHp5KmJd zy+YoYmX981vf($foG5uN>Sz0N*_=Chbx|G4H!8%TW5xwN^<>gsdf`+=CD^{q3jk2c zJ?miSk?>?`s^gCK$evvv3W0iB6RMY24pkg+s%hv_ZU+ZF4Vsl>FXmm!tLyhK*y9FK z_4Vzvd%WMR$dT%+#0bc*ob){YX~v|n!X=iwPAFxN)?+ATI?2~_1&iNFn{aD<$Z6ek zi00HaBYNOTTFz)^1|HGbbz0}7w&)oj>p@v2LX1%eGmZ6bxFY4dBUzslNQG)B#}jZO zOTI{|UUt01k1i(zw5(*ggqeZ9+LS)^Z?GBcYUe`qYRR-P@+B$t_&%hj@(!x7I9QYm z3Vfrx{o%=^f!*+D$EZ=G@davDCVyrfABZX9%Mn`9Vzp?Nnv)3y*^ZpRmdl6m4He!_s+=y@RoISVHz7&KLG&-k zIaMcw#-|onNH_zcrHYlPxYe~duJ!3y5!keZzaeS`y`s(-mcvsd!J;tIU7I($8)|Oo zaqCv{p9}$rJtz=MP&Jp9@h>ajP~AAYAWovRNZk|JH)pYg@?42G#$K}w4cT^E>Uk1W z+rm%P*qKrPmccj9>#r8l<4^?MDv-1SohZjxQBHhV40W5cH4AKRBGeA@J;TWxYsF3skoymOmA8q>|wKXLZ37H zj-!w2B{nCZzfK}hy`hG1-YIp3dGKleVbUu0Nx&hFAi!qi#It-FsszNw`5?+Y;VSi# zeX`pwV1!tm>EbXE^YuUio6nH64e;{ATVh33Ykxc+K!o+O-XoOsZP{>#B!Z08!3KlrQh&v=@xHZN9l z+gptj``?~Xau=05l3jm~%`pubBv-6VvhelzNvkI9Y?rd_>AS|@h}rnc zx`&G?JJ`Gi%#yoOg-Y4l{=bYS?h4l%^@CNE>b(2`m0)ZCFZiMHJT*Z(4&)YDrLaXF zDfS4rIdhHm3S*9UdhF+4lJ7w$J>1v)^Z~(XQW}Zy|}O#I#=eK z{j~p$Cgxn3;&pxgOa1Ncqgk70$cZ^$!4tR4y~lyf*v17hmTrMEUg0%xdefiL)Rah_ z1O6B~2lC#Q9-vl{V%JxN;ce7IRtBV@s4fsEm6bSW;)Iy%T=E{Ou$G?JzKF|n$N9V& zt$uo@xnozr5%e|C&I2Q$o!^20=$outXYnojaPp5D#nX4Hyaq3OP>>f9OgLJ1j#w&Q z!DexbMbh@dEMT+1Z%?9CrWpMz=?ZL^ZjR0P%COCU5z~Q%8H3z}ioqrP^lcwOq2=?? za`t+FibXSd1QrMFyDZ zFIe*1&6{@rBN0-wT3j4(3@+f?j7QA@6QdvX4Ysu{XYBccjSV4NVCYlJ!(L>rUPeAQ zpyb``3qh0m@W3)1*N_D`7A41t|35uBKC`sd>) zmpEkpZ%ZH|t^`%o3?-lz#=tGai%+qY1n3{;dIGDUd{kRunYjwRsvA5$?gBiET4#1e zHX#ZY;<|~SK^e05QX(_MPjGilN3kivF~QqO0Gxf<)Sg8?i%gXd#Nna!Rf7>HZK|PG zl=<-9N;c>5;2_M(&l)mpZBq!PM)%P2nCaMA+pfD)@4CNlIq(ds?0&L##1AgowwQKV z6-YHi@^lxbqc~va&*t&s8M9^6cPaxnIF ze)1lx0^rLW^p7yG>L>HMCai~`$5W+=Gr}7gykI?P6d*wvOz7fRE(>k!Z6E@EoF5Ft z#HwVzua5@>wvEtSk}(3}QUyvJwZMN(?x*qxi^*e+xPPX$qC+i}DQt)vPkH6_JfpYQUn2DUNKRH2bkgM3I) zLW7v*LUfT$mfXLaV%NjdXNUS=EOJ%5VCjqPon_`BJQv5fpkSVcdTFGikkT+oUwtgm z@;M3N3|2s*=HX=tnn8{KY23{S(+^Q>DLb73`LFx?h?bwqrE_%MKO3twiG-)}HrA%^ zd22{n@?8tPj`a|CQ0JDs2mjWmkuK(RARFCRPHMuw!oR0ClTx`G^`oL8uDrp*dI07+ zP!Z;AMg|YP`1G&}o&w=XMffEtk1@h%C^jF zDvt$6Jhs|8w|^ZKJkFOE8rbMtDVe5N&5$#1Q>ZpXi=XKtr{`k&1e+X_0GDNm!q75W z`9qU=43U)coSyvS50(;L0v&jBxhGPqt^sQ*expVE#QqM+(4+J9Bce#vFQ&4LC;9sN zZMywNwuocn;30mjD#NN3JbMFt{(U?QPQ3u#-H6`bU5lZAJ8=O3Z}n~7?5hOj8iD?H zMhB|F>$r(p$JqSVHFzA|N75TviaolB)uC5cnp-g7l@yDh_X&s_bJedS92+KU%}WxW zL3NrnHw0TriK;dVQ44xcQ)O=9zu^A9R#S_ibowp%_F83^@E1BWCwScKf1t|6UoI0t z_+~eFD8&bfsFPzFV6Fjg(oq(>-}yn_B_aMqwg-pz4rQSl`QVVpc-S4b_ui