From 7753380e0e57b53e3a24835f2de58aef6d50d3ed Mon Sep 17 00:00:00 2001 From: Ed86 <127.0.0.1> Date: Fri, 24 May 2024 16:03:45 +0300 Subject: [PATCH] 1.5 support --- 1.5/Assemblies/RimJobWorldWhoring.dll | Bin 0 -> 69632 bytes 1.5/Defs/JobDefs/Jobs_Whoring.xml | 17 + 1.5/Defs/RecordDefs/Records.xml | 18 + 1.5/Defs/Rooms/RoomRoles.xml | 17 + .../ThinkTreeDefs/ThinkTrees_Prisoner.xml | 22 + 1.5/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml | 43 ++ 1.5/Defs/ThoughtDefs/Thoughts_Whore.xml | 125 +++++ 1.5/Defs/TipSetDefs/Tips.xml | 13 + 1.5/Defs/WhoreBackstories.xml | 30 ++ .../WhoringTab/PawnColumnDefs/PawnColumns.xml | 59 +++ 1.5/Defs/WhoringTab/PawnTableDefs.xml | 34 ++ 1.5/Languages/English/Keyed/Whoring.xml | 43 ++ 1.5/Patches/FacialAnimation_compatibility.xml | 27 ++ 1.5/Source/Mod/Data/BedData.cs | 39 ++ 1.5/Source/Mod/Data/DataStore.cs | 70 +++ 1.5/Source/Mod/Data/PawnExtensions.cs | 17 + 1.5/Source/Mod/Data/StringListDef.cs | 14 + 1.5/Source/Mod/Data/WhoringData.cs | 36 ++ 1.5/Source/Mod/DefOf/RecordDefDefOf.cs | 12 + 1.5/Source/Mod/DefOf/ThoughtDefOf.cs | 19 + .../JobDriver_WhoreInvitingVisitors.cs | 172 +++++++ .../JobDriver_WhoreIsServingVisitors.cs | 191 ++++++++ .../JobGiver_WhoreInvitingVisitors.cs | 300 ++++++++++++ 1.5/Source/Mod/Location/Brothel_Room.cs | 28 ++ .../ThinkNode_ChancePerHour_Whore.cs | 59 +++ .../ThinkNode_ConditionalWhore.cs | 25 + .../Mod/Thoughts/ThoughtWorker_Whore.cs | 43 ++ 1.5/Source/Mod/Whoring.csproj | 116 +++++ 1.5/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 | 70 +++ .../WhoringTab/PawnColumnWorker_TextCenter.cs | 33 ++ .../PawnColumnWorker_WhoreExperience.cs | 19 + .../PawnColumnWorker_WhoringPolicy.cs | 23 + 1.5/Source/Mod/WhoringTab/PawnTable_Whores.cs | 33 ++ 1.5/Source/Mod/WhoringTab/WhoreCheckbox.cs | 86 ++++ .../Mod/WhoringTab/WhoringPolicyUIUtility.cs | 45 ++ 1.5/Source/Mod/Whoring_Bed_Utilities.cs | 381 +++++++++++++++ 1.5/Source/Mod/Whoring_Helper.cs | 440 ++++++++++++++++++ 1.5/Source/Mod/harmony_AftersexPatch.cs | 64 +++ 1.5/Source/Mod/harmony_Building_BedPatches.cs | 322 +++++++++++++ 1.5/Source/Mod/harmony_RJWTab_patch.cs | 53 +++ 1.5/Source/Mod/packages.config | 4 + 1.5/Source/Properties/AssemblyInfo.cs | 32 ++ 1.5/Source/mod.sln | 25 + 1.5/Textures/UI/Commands/AsWhore.png | Bin 0 -> 3794 bytes 1.5/Textures/UI/Commands/AsWhoreMany.png | Bin 0 -> 6942 bytes 1.5/Textures/UI/Commands/Service_Refuse.png | Bin 0 -> 26998 bytes 1.5/Textures/UI/Commands/Service_off.png | Bin 0 -> 22002 bytes 1.5/Textures/UI/Commands/Service_on.png | Bin 0 -> 37690 bytes 1.5/Textures/UI/Tab/ComfortPrisoner_off.png | Bin 0 -> 4338 bytes .../UI/Tab/ComfortPrisoner_off_nobg.png | Bin 0 -> 7577 bytes 1.5/Textures/UI/Tab/ComfortPrisoner_on.png | Bin 0 -> 4396 bytes 1.5/Textures/UI/Tab/Service_off.png | Bin 0 -> 3940 bytes 1.5/Textures/UI/Tab/Service_on.png | Bin 0 -> 3986 bytes About/About.xml | 1 + 61 files changed, 3586 insertions(+) create mode 100644 1.5/Assemblies/RimJobWorldWhoring.dll create mode 100644 1.5/Defs/JobDefs/Jobs_Whoring.xml create mode 100644 1.5/Defs/RecordDefs/Records.xml create mode 100644 1.5/Defs/Rooms/RoomRoles.xml create mode 100644 1.5/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml create mode 100644 1.5/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml create mode 100644 1.5/Defs/ThoughtDefs/Thoughts_Whore.xml create mode 100644 1.5/Defs/TipSetDefs/Tips.xml create mode 100644 1.5/Defs/WhoreBackstories.xml create mode 100644 1.5/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml create mode 100644 1.5/Defs/WhoringTab/PawnTableDefs.xml create mode 100644 1.5/Languages/English/Keyed/Whoring.xml create mode 100644 1.5/Patches/FacialAnimation_compatibility.xml create mode 100644 1.5/Source/Mod/Data/BedData.cs create mode 100644 1.5/Source/Mod/Data/DataStore.cs create mode 100644 1.5/Source/Mod/Data/PawnExtensions.cs create mode 100644 1.5/Source/Mod/Data/StringListDef.cs create mode 100644 1.5/Source/Mod/Data/WhoringData.cs create mode 100644 1.5/Source/Mod/DefOf/RecordDefDefOf.cs create mode 100644 1.5/Source/Mod/DefOf/ThoughtDefOf.cs create mode 100644 1.5/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs create mode 100644 1.5/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs create mode 100644 1.5/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs create mode 100644 1.5/Source/Mod/Location/Brothel_Room.cs create mode 100644 1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs create mode 100644 1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs create mode 100644 1.5/Source/Mod/Thoughts/ThoughtWorker_Whore.cs create mode 100644 1.5/Source/Mod/Whoring.csproj create mode 100644 1.5/Source/Mod/WhoringBase.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoringPolicy.cs create mode 100644 1.5/Source/Mod/WhoringTab/PawnTable_Whores.cs create mode 100644 1.5/Source/Mod/WhoringTab/WhoreCheckbox.cs create mode 100644 1.5/Source/Mod/WhoringTab/WhoringPolicyUIUtility.cs create mode 100644 1.5/Source/Mod/Whoring_Bed_Utilities.cs create mode 100644 1.5/Source/Mod/Whoring_Helper.cs create mode 100644 1.5/Source/Mod/harmony_AftersexPatch.cs create mode 100644 1.5/Source/Mod/harmony_Building_BedPatches.cs create mode 100644 1.5/Source/Mod/harmony_RJWTab_patch.cs create mode 100644 1.5/Source/Mod/packages.config create mode 100644 1.5/Source/Properties/AssemblyInfo.cs create mode 100644 1.5/Source/mod.sln create mode 100644 1.5/Textures/UI/Commands/AsWhore.png create mode 100644 1.5/Textures/UI/Commands/AsWhoreMany.png create mode 100644 1.5/Textures/UI/Commands/Service_Refuse.png create mode 100644 1.5/Textures/UI/Commands/Service_off.png create mode 100644 1.5/Textures/UI/Commands/Service_on.png create mode 100644 1.5/Textures/UI/Tab/ComfortPrisoner_off.png create mode 100644 1.5/Textures/UI/Tab/ComfortPrisoner_off_nobg.png create mode 100644 1.5/Textures/UI/Tab/ComfortPrisoner_on.png create mode 100644 1.5/Textures/UI/Tab/Service_off.png create mode 100644 1.5/Textures/UI/Tab/Service_on.png diff --git a/1.5/Assemblies/RimJobWorldWhoring.dll b/1.5/Assemblies/RimJobWorldWhoring.dll new file mode 100644 index 0000000000000000000000000000000000000000..6436cc6cbe9efae0ef8fd5be415df6a3e4805298 GIT binary patch literal 69632 zcmcG%34B!5^#^|5GH=!_Gn33DVaX1UOcF@g0xA$d5Je@53b+8W2(k=J0L73P#I+zw zYpJMMaH(Q#75A-*6;Z4UsI}q>6|GpUT4}9qjsNdC_f7I9V%y*6|NlqlynD_)_uO;O zJ$JwFapJUV$si&Vzwf>ydIV4Y8zt~RgLXt`7eAIw5BOgyeMFo1Qt9M*^P5YSq>|^Q zW-cn3HFNReA&Yn}7l@+LPL{B=FXrgA&?Ddo8rgPg* zWhFsv0Fh54vJ^GY7vU0wN8w47D`8#f%>;*ys2%a3^PfR8E@M{yzw7CsOv2wIeKb0m z1CaYX8>0K)42?pdwO4A?vwPfs!b_mOE8YkEI2T^KY|e$tfaiLlFXE)Ej^1fDkZ07U znp3kt5Z$1oR8#;@*WV~;Uz?hVv{3w2`6;)^IWiatmtzID=-3rU4 zNq!F6eTV`?RYWX*>i=KzbwdAURBW3m#@(hY?7SRdtEp+z&->Md3}o8Hxp3 zgB&#Mgt7?hxff}nLYUgBL5z230jqin1aYFa!2p#t@jh*X5a_VBps6(1fUUBfV{9mx z=%cr=(6%9&tXrA2zp!$Q4aF0ENVm~211JYePhG_ZD6mn5Tr`%F+N4OR%7jv=phF9K ztLq(w@;bDTuR7>1m*ft5mY?aJh2-i+Js30xPZ*DF!>wYlUy{1HBkO!ouVsu3QtY%_LT#o13#b8E&p@mf^!JJMF{g zmp%00;E`qTzH`=yvbW!QYee%=C}4XYIFPW%01uTzAvhOu*A3H?ZQ3X)JnFr0fUM-v zV78B8lhAwc2u=EOjdH^jh8&H{bU)IAKTMvM5nzP(dm3&5O|P~LxD~tt{^x19hDphh z;HdE#@>Kq!Coa_OQ6N_b4S6b0f)DA5bF$6qpr@q~u|kbS&9GU09OR4^Il4UtPsoW{ zVXNBT)(fSIdJ^6?j1>szEn^Ygax8;!48{Y5J$ZRa^tUKc70RzuF%(Oe-;SUxeg1RV zLs{vv2Wc+SqN#m^j6r*BrEj?ZiV&)&-m2cZJqc)4y>2(*xjcp%U<5sWU^z6` z;A0;82YN7g6#AnI)K}0!w^8wyJsC9nGzOxRq89sO$h-ZixP3ZeP-mqs z3EXL<7HR2H#IhQGf^6FIk%LOzat0E$OksclB9NR0fI5>3D|ZQsdcq!vLTbk#5Oo}j z>Qt8Na@aPuLh2cCIVz(UvZCII*FF=1UAm_}?BvnyC>L(_4{_$`X=#cx-=6tHtOGk) z?X!>{+ht^jhs$#W70@Y*RawRA5ejkXQk`&=E8Ol1uXcqmafR2o!k4I}DY z3&uQ0+^ssMp1KXHWsd@oZa0ojre!UsSqD(%xVU{a5X4t?INqwdfc2mj*SDg(4>(SI zZC7vuf^9zrC_5(bhY|Kq5OVy_L-*@Me(txLuLC)t>o#20QhwXQ-W&7|8_hndnod%Q z<(8K`l32whIu*s^$)9poZ5sj6l||7-k4F=?e+E2xJx8U>fcaA(mb?KFBha~o5udY8 zod<62%baF=BjW9w08|m}PTbxMV$_OQ_RY-lbH>o)Ic!^iwrvH7+qVE>1Zbwz1{Upg zY&Dt_aBKHd>M4n!Fyf?t>CEJR$rRm)lk9t$Vp7Fr;(jF%4h-`vn@W|R3Tyt5eQ$+o zu4;4aI~LS#Bdm%^-i8>bR2-}gr9Nkq-;Qu1km_MLVa4JM$x=blU^rO4JY6A2$RO3& zm6$E#B>rKIQcJrMaKGv#uu@x@?s5X|Y{)K>~xb zL5W2wf#NLjVIIOW0j@tTqiT(JBSG7*09=xsd|0UcYk-K}ksrZa(3iXiSVnSg%)OKM zGP&w_-QJFXvVwgdf>jtdeAE{OfD3WCxR227`vFB|z2yM}p|}yVA4EvjR6I7l0R1pF zVfJHImFf0Fh$GBh3>pVnLC9);0~`U%Xq^le2tI-nBp*g9%$@!K&gMrDPCg32mWjhc zp#=G=)VMYtGD9r$O_6D~o(7o^efobDy|0^SC6wn_Dag!{G8?g2%zg|xqu`G#1$-7p z=E9NF0&RVeg-pQE=MH{;G?KKYW*BQBbi z7#q$??&e^&YJ+AtTP$M3=>yT6a87lpDo~pKJErG`bF2M+kX{6aip@&K5vaNUy{vFn zwGSw|i~zlpI4_-17#W3CMiB}}T&7nUMZ?kR(oDK!lo!t9j3Vib!d)4Kkx|&m$Tc0$ z59h-u%V8A%4;v+Fl0W$pmn7EE8@)j!X1~l>oWgOXn^(=Y3(|PkXkeoUv7&|HLM&OM zMUHW>uk#8E=n?M0HRgeP?`9=B8$I5{YW!bpKEIBuydiWE7a z9+93-sAr^?3fX%hPPqsjNuQE%Np&D>B41U#unrtOF#L^<@4kC4Clc$36{1}`rVpET z4ty_K8ZNDFaJSjAa9MTF)GnwAmLs_*$S7bU>PvXw+}KayE|3~0Vt~Q($EcPjJU_q_ z4MF~x{x63<5r~_99q>BDJ&PUy3dtX@_pbpBc$f^C4q}>wrerp(1lj1C0xsVOQ`h9X zDQL_(>XMi1ya<$3V>p$K?nRn5ui|?_3VQ!QWea-tK(Rfwm7knL9K5cIx%JA*%oM9ZrV1RLy_cSms;cfRY#R5hWooygU-XyxqKqxU4 z;}3erKo(S-XR=mShvsx!TI`xw6ztU*hf~XgM>SaIWy(OI@H1|T~ zZYa zgdnRhYKpZ0=*J3eA2roJgrH&9LS_pxF>QcEmd|KA6Nqf!PLuHo1+<#~4BpCij>+q= z1~BDQQ2Z!A=bLAL#t?sT-cG{CjkRD((2H!_M@UMaPB-1XKKm{Ur#p8wC6O6=AA6UvK^jfmZY(yhB;U5Bso0jniBH zhQKn&)>}BfDucqTvM>2K^3Oy5&B)!tzMtOmcO+~18lVkn&E!82YCR93HdL$WM1KQf zWsTV$ig{^?02>EKYI&EM3|bc& z!|oz1nP^9Sqs)@(CQikmi!HS$1MN&z-jyobhg1w)sj4#2&Qz6MsU~qM2Ch^qGSJRc zJUewX`~|0C;7YY41MN&zfmA$c$Fi}jZNi>}84Bvm;9XBEU|4n|p5my8<8?wko|x3Y z$93*at?Cjm--TK%ipBG>w!yJlpgM%eAOdPE52OX~+TbXpFJK>qd&yqw5@7c<5nZa731!uP1Y$ zVH;d5Q0vo^VLa82cu>{}SqS18wJL+UhXdssIs{?HpsH zDicAkjhevxKh~l1WKM<{3@V<6jgaGQTaYQ@Z(SldMnq)!ZB$kw%Cmv#r2Fi#UYW#P9qPhDHGdeE>!L%b*sw1FjIMSsOj=^j4011EUafRQREdZLuzpICB5K| z$w4dzZn#yT=Dqje-d?YxOQ#NlsLwR%(!{^cM1R$rb#TT=785YIrk|<}^OI<3HP&r@ zXfUwcYC*iIs4=U>Vzqie9jgUnt2wnp=S8Q#dK@_^b5umh9-XMeM5OHQ!xbwfLGjUc zPoypmoIPcVQe9<$>fDKpl@Lq>xR%kFWY?}bqMj|ikTQvtL!idUOZfES9J?3@SF3Ix zi&CJO=xrq+#q;e_Jc5RI8kUk$0(cJZn%7}iVZ|N&WWwfJO3wg#Yl%mv~Lg^9F93Ct@gwhMM z9F?kf>SLi4`y+-*rY5hVy+7(lQ{n9j_@zOs@GOD7n!jd;#5vg_SQLg`j0ZJWAUL*@@ux6>r0od?KE}p33btcHH z$C=Qhl=VPO$^KH372qxmjmsaq8uK+Rlo)QcFdbBQf41II1F1=Lc^FBGT^JNZU+7Y> zYm6DhPb8kW8!bsfk09-V9w+qCdb|6g=sQ+P-y5OXkVtwQUT@h5DFCSu2yIHPV6in zk`|F3SK8{az+~iI>)x^4#H~YjA9(x$nhV|fj zuwE$Pi-+I?;zUonOD;W?nwf%w9Gc%o~`7$aIt z*g*2>&`~3O+~Qh1h;xmYX?2t6!iS>-vRi?MawcIsNQ`u-ST!ESkw*jIv{N|Kv|~Wi zWwS<>m{RystTW?NS28)`z36{Zr?zj}Lyf4ap_Q~1j1GK<0rL^` zF^%Y4?5Xg4OkQ+*N;)tt9Y6?6G(*NFEF5EPT07 z!&FqwDMbWEp-t?;<2c=TfVLD2C3DuL2y|FjH(AZcA)>OKV{A-WFb_jR;aUt zIn3J=Sh2V^pI}3^LyCi&hQA`~HncTU4w9rOKBm6~x*4lC%!FmwGmx1yVwng_{9}k` zHIQlR3T~t_&WH4tDWJ4W1!$WFki?P!N8M2qo0x`7nJ;vv=5l1CQYFs<6Q(~j$g z2Rk$bXCXKpH{oC&UTX5LbH+9_?-B=7*+JxTJX#!ik-;A@BS}}?1yXezxG_EjkXawt zUFu#RAzx>0;OJ=B&D@w>X3Gv|BfH_9*}2_eS!Ok9EPOW9uWaWSy98B%P2=PoE@(~z z7ULAoNzP>~R|X0806uo|G}*&fDMbgc6!J8g}Iu&NXEbW6DA>9u7w$*gKoY z^7xQyB~G0({T7Lo zyErM-0pEP&sjQ!_y~0ZrE+$EX@~>DW8m8{Yl^vJ3Z82OMuA?DF<>Z5KEEforr_)pki|ZI_43QQOaP zTuEnbs}R?Asav^lNoIAIM#|FFT@kLRzL3IYT-}x7%FOES6Yi5)-6wm)W!bftT=2ryw`V9pT(%p;`ELW?EEUnty2eeJu?pK+!^)@ z_xo?vjg~D(a_;juAL{Z3J@eeH9j*TpnDl&fGg)}@A6O^|dJFh32R%oqJXiJ7YJ{s% z40PMKL08oy$>h@Q$(W-AQy+8nN;iXL#z~6bJ|Et1#N&Apqa%L+x9sAC$6fm`Kz=ReP4%{xqVbx+l zOagX{JQE{n5{UHlA=wQXg%KVH_|A5S%nyXlGaJmvmVlct5q}OVNOv2PttM=;@vH)a zJGCukf!xWj0)L7T9{q==mwmk6HM*9*b~AHum#rok&ip{lwJ0%Ex0f*kZy(~ac2_#L z2v{Q^`yvpm4zsHc48ryk)p8wV7~4;A9CEVHxu>nC_4vucFFf|636Lw8&lcf`AmI&G{AAA zoivo_t9Am_Z9Zhlc8@aSI%Ztbm}Yd`f~_7RU)kKbAB~&_`DwS{bJzgr0|(yEbY54$ zndByon(2zYe3%ugHx6!qF}{Y!$eP4hkh~a5rb)6?XlDYScwpj>zz-ZRRiT6BJ$^6Q zuy23ye=~`75?`T|LR-{;O-#bX0@f8DZ692p|?CxpBU zrr4JtE@Jpv*5K)DxfGB~#Wvs3C?}WpWuPT52Pi)JY|fC4=SP=+1xR>n#7ttQg>^>Q z6mRvSl08`VaRgR{*w@CkcGU85(};LPY}jl=AxenfcnRNr={*|@B}1;lwnU2%TEhaVBVj~0}paSA73d`PxTh28sryx@fHt`6Bk$e^-d%VY@n>L5+ zYr)>RKZX8_&#Ra(U5DvCt~f|+GZZ$x&t(=!LZspIMK7NDoHkEsmZqWZ!xT@`49Wsw zpvuFvHz0Sie+-!X2>`aEzJwSolCNX6&~vV3RQLL1S4DI}@43uL@>4Le@wuZ$wWPTm zHDxV-3qxm@EY^fu zc`j~KLUf+}GeArpOS@Qjg~KkIO>Nh^SUS)8G3Qq{ggi2W?)EIR2OE2kSd^=a9QzJj4TY z!;$nFb`xSKbr$kN*Iv@N?io~oA^V=d+ec0nYpG1rTwBsyyp!3TE0nqxvJBZ?b;TL7 z@tQ%vURFlxTTrm9)E|-B>+{=;VHD1zR8ck>bt(D?xk=}Y%ut&9&JdnzY!G8ft@3^9 zAA>%O%NyY_l?P2{#KeO~SUf()1NwZ?Xy1mcWTeEHbvs)Zm%Cuim+#Is}8G{|q6@JO7c|Kss`?$kd&o;OVHqyU= zQvcIlY4`Tb`;{T*_)R*MADD`8HsbfXjGL+*wcHJjP-eI(_L@u^gF6qt!<~2je#QFo z-7$4mcNFW3qsHfAi`{ zc8;-84~e#mGI;{ba}TnvZ08ue96U0ORp;w|Dk@iJ+dbe1=+F5M$p2NZBg(^(nM|g1 znM}!RkJ+9)evL!A6x5p!?>iD5t^7+jJRapehB-bPFG+f`t!yv90Af)#Z*}3-l>5Mr zCb^vr84Fo4`#yxS{5;aJmt>J?jtA!{am-cA{MbsBVY#4-9B;3O4b1WFm=xe0LYZh) z_iAHeHSU<-4{_Dm=J+;_cCId{F*=AD8WUNxOyR0+GRGfr2<|@Ks{YeM=RtRjb9jdn zZK8m(y?OQnoS&KPO?YJbhlSTb6H^XE!cb162a!BWL!Z~4TOBaqY(5$L$#z1ei!w1Z&6k7JftX-y@BQAA7q8zlQt6jk0xvLEA6=iI2NYaNfOZ4+sF z4rFv)0FVuzCe8+Z*^)MN!_HCiDjydd>zROJaYeZg4B-`(BKNFr$vv6LQ5I!ela7a7 zMzUSn&@Cw2R+oOyMma7U$#Ee}5<*I{ALojF0-&ZuouXG~xeg=Qj!mc=_=6mf410s^ z*!COnhg`NpKmH_0(BS#e&dZ(H8Hka8e$*H7rGA9c*iV50Thob#PTrD6#mm#z2t|z4 zdgf#EGhZ%KIx9prwe1}o=h3lZfALBCX-4pV*eYJdRh|^~q?dCz3YmI(*b19I`?rX~ z{sb4HI@eV$aq*a};4G}*f(a}&;&@Ov2*YyUJrC9yCH}_OXd>#x88z5=K95k21w_1HP!YwL>?wLU9dEm{6yJCFd)Vk{a#xA(`QCa+HIok*8_79eUR=Hi9A zT^#h{lpyR)KF49KF=|4QP)9yyJw3vqLwko+A$e5&lrzlb3A z<+;bk*8EGrrpq$Kf*Cyt^j4PrGKe)BaD&KD7O)J?le%?Agbof>2Kw331MgF~V$p9Vt@RcZ;)s52||0=M99~ zFjA}80O#9b-2)YxpN6Q)c8-zPep>&)f^O<2DETI+l-klsw)Y9)woU>rJgdDJd|3gV zEAFtq1&-EH2v%Xj&t<6AiAKYII)9P?mphI{S45y;V3n6lDH~6$+c0h=Vhz7RprHaS zq5&H$)bI&FtV+)p;V60|=OM5KYZue5Kr(!^!$mG&GS28S$sJY?F7>-mj`i&x+4D$| z8Lxd~RPDQG`3NrJ8@2ZSco-j7@WSADq;o?B+LCHf!D`kqi=fROGkHXA6 zobrqj*$OHVCEd%zk#VOyZpPB?d2yu5t0*(C7{0F1!bYtsYW@&9UnFfAJpdtz<446E z0}J$)QD72}8yLiGdvU-(A{vty?s4fv{GyfhwD^M!k3a+VNvrewLppbNrg~RWg7R9W z4Y5{rzwbwW1ZCu!v|N(@C7O^l?>OJ&?-Zn7%yuZYB>5B4rFn#s{Fo`fP^pCC1h+$` zn-{~`Mfw%iSd5P` z(8cud$KtW%mn^R8cqgZlE79cT&2)5iQojrE)VO>~6{(b%{Z~%qD96Te>1lt3xaz(x zb~#pdaR_c72Aj;`u*Ky>{*9%|nlPKL{U7bRv%6g}MxdQ_T34#gk>6R3@>Y;r>HpnQ zZV!@gv{YU0F52Hw1o^y&&JzQ*3W1-PbPRujkfG!)mT1Cs( z$gFtw6#Eo-P1=V4U>my2|BZ|APlVlZ{{mivIZ&sQ*-XJ$*ZOZf+rH)Ks4F^dcStN^BT|^|-)%??_^&BE$j<%A0Lj6XN(H3@!26ySxZO5KcY)I_Zx>Z` z0TuVe+*IW#eC&bxsd8lg&psu7rmhWO#)SJZ;x5uytA?l5@v#!BWxe14fi?JbzHQLmz>X1Q$bbLDBD3z1Q?tAFQh|6wu*Oqsc~q=)m)tdpFZ zGOmxigyH(Q%0hNA@kXQH2^6_C>@#-zgBQ2%ni?WUgCvgcTXTQuDihHo}_iAbiLH8k}7+3SdSwM zwLU<7@%liOi4D+UJ@KC+v1G|e>8Ql^kq?DL*nG#c;o_}aS+YiuT60yE6xp5uQLWsC zxNA{5u`+bP>Q%N@?pwNSD?6GcD$g#Hrg}v(YgH``P7=`!3!E9cqKFN-<{UX<^eAvN zA;qEWfH|ltYI^bFj(jQ|$zNn-3%VnBa3q8T(yJMcR8}eIZWY!B<^AVac_R+D3Vxw3 zR!p1U%HxZ(6ggSSqM*|5>C8M@+;P9{jLVZ^a-6d~(uGm!QrJxwWwuF@6~pwxhQqPe zd=aH$l?u;vX5%c{I8uo&I-=+%5zVlNQzINsi{>ys7be*#PL<70&PEoqj;Y;|&;F;# zU6~5DxD!5?j!VW>)w?5~?~E*vNL`YuqV+gZ(JIp|Yj--ORDGo~VJoJRCKk2)P(pfU z3Xw%1w;D9Z&h;N$-|0Wq`j5NUuJxa^DOvx$fGm0a$DSmgwvqMU9#DDxr_1|+;N~+? zbS-iws$L5^1q8U5n!oUiK#hi7i1K20#xBB>?=)SlQeawuNec7yGV~VAG4Rp`IC#Y8 zLk8DdL`r`gMymCV;ml7ti3A58ZO8_6^&s_B(u7o7YRJb;Y6=bczG6){omWql7cXqO z&Q|YXTd8vOVy$C_T=c2Qmboul(%g~!vLMfAE&(fE{}sj6j9LydF#9||O%}rUwC&KQ zSC9F=qL|c3fkwkR)#c8fRt6DoZ!w1BT{4TJ1#b$&dug2>wlM#>QuGG=k&aya> z7^BoO2eW2=Kg%{+dUKUT)l+YQh0~`o{Pk1j;aVW|9@lg(F#b?xoCTY;lbwLP<6JW? zjj>&88XT(+aI9`Sc?YT0Ie>_wah?A;^0t!P9e6`?2{rYnN*{*b@)YB#r3!&h+p#r1r*Z&4f1* zYWNot#RBivf(ILZl6~_Bkk>k!HEB`sT!dR$bujJW0@)=nyj=>AECXo8G!Ad3eJkl3 zu;W8|^FbCeSA;0YqFUJqdW#}(qGS;&<#ra?%Jv|gH!_aKtR;eOirH2%xg*9LveTld z9oB~sf8;NQww6PqbaJt>)InBBj@CID!QO4z1 z);1P+4<{>sLe}(-Rn^!NB$So^#=(C4^C?u?Qg4LOSBBGeZDA41;Z_>jQu^GOcim=y z&R-bh=Q=LDYKy%0hQ1ViFKes%-kAt>^}SMEfrK~K{1J5GzIPVlTe-TV@BIwaDl7=k z1HtIf;iP{BrF|aIs(J&h$eG>1W4pcfSJm5)mowR?_$;^?PyR#WScKH7`OX5ixDz|g zuq$EWniJDJD7#fXGL4~^v8wA-a@9`buFoD|3B{6}h=TMs9JjyYb$J<8bppvg$f9b9 z-m*lvkK+Q?Hg|BTmV#2%W+eN91I@GrpT!Qe^kW1aMHQYbY?|S^Ej|rhiM;+%HC&Zn z-jm?2Q0fnT0)MYKjB6}B0cu%+3U&y6CUY%m_ zX+}Z{8t3|h#RKlXr3I|c3aOP-@pp1cQAX9baBOGaQrOwIWFwOw>|5|XXDp2{sf3Sm z`k?n%ZV)+GX`AHq=sV=)o=g+T}~d7qG@nC-r#S;({*r`em%7H63|s_ z@&F1{v(iE8VbPj}3hCy&)u%Z;w;_Q#U>@UU9EhZ@w|cRe$(eUuUru$svKrJ|SOJV9 zusK##>re`GZa7}S)rQouJm2?1n%u%`tpU}aYRx3p3h{mr)p37oePC~EI5`MW&@nj}Px7bUMsBS`n7wrsn=dX_jtAb| z0`(o6cNU_5^azERpGj1O*b3s23V|8xkqR-XTOo!*q5l_!C`cFLZLR{xaoBU(QN&~q zRCVhbE-Z#2_Nj&+F&l2VaBKm`UWyRLVXkZS=_Z~rjsk@vmZQ;Y)mT3g%wl-ONc2LSfIFj zY#D=w!oT#`l1kU0l#O@nq>M3?k$5=aDrXry=N^M6R$Wf}RAUG?{;n~EmDFVn!DgC_ zAs2(v%2vX7vYNx~9Oko}2so-}^r^?=^qd<4-)kpYF{pMx?Z5#8>xMDKLkj`-VDKu3 zjHA&helZ;3Q2J$6E&K(Anb7GjEq6mM0C!z>`CilKBLKtO-Rph%^{B10`^NJBx z(lfmTKdk2PcXu(%gv;V0<-BT(P8Rrtz%%k5#J4hTsOH#<^PVoVs6L-zRN$=wlLD_4 z_<-;%$eRE;69m4J*Qdy$jsfFJ0`y(ZjZs`d3)~Y5(5!)r>X4Up4GMQ(Xi;5&0u?t# zEvn699X>Y4l~^=NV*gga^d`?W{%ji4uz!d}yGvNwm2sAHCt!r0?$;Ey=!)>Tk{GS( ziSL=yxnYJy4aI(o?l3u*wIY9`$p0#bJ z7cs0aT10AJb?9IJmALY7_HvJn(yni z)K^3{%G;Y3M&p1lm|JT=mwfLLIY0BUw5!Tk&Ry9YesKVYXH;-a<)VxM8j&@!5_LuQ1 zsn4RniRTO#$!CkrFF}n2=pQkLrwC=GSo^z5rj(VlZTrHK0eWxur-Vei&kULQ1h#4U)@S`5gW`JS3Y&4doI&G>qX*Hp87+ zT+6=|XyEU>9^nyP_>kCaG2%%489kjx1%h1w&bGMa2tsi zvL{%jtiv?nudL@Xo+H-yxxi1MZEuSAVt=5j8>78xV(!+Or*!_BT7WLiW|>bw+W>t6 z{|`_B%5KrUJ=xCl#16lf9N(5&-exmrZz=Uk=oX-b!gHV4-zwRJ3KjnJPJ`daW? zbXhLToF;PKMC;3@YhaTe##!iJvuQ#Bm+`$A%Pgv6_>W=ijoYQBvOG)~FEZck%i&W* zlMkhiu7!_TG*sH%%aUVC%05Os?Ov&iy<*j^QBM0xFNS}E->oL$-{$hjP{}1(J#UCA-{+oH0MLZ^6D=_RrI4FP2mW7#ino>U4%9g zq1jR9{1(2AzNH_-A4zZ7CM|KUw6B2Z`4!|_bf}*5+F8prvY~?E4%CiCXG=eG3)(_} z?w8gyRr-W@4)fdxowKR8^iKEHunoTw>#dLyg?n*btdz9R#+d(K*=+eMe9ZX}e8!^T zQZJ_X&q%53T;YFCymY9@IbG3V6CPLa)F|zsvdqX(05W5mXAFw&ixm_O0`0~D#qA(!0LeY5$tqG83wFca-UMmQVQ{&9qV$# zFopFO&Ko1Uiza}xPOyK3cNcvL&VhpY5%&_l*fB`bt&kG+q+t@b43=opN`bM=?IN=; zZc4H)^K8z+rqgLPu)dMM_*%6D&6hYk`WIh2^twQ>R>U#ZBADsKT`bt25jPugYXpmA zDb6bdo93ijD>=Mo|HXHiR*Sm|ocpQS%vp^_UYe z=PxiD%B3s^yF;)k4(B$(?su?XQdjQ7=~rYRKb{RX;!gLyg8c~NU?Xnl-Y3{!B<@&x zOt3#=8q`P==mo)6*o>V@uL`E5Or|#k+aT#qqc;UBL>U|D40?;Ya-T-~U7TlOp2oV& zFqrdfIw%-lr){L^^pRlaiqD>4DWxrdn8OX&5BigJW3(ak_v$|()g=Qy2fRJTa8>UaR*ZU< zF?=Y(@bu_cpsxsg4fs=mXBTnU>cQ~i!C&VNp+&uCcu#NNm^C(ddi!=jCHeIBYYN9` z9=f`e;n73WIS!$#hkl1tD+SH~4Ab9=ZqUMXIC=xLiu%lO44&c#Tx-O_mURtmb$a_L z{a(&Jz1>^#GSWtU<%sQJ*qE(WXV(KB)%)LBSV!lL(KNbd@X)YE`}}Ory){Q895tEp zu7}~x)==>8tr-P4&c6s&ZOdZLv+KuV0dph?qmXL2ITrA9k+2>TG#cP#c%{H+0S%fI zIn^fN zzZvij;|{=`#&*ERJlnxDHR}lnGUwBvFD4uC7-N@9&pn-bR%f%f_XX5wUH$Ko_6k6a z`kFVO6#cCC5x(2n6P{FpW=EG7^iS|;c5f$k2=N7_9QTp-JhrFs-8I23_a#Ghz<#bU zq^0xt!zNv(Fv-tDn=-JcI zk$gH&FlEntx>7KuXFgp~CHbM}uY0rwZ#vXLAl$Wt*9qb3li;*q3qx`f;FS>USV>{_6|2dIjI$;Q7s_Z2+S+HI7 zd3bK5gnD9@n~p0bTdAvzdkfWuuFaSRbLnBLn#OQb=_KAaJf{lUB2HAW$Xmm-AJdKESRdJKD0!z zUB1^VFVp(a6$+z9^hbT@M-KK>fH4)fn%)rXCMWK9f<1zLk}f@W3bv6(1a5+6A3Iok z(d`kN?4y`-BUSeORiuiRIM|59W07jQwiEkpq?SH)u*(uJM*7pey!C-}7nHmnsiWtQ zQP|_rcOwI7;s}MEnm8C4L=TKq*bCu5M~2YBQ3`u2@l~XO7B(vE+XO|2)9ViQZuytl zM^oNt6<28IMn}-G4)#Iccytuab}+JgMH}g`gPmKP8y!t2j#23b6vv}uX`zFiP~0ne zEESAZaT|)tqvPl}2fMW>9-Tl-9PIp}FSC!Q+GCkh)yhN~CD=x~GOIc|k*;&FTY;TO zA3K{8J6*nqU9X*}?;b13c)kn{uo;WDsTG<^rDmsluVcV3keZbD9 zJq~6Ry_++GCgb3q<7z55Yv7auRZCD>kvUvRM^h9IpBTEzltY>U`bZIAcC)#E+{X?ar=HSnQ%P8**Nk=;?9ty6Y z69l_ddYcPqvJ-brzi8+Jx=^rP#F|}5TLfdx-p9T5LxL$ww9sK!x)v&!!a1mPtMC7l@BW;iDPV3 z=x21TU_0qR+1%)j#IItrUA_W#6J03SMjGC5L3A@+--)e_-bR<6Bl*#5LvD`VOA2a0#{j#@iCa~b1+{aRGaWD;Ysa>?w!Ms=+?xKkc73T`fmv+(57b$GE#n`i=>jqUjyz3*Ub&*$i4 z!Pd~bz1K&O!wRKYaKQS=^R&akzUjX{vOB}_FLc9NE>P*l=>>V2alfN=PTbds`&~x5 z7wH`*u0~%Ud6C9nsH8NS>mx7GEC>76vp(`NUF={_S?eRO(5((O&bvOchjt65Jb7(C4woxevM{07}vvV^yWp(xtivo zZePQJA7cmn7Z2)__gY4+yoMVCDvoRAH7Zb;7Oxrr&NCg1Yvr{J&0eEf61Rrl*GGbL zv0$pSuV-++P8T_xCu(E!UZ*P@>`LwUyx-F%2m8V}KJSfA>{Z15Aw$ZWbeqGuLO(w5 z&5XExRKAMKu!eq)xP2LMZ_yAZZkj$e?=2cDn9}p@49>S{lEe8+ZBpLbw8X)-8;1k$ z&=n5$vT;VR{uHXy}hLQ!wQPAJ8hnlouSNCmf8u;2;fJ%{eG9I7m%`9q?BSJ}2*B zh8J|ju@@YqvlOScqiQxdf9YWC1qUHd!yXaCM?ziU;tCFTL7n#W#oZao>w%M08reTL z*F!HBrFnih7Vl1BoxBd`MjG}>y287IOi_??(XngMC2ejU=cOnwfUaW)gJUP*Zm~{J zW~Dhbx~rrs>_IC0ThK1e&#P3an0^%WS0&P&@-juIg6i%(io%j{d@iwfmE`8?bdOj` z<@k7jDIbY^B}dti^-Sk=e+Bd0Um&KriSofyuOYwJ=k?oT% z%l|!WN-a!^=H?o7Vua-=3Ws@T>BtnWsdVjdIBj87M_n~yP#~9M-B8ukr?8JstNiJ- zZm)BP@kRYu7tdb?aH{`Z+7IROL-Z~$%FOqN_dt0&S}Y<%aQmSrQIp$ZrA^7SfigLxLnMy(eWs?POlcSwyLjCULC+43*L=n z$o)Vj)g;yS7DV4@2CB6E=qnn7ai|Wdhi>7Q?3ED9lvb+ zw&Hg?zDO6rZ##b3_-)1ScASY6;kO;X7=ByvyB)Ve0{Csm&%$pjez)T^jdv@sf6W}YgBzv&6Q5C&(Wm$;nk?Z> zvI9F6sVcNbwJR#eXh&0SY#iW|v6BJ6^Pi@T70Otlj1|gRB6+Vs4H{mkt)>G-mud5j z_xoL??bbGw-k@!#zxeCu0DW7s8I-bqOiA@+N+Pxy;a=6ZYD`RD0P`ZooO^i`By zd$M-GV9gIu2X=0@lee~A|I&D}*Jb)4 zLl|zaXZUt8!$2Lw(L%4P;PA;k7{1nz;m?HUvKWWg_GZ{2Jj25r9xQT}t6U11^04rH zB&j|YnHNcHFNytkhK7!-*p2@4`Pz=&hp9iz4R|oSbOpbD~LKk#M1eH%aUj zr5t+;(jK5YqKjYwKIPa>6S0eb0DGpJwSC5M{jLYyC>{f!8CAYne^k4v;#S>n28L|Y z3(a4a{#w6OEVj>><$niq2E}gB`stqqKLnj?Z94^eeX92}UkQDw*O|TZPSl5)P4$1* z8_m7ZZ}mF;q9FmJPH(EuH70-_H=0aud5JO8JSV5p@SBg8ZbObM%Ib^*+GoL`#(cAH zj}gW?@tM_T|HO&LQu90ibYm(cG#eYt*J7)TeZ~j*YmEc+e*Z=KHgll=T4SrZXvm$0 zUq96IVPm`554-k{n%l~sL3n5#`_e`5lMUt@v6qZS@qw$f{neisH=$gg(QWi$$TXie zSN1A1cbo5KZPxah(d-)Y0A=@vx5MkMF(1_f{WqHX%&&qsns-a8L*^slUz>+aW61M> zA2l2Re0}g|=5FKt0pFMph{c|e7QIti_c!L}y<(nk%xQHo&jVt&2M}BAc~N3D&*0KJ z&vxn;KH9?)MuX0C-6rFsh6$b~V{iRreA0GvDYvyxqRTynp4m9DWZf?E9H8f5hnZ5Y zZQ4aOn?0|KO7n4 zU-zuk&7pe$r!_E))idm$*ykDM>7R4Jb5P3uslYn(zNlrb*6S-G)&Y99*JiEJb5~gt z!Y4*IYa2xJVX?yj>GvjhzA2btP4FlWY^+{vHF@r=Z??A6xx-dkQ$2Q8n>Evu81kw1 zZ)wYi>Dj?+t;5u(Y1Uo- zQr|b8{7$-P;j#c+_6`cZ9D=vMuZdHj%5e2?nq*Q9)< zR${;fzU}mt`sdXZ zn>EccD@%O`XfFDb160_z6xMj6f#Ep=*e1j4YyFz_RUvphe;nQct6rCLlz*G&lTf37 zs&!P>IsWZ5W!PN*OlxxA1^%VhDg7Stth8bU%l-SzOUhRHCra*z%x6nB_#f4-3~km| zTR9c6z;=3mKyBbGZBG3NI!pU|ejUvg&V^Es%cLG3)m|AqMq8!%D;EX0Jzg8wtuN?z zg>SchxaU2Ay~f9Z*C1zQ?OTCu*1W{~fdkYJwRV6ukA0l=sdX?Qq zE5e72&x-#X*lxYnd#$z2S|2|gsPmLo{xiU(TjkX(t2Zp*xw>ySc!2uku(W4zM$qIr zs-iI1WD_!EdaszPp2mtZxet)_Iq|PLGxU24Nmy3$4>DF7P(t z)ZoqFZu2`XyZL3-d(h;u`h!8u+nlpUdbz&`{oZ$mcZd$Fyncgs%){Pa4=x0}p6eVXsjx=kRruU=U^T9swZH*5MeX3h8B zP%=JirT5-`CuVK)Y)PDw#VxT{R@nPV>dh@F%--q^lon>cE;iZf{kUX6_BQX^g(I>{rFH;d zIaxET?dJUh#%RMlO}%P!4p1&;EZfbcy@uq3Jwt{x<}~V0;wFCBbJEb+pyZ=OVc&;^ z3vzhQ(3;bvkFL8Mn*60k!(39lv0HK;HQ&zJo>QvNP*%!$ z2H|0axXYuTT=qP|BLNT4r5O9rrv*1_{d~)^-_5D>O|1A3^qa$*wN2V<<=0`>baT(m znqQli`>&isbX<*@>-X{+;h@%Bo}YVA``TZW+vporRF(U*-lwE4_mG~88$^dNvu((o z;Oh@-H2KaLcuX!vfA~WaYF4AEJ{z;>slNOC44)~Tp4+6Yip>VBhqg0)+q?^NL2p=? zTk5%|WNB`lc4IIf{|@>^<)3OZeSbo%j(-Vg3*a$;A=*M$0NzIHa(#3+ZODz_JG>h~ z`90kN%6^1>*eAOY^v@(bN4o>Dt@_=Nuv*^&`eph?z^epa4H%-$61!DmZx{MDfxnX2 zrx6>WXN9s`;7fqD_)zMNfKmEYUM+4HJ_J}!zXwdvdw>J!YrvxfjuCi*&`+grK|fO{ zvji@ny!=|c@irp=8SJ9om}_YNqPt^!Z|uh0G1^-CUBMVFsP!q_uieP8I_F!WbNE)B z`9BZ}8NZ};`C|-DHN$8DeU^mVCA>z$TO@p|gm*~z842%~@COpci%BeBV7Vze2y8ch zNqh3wNcdKX{lHvHLkmAJe?nUe4bQFgaA7%MqG$}@FN$UX7WY^Kcw>)S0mD6acv$mi zJS_hMfn@!X@?wU?lyZS%1g;TytH5Ujejw2B3a7v^0%r+aBk)#%&j|cLAim(wk_C0=Edmeo3drwn%tK-dCXS zmvBkG@CY0g`!n+k+#+y?!2JR#&aou|M->XEz%2rI2;47_iiA_(j-DLeFK|>ZNhPpd z;1+>96up#V+Xe0yNM#~N;3$DJ1U`<|G)y~NyI5PVJ)_m=Pv~=v{YH-2!>l)FdfGj| z^*rY}!J1<|V*SbbtCjB^<2})PiuV%lF7G~Xj&G=MmhZ>D2Yt`@g8qoV$Y1Io>>ua9 z-T$+|&VUx|6Ffh-Ja}>Nvfy*U7lV6)hk}0z`a^?4r-kkh?F+@Ssy4%!gJwZZ~HE4uWPnzJZTV8Q}}}QNUq{ z*Xcogzf#A)Rb2?kHo`FrGPnFIbc|;L^f>76eTZ{ef?ti+jbhuM6kUyGNjXD>Quh7x%h6)E7QxHheD|cf!N?dVLrk7)H&8 zF;eAW4=;{UHjX>maomBA(7*9TZ`Wv_-(`Q_gYGOR~u^u^{1_{em~uz-9kO|W4yia zyA0vA_+5qHRQ(n@8^53E9{*H*k@g$>F4HCk#v7i{*~XgCOygIfhmDHtNAdd&esS}H zoQI9gIgjG^8~Obv2ZlWQ#F-1`oHXZx$;tT(n@5~GeR|yhI(o#g>C*>HM__ESvAKEv zd5h1Om*m$4CnXoopS5!I@@31Ci-lR3M$DQ%eeC?^B@1V+9J6p{bMq02b#*L{1xsM! z%yZ`~JT;kGHg5UiSm&|EiHhRwNaWiKvOQtw)#nr7~L()lya$wBN zg|n6~oVjdHXTs)j$WNJ23z&&Z^%1NpDv*t`rig<_0_C9$D z*Gu!HnagI)bI9ZVpZ3l@Hm>W=?`KA$IHE_iIFi=!uI!!cMvb+$8A+D>s_m8(^_VRw z$|5C|yAEbAXD-Q!X6BCXoe{;P0XS0fNB>BH05z}y7HIoNfCgxa=8r{Npg}i918j;- z(FGcy3)DagZ2ADQZ4ER)Q`FslzQ1$tJSfU`9=mAKQsT^cpWpet&+nXj*=X12y4{$C zHSUJjgKZ-lqb!B3DBfZ1wL77$m@<$tpCTfPF9L4V8q{f^8(~n}3f7z99E08s8cn4Q z2vFd;%Ldt7w3io{%5!A(O4tr#7P}O-dnv@5VYhm*7q4`KO;A@4@1^Ac=V2aM@R$^w z&7^?DzSyXyEzTE%|qBmZ)n*Di#E)Ojd@ZzWzCdnIh z>$xA*tVTNFx6Zn2y{7R5$;zd65AG3%D7PHf!#J#u6|RKcE-LD3(5_pfg>XZnzaAv& za-HUl8oWVz&J+%bi&49a2x$djOn!BX0hYI6A~M;Oh%mXUL9)dRq!!|+Q;)XWVzNuk zP%^02aC3dR-P~DhB+6f0`NV5NP&29p%|rxfRjW)CG@Cp7;pW^Pd*^6!gKDgggdu_ zW)EG^h=1#xTWA<=gLsF`tx)=JpV7{~@bC<*iBfT1rJaIHel^~ybeG!#p4?{Rv#lsi z3%L~SzXB@uu3&Ew2!28M1<1Ws!tnWrM*u=f(Ij#AI=^tquSe^GhSL4P*k_P^iWv6- z)~P*MfF}Y ze8Wklt_Cq*CNFb)3+CNwc(2=w!*dHR#umkQF@;eqYr!i8ZiR6Y&dyaFFBotr?4_VX z;$qb5-1zm|?yh*LT6J@A7`Q+m*YPTr+u_Pq1Rq=sqy*?D^D60f>*@DUWvW&t15vgX z+au}tGuvr)b}4AISA%s&(I9;zY(_yHo#C$bHj~8$-$C4p+6eW!YbCWPZjumop}d1P zuV4k09P)!91B0W|n*X}gu2T@BCsb(sqr_+U#X7hf;YKfP&S4!JHMg>pbi>x{#i-dt zcw~NO&8Sf|m(;>8-}P`K=ry|wVN%N`)7VQv8xvPw-2!R#N}Zvb)oP>N=r)4ppirb+ zpx$+Y9WB+()$4A)*J#$kRu!BYA-u~cUAr2IYF44HYM^ha$htCOdwnssCEgcrAh zHYm(Wv4BytCnD^rfI2udY2(!FB!hg=Z6q5FhUtd)yhCKko9&u;M|F1<0)+8JJn1{M zss&neb)#oFVfRv7s0T?RRwMD5D`9t#X5c}(o;3*LIEt6sm+_KkUN{7$1YyqQ2vfF5di3BJuz8>@vk|2B|#)*@EWjR{3ccOTtP{1$5 z(nU52))@1L@Y9$1qHSMXtt42CM%|g+$TI4CJxX9#XcRU*l<0;*+9>UAG+I8fEy6oQ z%iX}>i)~x_#!O$u&~I!cqAyIn8d54YbvL3OpI-f}Sb8CBBERwFD1zoRuP!Miyg=bz ztIbS!v%XaD&7uFgTWZtN2MArnk9I3};H?`W+5tE+@7lp4WZ4XWjb)q#w^EB6>!I*? zFKkDht%!`A6Z5{EAsmYNoXQ6oUlrUNsmd}YJO(l9fNdJQhsvm~pmUKbS4pzsu%4B9 z(a3VZJ7_W}gR|+Z6<69x*D|lY@j{iKMwVZQ!o=GEp=+)tshq3dwYCo-&=!D#4&z3s zkxeRa$TsldlxK&r1tqaBp?AU1`L)opR~wy9!zXVyIzF))Bf}UG-yWMO>b06;|kE4Hl#5jwQr6QEMftp&_jx875`f?p)J&Eqy?=PTUiCk$-Q_O0Xe{22zn% zd$8WzX6UxPr7=3q@2F%6XE)$`bt~#^Zgp)Jk}2)Q@NU?=9>z74x7v8y_8V;Y0E|3} zu)3w8n~gi6!#GxjSae!5L}hCSUTNQLBn|Qi-R7oMWKOFZNfj*1m%0`$MvNHWG+p8< zC=WKqX?yLFEs5Eqlc;{nkLs>qBEch@#qQ-eYRUDlY#^jIr@PT(ci9T1IK9v9#yoI` zc&JW2(|StMR4T4j&x~#bL1pfNXrRKB`D}!kC@r9FL?muv&vq`gHyiD6wz7l=0p0LP z#>y|Ex%MfRPjUlg028)1_o=V6JH75=xEa)T(pt@G+vqE(O@l%DQw(O`t66CWvb2>! zV#h$ikWjD`qBG3Cn2<{+ffmgECbDYD6jQ>O>BQAY+>7^v0DIId<2{+jnP9Q5A~p=A z&w;x@dNhErf-*7=@`)Ix@+qe9iIgL;nN<_dj73wO=gWivpBl=v3GaGzFRPIGUf%Gn zOdVyJVV87FlMCbRM>e^LUhZbK0~xGh#p-4mf~KDcX;|&WSS#7A48pNE21;c|TUflP zG_vuqVy}2J_i)9fKw~dKy`A};Z1_D^VGbRH*p4-VXSZcIogB{<_CBQIU^{h(9ejoB zA=;UDYUz}MBQiPb#WVD#icXkce9i=qdL3he+sW=&36}S8oQLY5ohXiE%c{x=K<$ui z4N~TaKtlFxh;Vz;*T440*=iMaPt!|s!picM6fW{D=$vYnVHvJw*jjJytTwvDfd)-0Y-a-SXOJxsCPK1?wS!JEj#Mj% z?+mNFO}ZQ-j(7+o6&|24zS^kQ!}hSlrF%pG5+re0lnoEpZ8SD}0J3kj9PqedF|uJ_ zk09&8W+J%f4f3!)8=F8#y;ti#TyZh#?8FUh#eP*Nh4#*{BGtgAEV_;LMib>YtYwe! zW-si8+GzNM#Mu;#DKlIppOH?0>^`GSO{#{Z&wb%t?aHK)VXV6_UW8Sug$r_?l7@WU zN}`wwRdY>D`~dxfVpyngw^8rm_jPv$rMQK@7t<30)KucKGy%7EC)LO*gfA{P;v|im`i9=wR_)wo=mkcZG4%N9ReS?meVsv-&d}uDXO$3) zLF#SSYmJSZCP0h9P8eI+5Q~|?QZYKuFzBuld?OBh=`KE%D!j9%keqV!Ol|eb)cGCQ zGH*?QYRQJ7W+D0gfgqaro&0DH=+OKpvI?3l(xmOMeW()Wrgf~ zn2umV(p5Zvq(%mEZ~0X$!)MvE1#HjiHpb<~z4JeXxwOfz%-Ro&gU+|JDr_*;sjmAJ8?3u;u7~dbDd6zfKmb>lZNe4!=SB#)Jmla zXZDulKC+rhGLIov8@6Vk23y~(rv{E4IaVOcAof|1A4FuO29}&xy)d*oBh|!k*@>c(Btp z@^gaqDh$xw3Y%FWhblKY*g=(Mdug0}kh9;w@;@wIv0o*#UQtLjNh`e`McTw`RrsN) zXw5+D?gO`m#|>Y`5`dj-n7zdD9ThhlJyXhpYrb|a4PmA$^M#lkcF=6PcdG1}*+Q9M z`WPB5wp_1qyHV$xmEh?N)4@HT-o)e)LZSs5OtEK!BsPvCFg(L6Y~#1tyj!WCh*$yB ziR|fahV!r5ok1MaPSms?(8j=V*y-JAPiQMcnm8&jU544TqFT^ijNm5AD9)?C+flDs zx3G_efE536+M0Sz((Bfv$aIOEXDeH>1B|AHg|f6am$J;rX)9>D)kbGUaR5>xf_AW@ z-m|N*hfAv6s7e%DxTysRMw!@Rcu(INC{3E z>Z#|SwTit#&9W;^q6S0_J$I)%7Oo3oMqhv?y(`b9L73l0h;-MNNQ75YCcrx zBdLZg+gy9QU`k$lVUO7ji7~-)+*nS2RNU23>0-E{aCRaQ0Ft1-gFszl&zKg-&p?%< zP83;8!&yUxq$(7gk8+I{!$R}B#Tc=obtc)Db zxrInub;PUJWGkuULNpJ;BqipOxMgB7`1cDKf`!;>Qb|aI2AC5$6GX0J9m4r32uwR- z798c;Iov!aGnB9`Xr=bSDNv}rTGWz^q1V$4^ZJy60aAx!n^i0*Mmsz07Le9N%Syw? z3W~T`AIKIiv^bn#g&bdv=vI0y6!1#ZqHbG_&V1P24jD?uEi|WOcutRc^5t`>qdqvn zSB)CCwM7Fa1u#rs4EWIJh~h`vL=%EaEo$Q})q;+t8p?V~|=wd#5aFh5P_2Lx9e$(9^;D#;VrlY&bN zBwT4yTgWsi+KTMzVs21{z;&ASR`wEcYs}lwC6tY=*l|WT94*dVlW-$FF%dC`=O=y( zJ9^QCqhM5Jyfap|8YH;77Dg0IQHNl!4>`ya7xP;D!PW~(h6P$l7PrQyjRM@`cF&tR z9VD#uIvwI?oK@S&g&*8wJB{4KK%A?K?QN^?LwhE1?5m0LxkWsRwnJHl9cEhI@B$Fl zg*XdsYtJX_`5PHdzJi^$Wr2oK#bliX^e}qsye+UA^VsZAfCD5#z8%dm<`xXjzlDp{ zh!bCw6T3l@S0kiC5mAd1pv6gD;kDtIL9;fM_C|z_BWgO5M+VzFEyCf>T#cO>1I z?Y$0UD2ltP@+W(XjrQB_HWYO$I2^HS5&j5cXP$Uv;abmfx7p5AZ?nOmMwm#GMmFSW z$&UJBqD+eFN{hkz(3}mRNbm6$aR?}r$@V-p-C1pMdeP{xL661L^2TDn3-ig;&GQ*U zAFa?!y3ym&36k-R#){0GjFsphB^fL6Ti3m1UgwOLF2ud`irLrzilps~m53G2Of)r3LlJ)*%0gUQo8=EaAoaA^(q?)qFv&thi@`*yvt^i^XSabYTHJf z3WBuxgbC7YYHT?zP`ObjGuLT04eq+kt}G!)i$wj|dPt@%@;j&;EyElVW9C-gPSy(N zNjDSB{qt8@9_6ywZgoGW#aHa-w)mQd92Z}lNI@~PsStUen|6%D0iH_J{a%{Wf!w&( zN-NOaFnyZARmK~{G7{Ip7AjtDTd1hz{cZSqze4fuD7mYOzg~o27{#JJCX!@2G)$na zDk_QgFe6?w%&*gZiI?9El9T}YV;a0B)zK(T)p~K7!n0JBNs#s^mr*#Jefr+Zsr$)t zI^3A?)=925njQbbv=`7SDHS)zp)pA?5gah9zXm`P^$xf%6Zs`lia zz3~Qj8M;dO;OHxAcBH{mT^Fc@Y31PPMviYT*Tm+S29z1Oo1gO?VQQMl~!TnIM7+Ob%em zLPX}GMV<6a`JrkbCuc~1Qcb;`juXR84}}x2M>y%zVOulp2Y~S#Y;G5I~kmn^>v~NJbef-b18UwBw zQ9~J{j25YzHYz~x-E^4e1MaOGPt2tkUEK?()NvSUBpFfA##|p-pP1Z?46v;oC)YFlxK-T? zuz}NZPHrS<-0>RJWV=4wGG7l86o%h{4GWSU_d1efqleQ=Jt!M+vt)s7AE6n$@z0*h zF7~=gt3$9h!8o@0!g;Ri%20zdOv|U1!UA1>50H4zVB~NIU)T;u5<={RsubFnG$8PH z7LoXP4GPNk+KLaxG!O}{^oWe28oE8>WDZH4XHZF}${meyFRPj#8M6Yo*OiL6!Rir2_P{%D_C(%q@$qKt~Zv zI4eS@DaU0U;>dl`vA91TW?jms_lw{ifwK?9@^}=DXc5rj$_5z$ zRw1D2jRi9Jwr(WYDKc(yhmc~E!+4*!3s~%(xrT+yc^BX09x!5c={~%SsjZMSn0@Qz$rIX_FF^_q+z!BkM~+TK;g*mYNp7 zgB_r@R+$-8@(L!0FSF-nQn_$LtW3^$9pJ|+P~i`kX^k9%=$rMZ?L#uOD#ZA-XHrpZbpD$pG#fI6FXO8RlZq$a@iXi0S6q9v<$~=>`j4i&!!%%lx)M z@tG7880e9p16DrXVWsAs_)P^_?#sYdK7=Hqrzu=9ls#c3Z=>;eHZLiptDsY83%E)rMxtyhu zzc5St`wv-89yQSxf7r|#2GOX@d(5ijp2T;}YtM>UPIjFmD-siA=__%go@5!iXGhwe zj)=~%j)V2UADU!kC;%U9<_w&jVHR+QknjgZ{_y5ft3z6o&WAydq<$vn9d|gLdp_XV z>!yo%hpqCLNfD)TTlU@H@3L(2B=0ugA?5D$hqs=y@!U+)1-z@G>u&OCGo9F5GVcK8 zaSz7=t-JiXC&uR&RQjkmZCq@38gnnru#27gifHh-^a9%v&*++yw~FQ7c* z+|I94vd*)~#IjJ2T2GaCDz-^CXzAB_i|@qp!b8Fn&#%%WqBZ+HARv528ikxfGsnC& zN;;Iyfxo+ybJ|A9Gdyu!<|*s4%bhB_4ayrp;!8rqXA6kSmeRPnPwj2R`3s|#={ZWF zvipp!Blq#!HloJF64_XyTIBBVEPaPkce(=9Ww7R{8QNGK>OvdSuehw1zk1Q&)?6F> z)7tBMdb(rR=qE~+88vkG)bE$Cj?B2iydE2BWi&sX(PJF1D?nZY&Ww^Fe7JwhQT&dy z{?z`hSAfRzf+#xD{#oDtGV2o+1lxF9abJVp@YgBdc9qq{Mjalhp+>wnG9nOgvzRu* zm&RLy0;AZNW5g~sE#nRMsnNL~-ENs#mgwc49Bnh&*ZuM;a5Zes(Kg}+@w+f>ZKAVGG~Qie zr3DL&bJWg~x&-@n08+v_B>k(_Q)P2T)=UgO$4e13ssP;p6<(pK_2+n1LRO>EGA8nM z7p#uwerz-$&!a@-^k^2t`L-|8);-xXc!nxP#1cZ>3H8Vn&7ichKSI625Q!e{Q|4tG zJw}vj9wE(buN<$Wq?c+OGW&-q$yrpR6j0XNkM$}l&>c99auJk~;dY!YL>H|XGjt-O z<0$L6$uh62fSsTBYSWJ*{AU;_8&gUp4absV+%k&ufQaGXj;&VI6jLT6W+H3pRiS&G zU<*CBS^f54j4GU>p2B{Wc|7ejT9vkKJ|!5e;mXg_yUGZHjlan8!v5oI0|U>4(Mput zGxsAP|DZl2Gyc+&tt5no*KMs{m}UIksYln1jBx7Wh{(^8-Ud%NeMr)f2i>PWN~@7k zpIl(IQnH%^ZcHiltBAm)w&a3iI^HLJYM2(TWl!`OF5vZk{;yLUhEhHHc>dq^> zp&AwaCEqod`%6FB$eI4}d;&k8mduOR;v%WL4Zby})M>_RWy#M|nG+!`BFHlLLbbV% zt5y;s#Vt9~7;@E!6jDn6!)oz5zb+WUoGJYqv=lcF74MvlGG}g#3}q%~nVe*J)97+- zhEj){^H?U0NZ4aTE#n^dqiTiXV7Yu_&e==S=^5t<%d4~;&N$THqq>0={c;&oDGA(< zZ-r&ySgY{Pp4=p9p^nWqifQ+3*(Dimt&#f{q^@7tI43ifr_JPM z?%DYKl1&+G8B{qJ-l!!YR{--AV*>JO%@29ac=jTgSN;yVC&E)$Auk(F3z7%(Fi6pl@aUK6%4?#HOC)k_gp19N`57o9&eH- zFYA(58~wn7b3g<}`O}&10FWJcf#37|USPBPDs&f(Mm3_hUGC$rf@@g>IrG=kZ)vcY zO|Z7Q?kTm8=iSzrK^}*9es1J{(OfaV|(%QJCD5z(!18ru(-_i z8dWNpnevYGGt48lYJrv(-`+vixUub-M}5HX@G;nl~06W4YH~HQ~Jjj;`^$ zJs@a;GR|BC3E>@9CAZD5LljJiEWFCPy~3Bdl0XXQ!hq5;=5hkO%7fuQDW;Pu5=A_# zXHkdIaotPf!tdEq&YzDbWy0toT4W?SKtyBs%MznXYv$^Va)3lNVZ-QN*$-mLilRQFv-`D-taV=;J-X*$ zwU1Poho=t1saIhQL; z@G)~j$!UG$5Ajjj{o-UfpPQc9{gS@PPSZYLI8oaDI=QbLEW2YG;iO95QOV)5v&v&` zqU=h$Uwy26z`8v}-?UqQCT-oHDO%eTGyO}sQcsz8a%tx9QT++@r`>e^;8dP=JJy#N^j;1r9%3BT#G2(JT!SQ&(Fa_GyShVcA^w8XsA{btl{Lx zK6W&(6}*{$nl}?>wMtJ+snJM><5qI~_|ZI*XFaB8`rqLH;mL_ofl2r{R4A15`D5z`st~SRfPLx{Um8GmrOyy>FfBO)4DHe+plVImhz~J;j2jU-_oD|^s z((Zft{Gt4W%jHXJ2M?9{|5zX2)W^5@*!{Lg>wBfOQvch!sayh57gMr1Pczzsn1m zHkOci%t2#-7BSx~PEHwk_Hl>-ZsvH!Fl{Ue$sL2Q@e0=I>FL960@w@rVnI;rDTY=I(!*Hun!7aR&kU6j?IGCnk>= zr2P{BG!0#zoSqhF=?o_d;CSZ#448C`d}3Ndh{3I3=KfRDyeL+kNb=t%dy=Las6dbV zr&zN3JpUNePAh-^`Mg0BYQ)|5rYD>$-G3#;`Tf^tw1oSwLzT4@FcYHtmx_}I^7#`p zyMGAuPcimP|9Qrqc85R_=|Z7&e+hOi-G6i19RN|FiDK1cou(yz{nJ@i@Ri z6VR!&MiL&)7vGwErnLKSQW5s+9DGU#(9jy^O}2f{k)+T7gK9uQRq9_5$+DkA?f|@F zlxi8k_urFK9VPWgFSOj#s30Pxu4kpitNtn_rY zN>Tbt5|*c?Pfkt&k;w3_pJ4Z0k~GhQ`vJ+`^(?*nuJ{4$dA|Iz#(C!;D&%-!@?fEe z082d=Ayc6^2`{2xiiZGZ`e}EVl?jEV-mx@gOHQ@zV?sMx;7yit_Glgr)qmYqAlynx z(l=d^^>|uJ<@hJu^9HyNT!o4ZAqcEyqd50pDKPuCeZc3*XZJgglC?(Fv&g8sq!g@@z z^wRxrO;1h2H(8fA-2aXj76TpRuN5Q(|1)2zq>NW7p1@`dNSdO< z3`VI^Je-YP)X>Gr$%!Ir&npU3-qMIijvUd7-$ihXe4&L3MT#L%dGaxD`TTT9P(`$7 z5;zffJr{^Q2jEDA}Y})G6c@d`>Iv>VAeQ<&X3ZX) zJq#QVE=YK7nEPLTtZaxvDCq|_B%g(29yrKr2$b9vHYb0r)Gv56qiaR_-FF8DrI9aW zwxu=GZ`thTo=KAwtfj$Z9a7cHAaIxInvoWnwP`%zP%8Jo452Y74=!cHH>OM-%8IqJ zwyjjN0Fclq6_o<0giS)iulrZZ3Yli_Q~p``C2&wrnWPvu3y68UK< zqX!M#puChRN!YYtgzxv!6EF_ERFKXrh5(?}u?v zzJ0U&_%Hn@HR3cM#e&!t`L%_Ae!>C$8t_b;Zkk3nfr#npNq10KK8bN~Pd!Z#EO!!L z6*#9^6J+14x`dk{0_M4s@wMLlev>JS)Yo zM&RMWA8GXO+5YDDu;5Tu9<5nhkoe#S$3>shnPz#)pf{Vj`$aLG4R5on!mnKmMm;=p(K;z$!IO_-xgW`RHQ6^*{ zsmd=*utvWWzs4hULqcr~?OhG==cnC-$FX-(aMkD}oR=zQw`OSig&AX)6yLuuG1rfQ ziwtV50Ly>;dnr@fZ)^75FV1{H8VQCG*M8XG6 zzJRi(sNZ`W@56XDW!+2Vb8|c}IONs6SI_%>L2BKm6=lx1K!z{lAVY zSDxeJZ_gdf6Qv-RsD}-yiGqDgV>IBhJnuTdtMFx zxdxK0hPo*DujAU)Q?^!g6JloV$9|BXmXz%Nh-e4e zWB13$oi|LoKOQNR7hvNP$q{EE2=7S~pobVn{=T=NM+=iohpetKEiUHw;Fl89Qf*pz z?WprMBSnn?#BkgK(DVfjqh0M<%Ey(WFEH3D6xzP@F#2|+WcPdOr`cGh2_DmuuN2b` z8pXHQ(EQyMzm^J8S?UL-B`S)%fGs|?36R9e{Uj^T5{00iOmje4nM!Gvf?_fpOQF(f%U(+u%qRhcjdFR?h*?(8Sa*P$tSP{$-~t6X;rrSl|s&82l;tAhhkXG|AHQa=Rx4XI|l4k5lN1AlTse;V>x$h}%z7XU^%QDCa&=JNNRr3un&0^88C1XV#xTf8oXY^Dkcr zUU>feORv<<2Iqp8Up~WW%~H;toV|8wb@1l5=k#PK&w0Im_x$Wjv*!SE`uLzyFF54Z zub!AVu3qIqP1#ys%(*v)uXCCmUa_`2$a^1-dUpJE=l;d{?nB1d`vBF$gK!r0mvinf zj=(W?`FL<4_t|~__=No#19vOu-W(a=1D;cSHhZ#4&o1h1Q1%!>`d+4I$Nz4EyZ=-yo_8iaSLWHk=gJxC&&=At=gJp(riRzCzupde-8g7ISH9j`=K&oqO|R<3Vz0M( z)yd;}1HqkYpjT??GC1y#Tl0_i>H_U^F4Qi(c=nYS&WC4Se&wog&dp?d`tN5!_Mat? z&izKt-4vwh;||%kf9&CB0oysYNssA)u=F)vjz5m>>L?a_#A$Yvhkwot``(S>~ zgg(0Wt#i)x_#2sC6Y25zpYwdbkUq`M$a+FFdqnrZ)NLvi|4qLx6lpGZ~F&n-a>i5#bfmz@G*9t<13ci>A2heaJkxD<@c}RJT-|MWIs(^ z>~Xi;3Kw{9xl3G7UEvzlGPgSPEXp2KbQGyi8;5(yqh+XZfJB^w^qc9bD6~%w#LiK?rW^& z9FU#UH8p;IjZsF&@f55xu5SFq-1*_cZTfS|*07w;Axvlu8BUe+82?Gva@A;~OLe-X zr00CPBbfQ90se1qa KPXCu<;C}-^88<8d literal 0 HcmV?d00001 diff --git a/1.5/Defs/JobDefs/Jobs_Whoring.xml b/1.5/Defs/JobDefs/Jobs_Whoring.xml new file mode 100644 index 0000000..60eedda --- /dev/null +++ b/1.5/Defs/JobDefs/Jobs_Whoring.xml @@ -0,0 +1,17 @@ + + + + + WhoreIsServingVisitors + rjwwhoring.JobDriver_WhoreIsServingVisitors + servicing TargetA. + false + + + + WhoreInvitingVisitors + rjwwhoring.JobDriver_WhoreInvitingVisitors + soliciting TargetA. + false + + \ No newline at end of file diff --git a/1.5/Defs/RecordDefs/Records.xml b/1.5/Defs/RecordDefs/Records.xml new file mode 100644 index 0000000..f94897f --- /dev/null +++ b/1.5/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.5/Defs/Rooms/RoomRoles.xml b/1.5/Defs/Rooms/RoomRoles.xml new file mode 100644 index 0000000..855f0bd --- /dev/null +++ b/1.5/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.5/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml b/1.5/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml new file mode 100644 index 0000000..8af3edf --- /dev/null +++ b/1.5/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml @@ -0,0 +1,22 @@ + + + + + PrisonerWhoreSexualEmergencyTree + Humanlike_PostDuty + 100 + + +
  • + +
  • + +
  • + +
  • +
    + + +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml b/1.5/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml new file mode 100644 index 0000000..def7e6b --- /dev/null +++ b/1.5/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.5/Defs/ThoughtDefs/Thoughts_Whore.xml b/1.5/Defs/ThoughtDefs/Thoughts_Whore.xml new file mode 100644 index 0000000..0bbd196 --- /dev/null +++ b/1.5/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.5/Defs/TipSetDefs/Tips.xml b/1.5/Defs/TipSetDefs/Tips.xml new file mode 100644 index 0000000..4f36f27 --- /dev/null +++ b/1.5/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.5/Defs/WhoreBackstories.xml b/1.5/Defs/WhoreBackstories.xml new file mode 100644 index 0000000..329d45c --- /dev/null +++ b/1.5/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.5/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml b/1.5/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml new file mode 100644 index 0000000..d6fe0fb --- /dev/null +++ b/1.5/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml @@ -0,0 +1,59 @@ + + + + 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 + + + RJW_WhoringPolicy + Trade sex for benefits + + rjwwhoring.MainTab.PawnColumnWorker_WhoringPolicy + 100 + + diff --git a/1.5/Defs/WhoringTab/PawnTableDefs.xml b/1.5/Defs/WhoringTab/PawnTableDefs.xml new file mode 100644 index 0000000..af172f9 --- /dev/null +++ b/1.5/Defs/WhoringTab/PawnTableDefs.xml @@ -0,0 +1,34 @@ + + + + + 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
  • +
  • RJW_WhoringPolicy
  • +
  • RemainingSpace
  • +
    + +
  • + +
  • +
    +
    + +
    diff --git a/1.5/Languages/English/Keyed/Whoring.xml b/1.5/Languages/English/Keyed/Whoring.xml new file mode 100644 index 0000000..e86e4f0 --- /dev/null +++ b/1.5/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.5/Patches/FacialAnimation_compatibility.xml b/1.5/Patches/FacialAnimation_compatibility.xml new file mode 100644 index 0000000..8cae3d9 --- /dev/null +++ b/1.5/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.5/Source/Mod/Data/BedData.cs b/1.5/Source/Mod/Data/BedData.cs new file mode 100644 index 0000000..5d6a1ff --- /dev/null +++ b/1.5/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.5/Source/Mod/Data/DataStore.cs b/1.5/Source/Mod/Data/DataStore.cs new file mode 100644 index 0000000..8241197 --- /dev/null +++ b/1.5/Source/Mod/Data/DataStore.cs @@ -0,0 +1,70 @@ +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 Dictionary whoringData = 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); + whoringData.RemoveAll(item => item.Value == null || !item.Value.IsValid); + } + + base.ExposeData(); + Scribe_Collections.Look(ref bedData, "BedData", LookMode.Value, LookMode.Deep); + Scribe_Collections.Look(ref whoringData, "WhoringData", LookMode.Value, LookMode.Deep); + if (Scribe.mode == LoadSaveMode.LoadingVars) + { + if (bedData == null) bedData = new Dictionary(); + if (whoringData == null) whoringData = 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; + } + + public WhoringData GetWhoringData(Pawn pawn) + { + WhoringData res; + var filled = whoringData.TryGetValue(pawn.thingIDNumber, out res); + if ((res == null) || (!res.IsValid)) + { + if (filled) + { + whoringData.Remove(pawn.thingIDNumber); + } + res = new WhoringData(pawn); + whoringData.Add(pawn.thingIDNumber, res); + } + return res; + } + } +} \ No newline at end of file diff --git a/1.5/Source/Mod/Data/PawnExtensions.cs b/1.5/Source/Mod/Data/PawnExtensions.cs new file mode 100644 index 0000000..479ca2e --- /dev/null +++ b/1.5/Source/Mod/Data/PawnExtensions.cs @@ -0,0 +1,17 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Verse; + +namespace rjwwhoring +{ + public static class PawnExtensions + { + public static WhoringData WhoringData(this Pawn pawn) + { + return WhoringBase.DataStore.GetWhoringData(pawn); + } + } +} diff --git a/1.5/Source/Mod/Data/StringListDef.cs b/1.5/Source/Mod/Data/StringListDef.cs new file mode 100644 index 0000000..541b00c --- /dev/null +++ b/1.5/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.5/Source/Mod/Data/WhoringData.cs b/1.5/Source/Mod/Data/WhoringData.cs new file mode 100644 index 0000000..b113bb6 --- /dev/null +++ b/1.5/Source/Mod/Data/WhoringData.cs @@ -0,0 +1,36 @@ +using System; +using Verse; +using System.Linq; +using RimWorld; +using static rjw.xxx; +using System.Collections.ObjectModel; + +namespace rjwwhoring +{ + public class WhoringData : IExposable + { + public Pawn pawn; + public bool allowedForWhoringOwner = true; + public bool allowedForWhoringAll = false; + public int reservedForPawnID = 0; + + public WhoringType WhoringPolicy = WhoringType.Silver; + public enum WhoringType { Silver, Goodwill }; + + public WhoringData() { } + public WhoringData(Pawn pawn) + { + this.pawn = pawn; + } + + public void ExposeData() + { + Scribe_References.Look(ref pawn, "pawn"); + Scribe_Values.Look(ref WhoringPolicy, "WhoringPolicy", WhoringType.Silver, true); + Scribe_Values.Look(ref allowedForWhoringOwner, "allowedForWhoringOwner", true, true); + Scribe_Values.Look(ref allowedForWhoringAll, "allowedForWhoringAll", false, true); + } + + public bool IsValid { get { return pawn != null; } } + } +} diff --git a/1.5/Source/Mod/DefOf/RecordDefDefOf.cs b/1.5/Source/Mod/DefOf/RecordDefDefOf.cs new file mode 100644 index 0000000..0a13f1f --- /dev/null +++ b/1.5/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.5/Source/Mod/DefOf/ThoughtDefOf.cs b/1.5/Source/Mod/DefOf/ThoughtDefOf.cs new file mode 100644 index 0000000..b7a2e14 --- /dev/null +++ b/1.5/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.5/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs b/1.5/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs new file mode 100644 index 0000000..bbc6fe0 --- /dev/null +++ b/1.5/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.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.5/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs b/1.5/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs new file mode 100644 index 0000000..5b5683d --- /dev/null +++ b/1.5/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs @@ -0,0 +1,191 @@ +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))) + { + if (pawn.WhoringData().WhoringPolicy == WhoringData.WhoringType.Silver) + { + 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); + } + else + { + int bedTip = 1; + ModLog.Message($"{GetType()}:afterSex toil - {Partner} tried to pay {bedTip} goodwill to {pawn}"); + WhoringHelper.PayRespectToWhore(Partner, bedTip, pawn); + } + } + + 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.5/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs b/1.5/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs new file mode 100644 index 0000000..a81d6c7 --- /dev/null +++ b/1.5/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs @@ -0,0 +1,300 @@ +using System.Collections.Generic; +using System.Linq; +using HugsLib.Utils; +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; + } + + public static Thought_Memory GetMemory(Pawn pawn, Pawn target, ThoughtDef thought) + { + Thought_Memory val = pawn.needs.mood.thoughts.memories.Memories.Find( + (Thought_Memory x) => + { + if (x.def != thought) + return false; + + if (x.otherPawn == null || x.otherPawn != target) + return false; + + return true; + } + ); + return val; + } + + //[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.IsSingleOrPartnersNotHere(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.IsColonist || x.guest?.GuestStatus == GuestStatus.Guest) + && 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()}"); + //if (WhoringBase.DebugWhoring) ModLog.Message($" FindAttractivePawn number of all potential clients {potentialClients.ListElements()}"); + + 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()}"); + //if (WhoringBase.DebugWhoring) ModLog.Message($" number of reachable clients {valid_targets.ListElements()}"); + + + //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()}"); + + List guestsSpawned = new List(); + + foreach(Pawn x in valid_targets) + { + bool canAfford = WhoringHelper.CanAfford(x, whore, priceOfWhore); + Thought_Memory refusedMmeory = GetMemory(x, whore, ThoughtDef.Named("RJWFailedSolicitation")); + bool refused = refusedMmeory != null; + DirectPawnRelation relationship = LovePartnerRelationUtility.ExistingLoveRealtionshipBetween(whore, x); + bool relation = relationship != null; + bool differentFaction = x.Faction != whore.Faction; + + bool finalResult = canAfford && !refused && !relation && differentFaction; + + if (WhoringBase.DebugWhoring) + { + ModLog.Message($"Pawn {x.Name} is an {(finalResult ? "acceptable" : "unacceptable")} client for {whore.Name}. Explanation: canAfford {canAfford.ToString()} refused: {refused.ToString()} relation: {relation.ToString()} differentFaction: {differentFaction.ToString()}"); + } + + if (canAfford && !refused && !relation && differentFaction) + guestsSpawned.Add(x); + + } + + + 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.5/Source/Mod/Location/Brothel_Room.cs b/1.5/Source/Mod/Location/Brothel_Room.cs new file mode 100644 index 0000000..27921c3 --- /dev/null +++ b/1.5/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.5/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs b/1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs new file mode 100644 index 0000000..0239322 --- /dev/null +++ b/1.5/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.5/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs b/1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs new file mode 100644 index 0000000..fcfa9d5 --- /dev/null +++ b/1.5/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.5/Source/Mod/Thoughts/ThoughtWorker_Whore.cs b/1.5/Source/Mod/Thoughts/ThoughtWorker_Whore.cs new file mode 100644 index 0000000..cbe88f9 --- /dev/null +++ b/1.5/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.5/Source/Mod/Whoring.csproj b/1.5/Source/Mod/Whoring.csproj new file mode 100644 index 0000000..6480a0f --- /dev/null +++ b/1.5/Source/Mod/Whoring.csproj @@ -0,0 +1,116 @@ + + + + + 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.3.3\lib\net472\0Harmony.dll + False + + + ..\..\..\..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + + + ..\..\..\..\..\..\..\workshop\content\294100\818773962\v1.5\Assemblies\HugsLib.dll + False + + + ..\..\..\..\rjw\1.5\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.5/Source/Mod/WhoringBase.cs b/1.5/Source/Mod/WhoringBase.cs new file mode 100644 index 0000000..0edb576 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs new file mode 100644 index 0000000..72bb337 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs new file mode 100644 index 0000000..8a38a33 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs new file mode 100644 index 0000000..0e4cf05 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs new file mode 100644 index 0000000..3665822 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs new file mode 100644 index 0000000..cf02240 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs new file mode 100644 index 0000000..f4a6f6b --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs new file mode 100644 index 0000000..892a249 --- /dev/null +++ b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs @@ -0,0 +1,70 @@ +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) + { + if (pawn.WhoringData().WhoringPolicy == WhoringData.WhoringType.Silver) + { + min = WhoringHelper.WhoreMinPrice(pawn); + max = WhoringHelper.WhoreMaxPrice(pawn); + } + else + { + min = 1; + max = 1; + } + 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) + { + if (pawn.WhoringData().WhoringPolicy == WhoringData.WhoringType.Silver) + { + 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); + } + else + { + return string.Format("Raise Goodwill by 1"); + } + } + + private int GetValueToCompare(Pawn pawn) + { + return min; + } + } +} diff --git a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs new file mode 100644 index 0000000..f72193f --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs new file mode 100644 index 0000000..c0d85ba --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoringPolicy.cs b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoringPolicy.cs new file mode 100644 index 0000000..392bea7 --- /dev/null +++ b/1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoringPolicy.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace rjwwhoring.MainTab +{ + [StaticConstructorOnStartup] + public class PawnColumnWorker_WhoringPolicy : PawnColumnWorker + { + public override void DoCell(Rect rect, Pawn pawn, PawnTable table) + { + if (pawn.drugs != null) + { + WhoringPolicyUIUtility.DoAssignWhoringPolicyButtons(rect, pawn); + } + } + } +} diff --git a/1.5/Source/Mod/WhoringTab/PawnTable_Whores.cs b/1.5/Source/Mod/WhoringTab/PawnTable_Whores.cs new file mode 100644 index 0000000..3a25bb4 --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/WhoreCheckbox.cs b/1.5/Source/Mod/WhoringTab/WhoreCheckbox.cs new file mode 100644 index 0000000..1f21bdb --- /dev/null +++ b/1.5/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.5/Source/Mod/WhoringTab/WhoringPolicyUIUtility.cs b/1.5/Source/Mod/WhoringTab/WhoringPolicyUIUtility.cs new file mode 100644 index 0000000..a5af8cc --- /dev/null +++ b/1.5/Source/Mod/WhoringTab/WhoringPolicyUIUtility.cs @@ -0,0 +1,45 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; + +namespace rjwwhoring +{ + public static class WhoringPolicyUIUtility + { + //public const string AssigningDrugsTutorHighlightTag = "ButtonAssignDrugs"; + + public static void DoAssignWhoringPolicyButtons(Rect rect, Pawn pawn) + { + int num = Mathf.FloorToInt(rect.width); + float x = rect.x; + Rect rect2 = new Rect(x, rect.y + 2f, num, rect.height - 4f); + string text = pawn.WhoringData().WhoringPolicy.ToStringSafe(); + + Widgets.Dropdown(rect2, pawn, (Pawn p) => p.WhoringData().WhoringPolicy, Button_GenerateMenu, text.Truncate(rect2.width), paintable: true); + //Widgets.Dropdown(rect2, pawn, (Pawn p) => p.drugs.CurrentPolicy, Button_GenerateMenu, text.Truncate(((Rect)(ref rect2)).get_width()), null, pawn.drugs.CurrentPolicy.label, null, delegate + //{ + // PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.DrugPolicies, KnowledgeAmount.Total); + //}, paintable: true); + x += num; + x += 4f; + //UIHighlighter.HighlightOpportunity(rect2, "ButtonAssignDrugs"); + } + + private static IEnumerable> Button_GenerateMenu(Pawn pawn) + { + foreach (WhoringData.WhoringType option in Enum.GetValues(typeof(WhoringData.WhoringType))) + { + yield return new Widgets.DropdownMenuElement + { + option = new FloatMenuOption(option.ToString(), delegate + { + pawn.WhoringData().WhoringPolicy = option; + }), + payload = option + }; + } + } + } +} diff --git a/1.5/Source/Mod/Whoring_Bed_Utilities.cs b/1.5/Source/Mod/Whoring_Bed_Utilities.cs new file mode 100644 index 0000000..74ac8a1 --- /dev/null +++ b/1.5/Source/Mod/Whoring_Bed_Utilities.cs @@ -0,0 +1,381 @@ +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") || + bed.def.defName.Contains("Android") ) + { + 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.def.defName.Contains("Android") || + 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.5/Source/Mod/Whoring_Helper.cs b/1.5/Source/Mod/Whoring_Helper.cs new file mode 100644 index 0000000..e811658 --- /dev/null +++ b/1.5/Source/Mod/Whoring_Helper.cs @@ -0,0 +1,440 @@ +// #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 (whore.WhoringData().WhoringPolicy == WhoringData.WhoringType.Goodwill) 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; + } + + public static int PayRespectToWhore(Pawn targetPawn, int priceOfWhore, Pawn whore) + { + if (targetPawn.Faction == whore.Faction) + { + if (WhoringBase.DebugWhoring) ModLog.Message($" No need to pay respect"); + return 0; + } + targetPawn.Faction.TryAffectGoodwillWith(Faction.OfPlayer, priceOfWhore); + if (WhoringBase.DebugWhoring) ModLog.Message($" price: {priceOfWhore}, paid: {priceOfWhore}"); + + return priceOfWhore; + } + + //[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.5/Source/Mod/harmony_AftersexPatch.cs b/1.5/Source/Mod/harmony_AftersexPatch.cs new file mode 100644 index 0000000..e7accc6 --- /dev/null +++ b/1.5/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.5/Source/Mod/harmony_Building_BedPatches.cs b/1.5/Source/Mod/harmony_Building_BedPatches.cs new file mode 100644 index 0000000..d84a950 --- /dev/null +++ b/1.5/Source/Mod/harmony_Building_BedPatches.cs @@ -0,0 +1,322 @@ +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), Toils_LayDown.ApplyBedThoughts (slept in brothel thought) and RestUtility (don't automatically claim brothel beds) +/// + +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") && + !__instance.def.defName.Contains("Android") && + !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); + } + } + } + + /// + ///Prevents automatic claiming of brothel beds (beds that allow anyone to use for whoring) + ///Note, that intent is not verified here, and this works because bed usage for actual whoring does not rely on IsValidBedFor call. + ///Should above change in future, this patch needs to be removed or adjusted + ///If the bed is already claimed (for example - assigned manually to pawn), it will still be used. + ///Modifies __result to false, if bed is set to allow anyone for whroing AND is not already claimed. + /// + [HarmonyPatch(typeof(RestUtility), nameof(RestUtility.IsValidBedFor))] + public class RestUtility_IsValidBedFor_Patch + { + [HarmonyPostfix] + public static void Postfix(Pawn sleeper, Thing bedThing, ref bool __result) + { + if (!__result) return; + Building_Bed building_Bed = bedThing as Building_Bed; + bool isOwner = sleeper.ownership != null && sleeper.ownership.OwnedBed == bedThing; + if (building_Bed.IsAllowedForWhoringAll() && !isOwner ) __result = false; + + } + + + } + + } +} \ No newline at end of file diff --git a/1.5/Source/Mod/harmony_RJWTab_patch.cs b/1.5/Source/Mod/harmony_RJWTab_patch.cs new file mode 100644 index 0000000..5f32cd0 --- /dev/null +++ b/1.5/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.5/Source/Mod/packages.config b/1.5/Source/Mod/packages.config new file mode 100644 index 0000000..75a6411 --- /dev/null +++ b/1.5/Source/Mod/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/1.5/Source/Properties/AssemblyInfo.cs b/1.5/Source/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7b4716d --- /dev/null +++ b/1.5/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.5/Source/mod.sln b/1.5/Source/mod.sln new file mode 100644 index 0000000..981a536 --- /dev/null +++ b/1.5/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.5/Textures/UI/Commands/AsWhore.png b/1.5/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.5/Textures/UI/Commands/Service_Refuse.png b/1.5/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.5/Textures/UI/Commands/Service_off.png b/1.5/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.5/Textures/UI/Tab/ComfortPrisoner_off.png b/1.5/Textures/UI/Tab/ComfortPrisoner_off.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb8f645f8b7a960a6361b8d3a606ac3f7f2c458 GIT binary patch literal 4338 zcmVuJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-;w2NWm=Q+3lZ000I3NklEL8Cc3|R1;-qc&tL8A(l7+M-eX3Gd_wW1l_tmeeNG_LC05AYtLXik` zjk$b>;P>WQmIceQ0=ljf*LAH%qtT4V;||DV@1{_ikUkUdR0W{PO<({#-B^{0YDhTU%Q%PfkwKnM~$% zCX-36tgQS`)3hS((p?7-mBIS}oC0tfKpMb+Wm%(_FJI08z}nhc-L~yYC=?nXgbXvr zhT`$K`tIGkr?pzm)O9_O&1SD!mKC5<`~OFflq9EZ+a5?JliYC})a!MJQtBs=1kewl zPuKNYsZ{DHih@WalC~^M=UwLNUufSa(E~uIlxppEn=r%t*xQeY9X7=l2j^X0Eh`8q5ygbA!8F06Mxlp zotDex!;OuNWlE{?WgP?osGjGkLWlq%L?wg-2q6jp7L7*9vuDpRGc$w9$w{)ex7Smx zRwI((u#(`lsBY2O1B3I%(4dHH)y(_Rxof&h;EN#QsS-hNbBMuG@S^#)5nN)^`hLA`k@bu|ZpF}ho4N3R` zOQq7sKptBvB|7q9Y?C(QDVP;r8v@ zc=YIz=e1aKlrIsk0$x~@$Kp#acsw>yN8sw_7DfN_Knmg~B400AL{SX*1G z3=IvPnwgmy{`~oKrcfxnR8_U=CnHIIC*Yi)n5MZWgt&6%%$Y>7SPUA5@!3DQ0GNaj z$1sdB0AP%fWHPA(z~je{Uxq@VlBQ`D05ypw08`3jQC-)YtE;R3ZM9n7=;&y8WMt%< zMx$Xmj4o7($dnCL?ZE{rfE9>eg$vHhl9Z&=`OV6<72V3v{c;N+xsWy zye*}(q?x7+c+zEXOU_#yfaAI@xp3h^_5J(zH)^%o-_M^ve?1fm4GJNMX_~)mZf^c~ zaB#3_7)D1L@5*&fz|(<^X{2 zbmna*^V=I&luzakH4GwAZw)-m7-3vy8Zjt_L;(?QQkt8Q+#jYGP1|U-wF%jJb0VQ} zaj4gfrlJ(lWRoPz+#lmYb0ed_pDp<3x{f!VtoC14PpGVw9As7wlC;7olJ%rbWl z((XY}VUSj@#Onqy6a!H6i_^#lYB~^9W~#t#kV6O%efAHRz%4O=5DZ!!0jNxDnm+{C zyya$uu5aO}2P$eo>i`Y;7XYIGaMQ?e zVL<2)5WT#-z91|OFzD=CDD7P93vmvi0ez-x403h^ zcIj&3?Jv?;q=IFr=MR1Wkdw%WAML?~?*LWVz<^v_4b=m&%@$%D&%=jHmn(zCo@xLr zcm)n!ib_o0Pbt?iJO0~RPBKQpp_FW zQlZXv*v2f{N_@4A=vN#0IYKT>gRiq)gGPhw5$ftwgm6iShS0123U(2M#Hbp(OslE$ zt0Ye<@%B4ksgymbPwik?Z9Og>sus) zDUU&-te&JAUCFn>Urd!pDXKN=3gubDbUu>* zeB>pW9)Be#VR^``nAJ%>rJ5x``t7!JXTi2OMq&wZ<;@uq@pRbFOCfWCW<|&~l z?q;pHTLNu}I_bQwtldf~N9d!$WyhheXK83@JgHa6b(K$scA8Y46dGpQF36Kq zXiz0kPy4r%`Jt3#gr%M+?>JpNy#$Saq-Li)A6=BDlwe%~f&S-D=EHQuI>YW}yc?oL z88UjTyh-1tAGv-ZQFtrLb*(piIdi#VS$dgmnS0-cEc2n-lTX;&i$Z4KAKzqIp;?hx zA$CZWQooa%ZZ=!^!JJk$-ddydLycLvX+$Bt%=2`G{?IG>26?3)-;J<3GdZ8Ql&^c$ z)6Tx*Fi!btG2FMIyPmQRJ@lcVe8m{r6X_(xlEF;E?8M^3T%Kx}&oUCj(qj&nm)uHS zOQTNnxML|&BND)v_?_(C&36Lt*hD1Ei_rP#IW+m5gFAiZ@kRGm(iSxuTO(k}Zq%icO1kx0>Y2whJ=zo3tCO&Vs4bdu|He6V!EzA0WzH zyFGP#wt%eQijne-qcU-{YaZK&1}&c!_kx|&tmgZuEJKfixfe}qr&nJ}T$o=VPYaH8 zDJ+RADfozICYseQ$|x z3E7S8&J`dQ;1)12+BDipH#4fs7tU8SR5a}A|Iz=ke>_b#Ls@b{YAs_eVtDuRD3ee|Oi>lHTeAl~t9r_CT_%-dm8aQDDoaZ8b5e6w4}QqE*7nx+nRIw$ zJqX8W2Jzw^;rwtzpa8`Wae_t#s|VWZ_GFxf0^1=f1OjO&Zr(AQW~<- zR?6+%`#YhO`(!P3AaTHjD*RU9`uI;0yH&fGjz9{*@Q84WSE_NIk(R7Ok}0x2L%%ei zVYE)QlC|bCoFq*Y%EfNVim0H)A1h7E*UQwac8fb&{TQ>%wA6PqxT+v7QYPo_){Hsd zK8RS%TqIxeXG)dmwe@`QVW9mmyx>ZaIGyN?WHrM`0$r1L~q>cRwz5*iID4QDfMWL-)3=0Zv- z-)NEyeUq5*L<7xjlvLxi>9p$T-B;oe{^hdEJ*HNI;~mL2*UE$vA}cYn8jbvQb8Ddq z5t1)X4i=6r{ZZc)l8dvh^>6>E{63Q)|9&?cw@uehxA3MW@0Edt7`x?aQ^{k6FG^2d z%#bZH5?yQ3`L3`1(4y!MA~aMOE`p=7;8|=5jm3 zv(SN``Qs%*Pu4HTwa~V``7xdK#~VVQpN@nqs5kz`gyiUi)8W zR_HChTBMiXc!1pW+Elts8Zqf}ZpW{w+TZbHgDp#bVD_--#oiU%_*j;L z@@&(ApT|kp$r0wtY~WMDi-Ep|DIdX|(ngcU2Zw6g>QkDt5o4-0m%k==e+4~m^~pIH z`lWk993DD&nRpaWtw|K07T@=Z^3_(>brl7LMb)Pl8|MX@gO3IUvY0MEUiOtSU6BaH zj%`g045bczNZC(GYC#6%U2L{)v6Rnrw|8?ifAf`=ynlH2Y`e|pmk;}HE{57{}1!qYtNl7?DXzIbay|ma2UT<>Q>zNq=;KvUDDinafIDEPRz;ieNn+O1I zqyoU?@#aC74ghqW`daGdzSF-m4a#!$XtWQw4Mck%5@mhn>Z1=!5bPy?xXQ>S(M$g; zlx|G?{(hzOzJJ_k?p0m;b8(%kG#9`YA(M zN-X}@abwe@B-U)AnjH#YYU}>ERTFgVYlzy95ZqyH5FDVsYPTHK1;Rn_FX-?mm-Kk; z?6tZZnZ}#GN@&rU`z;)=)Rj4?pSNJf4*s4`Qf$^=?iI2}0j~QCDGqfu>(3rp#gvr*9@7D&KR5xjNE>;*Ah@ zurIQT5B|FGRnEo{@UK!i#V*TW9r%qnjt_8IAc`v?qMDwTLtM`!94F? zLF!hJHQS#l!gcjY{y>euXTrhM0w_qU<6eq`elJe@W=;mbCz5~}xLs-SVDr()6(ZX; z#4kx_b_FQ{ps@6EkShdjqA#-ig)f_T@qr}E!M{4vz@WXiLF>Q_CRr|C3S*H9c}`Jl z2SxQ|XKNlJ>AC&6- zVz}~R=Mx7C0zXykKdU9f%_R7q?xs+*h0}gTlbko+FK^OFQxSwufA4a~%rq zXAO40_PLDRa3cW*E(4dZ^!Jc2m;`wYz`8>|P=<>34L`mJ<>AV0F}rESvhd2zk|D@; zLRFmlhvnHtzRM__;^Sb>7Rk2|E@E&Oefbhoymhph_vb`u@W}7ZOAHBylNsQBzZ;JQ z31d$Fj{d51+Nw7mCG56>u$cl`RA*w@)4?d!x6cmNHla(3`gz9nRuCQlS2^Xq9L$Am z=(XxF{2LE%povjyH!C3pY6x?^1Fj`_DNCP_&YloQ00%ljOY7(h$;hA$+f~Qw0rCG; zjkGXUV^ikz(awS_L|B|7z<d3)VLZNx)@0(kRQdpgwT$rJ4jHWha^2Nnf(0JTSl1xD@8^c1K+ z*+Z%cLTWsetpJ8&xqwCy@SRdafesG!5x;pG)%_kQA;Tc3p1(M+0mYS}pfXCsa&ovW zNh_dR@KqXy9r6+8d1^SFK<|r_U*D005guO&IJE2 z4EYaGP+oS=OqGzYAbhBe;^Kk~Q^N;V?9exCUkr~0i4#D4PschYsXkA@@qahRqxDpf z^{ehkwkk9D(Y~X6N)H9OhVcdYRB+4{Gm9^FfJWQcz{U=6z1~Ozk-40bC@r`$y&CJh zz`6WvJhR%T$?F+eGOdAZE~k4WP~c=}@ip%%ks(Goj4_EB1az%D{Xk3L&PKt-{b}Gp zkgP)b)ZmblSdASe#FZc?nTfLpY77a^JMoYN;>dVk;Z)QPJHJlQzxB|AzFs(ZV_~CL z9jt|ohww#@qSa>K`}{CP?acCx>*$p&b^^L(?*@IHtNM7iOt0M?{~$X+nhzPC2`xrP zPZN6We)M;`ZFttVjQqi@_OS|iO&8$CP0xt@S;Y z|3phK?vfdp0)hF@*t|0mC>I$GuAiSC)&^V6x@~x|fVfkx9Y;ouZ^|2e!hyJ=f)p_prwEH?12K`x{kQ@&+g zGQImz74M2_(JPhBrXL=DV>P2waqRD46)mxZ-25UK!uK+O6&T0oBspt!WyJg zOycfG8L<#C;-s~@qtbyl{<3g@buv$j&T(ON<(=&ns^I7SN$OqB{X0tN9xTW$C?i*u z7)5$66|?5>)lt4FH}gX=K_ zWfR3m=7=&KE(hW=ZB?WP6TTgAe+*ia+U5*9IeU3fnD!s@+@G_b=h^K6ty_Mr_cdXR z7B6s$B~VnCAFBTdB0O}`#57T34=S#odf7&h!Xh77j8rI}+5;3RpJ*Wd_98f}D<0D7 zPG3=NBr7*vb7XwZ41UW6;~_S)KIBDu{?L{4d;k74-VkwKh-_k)B7r*n?*T z`mguPKM|61<9;;&Zo$jmBdng65J$o%2EKyASlJu|UUt=nm?XgGqBZ{Sl z^|@*n*7EU*287FCNI9kr(l&Fk%}ik@&bnT2{M@zxjec5_kzmRR^%OrX9c28%@*}O) zlFhTOc21xJE}FHl=FiDVbHUloZr`)?WMW;GBGgZbqrtnN>mjj$aGNDt)pUFsfdDD(ge9Nu9oW1 z>>t{R@(L28{$#SK_evAbTM@FRV~f!@1;QHdiC4;Ry6eY+5NTAN;uLarVACcRu_0w- z2tMjT#>*UxGoOsB)vmsO3qs<+YG?ME!s0}#UDleqF7yK@AKi$$5XpnC?8Ue*%GJSj z&)2zs&>3d?4=meWRbCyb)Z&DQ{{EnQ&gKdoCF0V9{(Sim4vCl*8-YKAM{;UKMmp5vO&zt`IvxQki4b&?}^;7DbpYwk`RSmF+%BqMj6l< zPl~6XmSwy~ATmO@mjcugE6V+F@ALe`$wgV^MfWqpmoi`aR`y+YZd7H4y~v8!jgHDH zX}rST6~H*%7LI+HwmI`uYl3cY?O@k*QYByZxh)BjAf->cf!FLi&3JPkbBZ;mTTGCP zj}7eOgQZ!T0C*@G9a!4<3`wwy>9R&k#WEP}hU+!SJ$%jzAAIKYkJP6U*!l zO^YUWhw>Z{L$)cMG1X6sQxop}pA+fU9f=HeApUp@nI!G@&m2|N$NQItpE)Z9(8e1Y z7J7@AeK*^QqUPPMAdC)VpKULLBUmCO2EE0)XP^V>hcMw-&5f!$XGDPDhMpP^*<^j8 zW2u?yWoEuhNj^zF)0EP^`KhopUN%aP(9$7hd5+0Wo&P+eJO%F#B zj~f_d?UJuyE8DfN`m;0iLPGh-`cvsS&RCzgVmfwljENmGQabxFLrqw zw_Q4yc|jDlS9)UV z@3oeMvj!Jh+z(AMZ_RWbM>YyPHVfUQR8u-Pd2yKS@5C8*d@AF|B^o~om^Yl+@M;)w zC`i^yNCyW)=a}x~$)BX3W8n}ST#DRNi6d5J)N4-lXw2H4tudy1wH{UXE+E?w(wse& z;zy*C&d@q$g_~C~I(w8RkqBf#I}SDTy^|#-6%eaoalwC*r@u31yB{aMk1_e%ZcFRL)K_f-&nvtu4?9oIfI%}+eb+1d&pPJZkUr| z$Bs)z_+1h>JCU2h`?u$q97rl(C!>2&ZCbg2*b^ldV!*{fG)Z>Bav=%+TqncI1Y!L7 zS^iNMhc+a89Fm^@;>oQ1f2EqRnze4s=pZh8NsS(*PoIz#GIDXDJOss4ORJekg?tI8 zgy^h24`xookPOW0i+I-ElM@pw-#Xn5^6wm6Hz5Scw}YD!QQvsGX;o=~FCFQmQcr?` zsu(Nk+l=d!6|+S~6Z!7n0PCsRoH}WmJpLd{J&TEYhtt_4HNr6+4ueQXfFy5O<4#lywsi?}907GNMv4#NaPz;Ask724x0 zYbc>RaIm^ey7tuTurc*hnSF}y{Uq1JzZ^=^C_CoY>=b4U;qno-Z*Vh=s_j&xfFquS zNa?4JuniN0J5WC0hFc7Wi83WJjp|VKJlnl*mM3t0{Wg?~5(YniApK~3y@wMLDV-^8 ztU#99+)!SOo6Je_B*e$>km<(LIvO7Fs#v5Qn~ZcPr#>N9pb?{~+Vx!3ML{B1;3xY- z-E-#F6c@af%Eg&uBUSH1X-uGAy!Xija{PM|bb{nI!h-i))RKw`bo2W{Z}XuXS}JkW z3xbb8?My#bFVBXF=70k-yT0o?hszC$_(KmzZJ7Qvn+e^jzdYjZb|%1Z_;1q@nh@r^ zHA5q95(BEyBF~%d=gLAd@hqmX&ZQ%;r>>_Bu}XG%w!j=6Qtuu25H|JEX;(P4n6tBEF}uI*8G^<8X%jzH(N6XQ=zTeZMWDQ ze9L)oKHmwvOi_m=t?9I)V=zN|#h!@|8SHk4B(AimKEGD8ShepI0W``lRDItOd@Un! zlMEfA**Q5|O;8wo_WVX>VM*NLkmqBN3Kkf;#&$_|; z)>s4AzqBe^>=3t$NnPGZejeu;@6WvvSnf0!!c_(y3maIgJUBZ%Ud7s!t!iKsN+7=_ zLnNJ!UydWT?D$}ua8#yF&STNY zRCx6V0;Q1(QP8}#iCbzqX6+CiNGo`i_?Q!b!AwW#xn+q`&Dl#71c zeyA!6gua&qA$39=#Eo%<`~y@L0KJg^@6{6iSjdIAWCIF(y`$SnhI9b`=xZBmm1!VC F{s$u802lxO literal 0 HcmV?d00001 diff --git a/1.5/Textures/UI/Tab/ComfortPrisoner_on.png b/1.5/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 f068906..5e06fb6 100644 --- a/About/About.xml +++ b/About/About.xml @@ -7,6 +7,7 @@

  • 1.3
  • 1.4
  • +
  • 1.5
  • rjw.whoring