From 924d085a5b1db7ff8f2309962cb6e8d2f8203f81 Mon Sep 17 00:00:00 2001 From: moreoreganostodump Date: Sun, 7 Mar 2021 23:23:54 +0900 Subject: [PATCH] 1.0.1.13 --- About/Manifest.xml | 2 +- Assemblies/RJW_Menstruation.dll | Bin 86528 -> 87040 bytes Patches/Hediffs_PrivateParts_Animal.xml | 19 +- changelogs.txt | 5 + .../HediffComp_InducedOvaulator.cs | 64 +++ .../HediffComp_Menstruation.cs | 386 +++++++++--------- .../RJW_Menstruation/RJW_Menstruation.csproj | 3 +- .../RJW_Menstruation/Things.cs | 4 +- .../RJW_Menstruation/Utility.cs | 7 +- 9 files changed, 293 insertions(+), 197 deletions(-) create mode 100644 source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvaulator.cs rename source/RJW_Menstruation/RJW_Menstruation/{ => HediffComps}/HediffComp_Menstruation.cs (86%) diff --git a/About/Manifest.xml b/About/Manifest.xml index 0b0a172..ced33c3 100644 --- a/About/Manifest.xml +++ b/About/Manifest.xml @@ -1,7 +1,7 @@ RJW Menstruation - 1.0.1.12 + 1.0.1.13 diff --git a/Assemblies/RJW_Menstruation.dll b/Assemblies/RJW_Menstruation.dll index 96e0961e578ace4c8e76b96417917bb1219d1c76..977494d8697502ea84e385ca2426c26381250ace 100644 GIT binary patch delta 29618 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 delta 29021 zcmc(|cVJZ2);7NOnKNffCX-}lGASgakz`0A2`QwKL_k214iZoSLFo(x6fuwqQWV63 zM~PT2Am|lD6j2dH1w{k}6-6ncf{KdQ-mszHv-UYDsPFyW@AuCy_s({3L3zQCP90Z6)9fV z8bK~_9}J~>ijt$(iA-mozDSr1^#%GekuCb^Pl`-2P=8;f#-&bz34eX?QOHU+JVvzq z2_n(F;v&&)>p&$^6?bhNtNkcMXZ>RPy|&Kqi&@@TU*SmClO0Kt$C`YK$>SyODQz81 zn{X!CIc-v;R3vTf?W|M9NPVq)q%IG#L>5+CUQiETukC&%>? zqxDDQeib9OJ`{hs@Eqo3y-+bEE5jvlL{CbX6MGbDr2(N;16L6_ZKm;HsKSFQfAm1bB1n;~YAH{U{c@vy?5(r`aAE5AXC z4{*N!2IMp-4NMvzWX%RZ?j%Fgun{CZSIzKc=La6r8S~w{TyT^_`Ken(!Hn}2?9}wvp+1j3wl@fgjruh7w)hJUjUyU%N-W}NpaIMXr!V*#P?eDm&+g!{$VhutiyRh>ufrIn z2H(I1rf2o=PO;8|Ac|(Q1mD#2I;H*p*dAHyH0S@W+Fn_0i)ITHqBqR?C#A>9`Wxdf zPy|ax7AB52U#0tS#bk`K$oW&g64Z#Qj9bkTaMhSv747teT`Ub)>70#NJDna1zKu&5 zM&~=Y=6KrKRDTewm{Se?mpqRAmps^J=7Ab}^Hb>yEWYm63g=vI)~>|TumHXdSR9>d zn>YePhiXPSLuxPtORxzLIK~q01DJGIw@c=<{IkzsvxrXZ^2J#C$NVz5JOVUT^SuI7 z!0=1@OTiwe7I+VKn>S3csDTpwP{zgLeLW{LkboPsGso^|?1ad7{mk!mm*O@|iXCpn z`i#uXK_}qgRih$|R-R;L^(f#ULY(yxAn-Au#R2QF)2p?xPng+ER$t7sc$5BFW?~s9 zHr2r!+vEmL5cm`j{EQ{c-IlysQg;tjbmuymsiUm(xlS!io6i+!VYd04pUGqfQTD)Q zeOsWjIH;ctq=Zhx%=a%eS(9U?tPJ9;&!G;})WCmmRjpmptg^AOT^yPMWXK0KVehW>*cWeuN4|HYcdX&Hqkir{(1m?sv z{)CI8;S8|hXF%{5K(5W^2>uEI&c88#1VP&FAS#51+U z3wIRN2%q&FH+^MRUNypmy@h3dJZ>DCI==&7v<7AkxHUTG$3gOk85(20tG3t?P_Sp< z-@2Ne9y$xh01xrk25Su* zdGn4c$EUnA`vVsJ*PMz?*`sVh8`Sd?;1y+W;7fxY3JgF8E;-TXD6LYN+o!!UR6hlEl!mfB=-u`SVZQV|KI>;WUhGPd;(ao*V7I%N%w?6BjP*=c`hSVzvu zjSF!GFtM_865G5mOn+joq@?|$+h^hai?B@QP?tacp1zUS>`RVby1w#(Uo3?XN>$g(xYU^JxXwhk(+blR-w5UlA7U#DC-9Wr;Lj69cd^;gaP^UpuqHQzCxZwgr*l>n;f z%o?r)s=*b@`~g@d6?J}pT(bVK$a0L*3iFgv4Q$PITV#={#KJhGft_$G?%faOig zj%bW!54%+8uXl~%%_eRwId029MGN!+2?n?*tNAsR7(@j%3fC@!7JgJ^l5&MMLx#=<%lHI zh>b87o7Q;C(~@i~1)I669$|QtVGDN@cCdf*RRZJCp0bf>db@1es+1ekUfo*loNTEM z8NK|ErTv7`EV4dX?Xoa-xf9SROAx1<&hk}=$lvUfTJ5>>+8g=2rC}h9je`Ke!MF8} zxeG71$UgqZ7XI>&ss6XI`!Auxj-jnOq1Miov9lN> z;`*svZ(#2YT#bgaEkU*-!w5qkH4T>q;w2=EEOY*JeZwB^syJD@se{vwusfYT;Lm= zf@^ZIE}?=bdq)P*Y!xbzu( zjcC+&4Gtpe1w*RBabMT?gcB#!fn|EbkX&)SzCq&QA-VC=I*+Xl^MP`)DRRMesorsD zb&Z@Tat2+91~%dmA16JFAYvonZyzPIKhP`ZX!U!Cc67C7!X5VV&>PSz1BX?FABQt; zYsQe#?;MtwC>^gy?!g-XQyP~tw)05SZNtw;>i)wMJgu49TOH;N5AY33%Ns8%+M;hA zb-Zy+#R#dyO-tWDJl5NqM^x(?r_UQ6t4Ca{bzqx6Fa?-nQ##C_DMMt|HUHv_>LnRpEj~*6gO0!X4@LN zpgFkvzA*Cs67HNvw`|@FV8dmAkxJlVw0flCz+MENH!wMGXS>$w_l}Ay<_t}bTM>?! zu=j9)-##FwF#}Hm87)E4|1+v{7g?35NX|VaU-aa3j8bQZA$5yiYu>>k{k%)Q>%mD< zorl*|Hm0M7Q$|8gt1@MIy4Sc8dJO9|I~(snZ35W8Xo^$@CbJm0LZ5SKCmDs{N;tF> zq;I-(NHlLEt-(evgI7IO8&wzBtNSj?7Tfij%d%6s^m9@%zX`cCeu`4DPpaE`(`6la zE3{#B0^+@AbaxpZWBF<+3W)-fkqGY#q664X+kC+wsJZ%X#!8#3kG-OI=qA)g?n#}c z*gE2ck#=*N22TO3xus2m$6wZ9jcZAT9WHBDv}wLHG`F>But8@Zy-kBNeb(H5NtN-&Mf-!70Th2=2^{`; zrfEoiS4(bzyWu{&CvGfwCoq2&;;%F?W_7n%rl?n_ax{#bG$O09@g8{Qc-n>E61W$t zl&r>o;UeR%P!rb{cRjfz%I*&w*VjypiQ}n}rKKL&->-X7Brf}_qzvmD6JzAWfwi!3 zR<&X6j{SR_anhV6MKdqXg-`b}x~PkuIO&xOR&(K9l6T{6Q4_B$(u`=yKP71jY|~w>SAg(aM-wXPwS{v{4Fla$Hf*)bpzMJxU*usRPh~uG3Om; zdP2r{gu?U)lY7jL3`&-_6(iLGIqk1i&;JV&6 zC9Ryt{K#%?lSQ_n-C&CwmDd~Pw0}ipO!fj@O!VqArr5k~J=EGl-53@RPWgWrJ-Jh} zd;CLIf2~mbsIKUQw%PF43hH-H?evdT!Z0lSufs4YtS$O-Wx%-uFGka{|1rN&)8a*w ze)Y6Kp6rk5#+rovQDC*Kvyqv!eg5|zd3~D8c{ThLJ{8gQs0oSDtxNk9btJw7V9wzl z6EfOatnDm~=cKW;vphN>wq2U`xxF``^q)o*Vw2w%oA&cjo{z}27(+~<41~mn`+yoa zp#M3oBhDH+PA?049ZkrIQ7yK>{rct8t5a~ciNi5vKANE7^-FJD8b8ED#ZeLt!TARF z!t~zm_c+x6mA^KT9e7QT3H}RT$apfC>%v=be#*fST5ziVHIDoa=utDW&QIqc!Z<+vfo{e^!f9k&A8nXJDk^f}Wc3t>~a{oSBx4Ggoca zR;YuI1G28f;m4!M!#sx!Jg$E^vp)_sE9=WevOcFiBPtSZP7Uwi8kTY^8-Cupx&Ctz z|1=U6bdwu0`34Ek{DHl2#fJB>*_q<`t;c5ntVQgDm&K!ctRBr{3+&TR;(YFvt8XapRg0VM9gXLUO#OJ{RuRx| z4c#CPY>jKm6JnI!cfptTQ78##YD2bmzwQw0yo=J$UxmBhdHgu5$X!?9LDa8t2s%t2 zllO!0hlW!^ZPq(5q&Kl8c!Ha&$Rp4&TaLpPyi~t^(d!8V{8&SSsFW-F8ZB54CtfM4 zi`@45VR~qBJW9N4aeR-lZEl&S+veU2q}zlxlgnN|t(Dnh`1FbQB66K`>OU?{3*gXF zoAsfr)lk$bP=aBE7qKtHNegrXX}Au?+0lCMCC`M-LSAMjy8C)Q!7RHz*`-6P1y8}P zewBX3^@SowUv+)jx$3>w4<3pKy0Dm8$UXyP#W~ zn9Xh2W;Ct~_g34z(7X%fwNnM&L^@-YcGch8*7Ev)_6qMlQ`r4)5eq(t|X#TFb zT1=j+{^d4jEh!d?@7omhNipqGk3qT|SN(-;y85}dEsG1?C>5Wh#Z4chDfRcZalBSn z>z{4opD;h&#y@3liRD86!|6X`?rr0znOC>*&zWD*#(Bq;T7P|;;tO_I*T%8GSL@%> zpI#Op!lAV`>noJPFP*cSIO>5fK^sTN5s$O$_U3Om;ny;wueoO5GCw2vH_Y+U1vQQ1 znt#jud**pU4r)~Tf=8pK*0)J(m(#C&d z-lL8G&U}L8-*E-?H*butE96FE_v;LlAqKO3*f=!(!H!o+#~<18Pv*_wfuERSomJ}} zW_pGxUK6YJueVYh|EgJCW__gBEI&_trY~Hc?|TAcxBgFf1b;&UygTYL>p%L-%gd9o z$#w?HQ7+yvH8@*{A8(laSsnSsQOZquA$|?5$alr^jdY>U@|PEyhX2zRX;#|au>SAd z@rKQKlm9=s>#yJBcX8c}VuKF-+nWN}6&U%scoB&{LgnyUObwoe58jO7O+q!#)#*w@ zGOLH^J#S74zXtx;v6!0ro3B!SCH?fx$#JRNYQBffXB%EwWa9FN_8aM`w@lH{WqhO5 zZ1-EGi>Zq#cGCOUz=Z2XEB>vaR?hnQ`pFel zg0Z7sbz3J9u3vszkqFb9Z(E8t5h;4Kh|;_1`NFSH)XPPRzD`fI@jEzQAWh$|mv}L9 z5v4vT#dvksWmZQ$`u22@s#n||XT16KC@7~H6_)R)v!+`b?9dorTamVP|Hbyqf3dyw zUu>t?7Q(3jy6bNRO5^_r+xP#s0{@by8#f2pLL;F*=8hzhuQ%P{OXslFpG9^7FJh5( zzB%wC5?VA_maBaF_B*nxdUhvDYb1IU*CVx%hs>^@G<^ad_K9w2B1%qxZrBid@E)Q_ z=+b%*>)R98r@#;CDJ!!RYrwGV5!M63noAM*pj0{^*Kzu!mARqM@TQmlG`crh@1oK3 z54CAUMJNhusooc z6>!}#FW_9Wsf_ZQi8}4(A_j>4%ht08ZGkt#QRGnYt zrvA3^UX3cO|8Z)RB&#)F<4o`ByxQ%g6YzA>`8LMi(mB(w)&Dr1r01=6Ycv$8oHQe2 zrcbAoTp~Zstje!)l2*a~8NiT}E{x@j9*$vb@NyO(t6ad%ne4Q;g!Q9PUq5BV=2vMH zW@T$*Di@F`3%D!mC5J}$dpRooQAH;mNMg0BVS8L$i3CnS_ZBc7K!u!C---2u5o#xmPh$DY zbVe1ScG5!WKdxrA+mCUUU*)H7(fZzEtCu@;ect3WjY6LE$!Sh1NaX}mO1Vf~<4`XG zcBES(J0^Feo)sNY31b# z)4`Zf$Yo6l#dC=MkOQj1BZn2jt5JFfZugd0cKyxIZQ9yprZ1Jsvw4)fCdbOu6pq<; zH~Z)qdKwKucVy76sIM}d^tMbDG^&+F5gLUfe-Aa4a}Lek@m@ELjtnvR-N(dJGT!T_ zSMs^;F;>oWa4qAwsMT&a9gzt>2Rg}%QQ{;!2B3##MY3j-ti*vD)=!o4U{uISmjt-# zg90ocl$|m^lI4fdiGDhekRL)}C#2JB5+frxK@T~$t0d0EDAlMty2($g zzdET;8skqgttLC-HYuNwt-nobuJmw`Ustl{wX(}rOZ{X-6yv`})-)%Vo$i#G7Rx?+ zp_u#9jd)~GUj)`q7u9g__sL#7tFr$*3|=R_EDQU<`I5s)n`;=m$&TBCNVu^EaD=9o z&-BI9&g#c7wpLd2nA=>8v?0pu%vszb6HIrqTq{TT5(FxX26x_w4f4d!7v?)D-DnLa zo}a$%%vI?nBN2}rGA+YOv98k7vh}Ahke&2EK4Yn@?nFP!bKvi%&+|C#Mjyu`bd~Hg zZ+A8?lX5O(jb8J0P4?4&WQ&!q>{=DcSS`oIO~r5GetJwst4yvFf5>KhEhDj54!YVL zZhdVWkE%_HJpF!5U_9QPi+`<>OMEWm=4E70DUbR05mhG1tO9vYYfIu>XGzQ_hYG7 zz?LIfZI)pxmn>bffm9_~S7sp^NHvmv5_c^1Z5l*9B)b`{sG`BRQE{ewoX1knf?dGB z0-}#A*fxy%5jK(Zs_R&43fM)`(~@>9)gdl5*-wScrlC5V%YP7ya4{V}Ct~&qY~dob zkk&~0d^~5m5Z^&(<0~dxFWCns`?qZGX2}-Q2FW&=Y@=k~>H=^>de5d{tti|G-` z&Ze+!DQ%UkR@!b1(UX#9W*$q;6}Qkf$@+FWmb!>^+9}x_gnOFM=|x$@nS9RXc6wQ| z)UM1vqP>!RCA;Ed+Ampb4BI}YlZ4$n%}ydpA&dA>vR!%1>>~6bSyCeDQzxNUB4D(j zNAJU+s-h@ys-4XvK5fT*;&bV_02x=|z4_OY4VCHQ#J7??VPRW>_))Sc(lb$~ z>nMH>Nor)1EPjSadA)=)%MONl~5hp^Nkbgr}MSVnvcCLLzVmsDPq{xILrRT*Wx1DW-$P>ex z&XgRm4sSZt?W}!x(+MeWlk)l9Snn@o{U|9HNI6$pqe4>kgCsXdTnqHm@`wXgKi&th zJWtBsRIq%1I_t}&eyf!GOL=c9TW?Ew1ACm`q8J;B7;7co)}7@C;u&=xgPQtF949rar94y0mqHeF%sCd1q1%%ghe&xv zBFm*YT*`>7KT*o#C4WYS1Qp^U=(LCNJ)lO3GK-sBZ=iDbMKXp5o>vAnC3?@IWox^S z1#(83temFhIk|T|#g?eyO$G6c4V@W3N@ARt#dt*=V{f2F-WrZX4aXxym&&l*E%D7F zF5r2I8zp`w@vOvURXY&U2PF>ma2VgnV*gn5u||_San_qL4m5fMK7*Qi`VUx3=+#8l zyj6f72T~v^4ER9-Yfi^b28K4El^VS(Gg_T+79pz3kHoXg@w_--uq$guN$e%@dWogz z4nZ%v(%|zV3KMit;<`AFRznoW<6?Bj@TOYCQls(?T=mDY11Nqkx*MCZ)Lh86P_Za-%d{E9D2I+$`l? zQhr>@$EAEw%4ej!Ulul17Uq!^x=U)xrKVUGd{AP!jMGoDie)mbkMjx9FiC1;rq9U4 zqh#VB`pi!y5!}bWc9UdBz1@4`#SlED}o#(15N(OJa!o{MpH)L};n zEy)^%xp1r#<1?=6s1o`nt|u_mvrAuGwmTR=+V-6k5fe&K2)hI3h0m$|78~Ictn%96K zpdRWY@G;hTUZh*vnvfZWmF~-G#*9S9x8fLc-HbPtGCrBbc(peygv+XU zCQ&k32bo~6Oi)_Ht5vC+R|UVE_ms_b-<8IdI3J5lTjh8OYN_0BSjb0NA4l336Q7l_ zc>(d5p}Y*-q#SIm^sB}1Mujw*BNvUyjuS9HB~Ae&)KfCq_mC&k&%jqLj89q_4{402 zrT!_w@-``#;K$W|S}8SOLpB1=UE}l&OvcuTR?^`32#=uaP1Y;kAHo^Yos#aMWjK$t z(3wPt%yCHiyw;8Ny%2)Z!J#(6P?($(*A2MvlPiVosM)vCEG)LtFr~Z zvu?7jg&&Yg3Qj^$f_-(xZVFkcqe&mBIE7!w2TXRWBMmKBW3n?bQ}77#q{-CS0Bp~j ztW(ZO#YXR%tV_;4VE-|gY=oU0I6*R+)Wu_`o~^9N;|S53R$A?GlZt&Q(I8rO^?|R?_JXV?Al~N~p3e(=2*ZvX%6`FL=bj~>J+HnYBxjj0JS zT|kiuH+%AEOs&B>gB8%g^O)_XpYZE|LYgSqA{vqsv=&lq54J6#r@Pd4^XX8l?Gr~IIw_fvXJ0zq%DQ;^($DSET|gHPATIwC zF(mR6M?V@5ior(Sg7-Za(GtmaQ}_IjJpE~By}3Ti4i>lsK1 z138x!G``5?9Za_mW@e-tO7}>%o8C|Hdxz4!LtqM-#^H27Q*)*dryY_R35QcIKUuYU z4m6nkdbh3&r*$Ul+?Cl5lhr5hrs0$`Os2EnE!ldLtt@3*@^H3=me?&dOfQjiiT%c0 zW_OybL9!htdq}eCi;YY#PEYaD_u7kS3e^2-hOdU6-f6?FL(20Io? z7IYr@$tf>@%{7N>UTd($sLTwy$7DZs7#{M@ zpx;e8G5Jz&J9@LokvnQR7r$1{gE%`e+wuq zyTN-6`Azn0?gH<%RBEz>?A_EryG<4ub-g##Km(gNp)u7O=pM<88*T$VDA@wivAt-Z zehb)h0cEL@Ei~B2coJ%$K8p95Et(29y&}2``$}BP2MB7c?2HIt^A8dDc z=Tqo+lU`~+MNQOYnUT#_`%T^jbcxB_D1IUBlWY(1tXN2|N@hfD5gn3@SHypL7m;=& z=VI8dr%1`z_8`7&b&biaRZn@B(d(ghuFL6&X?(xxMelOzvAivtTdAL9E9w2JGp<`H z|0cFEJLJ{rQIpyH$GvyZ@mBV+x0zfw8=iju=iXIR*~-56-a|8QmP28Q{eCP8tEovE zm(Y7@zj{~GPLti=fqZM|n8D02SKf%-M;{x^{uAPKAN9G7 zGu>lXvDdqg21#c0_Bt9bnK6IX(V9Eib0xi!;r6YgA53<{5$k(^u3ZIF2*x`d8NP>T zGgI^a_XzEmY$auT^L&rct#`9+CEc7+?0b{~_q4D|-xlg=vTHNWD38(cR@TF}m3}c< zLR4Shg$hVDLs}0w;Qbzi=(`Rc8wifJZ zid}24-6>;z&(O~M4E7Y*4mz^VU|P}w&$Cpz-e4tQ&(Ug=eI7Z{_dGpsun=99KHayI z4w=SfMQ4WYYi^jkaIn`C*2E3=UDEV=Y1C7EnI?gwwuD9N~@RT(E05 zaV{qvpOkG0`QD=I3@SdvY<`QDn#MqRcd*+{+cP=a;Ca|&f94E@?E}e-$h<|LO16;B z!~Nhb`t=-J(!*S!QMI?Ir)0)6R_G8t*Uor|j!0(I`)%@VmNgYz@3(2uBg_`i)ws#L zP5+YYq+@+qws@N!Fqmw_+w`z$<3_wqPnotkIlFvs({Co@M!b#l|3^7fqZMycm}Cp- z17#mvb0sqd;yYB<&hs6rH9fC|=Q}jPWKSw@_zqKjJI^C@t!W#L$Q+@k&#{GGFpWPb zhkZxrm}EwQN9mJxu1D!B({q=2&v%s0m@HO(&v%Sy3pc_@_b$04Gn(`+VU5DyLYhUN z`QD{`lO3{r<~vUPLMDCQ`kC)NnrO23w9kC+(;|~u#b>?`XpPC<0y{xFOtuS|o}?ot ztAXu9`oUytz&@hL$Bg2C0sEM8Br~dZii#eS_rHadgsFCldP$?vice@zJJ(OB&ddgJ z@O?s4Om^DxmG4uUZ?Z$yAAO&pG(qc<7*9DFuPJBjRm?ch{}&A50EtzM3SJlBcfvF< zDKb)}trd}xR-APG)#|EcYkU2}8Erm)myLpZ$l_Q14MRr3uZOo~@prkKi!1kMI#-Sh zR_To{gtL;09R4E3bH2z(8*RyJ$-!t$dsIjut-xU%=W|kensTTe2@h}q2Q%4~WyO>$ zD_H)Yte;EkFYcD&6}q}G5+`8yMMg#{bQ7vB==&W z-F`F}*6TWRMx$kmTM!|pd>J`IvniRYQrn3m(IRuIa9O$S$=rZV7?@c9+la-?f(;54 z<#U4aD8_rcvSxNF%aqMH5PF3^%x#ksF(xdg#?TkE^D$b_V@RP%=oE_)%Mi^eU=;_% zLi-CjJ7Y+`+B#NStT$n-sFWoqmEm(+XO7%+m^Ce_Zj-Uu1&uN}GaRPInM{|lSn%OPgWnw zMGigH)VKCMa!3lrwbUJ?o!s7u2bW@6je*uS%iB-07WuFF7;}f;Byv9GGOk7r-{boS zsD;rQo+QTj|9?kkG^h1rl<<-C|2ChaF6@5=;qn*kE(7@A(Wvfd*;xjDU!_tl{%uqo zJmZ@%_yQso;S9BizQo6k57v7eTX%y`DNa61p)aM7A8-nv)8ruD;Y9(hI3{H|1&Hs4 z0VAoe)SQ&KU6ki$&^|E-My$L~l4TT>y%47k9fI7YlqU5il&K8SzJx!upJM0GDUcy+OyO(B4 z&jQQhls6zJSG`3Amb#P=fG5*W0s9qyPGy$CaoRLjTlBT$ z6o>pE?^GrNFGxxgb7@k1wwOe9Ra{JX_uUBAZE<;GkcIWNmUk+P;W;p^TGUAmXVD9q z#>|VvSgDz0nN~GaW<3)6ucO8QJyjD#f#pHBpkL?|Ufs;J3{PD}b1hoR^bm^VfGj`^ z=7>6Ox7aQ<+v%y&Rbqu@cFG#D%F@mGfYd((d2Xi%#0KfJ)^bb2lVXGAUqw4aB{Z*z z?UuRS4vAfsw3IK!LCZ+zcVdf3^85~;;eM;K%MuO!2Fp@cIOIy-mm;)*F2rR66;-`~ zZ?w$8=6C~rgZKLz=wW<~;G|_tdAxGcveBCioDi7-)X?i?7V4g(Orp_`UCyGYqU z1AXPnc3P5nDe$?halrKw=O(f|Rq8ipPF94PRbnNfZe$FpmnJiLEW=6;^~TZ}$^zxW z>N(0jI@NVI^`wo(OB4?BO~AW4=qPd`id;d_(ap*)md~>9QC3*Kthx_)LDGFlWzBm? z=|@Y-bp=7jmkjpF_g!)7nR4#d=kOjOMcr7uSE;oe2|uj-LLq*lT}t11K2gfl@Z@Z< zl+ILtq137ko@@laOU}2-3Iuj9t*{KtW_fIQv*J+e63@sY&ng9$-W^WC`iVEnQma0L z+*nSt%%$A?BFne3n+B!XiX-+B2|@?ZVcVy1Wdu;7os}dc4Cy%Utz%+zHDs_}R)m$^!LJr_(6% z7Vj^XzLr-y{ApRC?kG^z@n&HkR~!=iXcE4pu?u&X=ar?3E9H!`N*$CL>Zm%@)Glf2 zQu;DKM_sEP%`Z@=%4D4 zr;e*#rXEzkL(Gn5rOwJt zNvELcmDbz36mK|kk!NznKv+M?8fN`P{jsXIRapOs8)aRqu1FnY?MF*pldSuwBq3-G zEhR0!$r@$Nj9hGWSkFsYW~~)3pd%dCi&E}@{`szpt+ncWeBU9(dRhD%z?h0`!96-u z+=I$Zvi8Ng_NjG{`f$XBTCF-Hb|CO=d_iF;-H}a0gHH*0m)=Yhided#FcQe{fv84S`_3!c=*S{Fv;Qms0# zaECU@+P`oYQgL7(m(iMO{Sja1*heD@4{3A7so3M%Ov`Whe#8#CEdMija=Rbrup>ef zV*Iw5*3gHU2dp!#Kj2$GGp)ZvUSPf4-NCj%%!!zeRjf-*ifyUY9+hd^P4n_fZ2M(* z9FiS$+~`ZOuyBm+V_Cpb(I;k%?F-qAAEf{9(*Fw@8Fi~|m33n&2D|mN`)*rb%Vqh0 zTGm=uhAR9vZuhM~c2W_{*Tg0{gEz@pu!-V|t>lvWRo3;@AKB)L=15(c3(ZfqeX_8* z;x1P%&7~pG$Em+}%tqC7QNRYlqkX1wsN_%E2Jw;8X5V5R<9FFNAT2h2mbn$7&UT;R zudBcm(m-WewuZehThduZdqo-?Yj0eb&^PYwQQDw^fa` zPohWDUWC7`)l+M$E0Wpe2wqCZTCc(T-&J(2bB04`{I#1nh2NVv zw7m&eIpVa4$XkHpJKy0*(dH)H?KrC1qgJYM3coQ)kkRd|y;^(NQJ|&!k2_YWo(>(c z(&WW_;t(P0Iv>x=gN0u>g!RjaQPwi;7l-CNZM`8+RV!t$*J@{D6P>%LYwant?EBb4 z$a~9sI|nJ;)4M3Wb~ncJ)TE)#I_;9AI%hwbYN+7l>ti`S5@dA8YKKbha!%3?`_?*V zLf+!+YYB~wc*^;)oEQnRt=lahS1iLSTj&2wOAxXYDE4#Dv-~UZ(nmbyk{^c4KKel|D6Wg;w9G zK5V8n9Lw+mWg4dUKH3)YJ%Frv0OrWTa%91CE%BIsztFn0C&Ff`r#n0owo3aTdw_Y z{i)`RvPCqy?cr;cu6_@&OHDGc!k-nsMcIe@-c%X(*)r@KWF=Nv>uN`Y&y)I9*2a>C z@I_)mbs7CY8Xi7bFT;gxRN8mpJW9@lAC=Y>)TJie{R?HpO>sDE z`Ek+iqtZXhcG#ET4#nAC%jn`>LCN@%*$Ubi&v?qoSe{$#zDL%5y?8TehoiveIoOB_YUc_R=uZFSj2MCD}0HvTjG9+hXgOc$EDB5QuBqx zA0+-Ru~vDhU}A)d_Pr)tijf0{`Uehm_!hiNUly@NOp4%2WcyOE42QO2v#<)cic!`A z>y8d9A~uMZlkSY@Yb$fDj_}Eh>TG9{AB`Amd$Hujh?%yz-48_ULL~(45?!zw&b6`J z*HT#gdBiU4Zodm3q@0TVDPpNIijgw9{1!1&Ih%xmjAfW2H(-f#L?$5TN!F#dxKKuF zJ{n26U_yXBWVC+9}R^ZOLdSF=rYL3G!EE_ zCPEXSX^?ZM9+*#apedl$kc*JkL&cCi)Jtma2fFAB3eCgi8(IMTLE_J}1oH0^N!$oo z6}RFj!75Hbwu?I;JH&^`w5PZW*$oq1zzB(#i1m=i2rhoS*Z`a;HUp=Mt-u-LDdaF$ zJd0HG;qRiG#Oe^p3Q4wzk0C!H<)`4}qV3S2^~wvtNM#pf!Q=Mx`$w^MY)kG{XG;N@;IfC zHI^Icet#M;BBn$DJ?EjH;Sv4_NQ5*JEbC-FszA4#;>*}uu&gPx40 zupV?KdQB8-c1k=Uk?`FYR9#|?#4!?^B(9OT(^Ct;yE8*45VQw6C4hxb6CtEi1V^Qizi8veSh_RlArKJ;2 zPjIqCx0nC!Bl;tkacc$P6zFz`3be;MfE77z;H`cy@J4qmFt;l(L{}%X>uQO2m9p%w zVZ0@mF(h%H#8K%9(9Fr^jN+2gfy=5GAC#D#&hicMoq^f1fEO!R9^aku^*ka3m=!4b+V4*irMKswux3weH7AyAZY0g&~ugVmt{I4M%_;~g(>5NfL6 z=Q%OJAvilyXed?#1wYD31P-Sp;KhiTf^XWS0qZCoIFd4fqo^~Yiw9oFmtx%zbQw^g z(fAsxLSyg+HigDw8CU3Xd<#vXaahI`8Xv+rmO@wHyhy>%Ybt=-@DmP&o}y~tb{yL% z^fZ1;q|mci@fCcHtv9lM38c0VBl#bmZ^C3;aVw1Myz~0xC)zP*pkr zH6;;fSCY`(ekJ6^C02pEJuj-Z{;Ar7P&F2!;0upB{co_`Tuxhxc$_=)Ti^+--@7k4THii71Zf8F5j> z@QBe7^$`mqHblfls!bT5=lmVRQMTGn(=GB@9Pjcuq(X5W{g)f2r+Hle(2dqT;_MK-+mlta|PvJOZgjRApsP_11Jkq zG#dw*IXL^w#m$LtPZvrrm_z2XGk%ZsX;8TGCT#0V0 z!m#a*iCv9P4TfqqzGah*c4yNFBQd%%gF7^}E|y_uIQA ztSgkd0mp~?CX624JJ|n9c0b?7FphHoTXSBuhO%ICbiz zaaT62z}P5!ye zu}v4^F|logMQjP*mJ}tN+O|N97~tP_cdj^SjclIKy+`kgIkhXZJKjfSQ#&=|AJ1NH zTVr*KsHXMJ5k(?PtZ6PU5|3L|r|?|U{6mp=N8~iWS}aaQk5H3^l3>Mub;WM?*{q(X zO`fLZ%`cURqs{BOiO0oL+eVa%M8&(qt|)G|r)gKTXPWRdz2s@y*?dE}xVy8>rg*M_ zKEq`C{e*!8G7M{bh)eirZ#s(ZaR)qe{_P9BB@(5>v#-&2y_T85T8Lx{K@8<7~dU zyI7QR+)UiWD$iJeBT^_G$`wpIKz21v|yikMf>M9@2?RnMN{** zTCpi+gi+2|&j_0-aheg$8Rv=IzzDa^WhH|#c5v3o{%@Dd!| znjn=Yn&i-C zT8#6WxAzn&9Uo+lh742S()1{&0BgEK(#M;B?kO^I^4at(!)}yO$-+s7{YWcEKqT0L z&aC>Z`GQ^|vF8urGN0(E1!EPr%f*(TWx>19W^)v=nb5Sl;fEs{_xt&bS4A-#eO#`O`IRyBYoY`e9O*l)p`OUTkNeLs;Jd3OEvU(PAndj8WzE3fS3kGiXQeLr!t+ds*?+rc}3 qQgh8kB3?Defs/rjw.HediffDef_PartBase[defName="CatVagina"] -
  • +
  • 6 1.0 2.0 0.05 - 6 - 14 + 9 + 10 0 15 - 14 + 1 Womb/Womb Genitals/Vagina FirstHalf + 9
  • @@ -126,19 +127,19 @@ Defs/rjw.HediffDef_PartBase[defName="RodentVagina"] -
  • +
  • 5 1.0 2.0 0.05 - 2 - 7 + 6 + 9 0 3 - 7 + 1 Womb/Womb Genitals/Vagina - 1 + 6
  • diff --git a/changelogs.txt b/changelogs.txt index 1ff7c19..0574f05 100644 --- a/changelogs.txt +++ b/changelogs.txt @@ -1,3 +1,8 @@ +Version 1.0.1.13 + - requires RJW 4.6.1 or later + - added induced ovulator + - fenline and rodent vagina ovulate after sex in follicular stage + - minor bug fix Version 1.0.1.12 - requires RJW 4.6.1 or later - added HybridExtension attribute to PawnDNAModExtension diff --git a/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvaulator.cs b/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvaulator.cs new file mode 100644 index 0000000..cf0c068 --- /dev/null +++ b/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_InducedOvaulator.cs @@ -0,0 +1,64 @@ +using HugsLib; +using RimWorld; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using Verse; + +namespace RJW_Menstruation +{ + public class CompProperties_InducedOvulator : CompProperties_Menstruation + { + public CompProperties_InducedOvulator() + { + compClass = typeof(HediffComp_InducedOvulator); + } + + } + + public class HediffComp_InducedOvulator : HediffComp_Menstruation + { + protected override void FollicularAction() + { + if (!IsBreedingSeason()) + { + GoNextStage(Stage.Anestrus); + return; + } + if (curStageHrs >= FollicularIntervalHours) + { + GoNextStage(Stage.Luteal); + } + else + { + curStageHrs += Configurations.CycleAcceleration; + if (!estrusflag && curStageHrs > FollicularIntervalHours - Props.estrusDaysBeforeOvulation * 24) + { + estrusflag = true; + SetEstrus(Props.eggLifespanDays + Props.estrusDaysBeforeOvulation); + } + StayCurrentStage(); + } + } + + public override void AfterCumIn(Pawn cummer) + { + base.AfterCumIn(cummer); + if (curStage == Stage.Follicular) curStage = Stage.Ovulatory; + } + + + + } + + + + + + + + + +} diff --git a/source/RJW_Menstruation/RJW_Menstruation/HediffComp_Menstruation.cs b/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs similarity index 86% rename from source/RJW_Menstruation/RJW_Menstruation/HediffComp_Menstruation.cs rename to source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs index cccbb8f..b3df198 100644 --- a/source/RJW_Menstruation/RJW_Menstruation/HediffComp_Menstruation.cs +++ b/source/RJW_Menstruation/RJW_Menstruation/HediffComps/HediffComp_Menstruation.cs @@ -97,18 +97,18 @@ namespace RJW_Menstruation Anestrus } - private List cums; - private List eggs; - private int follicularIntervalhours = -1; - private int lutealIntervalhours = -1; - private int bleedingIntervalhours = -1; - private int recoveryIntervalhours = -1; - private float crampPain = -1; - private Need sexNeed = null; - private string customwombtex = null; - private string customvagtex = null; - private bool estrusflag = false; - private int opcache = -1; + protected List cums; + protected List eggs; + protected int follicularIntervalhours = -1; + protected int lutealIntervalhours = -1; + protected int bleedingIntervalhours = -1; + protected int recoveryIntervalhours = -1; + protected float crampPain = -1; + protected Need sexNeed = null; + protected string customwombtex = null; + protected string customvagtex = null; + protected bool estrusflag = false; + protected int opcache = -1; public int ovarypowerthreshold { @@ -586,7 +586,7 @@ namespace RJW_Menstruation AfterFluidIn(cumd); } - public void AfterCumIn(Pawn cummer) + public virtual void AfterCumIn(Pawn cummer) { if (xxx.is_human(parent.pawn) && xxx.is_human(cummer)) { @@ -1205,6 +1205,150 @@ namespace RJW_Menstruation parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn)); } + protected virtual void FollicularAction() + { + if (!IsBreedingSeason()) + { + GoNextStage(Stage.Anestrus); + return; + } + if (curStageHrs >= FollicularIntervalHours) + { + GoNextStage(Stage.Ovulatory); + } + else + { + curStageHrs += Configurations.CycleAcceleration; + if (!estrusflag && curStageHrs > FollicularIntervalHours - Props.estrusDaysBeforeOvulation * 24) + { + estrusflag = true; + SetEstrus(Props.eggLifespanDays + Props.estrusDaysBeforeOvulation); + } + StayCurrentStage(); + } + } + + protected virtual void OvulatoryAction() + { + estrusflag = false; + int i = 0; + do + { + ovarypower--; + eggs.Add(new Egg((int)(Props.eggLifespanDays * 24 / CycleFactor))); + i++; + } while (i < Rand.ByCurve(parent.pawn.RaceProps.litterSizeCurve) + eggstack); + eggstack = 0; + if (Configurations.EnableMenopause && ovarypower < 1) + { + eggs.Clear(); + Hediff hediff = parent.pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_Climacteric); + if (hediff != null) parent.pawn.health.RemoveHediff(hediff); + hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn); + hediff.Severity = 0.2f; + parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn)); + GoNextStage(Stage.Young); + } + else if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold) + { + Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Climacteric, parent.pawn); + hediff.Severity = 0.008f * i; + parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn)); + lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor * 6); + GoNextStage(Stage.ClimactericLuteal); + } + else + { + lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor); + GoNextStage(Stage.Luteal); + } + } + + protected virtual void LutealAction() + { + if (!eggs.NullOrEmpty()) + { + EggDecay(); + FertilizationCheck(); + if (Implant()) GoNextStage(Stage.Pregnant); + else + { + curStageHrs += Configurations.CycleAcceleration; + StayCurrentStage(); + } + } + else if (curStageHrs <= lutealIntervalhours) + { + curStageHrs += Configurations.CycleAcceleration; + StayCurrentStage(); + } + else + { + if (Props.bleedingIntervalDays == 0) + { + follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); + GoNextStage(Stage.Follicular); + } + else + { + bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor); + if (crampPain >= 0.05f) + { + AddCrampPain(); + } + GoNextStage(Stage.Bleeding); + } + } + } + + protected virtual void BleedingAction() + { + if (curStageHrs >= bleedingIntervalhours) + { + follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); + Hediff hediff = parent.pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_MenstrualCramp); + if (hediff != null) parent.pawn.health.RemoveHediff(hediff); + GoNextStage(Stage.Follicular); + } + else + { + if (curStageHrs < bleedingIntervalhours / 4) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut(); + curStageHrs += Configurations.CycleAcceleration; + StayCurrentStage(); + } + } + + protected virtual void PregnantAction() + { + if (!eggs.NullOrEmpty()) + { + EggDecay(); + FertilizationCheck(); + Implant(); + } + if (parent.pawn.IsPregnant()) StayCurrentStageConst(Stage.Pregnant); + else GoNextStage(Stage.Recover); + } + + protected virtual void YoungAction() + { + if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) <= 0) StayCurrentStageConst(Stage.Young); + else GoNextStage(Stage.Follicular); + } + + protected virtual void AnestrusAction() + { + if (IsBreedingSeason()) + { + GoFollicularOrBleeding(); + } + else + { + StayCurrentStage(); + } + } + + private Action PeriodSimulator(Stage targetstage) { Action action = null; @@ -1213,118 +1357,25 @@ namespace RJW_Menstruation case Stage.Follicular: action = delegate { - if (!IsBreedingSeason()) - { - GoNextStage(Stage.Anestrus); - return; - } - if (curStageHrs >= FollicularIntervalHours) - { - GoNextStage(Stage.Ovulatory); - } - else - { - curStageHrs += Configurations.CycleAcceleration; - if (!estrusflag && curStageHrs > FollicularIntervalHours - Props.estrusDaysBeforeOvulation * 24) - { - estrusflag = true; - SetEstrus(Props.eggLifespanDays + Props.estrusDaysBeforeOvulation); - } - StayCurrentStage(); - } + FollicularAction(); }; break; case Stage.Ovulatory: action = delegate { - estrusflag = false; - int i = 0; - do - { - ovarypower--; - eggs.Add(new Egg((int)(Props.eggLifespanDays * 24 / CycleFactor))); - i++; - } while (i < Rand.ByCurve(parent.pawn.RaceProps.litterSizeCurve) + eggstack); - eggstack = 0; - if (Configurations.EnableMenopause && ovarypower < 1) - { - eggs.Clear(); - Hediff hediff = parent.pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_Climacteric); - if (hediff != null) parent.pawn.health.RemoveHediff(hediff); - hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Menopause, parent.pawn); - hediff.Severity = 0.2f; - parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn)); - GoNextStage(Stage.Young); - } - else if (Configurations.EnableMenopause && ovarypower < ovarypowerthreshold) - { - Hediff hediff = HediffMaker.MakeHediff(VariousDefOf.Hediff_Climacteric, parent.pawn); - hediff.Severity = 0.008f * i; - parent.pawn.health.AddHediff(hediff, Genital_Helper.get_genitalsBPR(parent.pawn)); - lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor * 6); - GoNextStage(Stage.ClimactericLuteal); - } - else - { - lutealIntervalhours = PeriodRandomizer(lutealIntervalhours, Props.deviationFactor); - GoNextStage(Stage.Luteal); - } + OvulatoryAction(); }; break; case Stage.Luteal: action = delegate { - if (!eggs.NullOrEmpty()) - { - EggDecay(); - FertilizationCheck(); - if (Implant()) GoNextStage(Stage.Pregnant); - else - { - curStageHrs += Configurations.CycleAcceleration; - StayCurrentStage(); - } - } - else if (curStageHrs <= lutealIntervalhours) - { - curStageHrs += Configurations.CycleAcceleration; - StayCurrentStage(); - } - else - { - if (Props.bleedingIntervalDays == 0) - { - follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); - GoNextStage(Stage.Follicular); - } - else - { - bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor); - if (crampPain >= 0.05f) - { - AddCrampPain(); - } - GoNextStage(Stage.Bleeding); - } - } + LutealAction(); }; break; case Stage.Bleeding: action = delegate { - if (curStageHrs >= bleedingIntervalhours) - { - follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); - Hediff hediff = parent.pawn.health.hediffSet.GetFirstHediffOfDef(VariousDefOf.Hediff_MenstrualCramp); - if (hediff != null) parent.pawn.health.RemoveHediff(hediff); - GoNextStage(Stage.Follicular); - } - else - { - if (curStageHrs < bleedingIntervalhours / 4) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut(); - curStageHrs += Configurations.CycleAcceleration; - StayCurrentStage(); - } + BleedingAction(); }; break; case Stage.Fertilized: //Obsoleted stage. merged in luteal stage @@ -1332,35 +1383,12 @@ namespace RJW_Menstruation { ModLog.Message("Obsoleted stage. skipping..."); GoNextStage(Stage.Luteal); - //if (curStageHrs >= 24) - //{ - // if (Implant()) - // { - // GoNextStage(Stage.Pregnant); - // } - // else - // { - // GoNextStageSetHour(Stage.Luteal, 96); - // } - //} - //else - //{ - // curStageHrs+=Configurations.CycleAcceleration; - // StayCurrentStage(); - //} }; break; case Stage.Pregnant: action = delegate { - if (!eggs.NullOrEmpty()) - { - EggDecay(); - FertilizationCheck(); - Implant(); - } - if (parent.pawn.IsPregnant()) StayCurrentStageConst(Stage.Pregnant); - else GoNextStage(Stage.Recover); + PregnantAction(); }; break; case Stage.Recover: @@ -1398,8 +1426,7 @@ namespace RJW_Menstruation case Stage.Young: action = delegate { - if (parent.pawn.health.capacities.GetLevel(xxx.reproduction) <= 0) StayCurrentStageConst(Stage.Young); - else GoNextStage(Stage.Follicular); + YoungAction(); }; break; case Stage.ClimactericFollicular: @@ -1484,14 +1511,7 @@ namespace RJW_Menstruation case Stage.Anestrus: action = delegate { - if (IsBreedingSeason()) - { - GoFollicularOrBleeding(); - } - else - { - StayCurrentStage(); - } + AnestrusAction(); }; break; default: @@ -1511,48 +1531,50 @@ namespace RJW_Menstruation actionref = action; return actionref; - void GoNextStage(Stage nextstage, float factor = 1.0f) + + + + } + + protected void GoNextStage(Stage nextstage, float factor = 1.0f) + { + curStageHrs = 0; + curStage = nextstage; + HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(nextstage), (int)(tickInterval * factor), parent.pawn, false); + } + + + protected void GoNextStageSetHour(Stage nextstage, int hour, float factor = 1.0f) + { + curStageHrs = hour; + curStage = nextstage; + HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(nextstage), (int)(tickInterval * factor), parent.pawn, false); + } + + //stage can be interrupted in other reasons + protected void StayCurrentStage(float factor = 1.0f) + { + HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(curStage), (int)(tickInterval * factor), parent.pawn, false); + } + + //stage never changes + protected void StayCurrentStageConst(Stage curstage, float factor = 1.0f) + { + HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(curstage), (int)(tickInterval * factor), parent.pawn, false); + } + + protected void GoFollicularOrBleeding() + { + if (Props.bleedingIntervalDays == 0) { - curStageHrs = 0; - curStage = nextstage; - HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(nextstage), (int)(tickInterval * factor), parent.pawn, false); + follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); + GoNextStage(Stage.Follicular); } - - - void GoNextStageSetHour(Stage nextstage, int hour, float factor = 1.0f) + else { - curStageHrs = hour; - curStage = nextstage; - HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(nextstage), (int)(tickInterval * factor), parent.pawn, false); + bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor); + GoNextStage(Stage.Bleeding); } - - //stage can be interrupted in other reasons - void StayCurrentStage(float factor = 1.0f) - { - HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(curStage), (int)(tickInterval * factor), parent.pawn, false); - } - - //stage never changes - void StayCurrentStageConst(Stage curstage, float factor = 1.0f) - { - HugsLibController.Instance.TickDelayScheduler.ScheduleCallback(PeriodSimulator(curstage), (int)(tickInterval * factor), parent.pawn, false); - } - - void GoFollicularOrBleeding() - { - if (Props.bleedingIntervalDays == 0) - { - follicularIntervalhours = PeriodRandomizer(follicularIntervalhours, Props.deviationFactor); - GoNextStage(Stage.Follicular); - } - else - { - bleedingIntervalhours = PeriodRandomizer(bleedingIntervalhours, Props.deviationFactor); - GoNextStage(Stage.Bleeding); - } - } - - } diff --git a/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj b/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj index 21b8c0a..ab4ccd1 100644 --- a/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj +++ b/source/RJW_Menstruation/RJW_Menstruation/RJW_Menstruation.csproj @@ -61,12 +61,13 @@ + - + diff --git a/source/RJW_Menstruation/RJW_Menstruation/Things.cs b/source/RJW_Menstruation/RJW_Menstruation/Things.cs index 700b5e3..d28a4ee 100644 --- a/source/RJW_Menstruation/RJW_Menstruation/Things.cs +++ b/source/RJW_Menstruation/RJW_Menstruation/Things.cs @@ -63,7 +63,9 @@ namespace RJW_Menstruation if (childNodes.Count >= 1) foreach (XmlNode node in childNodes) { - //Log.Message(xmlRoot.Name + "HybridInfo: " + node.Name + " " + node.InnerText); +#if DEBUG + Log.Message(xmlRoot.Name + "HybridInfo: " + node.Name + " " + node.InnerText); +#endif hybridInfo.Add(node.Name, ParseHelper.FromString(node.InnerText)); } diff --git a/source/RJW_Menstruation/RJW_Menstruation/Utility.cs b/source/RJW_Menstruation/RJW_Menstruation/Utility.cs index 034d124..61324fe 100644 --- a/source/RJW_Menstruation/RJW_Menstruation/Utility.cs +++ b/source/RJW_Menstruation/RJW_Menstruation/Utility.cs @@ -227,8 +227,9 @@ namespace RJW_Menstruation public static Texture2D GetGenitalIcon(this Pawn pawn) { - var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn)).Find((Hediff h) => h.def.defName.ToLower().Contains("vagina")); - HediffComp_Menstruation comp = pawn.GetMenstruationComp(); + var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.Find((Hediff h) => h.def.defName.ToLower().Contains("vagina")); + if (hediff == null) return ContentFinder.Get("Genitals/Vagina00", true); + HediffComp_Menstruation comp = hediff.GetMenstruationComp(); string icon; if (comp != null) icon = comp.vagTex; else icon = "Genitals/Vagina"; @@ -254,7 +255,7 @@ namespace RJW_Menstruation var hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault((Hediff h) => h.def.defName.ToLower().Contains("anus")); if (hediff != null) { - CompProperties_Anus Props = (CompProperties_Anus)hediff.TryGetComp().props; + CompProperties_Anus Props = (CompProperties_Anus)hediff.TryGetComp()?.props; string icon; if (Props != null) icon = Props.analTex ?? "Genitals/Anal"; else icon = "Genitals/Anal";