From 3ccea103e014057baf8f808319ff9d2911431b76 Mon Sep 17 00:00:00 2001 From: Ed86 Date: Wed, 26 Oct 2022 13:25:26 +0300 Subject: [PATCH] support for 1.4 --- 1.3/Source/Mod/Whoring.csproj | 2 +- 1.4/Assemblies/RimJobWorldWhoring.dll | Bin 0 -> 63488 bytes 1.4/Defs/JobDefs/Jobs_Whoring.xml | 17 + 1.4/Defs/RecordDefs/Records.xml | 18 + 1.4/Defs/Rooms/RoomRoles.xml | 17 + .../ThinkTreeDefs/ThinkTrees_Prisoner.xml | 22 + 1.4/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml | 43 ++ 1.4/Defs/ThoughtDefs/Thoughts_Whore.xml | 125 ++++++ 1.4/Defs/TipSetDefs/Tips.xml | 13 + 1.4/Defs/WhoreBackstories.xml | 30 ++ .../WhoringTab/PawnColumnDefs/PawnColumns.xml | 52 +++ 1.4/Defs/WhoringTab/PawnTableDefs.xml | 33 ++ 1.4/Languages/English/Keyed/Whoring.xml | 43 ++ 1.4/Patches/FacialAnimation_compatibility.xml | 27 ++ 1.4/Source/Mod/Data/BedData.cs | 39 ++ 1.4/Source/Mod/Data/DataStore.cs | 50 +++ 1.4/Source/Mod/Data/StringListDef.cs | 14 + 1.4/Source/Mod/DefOf/RecordDefDefOf.cs | 12 + 1.4/Source/Mod/DefOf/ThoughtDefOf.cs | 19 + .../JobDriver_WhoreInvitingVisitors.cs | 172 +++++++ .../JobDriver_WhoreIsServingVisitors.cs | 183 ++++++++ .../JobGiver_WhoreInvitingVisitors.cs | 260 +++++++++++ 1.4/Source/Mod/Location/Brothel_Room.cs | 28 ++ .../ThinkNode_ChancePerHour_Whore.cs | 59 +++ .../ThinkNode_ConditionalWhore.cs | 25 ++ .../Mod/Thoughts/ThoughtWorker_Whore.cs | 43 ++ 1.4/Source/Mod/Whoring.csproj | 112 +++++ 1.4/Source/Mod/WhoringBase.cs | 71 +++ .../WhoringTab/PawnColumnCheckbox_Whore.cs | 151 +++++++ .../PawnColumnWorker_AverageMoneyByWhore.cs | 29 ++ .../PawnColumnWorker_CountOfWhore.cs | 23 + .../PawnColumnWorker_EarnedMoneyByWhore.cs | 23 + .../WhoringTab/PawnColumnWorker_IsWhore.cs | 40 ++ .../Mod/WhoringTab/PawnColumnWorker_Mood.cs | 29 ++ .../PawnColumnWorker_PriceRangeOfWhore.cs | 55 +++ .../WhoringTab/PawnColumnWorker_TextCenter.cs | 33 ++ .../PawnColumnWorker_WhoreExperience.cs | 19 + 1.4/Source/Mod/WhoringTab/PawnTable_Whores.cs | 33 ++ 1.4/Source/Mod/WhoringTab/WhoreCheckbox.cs | 86 ++++ 1.4/Source/Mod/Whoring_Bed_Utilities.cs | 371 +++++++++++++++ 1.4/Source/Mod/Whoring_Helper.cs | 425 ++++++++++++++++++ 1.4/Source/Mod/harmony_AftersexPatch.cs | 64 +++ 1.4/Source/Mod/harmony_Building_BedPatches.cs | 292 ++++++++++++ 1.4/Source/Mod/harmony_RJWTab_patch.cs | 53 +++ 1.4/Source/Mod/packages.config | 4 + 1.4/Source/Properties/AssemblyInfo.cs | 32 ++ 1.4/Source/mod.sln | 25 ++ 1.4/Textures/UI/Commands/AsWhore.png | Bin 0 -> 3794 bytes 1.4/Textures/UI/Commands/AsWhoreMany.png | Bin 0 -> 6942 bytes 1.4/Textures/UI/Commands/Service_Refuse.png | Bin 0 -> 26998 bytes 1.4/Textures/UI/Commands/Service_off.png | Bin 0 -> 22002 bytes 1.4/Textures/UI/Commands/Service_on.png | Bin 0 -> 37690 bytes 1.4/Textures/UI/Tab/ComfortPrisoner_off.png | Bin 0 -> 4338 bytes .../UI/Tab/ComfortPrisoner_off_nobg.png | Bin 0 -> 7577 bytes 1.4/Textures/UI/Tab/ComfortPrisoner_on.png | Bin 0 -> 4396 bytes 1.4/Textures/UI/Tab/Service_off.png | Bin 0 -> 3940 bytes 1.4/Textures/UI/Tab/Service_on.png | Bin 0 -> 3986 bytes About/About.xml | 1 + 58 files changed, 3316 insertions(+), 1 deletion(-) create mode 100644 1.4/Assemblies/RimJobWorldWhoring.dll create mode 100644 1.4/Defs/JobDefs/Jobs_Whoring.xml create mode 100644 1.4/Defs/RecordDefs/Records.xml create mode 100644 1.4/Defs/Rooms/RoomRoles.xml create mode 100644 1.4/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml create mode 100644 1.4/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml create mode 100644 1.4/Defs/ThoughtDefs/Thoughts_Whore.xml create mode 100644 1.4/Defs/TipSetDefs/Tips.xml create mode 100644 1.4/Defs/WhoreBackstories.xml create mode 100644 1.4/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml create mode 100644 1.4/Defs/WhoringTab/PawnTableDefs.xml create mode 100644 1.4/Languages/English/Keyed/Whoring.xml create mode 100644 1.4/Patches/FacialAnimation_compatibility.xml create mode 100644 1.4/Source/Mod/Data/BedData.cs create mode 100644 1.4/Source/Mod/Data/DataStore.cs create mode 100644 1.4/Source/Mod/Data/StringListDef.cs create mode 100644 1.4/Source/Mod/DefOf/RecordDefDefOf.cs create mode 100644 1.4/Source/Mod/DefOf/ThoughtDefOf.cs create mode 100644 1.4/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs create mode 100644 1.4/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs create mode 100644 1.4/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs create mode 100644 1.4/Source/Mod/Location/Brothel_Room.cs create mode 100644 1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs create mode 100644 1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs create mode 100644 1.4/Source/Mod/Thoughts/ThoughtWorker_Whore.cs create mode 100644 1.4/Source/Mod/Whoring.csproj create mode 100644 1.4/Source/Mod/WhoringBase.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs create mode 100644 1.4/Source/Mod/WhoringTab/PawnTable_Whores.cs create mode 100644 1.4/Source/Mod/WhoringTab/WhoreCheckbox.cs create mode 100644 1.4/Source/Mod/Whoring_Bed_Utilities.cs create mode 100644 1.4/Source/Mod/Whoring_Helper.cs create mode 100644 1.4/Source/Mod/harmony_AftersexPatch.cs create mode 100644 1.4/Source/Mod/harmony_Building_BedPatches.cs create mode 100644 1.4/Source/Mod/harmony_RJWTab_patch.cs create mode 100644 1.4/Source/Mod/packages.config create mode 100644 1.4/Source/Properties/AssemblyInfo.cs create mode 100644 1.4/Source/mod.sln create mode 100644 1.4/Textures/UI/Commands/AsWhore.png create mode 100644 1.4/Textures/UI/Commands/AsWhoreMany.png create mode 100644 1.4/Textures/UI/Commands/Service_Refuse.png create mode 100644 1.4/Textures/UI/Commands/Service_off.png create mode 100644 1.4/Textures/UI/Commands/Service_on.png create mode 100644 1.4/Textures/UI/Tab/ComfortPrisoner_off.png create mode 100644 1.4/Textures/UI/Tab/ComfortPrisoner_off_nobg.png create mode 100644 1.4/Textures/UI/Tab/ComfortPrisoner_on.png create mode 100644 1.4/Textures/UI/Tab/Service_off.png create mode 100644 1.4/Textures/UI/Tab/Service_on.png diff --git a/1.3/Source/Mod/Whoring.csproj b/1.3/Source/Mod/Whoring.csproj index 3030a5d..80f1f7d 100644 --- a/1.3/Source/Mod/Whoring.csproj +++ b/1.3/Source/Mod/Whoring.csproj @@ -40,7 +40,7 @@ False - ..\..\..\..\..\..\..\workshop\content\294100\818773962\v1.2\Assemblies\HugsLib.dll + ..\..\..\..\..\..\..\workshop\content\294100\818773962\v1.3\Assemblies\HugsLib.dll False diff --git a/1.4/Assemblies/RimJobWorldWhoring.dll b/1.4/Assemblies/RimJobWorldWhoring.dll new file mode 100644 index 0000000000000000000000000000000000000000..af89fa2582a2258926bc9fcd2681451c02d5c234 GIT binary patch literal 63488 zcmcG%3w)Ht)jvMZWuLuflieh{2?25=@Q}@gT!4TG1dxk@-0x}#$pVp(h20>;kQf9n zc&+zhZ3|jkQENriSJYRrB9&^rw)Ij)sn%EQ#agXxt&P9$IrD7tY>fT&_kRBWeAu&d z&YU@O=FFLyGxN-|%v<#>p$Q>$e7^chh)3{Ee^VL$d(eYyfBvI>@u2$`g^wt6e^Iz( zLrbDyb3C>_-ngltsj;ms)?TnSS`gpbR?yN`Fk}AWf=#jJXhm9@XM`ns!5Ko#RWz~R zwX!K$+qb2A?N6L@kT1^dz$e2u;w^p*c;7rIVY zi-hQTvdhV&NnNm9lH{hO33u@bQ7Qz^L1*A~FIZfUZ=?4-TO`j1mxzPLMpX zvZL;HvVEDM!6;}ItmLS>mPoNWaFn|={+8`kBimJT0?1`vjlZQOU;{OBo?kEXIyxsJ zm#LvlJ)oD(hMdz_j%rTAH{@g*0i(>_9Y#ws9T8`Dh!bk(>B#P!OkfIusQ>{-R#vPY z2^uhY@U46(mTbS7hPIFV_igv3CEM;5>rfW93MBU9+heF*FupE~_+IiAa~f*tLLcby zgTT${RH?SW=p<4M#Uh<&fMoOh5_mY|cjx`mE3B&)E)m)1D$SzZQ9n_vdRKPsJRwWh7CQHPoOIgHDl9iT)tum?7BT6XK z6`(mlmS;DoTHOJ6*-%OATn2@@my=ev?%g{j6hk9CBAgb{LunD=F7<>Zc8U@X@n?!dTzC)FR-Pz+0uv}`uIC+=?iV?PFs41E!|~HciYkz+0s3> z^iEs)Vq1EbExo%h-9sa}^kV5^Wg+>kn(!LKgb!KE6DFI^OQ_7H0Hv0zo0kEBla}^c zUMr`9%R$Yr?!v0+v7Gse{^XTNc3%Zhbh_uY$>!BaQTT%O(jgA192*8i;u?@Ws%pY% z4e7w0$`!Nf`~)+sj}j$KPtb$<&GQ(7jbYPX6>?KnSVQ zh8uu{Vu%YoSc%pO1Y}fod^EUePP2yZO~^NI29QlO`*8CX5HpRSVSbxfupW45=Cjyt z1={@`fUtQRAXb8eh%YA5PRmxOQ2`qDZV}(f86to@YGr>V|4F5oPOM^Is}vyywTb2z zPrx(5Eo};tLCcHrP4@jRRI_!PW#2(oTA3639{8t*{Ch@g}0%oIrX=rZ3_ z5_zuJ0bnV`X)q6o-A&}uGgb2*B%~G0dy%9#*C|G#0dOH|7tIl>`C~v+cUq$!gL+t_rqR?>q?-35&x)C6LKX}fNc;>e9z*MbL+TJbh!eyPf)z2;v*1iT zfOPB-09hss3;80#RVwEdOya`J`e~t1$b1l7Q1T(k>@u*L=1y7V=`KJ`95i8m$QMS@ zFP?w?^zlJ;KpX(kX^|2uH`kUs-dBWrrkD>yE;C_ChD{MCe}H+-M{PRJZBo0=qBd!v zB}ONu%F^Vw`CnWz%z@H`0dY}TLHxV$LyL1BIOF@tbss@W#&TJi&N|vq8i`{7C6coX z{-AfA4WL;?mm_nDp`F2(`n~nh>kr9;B~^vKPSoPH;)N7i+G(* zqm#t;8c(NWm@dk-#L!$ulMF>Rc_`6qJU0k)B$ux#=X3y(cnZ)rKp&c3T7)z9Q{-j(A~OQM7+T@UOv9j|9tote zMa-i_^auQ9g{kysh@KuuFLS%V3Ui}o$Ot1*e&|FR<_;Io5YgX?tWQ>yfr>I@Mc70I zES;_Zm#iol2$mJ5(z&9{KqgfbNLG~5Ur`1s%CIW386_)_1*44D#b(!_MscAhevxAC zG&fs1Gdqx7HqLI}P#^?R9T4RnRFs=Gjgd@e#DUJiM$}mf`wzupDsE90eyF5jNYGwf zUAR!?H0>L&MHd1I2#v!DEVJlYy{-dftv`g=idk7H&$d%gm5LJp+V;_Af=f-OQYPjA z_B7fJ4uceoG*3zA&jItzm0k2rHH5)yGm|smMBAQ5+ce%7#q%5~BT5SjvlwRbIoiuQrvWDpcYH-pP+wi%l0`kg*_R_QnotAesVojwa z#KZsglCV_u_L7|VO31psBv(qly<|wdkq9P+Sl^7GM@G4{f)(fhxiEBNka?UuHM#9hD%V1hKtS(& z8T8Iq2)qiwy)+u96R}?s##{9w@`z05iMavYoQ<}#U3DY8!XpF({|b!d-#d|xB`Jgf zlxI1&5$@GxRAiNp_>6*sKUT!5jeTy%XB4Ukignxh*hrv3zlJy~zEnjSYKAG`cjjxL zWAW8P-bkL7Wxfs+vkWGFqPR8l4G?(e4H<8;jPupRZ;WF2+W9sT z?FgXMPRcJ$p%5$fTDrjONs0v$u%3Z47Pa#PigmsN(2en+$KFM%Yd%ul*#K7dNf1lQ z^^sYTfce|Lw4?Jqq+{;`V8zQ8n8~RiA6ywLSO_LFNs6F4)g&1E9r(j5V;|tFS4DHN zX4^B;A_zN(5fcQu(n$OdRq`PfTETlvnBx>MQQ8*27Ty*%KLXb2Ma_xdBh^ECqpb?9 zw{*N55b=ZHwu;f40{1bBH$5DcT`7uxqq2o>i!>kVt z;UotZi}YZoL7TbMd~n1G^s~ixrJ#MKhV_?vib@f%m3lh`?JJevUrKYL6aibQ(J5$O zse=AeE2$I#Td70}+E;2gN>OC=2@KHZzc4NgihnrqoQmG@XogvbZ+2AVWsY%)YJ3NY zN8{5WqpSeT6zB~Jg|iVq{sqZ0A2L5h0xpk8#gi03=K)x<1zb3gfNS%))(U7Mv@(}Q zF=YhoaJP`q;2`jMBk@;=q0LFe7jcLz8FbOPEu5Y{{kj_F#H6ZJ4?I(#J;*P^HpLQ+ z5m_VD?uDq5k7ySl(QEuNSx-q1<trM5%E*Klbsv!HFxr= z6_94I`sPa+YWIF0FZQvvnF}J6CQL3$eMYd9qQPM*> zw1GyfX2K&PK3Aw$rBI5eVNAS^x|<=#*}XVb1g6ZS2+Cm*2oK;CSmv=}HVD;a!c8!P zxnnA-%5+7l1Fo1xNjF?2E8ymnZh79_tFV`aX{T9+CDY(u8!1qN0D8;IWo>s-3V#@mzE>JA3@wsab_pNOIl2qj}uP2qK99EuAvq?{HWQdcs^oeeo zdt5O@vPOs>s$g+rZBCqkdpn($E`2)Gijk{$O5<~i)tIkxNe33AvKWs>J^f@wfWCzo zUxs)av8!HFY;>X;T~b3vr$K7zP{-(WA-S?wrOkr7Y^JbErpt_imsBBob!75MDqOLI z3*=8S9VngeId{bhsk*EH-HCA35`x8&dKrU>L;13x{O&YRGUfy**RmomH9y^S0ikZ? z19by4vD%H}08cpE^x(^@Iam2yvI2Mx#qm{GR!DJ6KVFpojdE}rVc2xGRAvkC6E4HW zPq(nsBXhZuolom!A?!Sa>@01|j)UFjNeq-uFSP6S0mRY(*hIBLv+GX5N5HYlSnaWe zd}I}G{1%#Y@!-;f{zu2mp1#Tx@?w8XlE}rg5t&|rT2#3WfK@y#ULoz?e6G)MZd~cw zxFXFamn^d--;<2hK0yT(tL>{DXuN|d!w?C{ zQp4llVM@L`sL5h7z+>&*nQjaf+GfHpHL(NVaO^_x6vr^4;11ao;0Y&U6jhXxy?k-tF;G|Ai4r_X>mxU5X&!!UCQsg$qA z^6*_ARwdg|AaTr`n`6U}!s-N790F<_&a@libjuK9Wjo8u2Q^4}s9!~WWGLb=i=Z6L1ZRSod=XdJhhAm3c*5R3 zo@4YC{8-(lom`gqDSPSlc7FK)-o_~(#nTy=Djq;P5jLjG`JFo2$+h&VXzob6uucc^ zY%5?=*%+qeV(4!oK#9QdR}0MVktr4xJEaknSptA3Ma-F`jRZ~QfQ`3R-1I{1t->q# zSekibqrfC5|MGhU?1D3}nelx1R@lS?dQVRwv|``Kpb!W$5nl*VP>;#NM6hKb7*XjV zpiCgzl8Hr}P|eX0K|>f!SY0WvMUF=4|8|-C{%gF)7d(FGcOS zJWyTy0L&Y4LHV93)_B&aJ@iaBAj}9@JIesn`~_w?zBk4y0C^iC=gJM>MHg`UDfa8U zfqWFtIX#`&y?DA;!B8B7u0*2Oco(WAs*q9ALpdgb1;kYt3^c14X_4U(KbDeP_pZc2 zqBFb_n`H!ByfOX|xi|@=d2uu9ETB5OM?i*L$o}olj&{{*{%~l=dqnJ-VQW!n7 zO|7ku2X|DGZM$j!&!nVA9OJM~Q;DVfbYxgz8uj^9`IMT@#dt@t28u^E4`fR|%%(U< zZaj!>&OkPbJUJ4o9GKJdq^ySm9tglD2FgUBmOMm9^e#gZ^7mO#3!YAWLZMZ;lf5z` z_e6as=c0b~N;m)(Fib0F1Dcb;yb(UW%Ij=3rvR~L8L~fiTC{El67Q2IiEi4I^P#;w z5yX9vIz$~ZqQVrV8p44mI#pmK9ul>aF5QPork?m7>wa!K;3o%Nt};sK+l8;6RX z*bIO)cczZRIgLZ#?N&I=C*!hI>!A*a35&We2(_ z6N*=2&S#_AuS^WE))K)D)nl_!r54Hx2aVorICoyaFz0||mr7yr(D-^tO_#xH{4%6% zj~{S8Ce-kZPHZQ6-$H;59@R$*ybQuDg;3++l#!{=m7_!2a;L`g$WRkT&6aG+=FJqho$= z{O!K#?Cx+*YB&9sgwKQeB|Vg54xyzSo8hymq3Lyhh2TJXY(8NbybzEF&?&y74t^p6 z8J!D|=d5&Fsfgmt4A|-mWazx{(0TI~4g`WhoOdlGd33VhAp$`<4xqF8;r1rbS-m%Y zh9_yUNSiYd-QjC^*zyLf9}77-k#L=ce}Hd;L8~IkE?BMj0L$4sT!X z6`KRY%Tf7`^>7$}8yWZJDCpF0?BbC`j$@!eCLd zyGH~@lx-J*BI@pvKuKzMj|_}V?e6)`K+%Bi9u*js`aH)BnAp!zcUvv9iVW-m#52?^ z#5tac!@lDF%twFbCr@c$XWZoSOuUNvIz2eFH#EBcwBGJtqXVP=Z{3ZNjcu%}w05Fhw2MG}Ns|UUvcYJu0P}9xjB-b(qbuh%X197Fz*`1?$L^)mWWY0^tSN$0r6; zv1;PEq;+J#YcA6%TEJ?z3fy$55x!xavGQ>Y4x%6s(HUk|)GyB(c7XpJLTE)DpWHDG z1x4%M9-8M82ThT3(YDrH8NZ0gc-1_Q7-*HjRoeb?b`cH4LC=^thUh_zg+agzxYmEO zEVc$*u||N6P_J{>Q^4Xt~=6$wVOAKZc;3^N>7P&oB%w`abUcG-$pb6}Cgh_pn zVr;hv<6#-~u{~spqPRTHA&a_cXH@q-)fzI_Ap$m%}fDq6ShgDI;ZKj{`^YY*r(HHU~!u{xZIZwZhv%U&)-TJi?(tuV$r@R)9j z^Rit}tsr`XDzY~rWo%r5R2x#xjVsI;zJr>pb2GkOom&98I0G{d)Jy=x z+5z$>ol6yx@!S|@7>u~c3{6^~2@NIoRwp{yfvpr}tfveIj(#%@7j;?C!D0hCUE|if zap0hLM*z%gz$o121(3)N4VTwrQ7Vm?!Q2KiRg6WxEJL_K*$#?{r^|47NDml%B+bwD zeJB}l#IPAOaEXWZ5jg##;~dybGcQDu{Gn_Q-Z@fCi;%1@A9IdJ)ndeE?f|g1m%Jab z%faP&Pkv6S9Gs8gHo2^)8P(%nxT>3!GP}XvcScnXzB0*|?8D^oP#ATS&CuB75s{wL ze!cZfS^8KI30Xrh)?UECt_EE14{)@96U=9!Ru_1UST~OON$tW zb2V>cq1|PWoIJC{*-D>&3D5_q2Va)@C4JT6fv-|3)mN#lJa+8rybA+KSL1PEuW#Fb zP@lzv`Y849>!W!yHlV(A=*0f6nODIuuu9VJ6?(pw%zFr0(lgEp_=d+NdE|KK@_5aJ z{gDr#)QD3vuZBFHj$5Hw(w;cm?(>(6NaJg$f9RDJdG2KIYs!~>&78KrR_JU>o@HtM zSKngSrplUZt7{%)bzwtDZ^OVljjmBh#~*`>s+~mU_)hI4YJaFVK(AyU@9xu!Qg)j= z#CK6=75QNNMaaekT~L1&Hq?s7CxXCxrmW;Po3wZEB)Rq_xt2oWKrU}w^U)og`Kfst zA4%GnHIq&xZ3OdMsKXauiqeMD#h7(e17DNxr^&gTO~9?Cdzjaw4b{|!AgzJ4$XP2K zzGy|n*LCBH9Y2HHLVTp!h zCdz&rR6Isau1+*TrVGQJvN+M&zL!eN_lI!oDr!j2ZbVQxOg;(c{EyBH2aZ2FFZ5ZD zl-NMuaC?KQDV=D&40J0gLT=5^U3cIc&szf6;PbUPPsDHVT{b*j=B3?`4^Tfkfj66+ zhP6%5x*H*q&r#PP(QAB!4&-x^k{-%2@kAxky*8ES_r!A>YA@-b91}wZ&xCN2EuROw z#gJn8EH)2)44wWrdJQTMk2^T9Q8}>TSEBrmEc06E!*-zi6(>;NSm`^e=5R>Q(DYe; zyg=pf8-AzxEn@f6F%Pb*KLBqDHxbKlmvtY+mHG8q-IQ%TYM1M!7tsI3Wv0+) z4Z0i-T>Gf8w12{?Eyht>9q{)Y;df@4`>8(NkL!LMieVE}qht9;CJbd|I*>^b8|{#U z-{_+ophGg~K}FU4I$k)Vh|y`7x8qBc9*bX%fgCpP0M_dTYhtILSFegPGPrY*3A8-;0@%W3kn?!5$+_$-jjJJD!<6T$o;rTSu#h5hFl z=)P{2HjiZVKa}Ri!viFb9`P=;W!WEkq326j?vDl(ccd0aTcmAu zfx|#iM|SDPu$HzhEBu;`(rq@f?kG+0p`1f61c0hAZWC%a{7wg+lt$Jyu+94PW3 z|Ab$Y9lH;J-)FNO=Ha_Rf-#?+X1&~nFW?av^DRgJO`aVJpY9GV?yv=$PU^ym7E=LB)3mE&R@AKU<7oR zc^|TH9zabf%doWz?niMj?KBPSn7k1uZU^B@1iUaT-HX`(>mYc6ztPo>pu8|I7Yhf! z2Z_BiJ%g;921eB!iHbaGxf-cUa^mT488h;O;6i?Fl9Qp%sl4uh!P||4ZQc9{X-S)L z+IG~@_Q0S@vy8q+$#h%MVg4QEx(iXF!eu18CCxqI2nt|WAetTchGwQtyFv4Q$d4Ta z$TTAB@FL9vlyu@0Jm8ESqBLUqa$nHbn~i8VFW`&#aC_)MWF#JJ`AjZ!+ry1bVM*C8RnxPmS2anETcD63Axr1hV3UcI^ZxL14CBq zaX`4UT#H^5iD?Rjm>k=}ujSo4+odxrTr8IR;{Qfr^a8e>S@Z%cUO0`o(Hk%Y?LR9L z-$$Ycjl!FIG8Qe%)M8JNVt8}*NqkGkMxWEOkXxx@`is9qo;V!_g3~P&B+y->g_f5K?Q4trX0TQ-}N*J`kw)UVn;z0@!$86&1abK zaUY@deCwP`WKO4V!@j;3S6Mbim(B2dvyOy7}_DdZrL@vJ13+-o4* zHWJ67oSFai%IS{*Nc=VGi6;lsdd5CWJR)0_$cZmm=sItd{5U) zT!+k-$_yD;2W84Sa#QQD+JpHAvL%!v5Zhcd%fd+dx@3{u-enX;}Ssda_$GIS>y zwRA}0W$1jN9DAsb?yg#Xl;2yEqjr*?vB%YTabueu&=biF@f)(Z=)jJ`@5vhUg7pEY zKt5^o{T_wd35mLVr-_s1Js4vAR%F@euV=mjZTPA!U$ngwtUPUp={9(uAo&8NMKQU^ zt0#Rp6WPVrG0fM2hhuL5!V#$ftO~!N5emoNBzpI61}S5{1!7VX zwUCP#d0C-wR^OXup-@ok&BiR1=Z3JiNm%KbRy_rmW5DzKqtqX&*od}aq*E-_XUC9v zg34Hmkzs5)n(rX5Y?O_iA930^7&qSq8^>E^{-mUnBo)yL+4P$K(5C7B0X9WPU?BAA z%1&Wb-q(fv=7nA9|I|u$-{D_VD81C)u-~Eq{35>ENow$(fY%GBz`>%xQiIs5&qol{ z7FebGeWYq&d${xaZEPD6o$sN#{N@$bdxz3Z-X|N{+y6To;RB@YdH(~v9Pvt@gPBCZ zI@k3fzPmBSd&)Cy*?8rE^KlP-!u{x=WXF-Ch0WgsA}U#DtHD*V!X~^M5Vz397Td+RHWA zO35To0Qg;(zku6rciNRqF+c66vM!+FZjzlUorN9?ppQx|ng6k0v9HO;*swe9Yp~1k zfGwSvROd5Ng8khgU`R2=W@Bv9$ z5HeEYcFD^Ebm=24KB7Oz8(-3gSToHO!$RLn;eQcv6~t+=F9;dOQDDqL<;H|@Unpg$Sc1V5cQR`y{IUQN_+Jh_ricO7B9B9i44$d{P^Ex-ZvoAW*@wRZhl49 zn@V;IcTrz)JkFhF>nZk0zBblHquJhxYylY5I)Uk;Vcu_AKF})|XwmrR13FcP;WJn? z!5k|ZmJ~K2b(|%KCPx##N$xK>q#1saY-w_%V9&&|Xc=&XG@w26AZ5;k*yPTEGNn~= z23m!*L3_WL!7ni30rwB(GyYXAT{M+jVgDK2773+xIQ6vGK|gk68M4y!U2+HLBFzT9A&6jd6G7=vm&&4Ku2kW{zG|!u5@kx!Lk1N+i$xR6vwDQmNzs%J zcWGRWis~%6%41t^NC~DI|~gS&yMU z+Gmj)@ozowKILJi2i4M7@V}6P`f;&bx7k2C*^*QGckLC3Q|u2^Cv`2ErHnMsW7P+n(QX^dqh)2hF~dYh_qE+m*4 zm^q5*8Z{t~&yeOz74c;1d*G0gWWP<+ z`hRkUR!F1Vw1lah^GKN$pp|7=G+PIdPS<=*UX4Gg3K~G~6qVkr@~>cMv1dq7w$}fv zHe4M$Xs8sSE_BqjUKMA2uY$8@0npNF+k0)LGp)N?ub>J1u1x80jbB}&esGCIvW+Ug z!6nV#1a;uhy2O@hrjNQ|9;i!+I*oLilElz`Mp>22l6DT;UI|9*NRq6KoaFHWwed{c zh@&jtYsAt}Md>)T6P5!v2D^bay+dt6{Hm9BYcW4KV2aLke0OFLf{qU0n}n^>Y_~F} z!xi|Nb?HRedcKcLuE+a+)G9E|2Jp5suZV~X^_p2y03B_IB6WOSyQJJVk`5NeAh2;o z(piW(14Z~e7_au>$^{(&J9|~6`0$rh`64M7KCahP^vlKBHOnmB2V^s21gm|p?VYBga7hmJSxxX$dH6gHqTjjmZGjuSj_|Uf-A3r{k0M1V72|?W` zWYs+l5c0hJIlgdqO7+sgC1zvYc7UIJ(W>iw&}A;ajaGiHh2+7a7s2Em|H*C7HKy}BLr4qB5 zcom59@nKhp2(rpv1L22Uq`Sg)GR$U0DLF*$&IRlm($B%VzN9PoJ()aEV?zO;W7jZZ zi9d+Sx`tD-tC=hmWXcaWg9L8aj-VfBOwknQrm#QAf*lY zQ0RZ(hMZ&@enTB#xd!>h2DC7ihd$`qNNvsk7ccdOUDxvlWNcjH|1N3 zgrUg9b+`v6#}4I^f+5cdJRJNZ>?Php{82v?G^kI1B^X2WaY zTYTm;cpYow1H7QNVoXKNn3^gaiqkKyqOqbCk9mr_g?Js`?~X%yaeKU_Z9Oj&k3i_V zcmPtobg}q$C*MaB#j}>qfy0ZtfPa>YylJhmwImLImQ`L}!B9w1*RHFWuiYNtaD zs*>va44)V9!6Afzlkwdts7-BWyQSlsKH2!x;6vp}9IB#sfbjRPVX{Sr*q8ahXhVF= z@SH44|1J0xeqi8z^tB=KGhZ$+#48LBF`S-7lyrtB!zE1jX5N6Zr-B4ynLo}kgsk;e5bXFK*vEyQwM|{gm=@)`jW1fD^a6`;s`X%8RK|@4!;xR*1 zYBnIwTt?+)7-D+HHN%7Ay&*wYP?Tm6TwEJ;8RAWi_}3Lt*>T*KqkfY4=&0inkC>HC z^m&kp_WF-U3~_npSNI)tq);MxAJR-M<>T*MZM?5>?YVStTW|Gy;7<;wX5HD)f zmbZt`2!_NZ>>;@m=_*E)#az^(XVN%FMcLdSfa|o6Wz05g8 ztVX+ri|n8W@L$@=Qjh51TCU(ycRGo4ZvnOL@-#}nSx)JFT<=idkYbOx3+=_Bdj;8{ z%TKxQRue2NqqaYbw)@3KC*|%apAqa-E~zBTyfT`k?Jgxa+eh$emj7M>rQeDWe2FO! zqje#%qn6q=3UztJ2VR0NaC#Egm8KKVk8;Vj9sY&rql*g2dJm5yOOAqv;H{$y@|p8< zDZOSKN%%|gW%x0gx_qK!v$TI@6TJw1;St~F^j{d}a(mw_CVF)tSyg3AeqK#_&K*Or zjdk9QHhRP{E_DN2@>6c<(_W%Kz&#aV`TM!0@v%goIF4ja|<%^Wix_9#D4#bVnf`HHipDQ%y|WT%p*F3Bu8hNb4y9{dEDxnN=i@Q z_BJux0eyyx4SCf2KN&S6I9v=%KUsQP!qQQaus;uxn3u6{50#jYu@WmUjcd5EY(ef{QO?iU zgTMkxCJu#3v#r1iffX|LBSR#aOn*xsz+ScH~KCi(-mPIj<^>I8AXmV-2Mz zotu==;!4(YZS6^CJ>E6BMref@VhaMPdfY0%UR;beOvF8cdbH;z#+F;y&5S7)_HD-Y zTG(DhBpIUJ!th!Quy+thkd)hOHH;D86B=run4=yydiOJS4Z^y5+zGvdv3of0G;t4O zA37*+3Vw-=%2kgfY>s%EF)8It@iSYwv&3=6f(Tve@tajIiT?I25U+3^MS}Hs$NhE2 zIv86n-n2Oi;TZucQRQnO;JWssO*smFD5Fgk$*N6`}?@`32^`c4q0nyP9-5b*p zFO|$y4DsABg4^>vfLomeui^A98I>MG++9nQeVl&58AGWzO1Gzn#1nyw0OtT!iOr=E z-#GCna~E<;%jYVEBCYlcf1!Az<_fpQ<&nLLGCRyV+ajfPZlzM>SUci9Zkvmrjh#P}*q19;T{g8aEcnCbBoj*l-ulh6S z>`8kC@T#FN>WL64${m#SV%SH$x!vWYkH7Sd}pqMXzT-tKq}{NBjBfD>FJR70HO zBhHPLm7c*Ryo*woY3~Dm$`Y=J1Vxk^1TSIu8$eC`BXAa^omRQRVOZ(Y%TA#dSAgXI zqVi8j|Jg(B9qs%S`u{=v9dMMQW`snoMsN$#$+BOKAZd3yeV|a9N(I0(N(ljerse|% zv{Jw)^iuGQ_l>n6aZUt%s`we?Kc-H>FP9zjorsq{MECWuoLQ;VqFrQ&I4ONJ&6N{nmJ#WRdum-C+afln9jN=!U9WOIft3W}-R&0=!y z<_x!Zm$B=_D?={AN;#Cb9ybHKCL=>!!`M#O>lwdRg5qWi`>c?#J1lIHy8}P_dB4O& zc3LHF^c})HA;d9pU*rG|kRE32sHlzHk&!8mF(xg69Smbq&rI<#qIrRtvMSW!jTQBmP~ z8ga>|*li~JJx_ee*fDW;#`76@;wWwVET0%EUSjO1nB;jiW2kW9@>MbqZ)T@pWsL21 zeL4EgjA3H3g*{%e%P~wWVCgS@?%zVQ2QAE*`^SuY@tK948u58Xp_oLE zMPRebO+8R7&gsMaffDhEg}rFz1V)M-b&~VR;ROLx+(_GNlv^Df9Vit!6D9Utb4(y2 zdQOwrB^l!b<>G!k^(D>`qo)QcMI9bZ5;kk}{6Ll1XJKy@9!skc?^@W~B@KbGA~0EU z{-|Uf{@<1{7Iw6xHBcw+wXj3O8Uho9182D;bLX&ifz!kY3%hMtYhaRi*urvhHopX3}%s~10KO!mrj@s^dh&bK2lU5u%hoI8Qd5W6kRJElrKL)>p+ zf3K`kXNtEhY#j1ti3QVSxo_oHsk6oN7B;`8N}Yq>Zj*W2k$0xJ*TTjl?<|ouL*^Ai z%3Lv(jw;Z;e`f3m%o8_SSh;Uk;B0Z*OqsVka7|#LIC7T6uE=@8zeLQKCoxy?d}WzP zoGr1g(R%~S#jT9V(Z5pM!I*6ON^yj-W1?jE{=iD{*?cN@OjP7Gdd?A9IR7VXBCvDC zBn!)|e9e8HILE>kW!x8N5W5-MDQ0K9=57>67(1%mTl6>2TJcK@+g$rMOFedff zA$Bk(+t-~^-$i1dt=vW854LhWB5SFvkNW6hafC71+FdD9c8k|JPkP91altYwCoO-O z=wVD+;^^X9{Nb`8&ly&f6uvEquW{#Y>Fc zELPQqgFh61@52g$cZm_JSf*H7UKzYwOk#{UX9VvROIB0f&0=nCYv4X{FRl_1wyO3O z&redu*!^P6dC9!df%{YP4vKcplUg4fkk`X`yTtA4s~M?z4~TtM-V=y%9uPAds0Om9 z16U(tCza9I0vr;}7WP_oC9v-_66Z;Gan;=5A#sPqlv^r@Gnsd1RXwnKt-NES7J>6) z3!96_kB3t9JS6_kdAr0aL>R`ssL#Ug zMU-$zwDaV!OMJxGN+F@PZhgFh_PEOtlY^`EKEWCa!9;nVV9^>?woZ}vkMWU z91=glkv8eM0Y}D%#1RYAxW30)C{Nn+P>MYt6t8pMNrmkBpzy_rQ`+;v6npmPkv$(2 zS&~yBdp;ZoHcDxEN(& zHvs$Zl-i#V^Q^p0YIE=jv4Sz_*H5N!J}H_l&cBM5;FDsDg^f{S!6Raqg`JM4l27$v z7b5ScDN>#mS6Q6H)mZT9l)R(Dn~+-1Lf+Aoyl2F4D^FEhg3pLD#-yIdQaF!^I*W6$ zvNd>2tgx_N^)>g;M9jkSv>m}``><#A9l_%%QhqLaEY5Gk@;^_>drrJ(<=ut6=R{FE zX)SemK85pnQNek;u=9U4<9ShUVMo=!d43`0FebhA1<}ly9Q`kfA6OW9>x<&cZB)Zf z(TWl9qR8D&*hzP^YFF^Z6yNR7Bj0^djF6m)$J_(XgoTmsz6c2lcK8Hu#wlttP5(2T zDsC*nEe!FUTs$ih^U5+Z9AYujium`r_?3Q?y|t1!?dc!k;fx|AloC#3o?if}*r`(P zKk(3A6}S14wJ72*!zn$jSmqMvS0j?Ss--zmRIwI&7?RM>BPk?76-zkxFT*o%J>XVu zuax{lH&LEq`BILwhF#7zMZ|MA&IqM_@S7d5Pcl8-W;a=uAfD5G1D)D}Uyh6Vy z7|z{f*>8fXcqXf#=S%GS)c*%*-&D&t(WPz#Q|tXE{%@jx-2zhbo-j#%1bc2xjLf5P z;b9+sxtiK2;p=R@;(W6I4cQquFZiB^#?DMYLo5VzitBkSbk~x!6XQr4@$1a*V19%7 zoy_kVgnx22)h;DdErapz;jv>Mga2t-5pUxpL5|<#=({^e6bWg}DmY8(htw8D{3o!N zZ6!yF^dCF4(`8!9T+Ji&o8-%}BjMe+4|4|2z47c6zvNzubM#W21ec1v_*I)AK6m2d z$LA(|_Tp(Xo-u(o0VkakK$`%XThJ*}0MLP_$&@Yx^x#)0I`CfsOkh~ga1O(T3|BI2 zWY_|jEw*sFgW*9yMZCfAAAmyy!2-OsO>|0|`1Nt3k5(oj@~h$q#V3wdO+xx%M0i!o zQOxF9Vk0hW&rvpF_Fl+kSN2IbPaNz^XW%zpsO$*l-^ukV+KIdig&S}W+D`TE1w4TB zyRXt7!ufTFc}x^)+lD<4I-QV>2Iud^LUnDiM=2BcXQct2mmLE9$Td`%#1f7(JOx;) z>=YYv$14-GYet=>98ez2pQ~(9PP!^Zy*4#}J}4(f5@lQoQJ%}1kM#P{%al1ziFO4c4%963?D>KBio~xBDTBZLq<+$k0zftMXE*-j0*{PA9FQcV*D0897 zOUfzbB3vjxrOa`@1-J@uiD;<&T&dTb8LGNp`=H#d9?+hwO;@)lUzkJGgW7yozFMX3 z36D_E5wjy9<*-JY*K6ZztH4u_ca)E7=|fLfpVICvoTi>)tDeIxJ%?+2L)%)6E>9>Xwe1kdF3`$RD zX$!cPsvM%YxYT%-pUq{La_*1OmN&FFz06ZWP~m#BSk5fwAI0=5S*u|zXDd#g-_R~# zeg2CjjNPuPq3UfE}`m&VqePak5&k?X8`!9Mtqt3qW5o%%dz+7Zfg4 z7pmKeR;wqqv#J}_PqY{E*Qw2Hw}aX;*Nu?#%dEMITYb*+UC^oTwkWIfexNG)kG%&} zxBf&>RRelM<$Y?dz9smO8c-jr{wZKX<+Exb=r5|H^>E?q>IA*g|2ArQE58vnURrQU zeM))G^RZg5-&e7X5R zus)-@9q^0Vs{ymC_v-t#KbGIA-^dobjYsYecoZMkrw)BaKdx`6cm}y-w?gfgl`rZq z>qjuMwkTHwKhfXNAHuU3s_}EZUi%eVSI^q+RUR$Pb=(VS5yyipZ6Q2=vg4#aD`&dn zl)lkFSGi6sE~EVr#hG)sRJ|60{-5ZN7R+|kYo7<^D=V4)IP3P5oM-es;T4X5=+Y~$ z9KFt=IPR(3=-8sPj@{yLI}G0ic%!JbdY^KXN7>`TsNUsxT(k|p%<(+i;c+p#_6Elu zmi9~TwWFZl>8RItc^`Bf5L?IGsI;iPrB65t9b1A&9l4Iv)1Py+uqG|~qq!eD<~UmO z9Y&${MQx7p7RxNuuC6TuqtS70`DRc)E8l9g zI6kb|VQg_kYj%PX9DSGZKFj$7+y67RScl^e>3=c~=yz29$=Io0IPx#XPRE5<`u8~A z9R4?BucNtIa~^Qqk>zr_9ru+NIuAR(>l*1i=vY=6aZcbFtX|9Z&R32*%8ROeSm z#c}aP`abma?8xUIxK3z8v&CNJ6i$^Fs(7@8bk^`n&|eQvh0l=9PdUc9=PRci zXS(-0Z{)tv6`Et~wY$sF*N*FJ9&swh-+j*j4)Z_fd|6NPzvOfq4+UR$DtdLr+s=S- zed%wVKJ*u@6xr3EI#)V=n7`Ag*RHRg4>{))%~uXP-YFXCtk;a}xuCo~VkE5bQZ2#O za8V9@SQU65OO2@O_sjgfj*LSXKi?Vj?I#;2QQ?k)jW%x%; zc1$oH4sCTE)UPkt;mYFL59?|9H@Ft6>%2?Vdc$9o=iZ|Hy1d3cLP=C&)l+WHsuX3+ zS&OyuY%vL|=OkDrquQg)P~I@;&!H+S6)obS>y7%)Am0dE-RaQ)*RB z2`D$zmUtS`meGLSwUvM;##MseVOD$U^~;JUdOD0hr0;U1pOC%{|KYZG0ERXYEDN}pD=33NJ}-EX{Ibraz4E8t_Q zGiR#4-`HQc%W=R6`_O-*KB90yGGabrvq1$}_(CK;6ZfNzA z@|5B%z1Me@LUY}2_Qu`pjXT)8CO9iA{~OYljQyFf!}t<&$QI@Mn02=(!LhKp(i(ah zx?NQCYu`a#Et{$zSH_pU<*Rpog>ijc5v~t>bDRfVe=-(2R}BByx6nB+|6?B_BaFv| z&PcwIw$iya2Z0(}Oi`y479jnTv{Jy%f=a-l1so9r0c}eztsuW6O`N~T zotU;$OwDLc+oIf6+>%D?W?R}$=g_=uX$Q4;hwV&zLwm?0*Uig7X?ES3c0l{1|B19c z`cn6?H2g-v*ca1IDeG|aa*Hy<^#|z zG<>eI-`SN$W9s6PKc;Ol+Aul}=vQU^HSK`&uND7DJLsI`TjAKFKUMBg4m)qp%k|f5 z3lUxH(SMp(=zm$?R$cBdRB!Xb1NF;l=KIOVmVtg-4(3~DYtFfTTIFN@Ds@4{cK;ro z{;P(1Z5$${J^Gr8D?q7oU*Uh*c|rD#{_FI6{kQuSbu-)QqqGN+J|4!CXtkl>Fw*k@ zv9{*X$Zhq^S57(?rM=)k<*X}u9rRThM0X(f6X(xze(T?(whce!KcJrUSBe8zbN}rB zhjSa+tGHH;`Ky16(py_8CZO*W;dXT(vUR)ebP@a@Kb$^68Jay5a2hlTxSljdq`O_O z)s9I2L`2d@r=QgSHoPi5SNWc2u9Bkx@K zZcyxD%GC_71FXOuspG*4JU@N`Fi*S&SS&sVjEJuQYeWt<*{3m_&hRXzFBZc=U(J*z zh8x9LP!ggc^A4P&9uK}J{wc1?dJp$hjt7gCE5$vbV#TW%;i<}ZklVv>x=NgD)O*B_ zGk2+^$q}^^@Lh)QsZ>^IMA0-#7jU|m(^EM;ozrVL-Nfl0PVeIM(+uC$?h&74YC3D8 zleFpjl_DITuHPVbhMV*|#4X`nfZm)t058pX8t|)}_W(O{H3#t*Gn~$_iQz7WPcwXv zA^ux0;$%3TVH3k$4DVq0G{g58YEI^7Sm2_zPi44~qY@!!1oXT)bm^m39VfZdX zk;9w}r!wprMwERF#c~OvQ7D|(ykV0w`tF5?`v=AU+U*N z?svT7_{foN%r+Jo%ZW1J0+M9{j#juB*UR>pH{rBiEho-?`H~ z=Xy4H;-2lE$2>vbV*Xx__`^Z0U|1tlU zeqZ`{j3fHLC{^LZjllp;6*6(2P>NHAGEgSqdT&2aLyzr;P>91J2(&_qc-Y$?jS1yl%U1icMvv`F_9gb?6m?)79T`MR)x^W~621TLBCew!r__Ce&|Y9# zAv~i9-dK#!2z*NL8Hvv*d`x)fXnacHB@uWjd1^U)r2?Nye8#|6szes5qvhgvn8kl5_J~`R4y8@+#HS0Ni}1M? zpWk4ga8kKRoKkj+KPuCVkMZe1`XYR~@QJ9qMI}C`z#CO{S42fQd^(hc?(y1s?`hf% z-fOileAnS~6F#44E&gk@YyH>Za}$5=qoFowUgO5-+0kuFVlAzS$!i-Ls>X;(lbaeE zX0#+Ww>EZ6Z*5E@#xx8FvP3dP;rt9 zahy0~`{r08I-{|@k>m_oqGnJrwS!W}G8Mu(F)P|WeM7Wyb2QODE!sS@v8g>4r)nhE zfX0tY79CHC>5Z*TTU#63qkRPvGh^{ZvDhXOz%0u*#NyF8ZRc-|chonZzctamDcaWF zmpd6s)RCk`(L}U;NlVkl#L~9*me!@4n<16hICpwuTm8Cqv3N64z`dZcV?n&7DY_)a z;w>tfcK&9vc49$ed(#GsJhP>(xxT$Uj)t{d5M9u?jXQ(7BDyIS??Bs|Hb%L{purf^ zEJMWN)1hu`Q(qnlS`=+;+R(VRHChj$7c{oCQks>33D{+%kb$Iu-43qx(e{SvTjPt{ z8`r}?&C%_)W~BIF6?_nO8qy?Xoc8%`q&%?oEf;QzS?R%5A4Kp#5-eLohJ|(m zv&giygQ^B925!840Y2#OGh=H>4NwPHV-O*OkkI6@kQ?1j>kr8THn==w4D6AyVqQz4 zX^;#^9VaF=u4|9RA)3Sj9awrCmmVZz{MUKw$ko11CQ__ywF?huEMjGE>r$vkgu2^e*_b;9ze*U&?SdTDDE9Nz}v@K~| zOQgQ^qG)TZu^D4t%-*^_F}DTZjqy#fwhl^eN;Jjdtw@mR(BA^CI1393CHuXATZ&no zs7>0pW1(qj5{o+$?a@sY(_^iz7%Q}rRlopI ztaYM3(G+dRcXM=IVz4?ITjZ z%s{@VZ*CUTwzjl3!xRlL7+beKk!V@pMswtn7LI;dSsIyOhAZ)j|T>5^2ePqEgmWc&dc=oQ2S7PGZnB>M2i_LjuD7Kmw&ZkI6y zCzrN0ae&b*X2bB&`1Do;IpAt)q&7FK+sYVO_Y5|DGr2IrP3i^~(3fsb5~J~WEIz+& zCZZ3p%)$gd5B))lQJnmSC7g}nAUmzTwUs(Ev3N6}MVk@hWP8h|Xo4dZ$-1C%YXTgw z@wzxdpE#B~#?WDH9kIBLNczr*)11O3v2ZrD#xRIc7WKupNpi!S1lEFPTjhx4K*PKlvL8M9`jiH2IAR709`T{ z(Wh9v5$?1oiirSvBx6zmuK}fj~CV$BcFyT&khZXF?V7hi8+ZRIoh10$OzA}XUL%;8N@MrXHd-rORS%Ud?f#F99MEfxdGk42Fdf!1idBv>n-`*oJM2()1`JVv!Ob z3ycWLqmouWC|1fEp$*di#A1w1)ZI54Fl!NVVGJXK(xlX)7!pgdT6LV!w!Wn;S}|uH z7JqaV!ig06bgUhNkSUy4gz*o*Yg<1^{+zbWTifSG*EcqGSh-Xy?>A>*rlducW=ye! z0A+1PZ?qADv6-R)RtXU1MKL?@;(_&hJti_TM$#zs%`@JT82Kh*6|`4cVLoCU4j8cl z&BmC(WI(WQ*+<&Gr(TSihJ8gQ;&30CLJcxu`5xB51|EA!XS60XNuvhI)cfC~}6>Xe^GbwUx-;+3XszVvCk!Ilgq|n7YqGGHsKx>aGl8NDig3$Qf!bBDo8< zGvw}r9}FbzOZ^Zu3#336Xn}Q+pjA;LaZv+ZAPY1=7f65>h=At74@SEWdDsUx{d|AF z^PdYv+1^VQEl^(OfBxt4JHPWgzuWnp^Z!p@U`;X?>KjRc%<;^!*D_s`-1M77m?i;ul4kQ&U2vS{WQ*@zS9k@GNS!lb4QJBPQ&^RiJejff| zWp!a?bFSJV{?V&iVqsB+Y=+ro!XrpbzqHq=f%mgoZrtn_xm7veK+Lf50|kyyrE#&k zv{b3}8=Tu)wJh^|j4L71h665rSXa>=#6ZY6_uMU8t_0>-wcE2wrVh+7+z|JRzAiC1UCbXUA_O z_)NRsXay2gjnuPe-qz|{3Kqt?4dc}@GK-b7a(|jtIjE(k0vHrcuVAEmTx+R8Fd!d5<>@0ur8_Swqh1HPCYWde|{id5F|9ALr&=qasX9 z#?8X(Mh2#LqYmQ$+%1}IZQ5`!H0EQ(!9*Hb;Idk2&MaFW^;UTWbQf<%wX00{;(WEy zYdu@7ct%4kq!+bTXwtlRXYs!c=DC(7|*CpO{D=9TkV^md#H53%VZm%pw^Tlcz zWuM$2-AN3a@h7>+=XeH%&gc^`JBjZN6{{ND5=jDDUOF9Pf>+pa zLDzdGmV>1%tKZFe7OyO9Ox`?hMU5MwUAt*HSo-PmhNm?zgm0+9N>A)pCFvkp zoDn1oNHVR|7z+xn3|F2_8u*XB;HPnqQ*7X;Ex`C#WPYq4CrREIC@MzK@1U9Y!S zmMpkpffhwsf>wjB3firudc7fKAeYwiE?aniCE%saCuz5DGNnk|YI!BhRo7;<^d=>8 zYtcC9(}qRXP|f*PeV)j$sIXXWVnvDERW@`LpqMlVQ<82@TN2ar8}=+JE4CzzJf`#j z%NZYwX`?@$)M~f|Om1gaSf~@5b3Tnq68srp5CR(vLeAvF*}%)mo}mO%dFXA zh8zQQF^WO)yBI<0s}>cZsywhXoDCoCnqS_va;v^3ShECmS~spzM{7$3I!N8CE2oyo z);yL5wy46{x|YfaQhSBus;=o2GqXlKeH z6YULz3fOA2&8gGuZjgifz8V#LP)JS-r~0ZQ&M4-1LwBCi8eIBpXyu6I!Hd#0l3D3IrYqEKP`JvF~6X{MT~0kNZEAsm3y1VDpBQ{R!Q`!kbr4`9%uO- zQSbUX3-xkov0lSrSuC$vs;b+wbziqjreg{kp_qDW3~9Vp{|=YL!tQa2A(_;)V$u=zy_vJ;N1HgCv5rjUC=VbV`AL$VQ*TC&BY=19}0Cgz5e2=&HWH+ScV z^llQd>$zYub|s7TwEnf~U2FBu1qDX`CprfX~t<;|6wxRw@p6HfIt z!lS;9m**=cv_-v*7n1ZdG?FCJiw{{Zp366^_! zZ*3{>ONK62&YEti_ec=3D;B@_kT^SXJTJ4{rw7 z+*V?ql10tqnk5=(jdQNf&L(<;l@-a0^(GcnDO=t#$91d?@k0k(sx8+g8@0_UNcXnIqKv($xkx5X1Kn;91@1B1~;xrqR5?Ej|Q(pi&r!6`7*u zO>X4Ctg#oex+WcRwozZhDEVUk=$Y9Y<;EKFp#@^)QiZfOO$3;_?uL3)gDttK3ypeP z@L=~vCc4>burk(e1X+!iihKv_Qnhv~TxE{JET+E^R*4)`8o|8V(%F~Wc6XJP!2DHw zbxK5un6xQDG%nkgR)e^V;+vu%Tui)-wG*ya!|7IMvrEQ{m2Jb++59S@`|28N+lJUv z9#F#`_zIqF@-Ij4x@}UhJ%wFQ^hmtZ zcGIw;i3R9cxH{h8mEw3|vWR(Lq!cfGU0WD;w@fkT;55%GBzXot0g6RJOy;;* zqhgaeRY9q#g~5P>3U_OpTJqydD3X#e-;uyUQ5ltDYO&pjDV#VJnTW{oKaWOXXHO$o z<8X%?4>_{vUu?N)BoI_mYHON}Pm;npCRu9Bgc?cB)wM+u;N<>c9;oe}nWxWbo3oD@ zTU{FpzD7GI&@p;SGT9kHgc1$ZH*>u`^r@s8dm&$cUFuFMO+M(0Y_qrGaiE_WhAH$f z0AZl_9o0G`0}8a|QN_wFqI?*1K7zeUV120MoNv>UxxiG{tL1i5}OZ)(wc zm|kdx$o5QqQ(?zuLb$Wl^7Wc5+G5igB?`WF{F`Q4ZGo)~CAhd3KrkoHsxXfJ4d<@< z8(rGFZ-$ywr-#Uy_=d4^GsK0th0dA?ghFUNoRTPqIXCsSxPN(1vCOYR-u-ghi6zPAq!?IghLs)n z!Y5JC3eMt3v#(lnS<{FVYHKFPTBgv2Qp-(wvAwil^lrZX;>meCZUI-?(wb>wCgrgL zu7ahHY1z@_P+`E?UbHLuSA<6a$0Ql_e!~m(EIwMpV4e{4xrgwZsR9X z4#|4FDSl?rLtMd5OS7V|lbNBkx<<^fiMgq9!QWiM-Dp(VD6@NFN6@NiQ5tufoA+!b z;67R?9=RwJXHg(oyp7OWF81qux`(gF_Tl`eDBu$N&@A&w^({i6ZTL9 zCX#1GNny!4ffSxP8^6T0ZnPxpo@iGuR$`8Vd%_BX zmW?I~FL;85BTQhcWu1Sxj4vQ^nyQ=8mVvwj?Y;VDB;(S3JdXnJ=uX{Z1k`T2sl=If zOC)0gVo(`nA?5^4H7#4H#p@xeV4ds+>KH0 z-#U6NpV2n)SHxtWQSJU+^qecr+Rp_cBKbM(2N4~t`t=u2%+D|S*-PV`Bz;b+t*DAM z1%#Z>W3#Z2d>8~BV32Bwn`)M6!G_tjI!tH0HNCQ4-eg-;C!%yf+^!zV&|$wuixWky z%6zSEib#uQvY6{-VjjpMo9G-}CCSn9HfJH>a4;yd{mFH%E|ae{?<#>1_SCr%VkN>| zu3w3+-_n+`ZS&zBt`UP;VYk%p?Z68QH;%pFY2C&|Z-66)ist?EZgS3Hz?xle_riU0 z>SepbEA@3&8tYg>J1l#Z)ed(G`ZZ>2q=eCi%gPR^xLl6;_lEB%@yNRD%m&7FW5CE^ zK@*Fi;9jDc#Tv%58)nmaF|c{At||4MdtT8C2NV0L>ef z+UZRlInrl&gHKU-6ZPS}3!9mn<;~C(`u%+ojyIBdu2xya&zx>B+vUc>X1IVBUfK+t zk7kcI*lrIPnxlcicUx*ZPGP#{U6q=%IyHdp7MCS?iTBdWJ{AXwnHpHkV(S{448m-* zyT{yeMgi{ekOT}F;~Z|Eu=dx_DVV9C;<;OXs>^-69oZQJXWRdRMV<6iLUL-D3QY0JPxNTlj zl4VO3_nVR|O<$6}(5NmolN*}1lJt&EIe7w$JaJ?@bV(gV)?<$B+OdR5Vyes&3lXwB z*nVzxjkG#FT`9LohRo@}S+@|5mif-4l~51sc7L7}kqw@j)U_IF;X2EOUH|T#poTk4zc{gayw>pg+ z3t{scDGkVKmR15o@HY)O2iL=i0P;ji4D`;P));I6xBS=z)+2X*3{djZ5EF zut?4tdDBqjHu-FBkn=dtHWqoFu^3X16~i+5RWR|Kicw^h5fm*YxT&Xh)*?a<)FLeh zXPxoQvv6V-39ME82Q8QS1egx)2vE`q1eN5x>RQC2aSKH{Qke)Wvut-hA| z)!3JIv$LT_&tm; zFL0drSo7&~)h4yV6Sm4(U^GO~L#P+SdFruQ0`Cgj2BnK!T|N>X7mv0X#{zvefKX?| z30D>wow!sSt#<0A2n@}F=Lw5%^DOV%e6`2!kQ&rfzc&mw&CY!xly-;U5+a=X(x`Dd ztP5Z-`Na?G<8sxt!G$>120EiZyPu~OrqBhFxTLkidI6aaBfRkQtHQFr%P1sSZKHQM zn9R^1twN^AlhDlHQP&d=r48Qw(P$PVgMC=i1UG;zI-WKf+_cduN3*~K<2}8Y)O6Vo zr&s~ga-Gqy_h8I3r)nuJHcvm!6M{BR-5Q^cL%8sZw4P@a!flZ^aqkXi9UOS5gIb!o z9ev*i^UrEC(BrRPwvkkr!&hvq&b_i%;j#Od4M2G8%m9y1lU|2T_)|j`Aw2a(Y7Ia= zbe7Rdt6cAKW1Ok4-mhe!^&8&|uDjmk+ZrVki$Idylzh6SoF&gW#X0N@H6$5z5qihijp6`F2ph85g@}Xv8O6c zeMO~`5NRsuEy0j?LHLGT+K;QoDgHybk8`5sq_c-L&9p(8HoGm$kjPmgCkfpIUADY0 zb=dX2$q13Ky?resuVl#kcvhM;;WSZo4!rw4I8NaA+mQ&Ckk71r*} z$PbX#S+m{-DI1L!48`m|Ia(-1mnSx$OB6#u@mlKJ=u-Vqhxqs$Jj@BrSB7GpkxJ{Zz6GZJhNHu ztMDpO0=UC{tvRl|>is~1p}5(pnR;42pe%=cg+6^I$Ss8ONVXR zY=onH532R0`H`GSf)*%szIT~SxIc`X4FQafvWZ-X|Nj8nkzh_8d@{VaqsIOSskw#I`8|0zd(kVRt>$nt2A%W zXIK{#cY${*y>CO(w-MmJJ2NQ!iTU_8FO*R&sS7tlt6XJrmibrzsyQf}Nk4p*3N2G# zDcV3?DQViZL>ufWu$&W1szhW@6l$WJ`)y=m5ln<|(9KW!OX@E`8;R#oAE#b05xGhJ z%lxnR$lGLW8i8mgk+?}8a&8=|=-Fh!`2wR&mZdVy5*!J-FN9?B%F`p@$9F6qp{ z!mH_Q!O$yQ8O@BO)9F29lihds9xS|>IyhPO!gT8J!w>II3%OU*kA_E6NvYDK6RPy! z{xm%#<@w3(d;E=OMhjU$@-ddp7Sn0IzogPb%g%rs*HVZ(fJ@JT6FGGTIjx?%TVnP1-H=o z7@WI*LgFW5fnM|J(POFbXc&bm-4D`Z`LFSU&3vKz;biwCD*iAv*)12kM{*GQlQijc zq5GqB7BU$u&03`X9nAq1GZTiPeT)I&`4sOjq>?2M@U||Xckb|lw|qW75k`f7Hl51~ z^S{!^A))`%*uhV!o{J;AtJ06N8dvw@9JAv2oxi2y$?iexep+?@c3;>7+H^S0P41!0 zKEt*<3Ql<@VmzN0cHTvIR1hb-pF+<7^=hY2f~=h#7#C^*m_<=-#V2KBM=Kxk*$)XRbHagJ(S!EFr!0w3MIZxTVyGz z=OC64Na{M&@ytk}^Y03skJ2Vrn%|G0(VOvV_Y*~%$v62N%k0TP#atNG1o6iWJetnU zWDXZP{~^k#k59uik?mc@!fKH=0Zsr6-KbPQV_^hVv1xguhuNKR>V9HC4((3~$~!52 zy?S!_1gT7mr#p8Z-mP4<(E+`dO1rK=6vUf{BM08`T;M1nMRbQ35<2Y;=4jRH^})=( ztOim-L=HLX(jA4Z)lsjPR-{ZrHA+O6B%ZL5ta(2JyKK$ zLpE~Rg)= zbzvF0TCL1T%t_i;=*$f0vLEs()gxD4tnlY97T_*` zpG=_V4dX|H?tdb!)GbNT<;UHuV3{&#Ea?Z}ix;3{W+a!+N)>H=NuYj9lE9Bk;MYA+lP#+B1W=`XFZNmM8$Y4J?D1f@V zD-3d3CN7)JqG0yzdnmKF(D}6>oMeVTh39ga3^p z;9xxTes_9u`$%@bO!4+nOh0wr1nfamu!nK0OwDxenXNt_PyM-c2r3$wm$~=(GPIlgxSHah2blz8& zm}WE-HPUcYdMua0SPG~y-6?dBoDkR`otGZkF69BvAj%}+&8%V4t)LZP7WgMC7Y+*G zm6)i&t8rlC^gz2pw_>1Q71O*SU|b*-fbfDUWJuZZFOYdYa#`^z;>sX$gXB!DG~cVni`uB!P7k^&kxm2nhe&>Kad#*S*D@;wh_pX?3Qi( zZ>vN!&rYCMx^1gS34HoCe%@ocO!SoZ;IpR~o0J>Vk=JY)J-5aWWXPLr z=WzGm*W7DfY$o2t%uH_o-pJTwn?7?nFrnO9cHW1TbK?PrjhxB$W0`$uH?ijjk$Yb% zyd)3C1Qo(bUd0oT?rt=1FJ%J)P{p{prg{lnWnNzrH+Mdw;#h3$<=gMk5GA|)9=Ll2 zY$j}?x>7YA*QC=@IFdq?WMGj4yQDE|nvXEq`BVn3uQV?_?ah4CqsAB*vI| zR~;4|+wTLt`=KoX{^-G;!{(+G+HHUEpr+$cqAKH$Bjq0Xo{3QR!l=H8&X4dFCf2@!HWU^siT`y%FoKxw46-wqS^x)Av>do(6R!$CPKdW}h33qgXo%@kynmaaJ1vRUh5)J-LOh}b@Yq{lFwSZ1KPETF>pKyv?N+a{>QR9GMH+5~yBP)afl)zbd_s8mkMr;C~I zrhFzo!p@|%!hvumJ>msWyW*E4YSwwT*R1pI$m6UOA1Cw99zIJXVcpE*KAjY1`Om8Y zEdF>nY*pXglS1&ae4h!IfW<`!=h9!&LyX_@$+yh92j`2yQsr= zoO>f&ZpB~XOZ$3n@G1Vs?-x%TJE6FKDtvA6#B(Q}Id=T{qt7lMTR3|1ncrSI`rI?+ zr;na|_W8x*4$hyteRAsADZavFF8^S!P%nt$ zl%CE7Kd4s4UP;kvpGk!m`!CFx;;{gK4r}-40-hLtgR8$CID8I_ozDi`3xu76*ZD@M z0X#nADVQgcGyi%rMz71T)4K7+7EcVnk~wVg9WOI_9%RS)wkL}`gYslCq1>@4`+c%_ zhST1>Aof(P(rz`%D^C_*X)kbeoP&&Wdg02c8qbqIpvOsX&X@Jh5uLrnp$TvJb6q<1 z_GEF#L$3X9j!&JOdhY3`pPoAL{K;pZ`C`5O{Xza_JoX)*qkpoPylb|P@X0SqmxX7a zEkCpP%x@om{^^sIW6wQ*Q8ecatv#3WixB(o6Uh+%Q7T*!rtze4a`h9(zX;kP?B@$M z^r%974@wBtR9HeU*g5>EK_31kGYp<@D&%ySTBm6nbL(}}JE8e2>VLc^l7TPS_|=Sg zKYb3pH7D>5AHSNe^P+VB#W*2+I~6LudDg>T&H4BU|1Wu>_wRgdPYCT)qKWkITn>{=GFS7sm2Ooapo9F(` zkN>j$;F0(LnOO4d3)f~_mGUaDxo+?*={24;Ec49UTJzc>FWarxt|e5w#uI$aYsl%* zb+@J0P^8y*fRjgVRCcYt@YXeZZdy$+VJ2hI?oO>OEeNasJAXDFaN!ho|5WMX?s$G@ zpk4?(blEt&vLdbJF9@$x?5#0s`*)84WB=|@e%ZMx>xeI)=?p`brxZAqac{orUF82C z7E@t`HDmI#qLTyR^)SoHz1PDzPNvOrPGg3RYMr`%na%DQtNOv7|M|bQ81jE*DILP^ z*r$I>jrecy=PWlVpz8d9&UWdXXNe6@ozBwF*KBE}GeO!0bVaW8D6GlC5KC5Ppr8Dcj!HiIe1cfii90Ya8}uuBw;(yb>Oy zR?=Uxxhp($jy#@2rt)i~SK}FqtBkF|NOYJW+17TvH7_igd+=VTC!JmI!#U1o^|9W6 z0H24bFN*nL3vF|+3}Cr?zr(#wfr+;C^>dzY>Pdx5^n2YPY14U)ace}pM2}vAQEND_ z7{1R~PJr17e)aQPKpBMNGq?m?9b#y3jDeGO@#l3L!%XZ$l+YLwn(EFe{ + + + + WhoreIsServingVisitors + rjwwhoring.JobDriver_WhoreIsServingVisitors + serving visitors + false + + + + WhoreInvitingVisitors + rjwwhoring.JobDriver_WhoreInvitingVisitors + attempting hookup + false + + \ No newline at end of file diff --git a/1.4/Defs/RecordDefs/Records.xml b/1.4/Defs/RecordDefs/Records.xml new file mode 100644 index 0000000..f94897f --- /dev/null +++ b/1.4/Defs/RecordDefs/Records.xml @@ -0,0 +1,18 @@ + + + + + + CountOfWhore + + The number of times I whored myself. + Int + + + + EarnedMoneyByWhore + + The amount of silvers I have earned as a whore. + Int + + diff --git a/1.4/Defs/Rooms/RoomRoles.xml b/1.4/Defs/Rooms/RoomRoles.xml new file mode 100644 index 0000000..855f0bd --- /dev/null +++ b/1.4/Defs/Rooms/RoomRoles.xml @@ -0,0 +1,17 @@ + + + + + Brothel + + rjwwhoring.RoomRoleWorker_Brothel + +
  • Beauty
  • +
  • Cleanliness
  • +
  • Wealth
  • +
  • Space
  • +
  • Impressiveness
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.4/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml b/1.4/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml new file mode 100644 index 0000000..8af3edf --- /dev/null +++ b/1.4/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml @@ -0,0 +1,22 @@ + + + + + PrisonerWhoreSexualEmergencyTree + Humanlike_PostDuty + 100 + + +
  • + +
  • + +
  • + +
  • +
    + + +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml b/1.4/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml new file mode 100644 index 0000000..def7e6b --- /dev/null +++ b/1.4/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml @@ -0,0 +1,43 @@ + + + + + + WhoreSexualEmergencyTree + Humanlike_PreMain + 15 + + +
  • + +
  • + +
  • + +
  • +
    + + +
    +
    + + + + WhoreJobTree + Humanlike_PostMain + 15 + + +
  • + +
  • + +
  • + +
  • +
    + + +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/ThoughtDefs/Thoughts_Whore.xml b/1.4/Defs/ThoughtDefs/Thoughts_Whore.xml new file mode 100644 index 0000000..0bbd196 --- /dev/null +++ b/1.4/Defs/ThoughtDefs/Thoughts_Whore.xml @@ -0,0 +1,125 @@ + + + + + Whorish_Thoughts + rjwwhoring.ThoughtWorker_Whore + 2.0 + 10 + 0.4 + + + +
  • 30
  • +
  • 50
  • +
    + 30 + +
  • + + We just need money! I'm not a ... + -5 +
  • +
  • + + Well, at least it pays well... + -1 +
  • +
  • + + This job isn't so bad afterall! + 2 +
  • +
    +
    + + + Whorish_Thoughts_Captive + rjwwhoring.ThoughtWorker_Whore + 4.0 + 10 + 0.4 + + + +
  • 30
  • +
  • 40
  • +
  • 80
  • +
    + 10 + + +
  • + + They forced me to serve as a sex toy! + -20 +
  • +
  • + + I'm not just a rental ride! + -10 +
  • +
  • + + Just no beatings, please. + -1 +
  • +
  • + + I could get more clients if not these restraints! + 2 +
  • +
    +
    + + + + RJWFailedSolicitation + Thought_MemorySocial + 0.4 + 100 + 1 + 0.5 + +
  • + + -1 +
  • +
    +
    + + + + RJWTurnedDownWhore + Thought_MemorySocial + 0.2 + 1 + 1 + 0.5 + +
  • + + -1 +
  • +
    +
    + + + SleptInBrothel + 1 + 1 + 1 + +
  • + + Eww, the sheets were all sticky. + -10 +
  • +
  • + + I just love this place, the smell, the sounds... + 2 +
  • +
    +
    +
    diff --git a/1.4/Defs/TipSetDefs/Tips.xml b/1.4/Defs/TipSetDefs/Tips.xml new file mode 100644 index 0000000..4f36f27 --- /dev/null +++ b/1.4/Defs/TipSetDefs/Tips.xml @@ -0,0 +1,13 @@ + + + + RjwWhoringTips + + +
  • Whoring price is visible in the "show sexuality" menu on the bio tab (the icon looks like a heart).
  • + + +
  • Condoms can be automatically used if placed in a stockpile next to a bed - it might be a good idea to have some around if you intend on whoring your colonists out.
  • +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/WhoreBackstories.xml b/1.4/Defs/WhoreBackstories.xml new file mode 100644 index 0000000..329d45c --- /dev/null +++ b/1.4/Defs/WhoreBackstories.xml @@ -0,0 +1,30 @@ + + + + + + WhoreBackstories + + + + + +
  • Sex slave
  • +
  • Courtesean
  • +
  • Housemate
  • +
  • Model
  • +
  • idol
  • + +
  • Nymph
  • + +
  • Pleasure
  • +
  • Courtesan
  • + +
  • Dancer
  • +
  • Holo-star
  • + +
  • Prostitute
  • +
  • Breeder
  • +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml b/1.4/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml new file mode 100644 index 0000000..63985a5 --- /dev/null +++ b/1.4/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml @@ -0,0 +1,52 @@ + + + + RJW_IsWhore + Whores + rjwwhoring.MainTab.PawnColumnWorker_IsWhore + true + 80 + + + RJW_WhoreExperience + Whoring experience + + rjwwhoring.MainTab.PawnColumnWorker_WhoreExperience + 100 + + + RJW_PriceRangeOfWhore + Price range for whore + + rjwwhoring.MainTab.PawnColumnWorker_PriceRangeOfWhore + 100 + + + RJW_EarnedMoneyByWhore + Money earned(total) + + rjwwhoring.MainTab.PawnColumnWorker_EarnedMoneyByWhore + 100 + + + RJW_CountOfWhore + Clients served + + rjwwhoring.MainTab.PawnColumnWorker_CountOfWhore + 100 + + + RJW_AverageMoneyByWhore + Money earned(average) + + rjwwhoring.MainTab.PawnColumnWorker_AverageMoneyByWhore + 100 + + + RJW_WhoreMood + Mood of pawn + + rjwwhoring.MainTab.PawnColumnWorker_Mood + 100 + + diff --git a/1.4/Defs/WhoringTab/PawnTableDefs.xml b/1.4/Defs/WhoringTab/PawnTableDefs.xml new file mode 100644 index 0000000..f321b97 --- /dev/null +++ b/1.4/Defs/WhoringTab/PawnTableDefs.xml @@ -0,0 +1,33 @@ + + + + + RJW_Brothel + rjwwhoring.MainTab.PawnTable_Whores + +
  • Label
  • +
  • GapTiny
  • +
  • RJW_Gender
  • +
  • GapTiny
  • +
  • LifeStage
  • +
  • GapTiny
  • +
  • RJW_IsPrisoner
  • +
  • RJW_IsSlave
  • +
  • GapTiny
  • +
  • RJW_IsWhore
  • +
  • RJW_WhoreMood
  • +
  • RJW_CountOfWhore
  • +
  • RJW_WhoreExperience
  • +
  • RJW_EarnedMoneyByWhore
  • +
  • RJW_AverageMoneyByWhore
  • +
  • RJW_PriceRangeOfWhore
  • +
  • RemainingSpace
  • +
    + +
  • + +
  • +
    +
    + +
    diff --git a/1.4/Languages/English/Keyed/Whoring.xml b/1.4/Languages/English/Keyed/Whoring.xml new file mode 100644 index 0000000..401855b --- /dev/null +++ b/1.4/Languages/English/Keyed/Whoring.xml @@ -0,0 +1,43 @@ + + + Enable whoring tab + Shows/hide whoring tab + Show whore price factor on beds + Show whore price factor as a label on beds that are enabled for whoring. + Show bed widgets + Show bed widgets to mark beds for public/private for whoring. + + Money Printing + Clients will spawn silver instead of using their own/caravan + Client RNG disable + Instead of doing rng roll, Clients always accept solicitation. + + Debug log whoring info + Enables some very spamming debug logs to help find bugs in Whoring solicitation operations. + + + {0} accepted the deal {1} offered. + {0} wants to be serviced by {1}. + {0} rejected the deal {1} offered. + {0} rejected the offer because {1} does not look healthy + + + Assign to whorin' + + Won't agree to be a whore + + + Allow everyone to whore + Allow all whores to use this bed to entertain customers. + Allow owner to whore + Whether owner(s) are allowed to use this bed for whoring. + Whoring price factor (based on comfort, room impressiveness and number of beds in room: {0} + + Whoring price range: + Prisoner + Slave + \ No newline at end of file diff --git a/1.4/Patches/FacialAnimation_compatibility.xml b/1.4/Patches/FacialAnimation_compatibility.xml new file mode 100644 index 0000000..8cae3d9 --- /dev/null +++ b/1.4/Patches/FacialAnimation_compatibility.xml @@ -0,0 +1,27 @@ + + + + +
  • [NL] Facial Animation - WIP
  • +
    + + Always + +
  • + /Defs/FacialAnimation.FaceAnimationDef[defName="Lovin" or defName="Lovin2"]/targetJobs + Always + +
  • WhoreIsServingVisitors
  • + + +
  • + /Defs/FacialAnimation.FaceAnimationDef[defName="StandAndBeSociallyActive"]/targetJobs + Always + +
  • WhoreInvitingVisitors
  • + + +
    +
    +
    +
    \ No newline at end of file diff --git a/1.4/Source/Mod/Data/BedData.cs b/1.4/Source/Mod/Data/BedData.cs new file mode 100644 index 0000000..5d6a1ff --- /dev/null +++ b/1.4/Source/Mod/Data/BedData.cs @@ -0,0 +1,39 @@ +using System; +using Verse; +using System.Linq; +using RimWorld; + +namespace rjwwhoring +{ + public class BedData : IExposable + { + public Building_Bed bed = null; + public bool allowedForWhoringOwner = true; + public bool allowedForWhoringAll = false; + public int reservedUntilGameTick = 0; + public int reservedForPawnID = 0; + + public int lastScoreUpdateTick = -70; // GenTicks.TicksGame + public float bedScore = -1f; + public int scoreUpdateTickDelay = 60; + + public float roomScore = -1f; + + public BedData() { } + public BedData(Building_Bed bed) + { + this.bed = bed; + } + + public void ExposeData() + { + Scribe_References.Look(ref bed, "Bed"); + Scribe_Values.Look(ref allowedForWhoringOwner, "allowedForWhoringOwner", true, true); + Scribe_Values.Look(ref allowedForWhoringAll, "allowedForWhoringAll", false, true); + Scribe_Values.Look(ref reservedUntilGameTick, "lastUsed", 0, true); + Scribe_Values.Look(ref reservedForPawnID, "lastUsedBy", 0, true); + } + + public bool IsValid { get { return bed != null; } } + } +} diff --git a/1.4/Source/Mod/Data/DataStore.cs b/1.4/Source/Mod/Data/DataStore.cs new file mode 100644 index 0000000..1f3566b --- /dev/null +++ b/1.4/Source/Mod/Data/DataStore.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using Verse; +using RimWorld; +using RimWorld.Planet; + +namespace rjwwhoring +{ + /// + /// Rimworld object for storing the world/save info + /// + public class DataStore : WorldComponent + { + public Dictionary bedData = new Dictionary(); + + public DataStore(World world) : base(world) + { + } + + public override void ExposeData() + { + if (Scribe.mode == LoadSaveMode.Saving) + { + bedData.RemoveAll(item => item.Value == null || !item.Value.IsValid); + } + + base.ExposeData(); + Scribe_Collections.Look(ref bedData, "BedData", LookMode.Value, LookMode.Deep); + if (Scribe.mode == LoadSaveMode.LoadingVars) + { + if (bedData == null) bedData = new Dictionary(); + } + } + + public BedData GetBedData(Building_Bed bed) + { + BedData res; + var filled = bedData.TryGetValue(bed.thingIDNumber, out res); + if ((res == null) || (!res.IsValid)) + { + if (filled) + { + bedData.Remove(bed.thingIDNumber); + } + res = new BedData(bed); + bedData.Add(bed.thingIDNumber, res); + } + return res; + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/Data/StringListDef.cs b/1.4/Source/Mod/Data/StringListDef.cs new file mode 100644 index 0000000..541b00c --- /dev/null +++ b/1.4/Source/Mod/Data/StringListDef.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Verse; + +namespace rjwwhoring +{ + /// + /// Whore backstories from xml GET! + /// Just a simplest form of passing data from xml to the code + /// + public class StringListDef : Def + { + public List strings = new List(); + } +} diff --git a/1.4/Source/Mod/DefOf/RecordDefDefOf.cs b/1.4/Source/Mod/DefOf/RecordDefDefOf.cs new file mode 100644 index 0000000..0a13f1f --- /dev/null +++ b/1.4/Source/Mod/DefOf/RecordDefDefOf.cs @@ -0,0 +1,12 @@ +using RimWorld; +using Verse; + +namespace rjwwhoring +{ + [DefOf] + public static class RecordDefOf + { + public static RecordDef EarnedMoneyByWhore; + public static RecordDef CountOfWhore; + } +} diff --git a/1.4/Source/Mod/DefOf/ThoughtDefOf.cs b/1.4/Source/Mod/DefOf/ThoughtDefOf.cs new file mode 100644 index 0000000..b7a2e14 --- /dev/null +++ b/1.4/Source/Mod/DefOf/ThoughtDefOf.cs @@ -0,0 +1,19 @@ +using RimWorld; +using Verse; + +namespace rjwwhoring +{ + [DefOf] + public static class ThoughtDefOf + { + public static ThoughtDef_Whore Whorish_Thoughts; + + public static ThoughtDef_Whore Whorish_Thoughts_Captive; + + public static ThoughtDef SleptInBrothel; + + public static ThoughtDef RJWFailedSolicitation; + + public static ThoughtDef RJWTurnedDownWhore; + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs b/1.4/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs new file mode 100644 index 0000000..3e6aa9a --- /dev/null +++ b/1.4/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs @@ -0,0 +1,172 @@ +using System.Collections.Generic; +using RimWorld; +using rjw; +using Verse; +using Verse.AI; + +namespace rjwwhoring +{ + public class JobDriver_WhoreInvitingVisitors : JobDriver + { + // List of jobs that can be interrupted by whores. + public static readonly List allowedJobs = new List { null, JobDefOf.Wait_Wander, JobDefOf.GotoWander, JobDefOf.Clean, JobDefOf.ClearSnow, + JobDefOf.CutPlant, JobDefOf.HaulToCell, JobDefOf.Deconstruct, JobDefOf.Harvest, JobDefOf.LayDown, JobDefOf.Research, JobDefOf.SmoothFloor, JobDefOf.SmoothWall, + JobDefOf.SocialRelax, JobDefOf.StandAndBeSociallyActive, JobDefOf.RemoveApparel, JobDefOf.Strip, JobDefOf.Tame, JobDefOf.Wait, JobDefOf.Wear, JobDefOf.FixBrokenDownBuilding, + JobDefOf.FillFermentingBarrel, JobDefOf.DoBill, JobDefOf.Sow, JobDefOf.Shear, JobDefOf.BuildRoof, JobDefOf.DeliverFood, JobDefOf.HaulToContainer, JobDefOf.Hunt, JobDefOf.Mine, + JobDefOf.OperateDeepDrill, JobDefOf.OperateScanner, JobDefOf.RearmTurret, JobDefOf.Refuel, JobDefOf.RefuelAtomic, JobDefOf.RemoveFloor, JobDefOf.RemoveRoof, JobDefOf.Repair, + JobDefOf.TakeBeerOutOfFermentingBarrel, JobDefOf.Train, JobDefOf.Uninstall, xxx.Masturbate}; + + public bool successfulPass = true; + + private Pawn Whore => GetActor(); + private Pawn TargetPawn => TargetThingA as Pawn; + private Building_Bed TargetBed => TargetThingB as Building_Bed; + + private readonly TargetIndex TargetPawnIndex = TargetIndex.A; + private readonly TargetIndex TargetBedIndex = TargetIndex.B; + + private bool DoesTargetPawnAcceptAdvance() + { + if (WhoringBase.DebugWhoring) ModLog.Message($"JobDriver_InvitingVisitors::DoesTargetPawnAcceptAdvance() - {xxx.get_pawnname(TargetPawn)}"); + //if (RJWSettings.WildMode) return true; + + if (PawnUtility.EnemiesAreNearby(TargetPawn)) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" fail - enemy near"); + return false; + } + if (!allowedJobs.Contains(TargetPawn.jobs.curJob.def)) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" fail - not allowed job"); + return false; + } + + if (WhoringBase.DebugWhoring) + { + ModLog.Message("Will try hookup " + WhoringHelper.WillPawnTryHookup(TargetPawn)); + ModLog.Message("Is whore appealing " + WhoringHelper.IsHookupAppealing(TargetPawn, Whore)); + ModLog.Message("Can afford whore " + WhoringHelper.CanAfford(TargetPawn, Whore)); + ModLog.Message("Need sex " + (xxx.need_some_sex(TargetPawn) >= 1)); + } + if (WhoringHelper.WillPawnTryHookup(TargetPawn) && WhoringHelper.IsHookupAppealing(TargetPawn, Whore) && WhoringHelper.CanAfford(TargetPawn, Whore) && xxx.need_some_sex(TargetPawn) >= 1f) + { + if (!Whore.IsPrisoner) + Whore.skills.Learn(SkillDefOf.Social, 1.2f); + return true; + } + return false; + } + + public override bool TryMakePreToilReservations(bool errorOnFailed) => true; + + protected override IEnumerable MakeNewToils() + { + this.FailOnDespawnedOrNull(TargetPawnIndex); + this.FailOnDespawnedNullOrForbidden(TargetBedIndex); + this.FailOn(() => Whore is null || !WhoreBed_Utility.CanUseForWhoring(Whore, TargetBed));//|| !Whore.CanReserve(TargetPawn) + this.FailOn(() => pawn.Drafted); + + if (!Whore.IsPrisoner) + { + yield return Toils_Goto.GotoThing(TargetPawnIndex, PathEndMode.Touch); + + + Toil TryItOn = new Toil(); + TryItOn.AddFailCondition(() => !xxx.IsTargetPawnOkay(TargetPawn)); + TryItOn.defaultCompleteMode = ToilCompleteMode.Delay; + TryItOn.initAction = delegate + { + //ModLog.Message("JobDriver_InvitingVisitors::MakeNewToils - TryItOn - initAction is called"); + Whore.jobs.curDriver.ticksLeftThisToil = 50; + FleckMaker.ThrowMetaIcon(Whore.Position, Whore.Map, FleckDefOf.Heart); + }; + yield return TryItOn; + } + + Toil AwaitResponse = new Toil(); + AwaitResponse.defaultCompleteMode = ToilCompleteMode.Delay; + AwaitResponse.defaultDuration = 10; + AwaitResponse.initAction = delegate + { + List extraSentencePacks = new List(); + successfulPass = DoesTargetPawnAcceptAdvance(); + //ModLog.Message("JobDriver_InvitingVisitors::MakeNewToils - AwaitResponse - initAction is called"); + if (successfulPass) + { + FleckMaker.ThrowMetaIcon(TargetPawn.Position, TargetPawn.Map, FleckDefOf.Heart); + TargetPawn.jobs.EndCurrentJob(JobCondition.Incompletable); + if (xxx.RomanceDiversifiedIsActive) + { + extraSentencePacks.Add(RulePackDef.Named("HookupSucceeded")); + } + if (Whore.health.HasHediffsNeedingTend()) + { + successfulPass = false; + string key = "RJW_VisitorSickWhore"; + string text = key.Translate(TargetPawn.LabelIndefinite(), Whore.LabelIndefinite()).CapitalizeFirst(); + Messages.Message(text, Whore, MessageTypeDefOf.TaskCompletion); + } + else + { + string key = "RJW_VisitorAcceptWhore"; + if (Whore.IsPrisoner) + { + key = "RJW_VisitorSolicitWhore"; + } + string text = key.Translate(TargetPawn.LabelIndefinite(), Whore.LabelIndefinite()).CapitalizeFirst(); + Messages.Message(text, TargetPawn, MessageTypeDefOf.TaskCompletion); + } + } + if (!successfulPass) + { + // remove bed reservation + TargetBed.UnreserveForWhoring(); + + FleckMaker.ThrowMetaIcon(TargetPawn.Position, TargetPawn.Map, FleckDefOf.IncapIcon); + TargetPawn.needs.mood.thoughts.memories.TryGainMemory( + TargetPawn.Faction == Whore.Faction + ? ThoughtDef.Named("RJWTurnedDownWhore") + : ThoughtDef.Named("RJWFailedSolicitation"), Whore); + + if (xxx.RomanceDiversifiedIsActive) + { + Whore.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("RebuffedMyHookupAttempt"), TargetPawn); + TargetPawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("FailedHookupAttemptOnMe"), Whore); + extraSentencePacks.Add(RulePackDef.Named("HookupFailed")); + } + //Disabled rejection notifications + //Messages.Message("RJW_VisitorRejectWhore".Translate(new object[] { xxx.get_pawnname(TargetPawn), xxx.get_pawnname(Whore) }), TargetPawn, MessageTypeDefOf.SilentInput); + } + if (xxx.RomanceDiversifiedIsActive) + { + Find.PlayLog.Add(new PlayLogEntry_Interaction(DefDatabase.GetNamed("TriedHookupWith"), pawn, TargetPawn, extraSentencePacks)); + } + //Log.Message("[RJW] AwaitResponse initAction - successfulPass: " + successfulPass.ToString()); + }; + yield return AwaitResponse; + + Toil BothGoToBed = new Toil(); + BothGoToBed.AddFailCondition(() => !successfulPass || !WhoreBed_Utility.CanUseForWhoring(Whore, TargetBed)); + BothGoToBed.defaultCompleteMode = ToilCompleteMode.Instant; + BothGoToBed.initAction = delegate + { + //ModLog.Message("JobDriver_InvitingVisitors::MakeNewToils - BothGoToBed - initAction is called0"); + if (!successfulPass) return; + if (!WhoreBed_Utility.CanUseForWhoring(Whore, TargetBed) && Whore.CanReserve(TargetPawn, 1, 0)) + { + //ModLog.Message("JobDriver_InvitingVisitors::MakeNewToils - BothGoToBed - cannot use the whore bed"); + return; + } + //ModLog.Message("JobDriver_InvitingVisitors::MakeNewToils - BothGoToBed - initAction is called1"); + + TargetBed.ReserveForWhoring(Whore, 1800);//is 1800 ticks long enough to go to the bed (until next reservation is made?) + + Whore.jobs.jobQueue.EnqueueFirst(JobMaker.MakeJob(xxx.whore_is_serving_visitors, TargetPawn, TargetBed)); + //TargetPawn.jobs.jobQueue.EnqueueFirst(JobMaker.MakeJob(DefDatabase.GetNamed("WhoreIsServingVisitors"), Whore, TargetBed, (TargetBed.MaxAssignedPawnsCount>1)?TargetBed.GetSleepingSlotPos(1): TargetBed.)), null); + Whore.jobs.curDriver.EndJobWith(JobCondition.InterruptOptional); + //TargetPawn.jobs.curDriver.EndJobWith(JobCondition.InterruptOptional); + }; + yield return BothGoToBed; + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs b/1.4/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs new file mode 100644 index 0000000..ecd45d2 --- /dev/null +++ b/1.4/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs @@ -0,0 +1,183 @@ +using System.Collections.Generic; +using RimWorld; +using Verse; +using Verse.AI; +//using Multiplayer.API; +using rjw; + +namespace rjwwhoring +{ + public class JobDriver_WhoreIsServingVisitors : JobDriver_SexBaseInitiator + { + public IntVec3 SleepSpot => Bed.SleepPosOfAssignedPawn(pawn); + + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return pawn.Reserve(Target, job, 1, 0, null, errorOnFailed); + } + + //[SyncMethod] + protected override IEnumerable MakeNewToils() + { + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":MakeNewToils() - making toils"); + setup_ticks(); + var PartnerJob = xxx.gettin_loved; + + this.FailOnDespawnedOrNull(iTarget); + this.FailOnDespawnedNullOrForbidden(iBed); + + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":fail conditions check " + !WhoreBed_Utility.CanUseForWhoring(pawn, Bed) + " " + !pawn.CanReserve(Partner)); + this.FailOn(() => !WhoreBed_Utility.CanUseForWhoring(pawn, Bed) || !pawn.CanReserve(Partner)); + this.FailOn(() => pawn.Drafted); + this.FailOn(() => Partner.IsFighting()); + + yield return Toils_Reserve.Reserve(iTarget, 1, 0); + int basePrice = WhoringHelper.PriceOfWhore(pawn); + float bedMult = WhoreBed_Utility.CalculatePriceFactor(Bed); + //yield return Toils_Reserve.Reserve(BedInd, Bed.SleepingSlotsCount, 0); + + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":generate job toils"); + Toil gotoBed = new Toil(); + gotoBed.defaultCompleteMode = ToilCompleteMode.PatherArrival; + gotoBed.FailOnBedNoLongerUsable(iBed, Bed); + gotoBed.AddFailCondition(() => Partner.Downed); + gotoBed.FailOn(() => !Partner.CanReach(Bed, PathEndMode.Touch, Danger.Deadly)); + gotoBed.initAction = delegate + { + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":gotoWhoreBed"); + pawn.pather.StartPath(SleepSpot, PathEndMode.OnCell); + Partner.jobs.StopAll(); + Job job = JobMaker.MakeJob(JobDefOf.GotoMindControlled, SleepSpot); + Partner.jobs.StartJob(job, JobCondition.InterruptForced); + }; + yield return gotoBed; + + ticks_left = (int)(2000.0f * Rand.Range(0.30f, 1.30f)); + + Toil waitInBed = new Toil(); + waitInBed.initAction = delegate + { + ticksLeftThisToil = 5000; + }; + waitInBed.tickAction = delegate + { + pawn.GainComfortFromCellIfPossible(); + if (IsInOrByBed(Bed, Partner) && pawn.PositionHeld == Partner.PositionHeld) + { + ReadyForNextToil(); + } + }; + waitInBed.defaultCompleteMode = ToilCompleteMode.Delay; + yield return waitInBed; + + Toil StartPartnerJob = new Toil(); + StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; + StartPartnerJob.socialMode = RandomSocialMode.Off; + StartPartnerJob.initAction = delegate + { + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":StartPartnerJob"); + var gettin_loved = JobMaker.MakeJob(PartnerJob, pawn, Bed); + Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced); + }; + yield return StartPartnerJob; + + Toil SexToil = new Toil(); + SexToil.defaultCompleteMode = ToilCompleteMode.Never; + SexToil.socialMode = RandomSocialMode.Off; + SexToil.handlingFacing = true; + SexToil.FailOn(() => Partner.Dead); + SexToil.FailOn(() => Partner.CurJob.def != PartnerJob); + SexToil.initAction = delegate + { + if (WhoringBase.DebugWhoring) ModLog.Message("" + this.GetType().ToString() + ":SexToil start"); + + // refresh bed reservation + Bed.ReserveForWhoring(pawn, ticks_left+100); + + Start(); + + // TODO: replace this quick n dirty way + CondomUtility.GetCondomFromRoom(pawn); + // Try to use whore's condom first, then client's + Sexprops.usedCondom = CondomUtility.TryUseCondom(pawn) || CondomUtility.TryUseCondom(Partner); + + if (!RJWSettings.HippieMode && xxx.HasNonPolyPartner(Partner, true)) + { + Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(Partner); + // We have to do a few other checks because the pawn might have multiple lovers and ExistingLovePartner() might return the wrong one + if (lover != null && pawn != lover && !lover.Dead && (lover.Map == Partner.Map || Rand.Value < 0.25) && GenSight.LineOfSight(lover.Position, Partner.Position, lover.Map)) + { + lover.needs.mood.thoughts.memories.TryGainMemory(RimWorld.ThoughtDefOf.CheatedOnMe, Partner); + } + } + }; + SexToil.AddPreTickAction(delegate + { + if (pawn.IsHashIntervalTick(ticks_between_hearts)) + if (xxx.is_nympho(pawn)) + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart); + else + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, xxx.mote_noheart); + SexTick(pawn, Partner); + SexUtility.reduce_rest(Partner, 1); + SexUtility.reduce_rest(pawn, 2); + if (ticks_left % 100 == 0) + Bed.ReserveForWhoring(pawn, ticks_left + 100); // without this, reservation sometimes expires before sex is finished + if (ticks_left <= 0) + ReadyForNextToil(); + }); + SexToil.AddFinishAction(delegate + { + End(); + }); + yield return SexToil; + + Toil afterSex = new Toil + { + initAction = delegate + { + // Adding interactions, social logs, etc + SexUtility.ProcessSex(Sexprops); + + Bed.UnreserveForWhoring(); + + if (!(Partner.IsColonist && (pawn.IsPrisonerOfColony || pawn.IsColonist))) + { + int netPrice = (int) (basePrice * bedMult); + if (netPrice == 0) + netPrice += 1; + + int bedTip = netPrice - basePrice; + int defect = WhoringHelper.PayPriceToWhore(Partner, netPrice, pawn); + + if (WhoringBase.DebugWhoring) + { + ModLog.Message($"{GetType()}:afterSex toil - {Partner} tried to pay {basePrice}(whore price) + {bedTip}(room modifier) silver to {pawn}"); + + if (defect <= 0) + ModLog.Message(" Paid full price"); + else if (defect <= bedTip) + ModLog.Message(" Could not pay full tip"); + else + ModLog.Message(" Failed to pay base price"); + } + + WhoringHelper.UpdateRecords(pawn, netPrice - defect); + } + + if (SexUtility.ConsiderCleaning(pawn)) + { + LocalTargetInfo cum = pawn.PositionHeld.GetFirstThing(pawn.Map); + + Job clean = JobMaker.MakeJob(JobDefOf.Clean); + clean.AddQueuedTarget(TargetIndex.A, cum); + + pawn.jobs.jobQueue.EnqueueFirst(clean); + } + }, + defaultCompleteMode = ToilCompleteMode.Instant + }; + yield return afterSex; + } + } +} diff --git a/1.4/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs b/1.4/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs new file mode 100644 index 0000000..c438e29 --- /dev/null +++ b/1.4/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs @@ -0,0 +1,260 @@ +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using rjw; +using Verse; +using Verse.AI; +//using Multiplayer.API; + +namespace rjwwhoring +{ + public class JobGiver_WhoreInvitingVisitors : ThinkNode_JobGiver + { + // Checks if pawn has a memory. + // Maybe not the best place for function, might be useful elsewhere too. + public static bool MemoryChecker(Pawn pawn, ThoughtDef thought) + { + Thought_Memory val = pawn.needs.mood.thoughts.memories.Memories.Find((Thought_Memory x) => (object)x.def == thought); + return val == null ? false : true; + } + + //[SyncMethod] + private static bool Roll_to_skip(Pawn client, Pawn whore) + { + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + float fuckability = SexAppraiser.would_fuck(client, whore); // 0.0 to 1. + + // More likely to skip other whores, because they're supposed to be working. + if (client.IsDesignatedService()) + fuckability *= 0.6f; + if (WhoringBase.ClientAlwaysAccept) + { + return fuckability >= 0.1f && xxx.need_some_sex(client) >= 1f; + } + else + return fuckability >= 0.1f && xxx.need_some_sex(client) >= 1f && Rand.Chance(0.5f); + } + + /* + public static Pawn Find_pawn_to_fuck(Pawn whore, Map map) + { + Pawn best_fuckee = null; + float best_distance = 1.0e6f; + foreach (Pawn q in map.mapPawns.FreeColonists) + if ((q != whore) && + xxx.need_some_sex(q)>0 && + whore.CanReserve(q, 1, 0) && + q.CanReserve(whore, 1, 0) && + Roll_to_skip(whore, q) && + (!q.Position.IsForbidden(whore)) && + xxx.is_healthy(q)) + { + var dis = whore.Position.DistanceToSquared(q.Position); + if (dis < best_distance) + { + best_fuckee = q; + best_distance = dis; + } + } + return best_fuckee; + } + */ + + private sealed class FindAttractivePawnHelper + { + internal Pawn whore; + + internal bool TraitCheckFail(Pawn client) + { + if (!xxx.is_human(client)) + return true; + if (!xxx.has_traits(client)) + return true; + if (!(xxx.can_fuck(client) || xxx.can_be_fucked(client)) || !xxx.IsTargetPawnOkay(client)) + return true; + + //Log.Message("client:" + client + " whore:" + whore); + if (CompRJW.CheckPreference(client, whore) == false) + return true; + return false; // Everything ok. + } + + //Use this check when client is not in the same faction as the whore + internal bool FactionCheckPass(Pawn client) + { + return ((client.Map == whore.Map) && (client.Faction != null && client.Faction != whore.Faction) && !client.IsPrisoner && !xxx.is_slave(client) && !client.HostileTo(whore)); + } + + //Use this check when client is in the same faction as the whore + //[SyncMethod] + internal bool RelationCheckPass(Pawn client) + { + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + if (xxx.isSingleOrPartnerNotHere(client) || xxx.is_lecher(client) || Rand.Value < 0.9f) + { + if (client != LovePartnerRelationUtility.ExistingLovePartner(whore)) + { //Exception for prisoners to account for PrisonerWhoreSexualEmergencyTree, which allows prisoners to try to hook up with anyone who's around (mostly other prisoners or warden) + return (client != whore) & (client.Map == whore.Map) && (client.Faction == whore.Faction || whore.IsPrisoner) && (client.IsColonist || whore.IsPrisoner) && WhoringHelper.IsHookupAppealing(whore, client); + } + } + return false; + } + } + + //[SyncMethod] + public static Pawn FindAttractivePawn(Pawn whore, out int price) + { + price = 0; + if (whore == null || xxx.is_asexual(whore)) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" {xxx.get_pawnname(whore)} is asexual, abort"); + return null; + } + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + + FindAttractivePawnHelper client = new FindAttractivePawnHelper + { + whore = whore + }; + price = WhoringHelper.PriceOfWhore(whore); + int priceOfWhore = price; + + IntVec3 pos = whore.Position; + + IEnumerable potentialClients = whore.Map.mapPawns.AllPawnsSpawned; + potentialClients = potentialClients.Where(x + => x != whore + && !x.IsForbidden(whore) + && !x.HostileTo(whore) + && !x.IsPrisoner + && !xxx.is_slave(x) + && !x.IsColonist + && x.Position.DistanceTo(pos) < 100 + && xxx.is_healthy_enough(x)); + + + potentialClients = potentialClients.Except(potentialClients.Where(client.TraitCheckFail)); + + if (!whore.IsPrisoner) + potentialClients = potentialClients.Except(potentialClients.Where(x => !whore.CanReserveAndReach(x, PathEndMode.ClosestTouch, Danger.Some, 1))); + else + potentialClients = potentialClients.Except(potentialClients.Where(x => !x.CanReserveAndReach(whore, PathEndMode.ClosestTouch, Danger.Some, 1))); + + if (!potentialClients.Any()) return null; + + if (WhoringBase.DebugWhoring) ModLog.Message($" FindAttractivePawn number of all potential clients {potentialClients.Count()}"); + + List valid_targets = new List(); + + if (!whore.IsPrisoner) + foreach (Pawn target in potentialClients) + { + if(Pather_Utility.cells_to_target_casual(whore, target.Position)) + if (Pather_Utility.can_path_to_target(whore, target.Position)) + valid_targets.Add(target); + } + else + foreach (Pawn target in potentialClients) + { + if (Pather_Utility.cells_to_target_casual(target, whore.Position)) + if (Pather_Utility.can_path_to_target(target, whore.Position)) + valid_targets.Add(target); + } + + if (WhoringBase.DebugWhoring) ModLog.Message($" number of reachable clients {valid_targets.Count()}"); + + + //IEnumerable guestsSpawned = valid_targets.Where(x => x.Faction != whore.Faction + // && WhoringHelper.CanAfford(x, whore, priceOfWhore)); + + //if (RJWSettings.DebugWhoring) ModLog.Message($" number of clients can afford {guestsSpawned.Count()}"); + + //guestsSpawned = valid_targets.Where(x => x.Faction != whore.Faction + // && x != LovePartnerRelationUtility.ExistingLovePartner(whore)); + + //if (RJWSettings.DebugWhoring) ModLog.Message($" number of relations OK {guestsSpawned.Count()}"); + //guestsSpawned = valid_targets.Where(x => x.Faction != whore.Faction + // && !MemoryChecker(x, ThoughtDef.Named("RJWFailedSolicitation"))); + + //if (RJWSettings.DebugWhoring) ModLog.Message($" number of clients can memory OK {guestsSpawned.Count()}"); + + IEnumerable guestsSpawned = valid_targets.Where(x => x.Faction != whore.Faction + && !MemoryChecker(x, ThoughtDef.Named("RJWFailedSolicitation")) + && WhoringHelper.CanAfford(x, whore, priceOfWhore) + && x != LovePartnerRelationUtility.ExistingLovePartner(whore)); + + if (guestsSpawned.Any()) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" number of all acceptable Guests {guestsSpawned.Count()}"); + return guestsSpawned.RandomElement(); + } + + return null; + + //use casual sex for colonist hooking + if (WhoringBase.DebugWhoring) ModLog.Message($" found no guests, trying colonists"); + + if (!WhoringHelper.WillPawnTryHookup(whore))// will hookup colonists? + { + return null; + } + IEnumerable freeColonists = valid_targets.Where(x => x.Faction == whore.Faction + && Roll_to_skip(x, whore)); + + if (WhoringBase.DebugWhoring) ModLog.Message($" number of free colonists {freeColonists.Count()}"); + + freeColonists = freeColonists.Where(x => client.RelationCheckPass(x) && !MemoryChecker(x, ThoughtDef.Named("RJWTurnedDownWhore"))); + + if (freeColonists.Any()) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" number of all acceptable Colonists {freeColonists.Count()}"); + return freeColonists.RandomElement(); + } + + return null; + } + + protected override Job TryGiveJob(Pawn pawn) + { + + // Most things are now checked in the ThinkNode_ConditionalWhore. + + if (pawn.Drafted) return null; + //if (MP.IsInMultiplayer) return null; //fix error someday, maybe + + if (pawn.jobs.curDriver is JobDriver_Sex || pawn.jobs.curDriver is JobDriver_WhoreInvitingVisitors) return null; // already having sex + + if (!SexUtility.ReadyForLovin(pawn)) + { + //Whores need rest too, but this'll reduxe the wait a bit every it triggers. + pawn.mindState.canLovinTick -= 40; + return null; + } + + if (WhoringBase.DebugWhoring) ModLog.Message($"JobGiver_WhoreInvitingVisitors.TryGiveJob:({xxx.get_pawnname(pawn)})"); + + int price; + Pawn client = FindAttractivePawn(pawn, out price); + if (client == null) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" no clients found"); + return null; + } + + if (WhoringBase.DebugWhoring) ModLog.Message($" {xxx.get_pawnname(client)} is client"); + + Building_Bed whorebed = WhoreBed_Utility.FindBed(pawn, client); + if (whorebed == null) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" {xxx.get_pawnname(pawn)} + {xxx.get_pawnname(client)} - no usable bed found"); + return null; + } + whorebed.ReserveForWhoring(pawn, 600); // reserve for a short while until whore can actually ask customer + + return JobMaker.MakeJob(xxx.whore_inviting_visitors, client, whorebed); + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/Location/Brothel_Room.cs b/1.4/Source/Mod/Location/Brothel_Room.cs new file mode 100644 index 0000000..27921c3 --- /dev/null +++ b/1.4/Source/Mod/Location/Brothel_Room.cs @@ -0,0 +1,28 @@ +using Verse; +using RimWorld; + + +namespace rjwwhoring +{ + + public class RoomRoleWorker_Brothel : RoomRoleWorker + { + public override float GetScore(Room room) + { + int num = 0; + var allContainedThings = room.ContainedAndAdjacentThings; + foreach (var thing in allContainedThings) + { + var building_Bed = thing as Building_Bed; + if (building_Bed?.def.building.bed_humanlike == true) + { + if (building_Bed.ForPrisoners) return 0; + if (building_Bed.IsAllowedForWhoringAll()) num++; + } + } + if (num < 1) return 0; + return num * 110001; // higher than guest beds or "regular" beds when counting barracks + } + } + +} \ No newline at end of file diff --git a/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs b/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs new file mode 100644 index 0000000..0239322 --- /dev/null +++ b/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs @@ -0,0 +1,59 @@ +namespace rjwwhoring +{ + //This class is not used now. + /* + public class ThinkNode_ChancePerHour_Whore : ThinkNode_ChancePerHour + { + protected override float MtbHours(Pawn pawn) + { + // Use the fappin mtb hours as the base number b/c it already accounts for things like age + var base_mtb = xxx.config.whore_mtbh_mul * ThinkNode_ChancePerHour_Fappin.get_fappin_mtb_hours(pawn); + if (base_mtb < 0.0f) + return -1.0f; + + float desire_factor; + { + var need_sex = pawn.needs.TryGetNeed(); + if (need_sex != null) + { + if (need_sex.CurLevel <= need_sex.thresh_frustrated()) + desire_factor = 0.15f; + else if (need_sex.CurLevel <= need_sex.thresh_horny()) + desire_factor = 0.60f; + else + desire_factor = 1.00f; + } + else + desire_factor = 1.00f; + } + + float personality_factor; + { + personality_factor = 1.0f; + if (pawn.story != null) + { + foreach (var trait in pawn.story.traits.allTraits) + { + if (trait.def == xxx.nymphomaniac) personality_factor *= 0.25f; + else if (trait.def == TraitDefOf.Greedy) personality_factor *= 0.50f; + else if (xxx.RomanceDiversifiedIsActive&&(trait.def==xxx.philanderer || trait.def == xxx.polyamorous)) personality_factor *= 0.75f; + else if (xxx.RomanceDiversifiedIsActive && (trait.def == xxx.faithful)&& LovePartnerRelationUtility.HasAnyLovePartner(pawn)) personality_factor *= 30f; + } + } + } + + float fun_factor; + { + if ((pawn.needs.joy != null) && (xxx.is_nympho(pawn))) + fun_factor = Mathf.Clamp01(0.50f + pawn.needs.joy.CurLevel); + else + fun_factor = 1.00f; + } + + var gender_factor = (pawn.gender == Gender.Male) ? 1.0f : 3.0f; + + return base_mtb * desire_factor * personality_factor * fun_factor * gender_factor; + } + } + */ +} \ No newline at end of file diff --git a/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs b/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs new file mode 100644 index 0000000..fcfa9d5 --- /dev/null +++ b/1.4/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs @@ -0,0 +1,25 @@ +using Verse; +using Verse.AI; +using RimWorld; +using rjw; + +namespace rjwwhoring +{ + /// + /// Whore/prisoner look for customers + /// + public class ThinkNode_ConditionalWhore : ThinkNode_Conditional + { + protected override bool Satisfied(Pawn p) + { + // No animal whorin' for now. + if (xxx.is_animal(p)) + return false; + + if (!InteractionUtility.CanInitiateInteraction(p)) + return false; + + return xxx.is_whore(p); + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/Thoughts/ThoughtWorker_Whore.cs b/1.4/Source/Mod/Thoughts/ThoughtWorker_Whore.cs new file mode 100644 index 0000000..cbe88f9 --- /dev/null +++ b/1.4/Source/Mod/Thoughts/ThoughtWorker_Whore.cs @@ -0,0 +1,43 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; + +namespace rjwwhoring +{ + /// + /// Extends the standard thought to add a counter for the whore stages + /// + public class ThoughtDef_Whore : ThoughtDef + { + public List stageCounts = new List(); + public int storyOffset = 0; + } + + public class ThoughtWorker_Whore : Thought_Memory + { + public static readonly HashSet backstories = new HashSet(DefDatabase.GetNamed("WhoreBackstories").strings); + + protected List Stages => ((ThoughtDef_Whore) def).stageCounts; + protected int StoryOffset => ((ThoughtDef_Whore) def).storyOffset; + + public override int CurStageIndex + { + get + { + int timesWhored = pawn.records.GetAsInt(RecordDefOf.CountOfWhore); + + if (backstories.Contains(pawn.story?.Adulthood?.titleShort)) + { + timesWhored += StoryOffset; + } + + if (timesWhored > Stages[Stages.Count - 1]) + { + return Stages.Count - 1; + } + + return Stages.FindLastIndex(v => timesWhored > v) + 1; + } + } + } +} diff --git a/1.4/Source/Mod/Whoring.csproj b/1.4/Source/Mod/Whoring.csproj new file mode 100644 index 0000000..b213640 --- /dev/null +++ b/1.4/Source/Mod/Whoring.csproj @@ -0,0 +1,112 @@ + + + + + Debug + AnyCPU + {3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28} + Library + rjwwhoring + RimJobWorldWhoring + v4.7.2 + 512 + + + AnyCPU + true + full + false + ..\..\Assemblies\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\..\Assemblies\ + TRACE + prompt + 4 + + + + ..\packages\Lib.Harmony.2.2.2\lib\net472\0Harmony.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + + + ..\..\..\..\..\..\..\workshop\content\294100\818773962\v1.4\Assemblies\HugsLib.dll + False + + + ..\..\..\..\rjw\1.4\Assemblies\RJW.dll + False + + + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputLegacyModule.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.InputModule.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/1.4/Source/Mod/WhoringBase.cs b/1.4/Source/Mod/WhoringBase.cs new file mode 100644 index 0000000..0edb576 --- /dev/null +++ b/1.4/Source/Mod/WhoringBase.cs @@ -0,0 +1,71 @@ +using System; +using HugsLib; +using HugsLib.Settings; +using RimWorld; +using Verse; + +namespace rjwwhoring +{ + public class WhoringBase : ModBase + { + public override string ModIdentifier + { + get + { + return "RJW_Whoring"; + } + } + + public static DataStore DataStore;//reference to savegame data, hopefully + + public override void SettingsChanged() + { + //ToggleTabIfNeeded(); + } + public override void WorldLoaded() + { + DataStore = Find.World.GetComponent(); + //ToggleTabIfNeeded(); + } + + private void ToggleTabIfNeeded() + { + //DefDatabase.GetNamed("RJW_Brothel").buttonVisible = whoringtab_enabled; + } + + //public static SettingHandle whoringtab_enabled; + public static SettingHandle show_whore_price_factor_on_bed; + public static SettingHandle show_whore_widgets_on_bed; + public static SettingHandle DebugWhoring; + public static SettingHandle MoneyPrinting; + public static SettingHandle ClientAlwaysAccept; + + public override void DefsLoaded() + { + //whoringtab_enabled = Settings.GetHandle("whoringtab_enabled", + // "whoringtab_enabled".Translate(), + // "whoringtab_enabled_desc".Translate(), + // true); + show_whore_price_factor_on_bed = Settings.GetHandle("show_whore_price_factor_on_bed", + "show_whore_price_factor_on_bed".Translate(), + "show_whore_price_factor_on_bed_desc".Translate(), + false); + show_whore_widgets_on_bed = Settings.GetHandle("show_whore_widgets_on_bed", + "show_whore_widgets_on_bed".Translate(), + "show_whore_widgets_on_bed_desc".Translate(), + false); + MoneyPrinting = Settings.GetHandle("MoneyPrinting", + "MoneyPrinting".Translate(), + "MoneyPrinting_desc".Translate(), + false); + ClientAlwaysAccept = Settings.GetHandle("ClientAlwaysAccept", + "ClientAlwaysAccept".Translate(), + "ClientAlwaysAccept_desc".Translate(), + false); + DebugWhoring = Settings.GetHandle("DebugWhoring", + "DebugWhoring".Translate(), + "DebugWhoring_desc".Translate(), + false); + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs new file mode 100644 index 0000000..72bb337 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Verse; +using UnityEngine; +using RimWorld; +using Verse.Sound; +using rjw; + +namespace rjwwhoring.MainTab +{ + public abstract class PawnColumnCheckbox_Whore : PawnColumnWorker + { + public const int HorizontalPadding = 2; + + public override void DoCell(Rect rect, Pawn pawn, PawnTable table) + { + if (!this.HasCheckbox(pawn)) + { + return; + } + int num = (int)((rect.width - 24f) / 2f); + int num2 = Mathf.Max(3, 0); + Vector2 vector = new Vector2(rect.x + (float)num, rect.y + (float)num2); + Rect rect2 = new Rect(vector.x, vector.y, 24f, 24f); + if (Find.TickManager.TicksGame % 60 == 0) + { + pawn.UpdatePermissions(); + //Log.Message("GetDisabled UpdateCanDesignateService for " + xxx.get_pawnname(pawn)); + //Log.Message("UpdateCanDesignateService " + pawn.UpdateCanDesignateService()); + //Log.Message("CanDesignateService " + pawn.CanDesignateService()); + //Log.Message("GetDisabled " + GetDisabled(pawn)); + } + bool disabled = this.GetDisabled(pawn); + bool value; + if (disabled) + { + value = false; + } + else + { + value = this.GetValue(pawn); + } + + bool flag = value; + Vector2 topLeft = vector; + WhoreCheckbox.Checkbox(topLeft, ref value, 24f, disabled, WhoreCheckbox.WhoreCheckboxOnTex, WhoreCheckbox.WhoreCheckboxOffTex, WhoreCheckbox.WhoreCheckboxDisabledTex); + if (Mouse.IsOver(rect2)) + { + string tip = this.GetTip(pawn); + if (!tip.NullOrEmpty()) + { + TooltipHandler.TipRegion(rect2, tip); + } + } + if (value != flag) + { + this.SetValue(pawn, value); + } + } + + public override int GetMinWidth(PawnTable table) + { + return Mathf.Max(base.GetMinWidth(table), 28); + } + + public override int GetMaxWidth(PawnTable table) + { + return Mathf.Min(base.GetMaxWidth(table), this.GetMinWidth(table)); + } + + public override int GetMinCellHeight(Pawn pawn) + { + return Mathf.Max(base.GetMinCellHeight(pawn), 24); + } + + public override int Compare(Pawn a, Pawn b) + { + return this.GetValueToCompare(a).CompareTo(this.GetValueToCompare(b)); + } + + private int GetValueToCompare(Pawn pawn) + { + if (!this.HasCheckbox(pawn)) + { + return 0; + } + if (!this.GetValue(pawn)) + { + return 1; + } + return 2; + } + + protected virtual string GetTip(Pawn pawn) + { + return null; + } + + protected virtual bool HasCheckbox(Pawn pawn) + { + return true; + } + + protected abstract bool GetValue(Pawn pawn); + + protected abstract void SetValue(Pawn pawn, bool value); + + protected abstract bool GetDisabled(Pawn pawn); + + protected override void HeaderClicked(Rect headerRect, PawnTable table) + { + base.HeaderClicked(headerRect, table); + if (Event.current.shift) + { + List pawnsListForReading = table.PawnsListForReading; + for (int i = 0; i < pawnsListForReading.Count; i++) + { + if (this.HasCheckbox(pawnsListForReading[i])) + { + if (Event.current.button == 0) + { + if (!this.GetValue(pawnsListForReading[i])) + { + this.SetValue(pawnsListForReading[i], true); + } + } + else if (Event.current.button == 1 && this.GetValue(pawnsListForReading[i])) + { + this.SetValue(pawnsListForReading[i], false); + } + } + } + if (Event.current.button == 0) + { + SoundDefOf.Checkbox_TurnedOn.PlayOneShotOnCamera(null); + } + else if (Event.current.button == 1) + { + SoundDefOf.Checkbox_TurnedOff.PlayOneShotOnCamera(null); + } + } + } + + protected override string GetHeaderTip(PawnTable table) + { + return base.GetHeaderTip(table) + "\n" + "CheckboxShiftClickTip".Translate(); + } + } +} + diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs new file mode 100644 index 0000000..8a38a33 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs @@ -0,0 +1,29 @@ +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_AverageMoneyByWhore : PawnColumnWorker_TextCenter + { + protected override string GetTextFor(Pawn pawn) + { + return ((int)GetValueToCompare(pawn)).ToString(); + } + + public override int Compare(Pawn a, Pawn b) + { + return GetValueToCompare(a).CompareTo(GetValueToCompare(b)); + } + + private float GetValueToCompare(Pawn pawn) + { + float total = pawn.records.GetValue(RecordDefOf.EarnedMoneyByWhore); + float count = pawn.records.GetValue(RecordDefOf.CountOfWhore); + if ((int)count == 0) + { + return 0; + } + return (total / count); + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs new file mode 100644 index 0000000..0e4cf05 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs @@ -0,0 +1,23 @@ +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_CountOfWhore : PawnColumnWorker_TextCenter + { + protected override string GetTextFor(Pawn pawn) + { + return GetValueToCompare(pawn).ToString(); + } + + public override int Compare(Pawn a, Pawn b) + { + return GetValueToCompare(a).CompareTo(GetValueToCompare(b)); + } + + private int GetValueToCompare(Pawn pawn) + { + return pawn.records.GetAsInt(RecordDefOf.CountOfWhore); + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs new file mode 100644 index 0000000..3665822 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs @@ -0,0 +1,23 @@ +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_EarnedMoneyByWhore : PawnColumnWorker_TextCenter + { + protected override string GetTextFor(Pawn pawn) + { + return GetValueToCompare(pawn).ToString(); + } + + public override int Compare(Pawn a, Pawn b) + { + return GetValueToCompare(a).CompareTo(GetValueToCompare(b)); + } + + private int GetValueToCompare(Pawn pawn) + { + return pawn.records.GetAsInt(RecordDefOf.EarnedMoneyByWhore); + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs new file mode 100644 index 0000000..cf02240 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using rjw; +using UnityEngine; +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_IsWhore : PawnColumnCheckbox_Whore + { + protected override bool GetDisabled(Pawn pawn) + { + return !pawn.CanDesignateService(); + } + + protected override bool GetValue(Pawn pawn) + { + return pawn.IsDesignatedService() && xxx.is_human(pawn); + } + + protected override void SetValue(Pawn pawn, bool value) + { + if (value == this.GetValue(pawn)) return; + + pawn.ToggleService(); + } + /* + private static readonly Texture2D serviceOn = ContentFinder.Get("UI/Tab/Service_on"); + private static readonly Texture2D serviceOff = ContentFinder.Get("UI/Tab/Service_off"); + + protected override Texture2D GetIconFor(Pawn pawn) + { + return pawn.IsDesignatedService() ? serviceOn : null; + }*/ + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs new file mode 100644 index 0000000..f4a6f6b --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_Mood : PawnColumnWorker_TextCenter + { + protected override string GetTextFor(Pawn pawn) + { + return GetValueToCompare(pawn).ToStringPercent(); + } + + public override int Compare(Pawn a, Pawn b) + { + return GetValueToCompare(a).CompareTo(GetValueToCompare(b)); + } + + private float GetValueToCompare(Pawn pawn) + { + return pawn.needs.mood.CurLevelPercentage; + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs new file mode 100644 index 0000000..220713b --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_PriceRangeOfWhore : PawnColumnWorker_TextCenter + { + protected internal int min; + protected internal int max; + + protected override string GetTextFor(Pawn pawn) + { + min = WhoringHelper.WhoreMinPrice(pawn); + max = WhoringHelper.WhoreMaxPrice(pawn); + return string.Format("{0} - {1}", min, max); + } + + public override int Compare(Pawn a, Pawn b) + { + return GetValueToCompare(a).CompareTo(GetValueToCompare(b)); + } + + protected override string GetTip(Pawn pawn) + { + string minPriceTip = string.Format( + " Base: {0}\n Traits: {1}", + WhoringHelper.baseMinPrice, + (WhoringHelper.WhoreTraitAdjustmentMin(pawn) -1f).ToStringPercent() + ); + string maxPriceTip = string.Format( + " Base: {0}\n Traits: {1}", + WhoringHelper.baseMaxPrice, + (WhoringHelper.WhoreTraitAdjustmentMax(pawn) -1f).ToStringPercent() + ); + string bothTip = string.Format( + " Gender: {0}\n Age: {1}\n Injuries: {2}", + (WhoringHelper.WhoreGenderAdjustment(pawn) - 1f).ToStringPercent(), + (WhoringHelper.WhoreAgeAdjustment(pawn) - 1f).ToStringPercent(), + (WhoringHelper.WhoreInjuryAdjustment(pawn) - 1f).ToStringPercent() + ); + return string.Format("Min:\n{0}\nMax:\n{1}\nBoth:\n{2}", minPriceTip, maxPriceTip, bothTip); + } + + private int GetValueToCompare(Pawn pawn) + { + return min; + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs new file mode 100644 index 0000000..f72193f --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; + +namespace rjwwhoring.MainTab +{ + public abstract class PawnColumnWorker_TextCenter : PawnColumnWorker_Text + { + public override void DoCell(Rect rect, Pawn pawn, PawnTable table) + { + Rect rect2 = new Rect(rect.x, rect.y, rect.width, Mathf.Min(rect.height, 30f)); + string textFor = GetTextFor(pawn); + if (textFor != null) + { + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.MiddleCenter; + Text.WordWrap = false; + Widgets.Label(rect2, textFor); + Text.WordWrap = true; + Text.Anchor = TextAnchor.UpperLeft; + string tip = GetTip(pawn); + if (!tip.NullOrEmpty()) + { + TooltipHandler.TipRegion(rect2, tip); + } + } + } + } +} diff --git a/1.4/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs new file mode 100644 index 0000000..c0d85ba --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using Verse; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_WhoreExperience : PawnColumnWorker_TextCenter + { + public static readonly HashSet backstories = new HashSet(DefDatabase.GetNamed("WhoreBackstories").strings); + + protected override string GetTextFor(Pawn pawn) + { + + int b = backstories.Contains(pawn.story?.Adulthood?.titleShort) ? 30 : 0; + int score = pawn.records.GetAsInt(RecordDefOf.CountOfWhore); + return (score + b).ToString(); + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/WhoringTab/PawnTable_Whores.cs b/1.4/Source/Mod/WhoringTab/PawnTable_Whores.cs new file mode 100644 index 0000000..3a25bb4 --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/PawnTable_Whores.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using rjw; +using Verse; + +namespace rjwwhoring.MainTab +{ + public class PawnTable_Whores : PawnTable_PlayerPawns + { + public PawnTable_Whores(PawnTableDef def, Func> pawnsGetter, int uiWidth, int uiHeight) : base(def, pawnsGetter, uiWidth, uiHeight) { } + + //default sorting + protected override IEnumerable LabelSortFunction(IEnumerable input) + { + //return input.OrderBy(p => p.Name); + foreach (Pawn p in input) + p.UpdatePermissions(); + return input.OrderByDescending(p => (p.IsPrisonerOfColony || p.IsSlaveOfColony) != false).ThenBy(p => xxx.get_pawnname(p)); + //return input.OrderByDescending(p => (p.IsPrisonerOfColony || p.IsSlaveOfColony) != false).ThenBy(p => (p.Name.ToStringShort.Colorize(Color.yellow))); + //return input.OrderBy(p => xxx.get_pawnname(p)); + } + + protected override IEnumerable PrimarySortFunction(IEnumerable input) + { + foreach (Pawn p in input) + p.UpdatePermissions(); + return input; + //return base.PrimarySortFunction(input); + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/WhoringTab/WhoreCheckbox.cs b/1.4/Source/Mod/WhoringTab/WhoreCheckbox.cs new file mode 100644 index 0000000..1f21bdb --- /dev/null +++ b/1.4/Source/Mod/WhoringTab/WhoreCheckbox.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Verse; +using UnityEngine; +using RimWorld; +using Verse.Sound; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public static class WhoreCheckbox + { + public static readonly Texture2D WhoreCheckboxOnTex = ContentFinder.Get("UI/Commands/Service_on"); + public static readonly Texture2D WhoreCheckboxOffTex = ContentFinder.Get("UI/Commands/Service_off"); + public static readonly Texture2D WhoreCheckboxDisabledTex = ContentFinder.Get("UI/Commands/Service_Refuse"); + + private static bool checkboxPainting; + private static bool checkboxPaintingState; + + public static void Checkbox(Vector2 topLeft, ref bool checkOn, float size = 24f, bool disabled = false, Texture2D texChecked = null, Texture2D texUnchecked = null, Texture2D texDisabled = null) + { + WhoreCheckbox.Checkbox(topLeft.x, topLeft.y, ref checkOn, size, disabled, texChecked, texUnchecked); + } + + public static void Checkbox(float x, float y, ref bool checkOn, float size = 24f, bool disabled = false, Texture2D texChecked = null, Texture2D texUnchecked = null, Texture2D texDisabled = null) + { + Rect rect = new Rect(x, y, size, size); + WhoreCheckbox.CheckboxDraw(x, y, checkOn, disabled, size, texChecked, texUnchecked,texDisabled); + if (!disabled) + { + MouseoverSounds.DoRegion(rect); + bool flag = false; + Widgets.DraggableResult draggableResult = Widgets.ButtonInvisibleDraggable(rect, false); + if (draggableResult == Widgets.DraggableResult.Pressed) + { + checkOn = !checkOn; + flag = true; + } + else if (draggableResult == Widgets.DraggableResult.Dragged) + { + checkOn = !checkOn; + flag = true; + WhoreCheckbox.checkboxPainting = true; + WhoreCheckbox.checkboxPaintingState = checkOn; + } + if (Mouse.IsOver(rect) && WhoreCheckbox.checkboxPainting && Input.GetMouseButton(0) && checkOn != WhoreCheckbox.checkboxPaintingState) + { + checkOn = WhoreCheckbox.checkboxPaintingState; + flag = true; + } + if (flag) + { + if (checkOn) + { + SoundDefOf.Checkbox_TurnedOn.PlayOneShotOnCamera(null); + } + else + { + SoundDefOf.Checkbox_TurnedOff.PlayOneShotOnCamera(null); + } + } + } + } + + private static void CheckboxDraw(float x, float y, bool active, bool disabled, float size = 24f, Texture2D texChecked = null, Texture2D texUnchecked = null, Texture2D texDisabled = null) + { + Texture2D image; + if (disabled) + { + image = ((!(texDisabled != null)) ? WhoreCheckbox.WhoreCheckboxDisabledTex : texDisabled); + } + else if (active) + { + image = ((!(texChecked != null)) ? WhoreCheckbox.WhoreCheckboxOnTex : texChecked); + } + else + { + image = ((!(texUnchecked != null)) ? WhoreCheckbox.WhoreCheckboxOffTex : texUnchecked); + } + Rect position = new Rect(x, y, size, size); + GUI.DrawTexture(position, image); + } + + } +} diff --git a/1.4/Source/Mod/Whoring_Bed_Utilities.cs b/1.4/Source/Mod/Whoring_Bed_Utilities.cs new file mode 100644 index 0000000..a93a898 --- /dev/null +++ b/1.4/Source/Mod/Whoring_Bed_Utilities.cs @@ -0,0 +1,371 @@ +using Verse; +using Verse.AI; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using System; +using UnityEngine; +using rjw; + +namespace rjwwhoring +{ + public static class WhoreBed_Utility + { + public static readonly RoomRoleDef roleDefBrothel = DefDatabase.GetNamed("Brothel"); + + + // find the best bed for a customer; whore is needed as parameter to only select beds that are reachable + public static Building_Bed FindBed(Pawn whore, Pawn customer) + { + List b = FindReachableAndAvailableWhoreBeds(whore, customer); + return GetBestBedForCustomer(customer, b); + } + public static bool CanUseForWhoring(Pawn pawn, Building_Bed bed) + { + bool flag = bed.IsAvailableForWhoring(pawn) && pawn.CanReserveAndReach(bed, PathEndMode.InteractionCell, Danger.Unspecified) && !bed.IsForbidden(pawn); + return flag; + } + + public static Building_Bed GetBestBedForCustomer(Pawn customer, List beds) + { + if (beds != null && beds.Any()) + { + return beds.MaxBy(bed => CalculateBedScore(customer, bed)); + } + else + { + return null; + } + } + public static float GetCheapestBedFactor(Pawn whore, Pawn customer) + { + List beds = FindReachableAndAvailableWhoreBeds(whore, customer); + return GetCheapestBedFactor(beds); + } + public static float GetCheapestBedFactor(List beds) + { + if (beds != null && beds.Any()) + { + return CalculatePriceFactor(beds.MinBy(bed => CalculatePriceFactor(bed))); + } + else + { + return 0f; + } + } + // unused + /*public static float GetMostExpensiveBedFactor(List beds) + { + if (beds != null && beds.Any()) + { + return CalculatePriceFactor(beds.MaxBy(bed => CalculatePriceFactor(bed))); + } + else + { + return 0f; + } + }//*/ + + public static float CalculateRoomFactor(Room room, int num_humanlike_beds) + { + if (room == null || room.Role == RoomRoleDefOf.None || room.OutdoorsForWork) + return 0.1f; + + float room_multiplier = 1f; + + if (room.Role == roleDefBrothel) + { + room_multiplier *= (float)Math.Pow(0.8, num_humanlike_beds - 1); + } + else // if(room.Role == RoomRoleDefOf.Barracks) + { + room_multiplier /= 2 * (num_humanlike_beds - 1) + 1; + } + + int scoreStageIndex = RoomStatDefOf.Impressiveness.GetScoreStageIndex(room.GetStat(RoomStatDefOf.Impressiveness)); + //Room impressiveness factor + //0 < scoreStageIndex < 10 (Last time checked) + //3 is mediocore + room_multiplier *= (float)(scoreStageIndex <= 3 ? .4f + scoreStageIndex * .2f : 1f + .3f * (scoreStageIndex - 3)); + + return Mathf.Max(room_multiplier, 0); + } + + public static float CalculateBedFactorsForRoom(Room room, Building_Bed except_this_bed = null) + { + float room_factor = 0.1f; + + if (room == null) + return room_factor; + + // get eligible beds + IEnumerable humanlike_beds = room.ContainedBeds.Where(b => b.def.building.bed_humanlike); + int num_humanlike_beds = humanlike_beds.Count(); + if (num_humanlike_beds <= 0) + { + return room_factor; + } + IEnumerable whoring_beds = humanlike_beds.Where(b => b.IsAllowedForWhoringOwner()); + + if (whoring_beds.Any()) + { + // if beds exist, calculate room score + room_factor = CalculateRoomFactor(room, num_humanlike_beds); + + // and update all beds + foreach (Building_Bed b in whoring_beds) + { + // except the bed given as parameter (will be calculated in that bed's function) + if (except_this_bed == null || b.thingIDNumber != except_this_bed.thingIDNumber) + CalculatePriceFactor(b, room_factor); + } + } + return room_factor; + } + + public static void ResetTicksUntilUpdate(Room room) + { + IEnumerable whoring_beds = room.ContainedBeds.Where(b => b.IsAllowedForWhoringOwner()); + + foreach (Building_Bed bed in whoring_beds) + { + // set all to 0 + // if one is needed, it updates all the other beds + // if none is needed, it doesn't matter + // only setting one bed to update has the risk that a different bed's value is required that doesn't trigger an update + WhoringBase.DataStore.GetBedData(bed).scoreUpdateTickDelay = 0; + } + } + + public static float CalculatePriceFactor(Building_Bed bed, float room_multiplier = -1f) + { + + BedData saved_bed_data = WhoringBase.DataStore.GetBedData(bed); + + // cache result (no need for saving): if no result available, calculate; otherwise save tick at which it has been calculated. + // additional parameter "room_multiplier" to skip room analysis + if ((room_multiplier == -1 || room_multiplier >= 0 && room_multiplier == saved_bed_data.roomScore) + && saved_bed_data.bedScore >= 0f + && saved_bed_data.lastScoreUpdateTick > + GenTicks.TicksGame - saved_bed_data.scoreUpdateTickDelay) + { + if (room_multiplier >= 0 && saved_bed_data.scoreUpdateTickDelay < 720) + { + // if saved value is used due to unchanged room multiplier, increase recalc delay + saved_bed_data.scoreUpdateTickDelay += 60 + Rand.Int % 10; + } + //Log.Message("[RJW] lastScoreUpdateTick: " + BukkakeBase.DataStore.GetBedData(bed).lastScoreUpdateTick.ToString() + " / TicksGame: "+ GenTicks.TicksGame.ToString()); + return saved_bed_data.bedScore; + } + + if (room_multiplier < 0) + { + Room room = bed.Map != null && bed.Map.regionAndRoomUpdater.Enabled ? bed.GetRoom() : null; + room_multiplier = CalculateBedFactorsForRoom(room, bed); + } + + // uncomfortable beds reduce price, comfortable beds make customers pay a tip + float comfort = bed.GetStatValue(StatDefOf.Comfort); + float price_factor = room_multiplier * comfort; + + // delay recalculation if result is the same as before + // Rand.Int % 10 flattens the spike over time if many beds are toggled at once + if (price_factor == saved_bed_data.bedScore) + { + if (saved_bed_data.scoreUpdateTickDelay < 720) + { + // slowly increase recalculation delay to two seconds on speed 3 + saved_bed_data.scoreUpdateTickDelay += 60 + Rand.Int % 10; + } + } + else + { + // reset recalculation delay + saved_bed_data.scoreUpdateTickDelay = 60 + Rand.Int % 10; + } + + // update bed data + saved_bed_data.lastScoreUpdateTick = GenTicks.TicksGame; + saved_bed_data.bedScore = price_factor; + saved_bed_data.roomScore = room_multiplier; + + // this is quite spammy + //if (RJWSettings.DebugWhoring) + // Log.Message("[RJW]CalculatePriceFactor for bed " + bed.thingIDNumber.ToString() + ": " + // + "room_multiplier (num beds, impressiveness) ("+room_multiplier.ToString() +") * " + // + "comfort (" + comfort.ToString() + ") = " + price_factor.ToString()); + + return price_factor; + } + + // customers would want the best bed + // TODO: price as factor, rebalance + public static float CalculateBedScore(Pawn customer, Building_Bed bed) + { + float basePriceFactor = CalculatePriceFactor(bed); + + // ascetic pawns want the least impressive room + if (customer.story.traits.HasTrait(TraitDefOf.Ascetic)) + { + float comfort = bed.GetStatValue(StatDefOf.Comfort); + basePriceFactor = comfort * comfort / basePriceFactor; // inverse room effects - may be cheap, but should still be comfortable. ascetic isn't masochistic! + if (WhoringBase.DebugWhoring) + Log.Message("[RJW]CalculateBedScore - Customer is ascetic"); + } + + basePriceFactor *= 200; // make a larger number for better distance scaling (and random effect) + + // horny pawns are in a hurry and want a closer bed + int distance = 0; + if (xxx.is_hornyorfrustrated(customer)) + { + distance = (int)bed.Position.DistanceTo(customer.Position); + //if (RJWSettings.DebugWhoring) + // Log.Message("[RJW]CalculateBedScore - Pawn is horny - distance = "+distance.ToString()); + } + + int random_factor = Rand.Int % 100; + float score = basePriceFactor - distance + random_factor; + + if (WhoringBase.DebugWhoring) + Log.Message("[RJW]CalculateBedScore for bed " + bed.thingIDNumber.ToString() + ": " + + "score from price (" + basePriceFactor.ToString() + ") " + + "- distance (" + distance.ToString() + ") " + + "+ randomness (" + random_factor.ToString() + ") " + + "= " + score.ToString()); + + return score; + } + + public static List FindReachableAndAvailableWhoreBeds(Pawn whore, Pawn customer) + { + List wb = new List(); + + wb = whore.MapHeld.GetWhoreBeds().Where(bed => + !bed.IsForbidden(whore) && + !bed.IsForbidden(customer) && + !bed.IsBurning() && + bed.WhoringIsAllowedForPawn(whore) && + bed.IsAvailableForWhoring(whore) && + whore.CanReserveAndReach(bed, PathEndMode.OnCell, Danger.Unspecified) && + customer.CanReach(bed, PathEndMode.OnCell, Danger.Some) + // TODO: price/affordable? + ).ToList(); + if (WhoringBase.DebugWhoring) + Log.Message("[RJW]FindReachableAndAvailableWhoreBeds - found " + wb.Count().ToString() + " beds"); + return wb; + } + + public static IEnumerable GetWhoreBeds(this Map map, Area area = null) + { + if (map == null) return new Building_Bed[0]; + if (area == null) return map.listerBuildings.AllBuildingsColonistOfClass(); + return map.listerBuildings.AllBuildingsColonistOfClass().Where(b => area[b.Position]); + } + + public static bool WhoringIsAllowedForPawn(this Building_Bed bed, Pawn pawn) + { + if (bed.IsAllowedForWhoringAll()) + return true; + if (bed == pawn.ownership.OwnedBed && bed.IsAllowedForWhoringOwner()) + return true; + return false; + } + + public static void SetAllowedForWhoringOwner(this Building_Bed bed, bool isAllowed) + { + if (!isAllowed) + { + // if whoring is disallowed for owner, also disallow for all + bed.SetAllowedForWhoringAll(false); + } + WhoringBase.DataStore.GetBedData(bed).allowedForWhoringOwner = isAllowed; + } + public static void ToggleAllowedForWhoringOwner(this Building_Bed bed) + { + bed.SetAllowedForWhoringOwner(!WhoringBase.DataStore.GetBedData(bed).allowedForWhoringOwner); + } + public static bool IsAllowedForWhoringOwner(this Building_Bed bed) + { + if (!bed.def.building.bed_humanlike || bed.Faction != Faction.OfPlayerSilentFail || bed.Medical || bed.def.defName.Contains("Guest")) + { + return false; + } + if (bed.ForPrisoners) + { + // no toggle on prisoner beds, they may always use their own bed (if they are supposed to whore, anyway) + return true; + } + return WhoringBase.DataStore.GetBedData(bed).allowedForWhoringOwner; + } + + public static void SetAllowedForWhoringAll(this Building_Bed bed, bool isAllowed) + { + if (isAllowed) + { + // if whoring is allowed for all, also visibly allow for owner + bed.SetAllowedForWhoringOwner(true); + // if bed is designated for whoring, disable prisoner/medical use + bed.ForPrisoners = false; + bed.Medical = false; + } + WhoringBase.DataStore.GetBedData(bed).allowedForWhoringAll = isAllowed; + + bed.GetRoom()?.Notify_BedTypeChanged(); + bed.Notify_ColorChanged(); + } + public static void ToggleAllowedForWhoringAll(this Building_Bed bed) + { + bed.SetAllowedForWhoringAll(!WhoringBase.DataStore.GetBedData(bed).allowedForWhoringAll); + } + public static bool IsAllowedForWhoringAll(this Building_Bed bed) + { + if (WhoringBase.DataStore.GetBedData(bed).allowedForWhoringAll) + { + if (!bed.def.building.bed_humanlike || bed.Faction != Faction.OfPlayerSilentFail || bed.Medical || bed.ForPrisoners || bed.def.defName.Contains("Guest") || bed.GetRoom()?.IsPrisonCell == true) + { + return false; + } + return true; + } + return false; + } + + public static void ReserveForWhoring(this Building_Bed bed, Pawn p, int num_ticks) + { + WhoringBase.DataStore.GetBedData(bed).reservedUntilGameTick = GenTicks.TicksGame + num_ticks; + WhoringBase.DataStore.GetBedData(bed).reservedForPawnID = p.thingIDNumber; + } + public static void UnreserveForWhoring(this Building_Bed bed) + { + WhoringBase.DataStore.GetBedData(bed).reservedUntilGameTick = 0; + WhoringBase.DataStore.GetBedData(bed).reservedForPawnID = 0; + } + public static bool IsAvailableForWhoring(this Building_Bed bed, Pawn p) + { + // check for active reservation + if (WhoringBase.DataStore.GetBedData(bed).reservedUntilGameTick > GenTicks.TicksGame) + { + if (WhoringBase.DataStore.GetBedData(bed).reservedForPawnID != p.thingIDNumber) + { + // a different pawn has reserved this bed + return false; + } + } + + if (bed.OwnersForReading.Any()) + { + for (int i = 0; i < bed.OwnersForReading.Count; i++) + { + if (bed.OwnersForReading[i].InBed() && bed.OwnersForReading[i].CurrentBed() == bed) + { + // someone sleeping in this bed + return false; + } + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/Whoring_Helper.cs b/1.4/Source/Mod/Whoring_Helper.cs new file mode 100644 index 0000000..d313a98 --- /dev/null +++ b/1.4/Source/Mod/Whoring_Helper.cs @@ -0,0 +1,425 @@ +// #define TESTMODE // Uncomment to enable logging. + +using Verse; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using System; +using UnityEngine; +using Verse.AI.Group; +//using Multiplayer.API; +using rjw; + +namespace rjwwhoring +{ + /// + /// Helper for whoring related stuff + /// + public class WhoringHelper + { + public const float baseMinPrice = 10f; + public const float baseMaxPrice = 20f; + + public static readonly HashSet backstories = new HashSet(DefDatabase.GetNamed("WhoreBackstories").strings); + + public static int WhoreMinPrice(Pawn whore) + { + float min_price = baseMinPrice; + min_price *= WhoreAgeAdjustment(whore); + min_price *= WhoreGenderAdjustment(whore); + min_price *= WhoreInjuryAdjustment(whore); + min_price *= WhoreAbilityAdjustmentMin(whore); + //min_price *= WhoreRoomAdjustment(whore); + if (xxx.has_traits(whore)) + min_price *= WhoreTraitAdjustmentMin(whore); + + return (int)min_price; + } + + public static int WhoreMaxPrice(Pawn whore) + { + float max_price = baseMaxPrice; + max_price *= WhoreAgeAdjustment(whore); + max_price *= WhoreGenderAdjustment(whore); + max_price *= WhoreInjuryAdjustment(whore); + max_price *= WhoreAbilityAdjustmentMax(whore); + //max_price *= WhoreRoomAdjustment(whore); + if (xxx.has_traits(whore)) + max_price *= WhoreTraitAdjustmentMax(whore); + + return (int)max_price; + } + + public static float WhoreGenderAdjustment(Pawn whore) + { + if (GenderHelper.GetSex(whore) == GenderHelper.Sex.futa) + return 1.2f; + return 1f; + } + + public static float WhoreAgeAdjustment(Pawn whore) + { + return AgeConfigDef.Instance.whoringPriceByAge.Evaluate(SexUtility.ScaleToHumanAge(whore)); + } + + public static float WhoreInjuryAdjustment(Pawn whore) + { + float modifier = 1.0f; + int injuries = whore.health.hediffSet.hediffs.Count(x => x.Visible && x.def.everCurableByItem && x.IsPermanent()); + + if (injuries == 0) return modifier; + + while (injuries > 0) + { + modifier *= 0.85f; + injuries--; + } + return modifier; + } + + public static float WhoreAbilityAdjustmentMin(Pawn whore) + { + int b = backstories.Contains(whore.story?.Adulthood?.titleShort) ? 30 : 0; + int score = whore.records.GetAsInt(RecordDefOf.EarnedMoneyByWhore); + float multiplier = (score + b) / 100; + multiplier = Math.Min(multiplier, 2); + multiplier = (multiplier - 0.5f) * 0.5f + 1; + return multiplier; + } + + public static float WhoreAbilityAdjustmentMax(Pawn whore) + { + int b = backstories.Contains(whore.story?.Adulthood?.titleShort) ? 30 : 0; + int score = whore.records.GetAsInt(RecordDefOf.CountOfWhore); + float multiplier = (score + b) / 100; + multiplier = Math.Min(multiplier, 2); + multiplier = (multiplier - 0.5f) * 0.5f + 1; + return multiplier; + } + + public static float WhoreTraitAdjustmentMin(Pawn whore) + { + float multiplier = WhoreTraitAdjustment(whore); + if (xxx.is_masochist(whore)) // Won't haggle, may settle for low price + multiplier *= 0.7f; + if (xxx.is_nympho(whore)) // Same as above + multiplier *= 0.4f; + if (whore.story.traits.HasTrait(TraitDefOf.Wimp)) // Same as above + multiplier *= 0.4f; + return multiplier; + } + + public static float WhoreTraitAdjustmentMax(Pawn whore) + { + float multiplier = WhoreTraitAdjustment(whore); + if (xxx.IndividualityIsActive && whore.story.traits.HasTrait(xxx.SYR_Haggler)) + multiplier *= 1.5f; + if (whore.story.traits.HasTrait(TraitDefOf.Greedy)) + multiplier *= 2f; + return multiplier; + } + + public static float WhoreTraitAdjustment(Pawn whore) + { + float multiplier = 1f; + + if (xxx.has_traits(whore)) + { + if (whore.story.traits.DegreeOfTrait(TraitDefOf.Industriousness) == 2) // Industrious + multiplier *= 1.2f; + if (whore.story.traits.DegreeOfTrait(TraitDefOf.Industriousness) == 1) // Hard Worker + multiplier *= 1.1f; + if (whore.story.traits.HasTrait(TraitDefOf.CreepyBreathing)) + multiplier *= 0.75f; + + if (whore.GetStatValue(StatDefOf.PawnBeauty) >= 2) + multiplier *= 3.5f; + else if (whore.GetStatValue(StatDefOf.PawnBeauty) >= 1) + multiplier *= 2f; + else if (whore.GetStatValue(StatDefOf.PawnBeauty) < 0) + if (whore.GetStatValue(StatDefOf.PawnBeauty) >= -1) + multiplier *= 0.8f; + else + multiplier *= 0.6f; + } + return multiplier; + } + + /*public static float WhoreRoomAdjustment(Pawn whore) + { + float room_multiplier = 1f; + Room ownedRoom = whore.ownership.OwnedRoom; + + if (ownedRoom == null) return 0f; + + //Room sharing is not liked by patrons + room_multiplier = room_multiplier / (2 * (ownedRoom.Owners.Count() - 1) + 1); + int scoreStageIndex = RoomStatDefOf.Impressiveness.GetScoreStageIndex(ownedRoom.GetStat(RoomStatDefOf.Impressiveness)); + //Room impressiveness factor + //0 < scoreStageIndex < 10 (Last time checked) + //3 is mediocore + if (scoreStageIndex == 0) + { + room_multiplier *= 0.3f; + } + else if (scoreStageIndex > 3) + { + room_multiplier *= 1 + ((float)scoreStageIndex - 3) / 3.5f; + } //top room triples the price + + return room_multiplier; + }//*/ + + //[SyncMethod] + public static int PriceOfWhore(Pawn whore) + { + float NeedSexFactor = xxx.is_hornyorfrustrated(whore) ? 1 - xxx.need_some_sex(whore) / 8 : 1f; + + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + float price = Rand.Range(WhoreMinPrice(whore), WhoreMaxPrice(whore)); + + price *= NeedSexFactor; + //--ModLog.Message(" xxx::PriceOfWhore - price is " + price); + + return (int)Math.Round(price); + } + + public static bool CanAfford(Pawn targetPawn, Pawn whore, int priceOfWhore = -1) + { + //if (targetPawn.Faction == whore.Faction) return true; + if (WhoringBase.MoneyPrinting) return true; + + //if (RJWSettings.DebugWhoring) ModLog.Message($"CanAfford for client {xxx.get_pawnname(targetPawn)}"); + int price = priceOfWhore < 0 ? PriceOfWhore(whore) : priceOfWhore; + if (price == 0) + return true; + + // can customer afford the cheapest bed? - skip check, should rarely make a difference + //float bed_factor = WhoreBed_Utility.GetCheapestBedFactor(whore, targetPawn); + //price = (int)(price * bed_factor); + + //if (RJWSettings.DebugWhoring) ModLog.Message($" whore price {price}"); + + Lord lord = targetPawn.GetLord(); + Faction faction = targetPawn.Faction; + int clientAmountOfSilvers = targetPawn.inventory.innerContainer.TotalStackCountOfDef(ThingDefOf.Silver); + int totalAmountOfSilvers = clientAmountOfSilvers; + + if (faction != null) + { + List caravanMembers = targetPawn.Map.mapPawns.PawnsInFaction(targetPawn.Faction).Where(x => x.GetLord() == lord && x.inventory?.innerContainer?.TotalStackCountOfDef(ThingDefOf.Silver) > 0).ToList(); + if (!caravanMembers.Any()) + { + //if (RJWSettings.DebugWhoring) ModLog.Message($" client not in caravan"); + //if (RJWSettings.DebugWhoring) ModLog.Message("CanAfford::(" + xxx.get_pawnname(targetPawn) + "," + xxx.get_pawnname(whore) + ") - totalAmountOfSilvers is " + totalAmountOfSilvers); + return totalAmountOfSilvers >= price; + } + + totalAmountOfSilvers += caravanMembers.Sum(member => member.inventory.innerContainer.TotalStackCountOfDef(ThingDefOf.Silver)); + } + //if (RJWSettings.DebugWhoring) ModLog.Message($" client silver = {clientAmountOfSilvers} caravan silver = {totalAmountOfSilvers - clientAmountOfSilvers}"); + + //if (RJWSettings.DebugWhoring) ModLog.Message("CanAfford:: can afford the whore: " + (totalAmountOfSilvers >= price)); + return totalAmountOfSilvers >= price; + } + + //priceOfWhore is assumed >=0, and targetPawn is assumed to be able to pay the price(either by caravan, or by himself) + //This means that targetPawn has total stackcount of silvers >= priceOfWhore. + public static int PayPriceToWhore(Pawn targetPawn, int priceOfWhore, Pawn whore) + { + if (WhoringBase.DebugWhoring) ModLog.Message($"PayPriceToWhore for client {xxx.get_pawnname(targetPawn)}"); + if (WhoringBase.MoneyPrinting) + { + DebugThingPlaceHelper.DebugSpawn(ThingDefOf.Silver, whore.PositionHeld, priceOfWhore, false, null); + if (WhoringBase.DebugWhoring) ModLog.Message($" MoneyPrinting " + priceOfWhore + " silver to pay price"); + return 0; + } + int AmountLeft = priceOfWhore; + if ((targetPawn.Faction == whore.Faction && targetPawn.GuestStatus != GuestStatus.Guest) || priceOfWhore == 0) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" No need to pay price"); + return AmountLeft; + } + Lord lord = targetPawn.GetLord(); + //Caravan guestCaravan = Find.WorldObjects.Caravans.Where(x => x.Spawned && x.ContainsPawn(targetPawn) && x.Faction == targetPawn.Faction && !x.IsPlayerControlled).FirstOrDefault(); + List caravan = targetPawn.Map.mapPawns.PawnsInFaction(targetPawn.Faction).Where(x => x.GetLord() == lord && x.inventory?.innerContainer != null && x.inventory.innerContainer.TotalStackCountOfDef(ThingDefOf.Silver) > 0).ToList(); + + IEnumerable TraderSilvers; + if (!caravan.Any()) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" (not a caravan member), try to pay with own silver"); + TraderSilvers = targetPawn.inventory.innerContainer.Where(x => x.def == ThingDefOf.Silver); + foreach (Thing silver in TraderSilvers) + { + if (AmountLeft <= 0) + break; + int dropAmount = silver.stackCount >= AmountLeft ? AmountLeft : silver.stackCount; + if (targetPawn.inventory.innerContainer.TryDrop(silver, whore.Position, whore.Map, ThingPlaceMode.Near, dropAmount, out Thing resultingSilvers)) + { + if (resultingSilvers is null) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" have no silver"); + continue; + } + AmountLeft -= resultingSilvers.stackCount; + if (AmountLeft <= 0) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" {xxx.get_pawnname(targetPawn)} paid {resultingSilvers.stackCount} silver"); + break; + } + } + else + { + if (WhoringBase.DebugWhoring) ModLog.Message($" TryDrop failed"); + break; + } + } + if (WhoringBase.DebugWhoring) ModLog.Message($" price: {priceOfWhore}, paid: {priceOfWhore - AmountLeft}"); + } + else + { + if (WhoringBase.DebugWhoring) ModLog.Message($" (caravan member), try to pay {AmountLeft} silver with caravan silver"); + foreach (Pawn caravanMember in caravan) + { + TraderSilvers = caravanMember.inventory.innerContainer.Where(x => x.def == ThingDefOf.Silver); + if (WhoringBase.DebugWhoring) ModLog.Message($" try to pay with {xxx.get_pawnname(caravanMember)} silver"); + foreach (Thing silver in TraderSilvers) + { + if (AmountLeft <= 0) + break; + int dropAmount = silver.stackCount >= AmountLeft ? AmountLeft : silver.stackCount; + if (caravanMember.inventory.innerContainer.TryDrop(silver, whore.Position, whore.Map, ThingPlaceMode.Near, dropAmount, out Thing resultingSilvers)) + { + if (resultingSilvers is null) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" have no silver"); + continue; + } + AmountLeft -= resultingSilvers.stackCount; + if (AmountLeft <= 0) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" {xxx.get_pawnname(caravanMember)} paid {resultingSilvers.stackCount} silver"); + break; + } + } + } + } + } + if (WhoringBase.DebugWhoring) ModLog.Message($" price: {priceOfWhore}, paid: {priceOfWhore - AmountLeft}"); + return AmountLeft; + } + + //[SyncMethod] + public static bool IsHookupAppealing(Pawn target, Pawn whore) + { + if (PawnUtility.WillSoonHaveBasicNeed(target)) + { + //Log.Message("IsHookupAppealing - fail: " + xxx.get_pawnname(target) + " has need to do"); + return false; + } + if (WhoringBase.ClientAlwaysAccept) + { + return true; + } + float num = target.relations.SecondaryRomanceChanceFactor(whore) / 1.5f; + if (xxx.is_frustrated(target)) + { + num *= 3.0f; + } + else if (xxx.is_hornyorfrustrated(target)) + { + num *= 2.0f; + } + if (xxx.is_zoophile(target) && !xxx.is_animal(whore)) + { + num *= 0.5f; + } + if (xxx.AlienFrameworkIsActive) + { + if (xxx.is_xenophile(target)) + { + if (target.def.defName == whore.def.defName) + num *= 0.5f; // Same species, xenophile less interested. + else + num *= 1.5f; // Different species, xenophile more interested. + } + else if (xxx.is_xenophobe(target)) + { + if (target.def.defName != whore.def.defName) + num *= 0.25f; // Different species, xenophobe less interested. + } + } + + num *= 0.8f + (float)whore.skills.GetSkill(SkillDefOf.Social).Level / 40; // 0.8 to 1.3 + num *= Mathf.InverseLerp(-100f, 0f, target.relations.OpinionOf(whore)); // 1 to 0 reduce score by negative opinion/relations to whore + //Log.Message("IsHookupAppealing - score: " + num); + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + return Rand.Range(0.05f, 1f) < num; + } + + /// + /// Check if the pawn is willing to hook up. Checked for both target and the whore(when hooking colonists). + /// + //[SyncMethod] + public static bool WillPawnTryHookup(Pawn target) + { + if (WhoringBase.ClientAlwaysAccept) + { + return true; + } + if (target.story.traits.HasTrait(TraitDefOf.Asexual)) + { + return false; + } + Pawn lover = LovePartnerRelationUtility.ExistingMostLikedLovePartner(target, false); + if (lover == null) + { + return true; + } + float num = target.relations.OpinionOf(lover); + float num2 = Mathf.InverseLerp(30f, -80f, num); + + if (xxx.is_prude(target)) + { + num2 = 0f; + } + else if (xxx.is_lecher(target)) + { + //Lechers are always up for it. + num2 = Mathf.InverseLerp(100f, 50f, num); + } + else if (target.Map == lover.Map) + { + //Less likely to cheat if the lover is on the same map. + num2 = Mathf.InverseLerp(70f, 15f, num); + } + //else default values + + if (xxx.is_frustrated(target)) + { + num2 *= 1.8f; + } + else if (xxx.is_hornyorfrustrated(target)) + { + num2 *= 1.4f; + } + num2 /= 1.5f; + //Rand.PopState(); + //Rand.PushState(RJW_Multiplayer.PredictableSeed()); + return Rand.Range(0f, 1f) < num2; + } + + /// + /// Updates records for whoring. + /// + public static void UpdateRecords(Pawn pawn, int price) + { + pawn.records.AddTo(RecordDefOf.EarnedMoneyByWhore, price); + pawn.records.Increment(RecordDefOf.CountOfWhore); + //this is added by normal outcome + //pawn.records.Increment(CountOfSex); + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/harmony_AftersexPatch.cs b/1.4/Source/Mod/harmony_AftersexPatch.cs new file mode 100644 index 0000000..e7accc6 --- /dev/null +++ b/1.4/Source/Mod/harmony_AftersexPatch.cs @@ -0,0 +1,64 @@ +using Verse; +using HarmonyLib; +using rjw; +using System; +using RimWorld; + +namespace rjwwhoring +{ + [HarmonyPatch(typeof(AfterSexUtility), "think_about_sex", new Type[] {typeof(Pawn), typeof(Pawn), typeof(bool), typeof(SexProps), typeof(bool)})] + [StaticConstructorOnStartup] + static class Aftersex_WhoringhoughtApply + { + [HarmonyPostfix] + private static void ThinkAboutWhoringPatch(Pawn pawn, Pawn partner, bool isReceiving, SexProps props, bool whoring = false) + { + try + { + AfterSexUtilityPatch.ThinkAboutWhoring(pawn, partner, isReceiving, props, whoring); + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + } + + static class AfterSexUtilityPatch + { + /// + ///add aftersex thoughts for whoring + /// + public static void ThinkAboutWhoring(Pawn pawn, Pawn partner, bool isReceiving, SexProps props, bool whoring = false) + { + //no whoring in vanilla sex + if (props.isCoreLovin) + return; + + //masturbation? + if (pawn == null || partner == null) + return; + + //necro + if (pawn.Dead || partner.Dead) + return; + + //bestiality + if (!(xxx.is_human(pawn) && xxx.is_human(partner))) + return; + + //whoring, initiator is whore + if (whoring && !props.isReceiver) + { + ThoughtDef memory; + + if (pawn.IsPrisoner || xxx.is_slave(pawn)) + memory = ThoughtDefOf.Whorish_Thoughts_Captive; + else + memory = ThoughtDefOf.Whorish_Thoughts; + + pawn.needs.mood.thoughts.memories.TryGainMemory(memory); + } + } + } +} diff --git a/1.4/Source/Mod/harmony_Building_BedPatches.cs b/1.4/Source/Mod/harmony_Building_BedPatches.cs new file mode 100644 index 0000000..852b633 --- /dev/null +++ b/1.4/Source/Mod/harmony_Building_BedPatches.cs @@ -0,0 +1,292 @@ +using HarmonyLib; +using Verse; +using System; +using RimWorld; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using rjw; + +/// +/// patches Building_Bed to add stuff for WhoreBeds +/// +/// Also contains smaller patches for RoomRoleWorker_Barracks (don't count whore beds) (disabled) and Toils_LayDown.ApplyBedThoughts (slept in brothel thought) +/// + +namespace rjwwhoring +{ + public static class harmony_Building_BedPatches + { + + private static readonly Color sheetColorForWhores = new Color(181 / 255f, 55 / 255f, 109 / 255f); + + // Set color for whore beds + [HarmonyPatch(typeof(Building_Bed))] + [HarmonyPatch(nameof(Building_Bed.DrawColorTwo), MethodType.Getter)] + public static class Building_Bed_DrawColor_Patch + { + [HarmonyPostfix] + public static void Postfix(Building_Bed __instance, ref Color __result) + { + if (__instance.IsAllowedForWhoringAll()) + { + __result = sheetColorForWhores; + } + } + } + + // add whoring toggles to beds + [HarmonyPatch(typeof(Building_Bed), nameof(Building_Bed.GetGizmos))] + public static class Building_Bed_GetGizmos_Patch + { + [HarmonyPostfix] + public static void Postfix(Building_Bed __instance, ref IEnumerable __result) + { + if (!WhoringBase.show_whore_widgets_on_bed) + { + return; + } + __result = Process(__instance, __result); + } + + private static IEnumerable Process(Building_Bed __instance, IEnumerable __result) + { + var isPrisonCell = __instance.GetRoom()?.IsPrisonCell == true; + if (!__instance.ForPrisoners && !__instance.Medical && __instance.def.building.bed_humanlike && __instance.Faction == Faction.OfPlayerSilentFail && !__instance.def.defName.Contains("Guest") && !isPrisonCell) + { + + yield return + new Command_Toggle + { + defaultLabel = "CommandBedAllowWhoringLabel".Translate(), + defaultDesc = "CommandBedAllowWhoringDesc".Translate(), + icon = ContentFinder.Get("UI/Commands/AsWhore"), + isActive = __instance.IsAllowedForWhoringOwner, + toggleAction = __instance.ToggleAllowedForWhoringOwner, + hotKey = KeyBindingDefOf.Misc5, // Guest Beds uses Misc4 + disabled = !__instance.def.HasAssignableCompFrom(typeof(CompAssignableToPawn_Bed)), + disabledReason = "This bed type is not assignable to pawns." + }; + + yield return + new Command_Toggle + { + defaultLabel = "CommandBedSetAsWhoreBedLabel".Translate(), + defaultDesc = "CommandBedSetAsWhoreBedDesc".Translate(), + icon = ContentFinder.Get("UI/Commands/AsWhoreMany"), + isActive = __instance.IsAllowedForWhoringAll, + toggleAction = __instance.ToggleAllowedForWhoringAll, + hotKey = KeyBindingDefOf.Misc6, // Guest Beds uses Misc4 + disabled = !__instance.def.HasAssignableCompFrom(typeof(CompAssignableToPawn_Bed)), + disabledReason = "This bed type is not assignable to pawns." + }; + } + + foreach (var gizmo in __result) + { + if (__instance.IsAllowedForWhoringAll()) + { + if (gizmo is Command_Toggle && ((Command_Toggle)gizmo).defaultLabel == "CommandBedSetAsGuestLabel".Translate()) + { + // hide set as guest bed + continue; + }; + // old: instead of hiding, just disable + /*switch (gizmo) + { + case Command_Toggle toggle: + { + // Disable prisoner and medical, and guest buttons + if (//toggle.defaultLabel == "CommandBedSetForPrisonersLabel".Translate() || + //toggle.defaultLabel == "CommandBedSetAsMedicalLabel".Translate() || + toggle.defaultLabel == "CommandBedSetAsGuestLabel".Translate()) gizmo.Disable(); + break; + } + }//*/ + } + yield return gizmo; + } + } + } + + // add description of whore price factor to inspect string (bottom left corner if item selected) + [HarmonyPatch(typeof(Building_Bed), nameof(Building_Bed.GetInspectString))] + public static class Building_Bed_GetInspectString_Patch + { + [HarmonyPostfix] + public static void Postfix(Building_Bed __instance, ref string __result) + { + if (__instance.def.building.bed_humanlike && __instance.Faction == Faction.OfPlayerSilentFail && (__instance.IsAllowedForWhoringAll() || __instance.IsAllowedForWhoringOwner())) + { + __result = __result + "\n" + "WhorePriceCalcDesc".Translate(WhoreBed_Utility.CalculatePriceFactor(__instance).ToString("F2")); + if (WhoringBase.DebugWhoring) + { + __result = __result + "\nbed.thingIDNumber: " + __instance.thingIDNumber.ToString(); + + __result = __result + "\nscoreUpdateTickDelay: " + WhoringBase.DataStore.GetBedData(__instance).scoreUpdateTickDelay.ToString(); + + if (WhoringBase.DataStore.GetBedData(__instance).reservedUntilGameTick > GenTicks.TicksGame) + { + __result = __result + "\nreserved by pawn id: " + WhoringBase.DataStore.GetBedData(__instance).reservedForPawnID.ToString(); + } + } + } + } + } + + // add whore price factor as overlay + [HarmonyPatch(typeof(Building_Bed), nameof(Building_Bed.DrawGUIOverlay))] + public static class Building_Bed_DrawGUIOverlay_Patch + { + [HarmonyPrefix] + public static bool Prefix(Building_Bed __instance) + { + if (WhoringBase.show_whore_price_factor_on_bed && __instance.def.building.bed_humanlike && __instance.Faction == Faction.OfPlayerSilentFail) { + // if whore bed, print price factor on it + if (Find.CameraDriver.CurrentZoom == CameraZoomRange.Closest + && ((__instance.IsAllowedForWhoringOwner() && __instance.OwnersForReading.Any()) + || __instance.IsAllowedForWhoringAll())) + { + Color defaultThingLabelColor = GenMapUI.DefaultThingLabelColor; + + // make string + float whore_price_factor = WhoreBed_Utility.CalculatePriceFactor(__instance); + string wpf; + if (Math.Abs(whore_price_factor) >= 100) + { + wpf = ((int)whore_price_factor).ToString("D"); + } + else if (Math.Abs(whore_price_factor) >= 10) + { + wpf = whore_price_factor.ToString("F1"); + } + else + { + wpf = whore_price_factor.ToString("F2"); + } + + // get dimensions of text and make it appear above names + Vector2 textsize = Text.CalcSize(wpf); + Vector2 baseLabelPos = GenMapUI.LabelDrawPosFor(__instance, -0.4f); // -0.4f is copied from vanilla code + baseLabelPos.y -= textsize.y * 0.75f; + + GenMapUI.DrawThingLabel(baseLabelPos, wpf, defaultThingLabelColor); + + if (__instance.IsAllowedForWhoringAll() && !__instance.OwnersForReading.Any()) + { + // hide "Unowned" if whore bed with no owner + return false; + } + } + } + // after drawing whore price factor, draw the actual names + // could have been done as a postfix, but I started with a prefix, hoping I could get by with only one draw call + return true; + } + + } + + // barracks don't count whore beds, so room type switches to brothel sooner + // disabled - barracks have their own slept in ~ debuff; doesn't really matter; put some effort in your brothels! + /*[HarmonyPatch(typeof(RoomRoleWorker_Barracks), nameof(RoomRoleWorker_Barracks.GetScore))] + public static class RoomRoleWorker_Barracks_GetScore_Patch + { + public static bool Prefix(Room room, ref float __result) + { + int num = 0; + int num2 = 0; + List containedAndAdjacentThings = room.ContainedAndAdjacentThings; + for (int i = 0; i < containedAndAdjacentThings.Count; i++) + { + Building_Bed building_Bed = containedAndAdjacentThings[i] as Building_Bed; + if (building_Bed != null && building_Bed.def.building.bed_humanlike) + { + if (building_Bed.ForPrisoners) + { + __result = 0f; + return false; + } + num++; + if (!building_Bed.Medical && !building_Bed.IsAllowedForWhoringAll()) + { + num2++; + } + } + } + if (num <= 1) + { + __result = 0f; + return false; + } + __result = (float)num2 * 100100f; + return false; + } + }*/ + + // if pawns sleep in a brothel or a whoring bed, they get a thought + [HarmonyPatch(typeof(Toils_LayDown), "ApplyBedThoughts")] + public class Toils_LayDown_ApplyBedThoughts_Patch + { + [HarmonyPostfix] + public static void Postfix(Pawn actor) + { + if (actor?.needs?.mood == null) return; + + Building_Bed building_Bed = actor.CurrentBed(); + + actor?.needs?.mood?.thoughts?.memories?.RemoveMemoriesOfDef(ThoughtDefOf.SleptInBrothel); + + if (building_Bed == null) return; + + if (building_Bed?.GetRoom()?.Role == WhoreBed_Utility.roleDefBrothel || building_Bed.IsAllowedForWhoringAll()) + { + var memoryHandler = actor.needs.mood.thoughts.memories; + int thoughtStage = 0; + + foreach (var thoughtDef in DefDatabase.AllDefsListForReading) + { + var memory = memoryHandler.GetFirstMemoryOfDef(thoughtDef); + if (memory?.CurStageIndex >= thoughtDef.stages.Count - 1) + { + thoughtStage = 1; + break; + } + } + + memoryHandler.TryGainMemory(ThoughtMaker.MakeThought(ThoughtDefOf.SleptInBrothel, thoughtStage)); + } + } + } + + // if room stats are updated, update beds within + // "necessary" if beds are toggled during pause + [HarmonyPatch(typeof(Room), "UpdateRoomStatsAndRole")] + public class Room_UpdateRoomStatsAndRole_Patch + { + [HarmonyPostfix] + public static void Postfix(Room __instance) + { + // note: with room stat display enabled, this get's called quite often for whatever room the mouse hovers over + // even large outdoor areas + // where iterating over all things to find all beds (even if there are none) is expensive + // for now, skip doing anything if even the game decides it's not worth it + // (game sets role to None if region count >36 or something) + // - the beds will update eventually + + if (/*Find.PlaySettings.showRoomStats && */__instance.Role == RoomRoleDefOf.None) + return; + + if (Find.TickManager.Paused) + { + // if paused, update immediately + WhoreBed_Utility.CalculateBedFactorsForRoom(__instance); + } + else + { + // else, just make beds update as soon as needed + WhoreBed_Utility.ResetTicksUntilUpdate(__instance); + } + } + } + } +} \ No newline at end of file diff --git a/1.4/Source/Mod/harmony_RJWTab_patch.cs b/1.4/Source/Mod/harmony_RJWTab_patch.cs new file mode 100644 index 0000000..5f32cd0 --- /dev/null +++ b/1.4/Source/Mod/harmony_RJWTab_patch.cs @@ -0,0 +1,53 @@ +using Verse; +using HarmonyLib; +using rjw; +using System; +using RimWorld; +using System.Collections.Generic; +using UnityEngine; +using rjw.MainTab.DefModExtensions; +using System.Linq; +using System.Reflection; + +namespace rjwwhoring +{ + [HarmonyPatch(typeof(rjw.MainTab.MainTabWindow))] + [HarmonyPatch(nameof(rjw.MainTab.MainTabWindow.MakeOptions))] + static class RJWTab_Brothel + { + [HarmonyPostfix] + private static void MakeOptionsPatch(rjw.MainTab.MainTabWindow __instance, ref List __result) + { + try + { + RJWTab_Brothel_Patch.MakeOptionsPatch(__instance, ref __result); + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + } + + static class RJWTab_Brothel_Patch + { + public static List MakeOptionsPatch(rjw.MainTab.MainTabWindow __instance, ref List __result) + { + PawnTableDef RJW_Brothel = DefDatabase.GetNamed("RJW_Brothel"); + ModLog.Message("0"); + __result.Add(new FloatMenuOption(RJW_Brothel.GetModExtension().label, () => + { + ModLog.Message("1"); + __instance.pawnTableDef = RJW_Brothel; + ModLog.Message("2"); + __instance.pawns = Find.CurrentMap.mapPawns.AllPawns.Where(p => xxx.is_human(p) && (p.IsColonist || p.IsPrisonerOfColony)); + ModLog.Message("3"); + __instance.Notify_ResolutionChanged(); + ModLog.Message("4"); + rjw.MainTab.MainTabWindow.Reloadtab(); + ModLog.Message("5"); + }, MenuOptionPriority.Default)); + return __result; + } + } +} diff --git a/1.4/Source/Mod/packages.config b/1.4/Source/Mod/packages.config new file mode 100644 index 0000000..c5bef78 --- /dev/null +++ b/1.4/Source/Mod/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/1.4/Source/Properties/AssemblyInfo.cs b/1.4/Source/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7b4716d --- /dev/null +++ b/1.4/Source/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RimJobWorld Whoring")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RimJobWorld Whoring")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c2825019-7f0b-456d-85a3-479c1a2a8805")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] diff --git a/1.4/Source/mod.sln b/1.4/Source/mod.sln new file mode 100644 index 0000000..981a536 --- /dev/null +++ b/1.4/Source/mod.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30907.101 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Whoring", "Mod\Whoring.csproj", "{3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FC2D442-19B8-4CF9-9D35-CD13B6AC7B28}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5A0C2732-36A9-4ACA-807E-019E02C37E10} + EndGlobalSection +EndGlobal diff --git a/1.4/Textures/UI/Commands/AsWhore.png b/1.4/Textures/UI/Commands/AsWhore.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f14e13c729eb77fff698b932cb909f53992d78 GIT binary patch literal 3794 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 literal 0 HcmV?d00001 diff --git a/1.4/Textures/UI/Commands/Service_Refuse.png b/1.4/Textures/UI/Commands/Service_Refuse.png new file mode 100644 index 0000000000000000000000000000000000000000..7b57c3baf5858874779030daaadae7033f48add3 GIT binary patch literal 26998 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

    8>9|Z{!Vr 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 literal 0 HcmV?d00001 diff --git a/1.4/Textures/UI/Commands/Service_off.png b/1.4/Textures/UI/Commands/Service_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b46e975e19b5bf192bdb3e22a65c0476e7d0845 GIT binary patch literal 22002 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 literal 0 HcmV?d00001 diff --git a/1.4/Textures/UI/Tab/ComfortPrisoner_off.png b/1.4/Textures/UI/Tab/ComfortPrisoner_off.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb8f645f8b7a960a6361b8d3a606ac3f7f2c458 GIT binary patch literal 4338 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 F{s$u802lxO literal 0 HcmV?d00001 diff --git a/1.4/Textures/UI/Tab/ComfortPrisoner_on.png b/1.4/Textures/UI/Tab/ComfortPrisoner_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a76eee0fcff9a6660a5841aede8f0042bf3c84 GIT binary patch literal 4396 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 literal 0 HcmV?d00001 diff --git a/About/About.xml b/About/About.xml index 4bea346..f068906 100644 --- a/About/About.xml +++ b/About/About.xml @@ -6,6 +6,7 @@ https://gitgud.io/Ed86/rjw-whoring

  • 1.3
  • +
  • 1.4
  • rjw.whoring