diff --git a/1.5/Assemblies/RimJobWorldWhoring.dll b/1.5/Assemblies/RimJobWorldWhoring.dll
deleted file mode 100644
index 6436cc6..0000000
Binary files a/1.5/Assemblies/RimJobWorldWhoring.dll and /dev/null differ
diff --git a/1.5/Defs/JobDefs/Jobs_Whoring.xml b/1.5/Defs/JobDefs/Jobs_Whoring.xml
deleted file mode 100644
index 60eedda..0000000
--- a/1.5/Defs/JobDefs/Jobs_Whoring.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- 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
deleted file mode 100644
index f94897f..0000000
--- a/1.5/Defs/RecordDefs/Records.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
- CountOfWhore
- times whored
- The number of times I whored myself.
- Int
-
-
-
- EarnedMoneyByWhore
- silvers earned as a whore
- 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
deleted file mode 100644
index 855f0bd..0000000
--- a/1.5/Defs/Rooms/RoomRoles.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- Brothel
- 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
deleted file mode 100644
index 8af3edf..0000000
--- a/1.5/Defs/ThinkTreeDefs/ThinkTrees_Prisoner.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- 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
deleted file mode 100644
index def7e6b..0000000
--- a/1.5/Defs/ThinkTreeDefs/ThinkTrees_Whore.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
- 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
deleted file mode 100644
index 0bbd196..0000000
--- a/1.5/Defs/ThoughtDefs/Thoughts_Whore.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-
-
- Whorish_Thoughts
- rjwwhoring.ThoughtWorker_Whore
- 2.0
- 10
- 0.4
-
-
-
- 30
- 50
-
- 30
-
-
- Resentful whore
- We just need money! I'm not a ...
- -5
-
-
- Whore
- Well, at least it pays well...
- -1
-
-
- WHORE
- This job isn't so bad afterall!
- 2
-
-
-
-
-
- Whorish_Thoughts_Captive
- rjwwhoring.ThoughtWorker_Whore
- 4.0
- 10
- 0.4
-
-
-
- 30
- 40
- 80
-
- 10
-
-
-
- Forced whore
- They forced me to serve as a sex toy!
- -20
-
-
- Unwilling whore
- I'm not just a rental ride!
- -10
-
-
- Accustomed whore
- Just no beatings, please.
- -1
-
-
- Complete whore
- I could get more clients if not these restraints!
- 2
-
-
-
-
-
-
- RJWFailedSolicitation
- Thought_MemorySocial
- 0.4
- 100
- 1
- 0.5
-
-
- tried to solicit me
- -1
-
-
-
-
-
-
- RJWTurnedDownWhore
- Thought_MemorySocial
- 0.2
- 1
- 1
- 0.5
-
-
- bothered me
- -1
-
-
-
-
-
- SleptInBrothel
- 1
- 1
- 1
-
-
- slept in brothel
- Eww, the sheets were all sticky.
- -10
-
-
- slept in brothel!
- 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
deleted file mode 100644
index 4f36f27..0000000
--- a/1.5/Defs/TipSetDefs/Tips.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- 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
deleted file mode 100644
index 329d45c..0000000
--- a/1.5/Defs/WhoreBackstories.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
- 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
deleted file mode 100644
index d6fe0fb..0000000
--- a/1.5/Defs/WhoringTab/PawnColumnDefs/PawnColumns.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
- RJW_IsWhore
- Whores
- rjwwhoring.MainTab.PawnColumnWorker_IsWhore
- true
- 80
-
-
- RJW_WhoreExperience
- Whoring experience
- Experience
- rjwwhoring.MainTab.PawnColumnWorker_WhoreExperience
- 100
-
-
- RJW_PriceRangeOfWhore
- Price range for whore
- Price
- rjwwhoring.MainTab.PawnColumnWorker_PriceRangeOfWhore
- 100
-
-
- RJW_EarnedMoneyByWhore
- Money earned(total)
- Earned
- rjwwhoring.MainTab.PawnColumnWorker_EarnedMoneyByWhore
- 100
-
-
- RJW_CountOfWhore
- Clients served
- Clients
- rjwwhoring.MainTab.PawnColumnWorker_CountOfWhore
- 100
-
-
- RJW_AverageMoneyByWhore
- Money earned(average)
- Average
- rjwwhoring.MainTab.PawnColumnWorker_AverageMoneyByWhore
- 100
-
-
- RJW_WhoreMood
- Mood of pawn
- Mood
- rjwwhoring.MainTab.PawnColumnWorker_Mood
- 100
-
-
- RJW_WhoringPolicy
- Trade sex for benefits
- Payment type
- rjwwhoring.MainTab.PawnColumnWorker_WhoringPolicy
- 100
-
-
diff --git a/1.5/Defs/WhoringTab/PawnTableDefs.xml b/1.5/Defs/WhoringTab/PawnTableDefs.xml
deleted file mode 100644
index af172f9..0000000
--- a/1.5/Defs/WhoringTab/PawnTableDefs.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- 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
-
-
-
- Brothel
-
-
-
-
-
diff --git a/1.5/Languages/English/Keyed/Whoring.xml b/1.5/Languages/English/Keyed/Whoring.xml
deleted file mode 100644
index e86e4f0..0000000
--- a/1.5/Languages/English/Keyed/Whoring.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
- 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
deleted file mode 100644
index 8cae3d9..0000000
--- a/1.5/Patches/FacialAnimation_compatibility.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- [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
deleted file mode 100644
index 5d6a1ff..0000000
--- a/1.5/Source/Mod/Data/BedData.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index 8241197..0000000
--- a/1.5/Source/Mod/Data/DataStore.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-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
deleted file mode 100644
index 479ca2e..0000000
--- a/1.5/Source/Mod/Data/PawnExtensions.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 541b00c..0000000
--- a/1.5/Source/Mod/Data/StringListDef.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index b113bb6..0000000
--- a/1.5/Source/Mod/Data/WhoringData.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644
index 0a13f1f..0000000
--- a/1.5/Source/Mod/DefOf/RecordDefDefOf.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index b7a2e14..0000000
--- a/1.5/Source/Mod/DefOf/ThoughtDefOf.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-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
deleted file mode 100644
index bbc6fe0..0000000
--- a/1.5/Source/Mod/JobDrivers/JobDriver_WhoreInvitingVisitors.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-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
deleted file mode 100644
index 5b5683d..0000000
--- a/1.5/Source/Mod/JobDrivers/JobDriver_WhoreIsServingVisitors.cs
+++ /dev/null
@@ -1,191 +0,0 @@
-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
deleted file mode 100644
index a81d6c7..0000000
--- a/1.5/Source/Mod/JobGivers/JobGiver_WhoreInvitingVisitors.cs
+++ /dev/null
@@ -1,300 +0,0 @@
-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
deleted file mode 100644
index 27921c3..0000000
--- a/1.5/Source/Mod/Location/Brothel_Room.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-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
deleted file mode 100644
index 0239322..0000000
--- a/1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ChancePerHour_Whore.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-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
deleted file mode 100644
index fcfa9d5..0000000
--- a/1.5/Source/Mod/ThinkTreeNodes/ThinkNode_ConditionalWhore.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-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
deleted file mode 100644
index cbe88f9..0000000
--- a/1.5/Source/Mod/Thoughts/ThoughtWorker_Whore.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-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
deleted file mode 100644
index 6480a0f..0000000
--- a/1.5/Source/Mod/Whoring.csproj
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
- 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
deleted file mode 100644
index 0edb576..0000000
--- a/1.5/Source/Mod/WhoringBase.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-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
deleted file mode 100644
index 72bb337..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnCheckbox_Whore.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-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
deleted file mode 100644
index 8a38a33..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_AverageMoneyByWhore.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-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
deleted file mode 100644
index 0e4cf05..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_CountOfWhore.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index 3665822..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_EarnedMoneyByWhore.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index cf02240..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_IsWhore.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-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
deleted file mode 100644
index f4a6f6b..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_Mood.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-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
deleted file mode 100644
index 892a249..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_PriceRangeOfWhore.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-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
deleted file mode 100644
index f72193f..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_TextCenter.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644
index c0d85ba..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoreExperience.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-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
deleted file mode 100644
index 392bea7..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnColumnWorker_WhoringPolicy.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-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
deleted file mode 100644
index 3a25bb4..0000000
--- a/1.5/Source/Mod/WhoringTab/PawnTable_Whores.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-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
deleted file mode 100644
index 1f21bdb..0000000
--- a/1.5/Source/Mod/WhoringTab/WhoreCheckbox.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-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
deleted file mode 100644
index a5af8cc..0000000
--- a/1.5/Source/Mod/WhoringTab/WhoringPolicyUIUtility.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-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
deleted file mode 100644
index 74ac8a1..0000000
--- a/1.5/Source/Mod/Whoring_Bed_Utilities.cs
+++ /dev/null
@@ -1,381 +0,0 @@
-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
deleted file mode 100644
index e811658..0000000
--- a/1.5/Source/Mod/Whoring_Helper.cs
+++ /dev/null
@@ -1,440 +0,0 @@
-// #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
deleted file mode 100644
index e7accc6..0000000
--- a/1.5/Source/Mod/harmony_AftersexPatch.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-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
deleted file mode 100644
index d84a950..0000000
--- a/1.5/Source/Mod/harmony_Building_BedPatches.cs
+++ /dev/null
@@ -1,322 +0,0 @@
-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
deleted file mode 100644
index 5f32cd0..0000000
--- a/1.5/Source/Mod/harmony_RJWTab_patch.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-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
deleted file mode 100644
index 75a6411..0000000
--- a/1.5/Source/Mod/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/1.5/Source/Properties/AssemblyInfo.cs b/1.5/Source/Properties/AssemblyInfo.cs
deleted file mode 100644
index 7b4716d..0000000
--- a/1.5/Source/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-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
deleted file mode 100644
index 981a536..0000000
--- a/1.5/Source/mod.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-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
deleted file mode 100644
index b5f14e1..0000000
Binary files a/1.5/Textures/UI/Commands/AsWhore.png and /dev/null differ
diff --git a/1.5/Textures/UI/Commands/AsWhoreMany.png b/1.5/Textures/UI/Commands/AsWhoreMany.png
deleted file mode 100644
index f7c1989..0000000
Binary files a/1.5/Textures/UI/Commands/AsWhoreMany.png and /dev/null differ
diff --git a/1.5/Textures/UI/Commands/Service_Refuse.png b/1.5/Textures/UI/Commands/Service_Refuse.png
deleted file mode 100644
index 7b57c3b..0000000
Binary files a/1.5/Textures/UI/Commands/Service_Refuse.png and /dev/null differ
diff --git a/1.5/Textures/UI/Commands/Service_off.png b/1.5/Textures/UI/Commands/Service_off.png
deleted file mode 100644
index 3b46e97..0000000
Binary files a/1.5/Textures/UI/Commands/Service_off.png and /dev/null differ
diff --git a/1.5/Textures/UI/Commands/Service_on.png b/1.5/Textures/UI/Commands/Service_on.png
deleted file mode 100644
index b427f88..0000000
Binary files a/1.5/Textures/UI/Commands/Service_on.png and /dev/null differ
diff --git a/1.5/Textures/UI/Tab/ComfortPrisoner_off.png b/1.5/Textures/UI/Tab/ComfortPrisoner_off.png
deleted file mode 100644
index 7cb8f64..0000000
Binary files a/1.5/Textures/UI/Tab/ComfortPrisoner_off.png and /dev/null differ
diff --git a/1.5/Textures/UI/Tab/ComfortPrisoner_off_nobg.png b/1.5/Textures/UI/Tab/ComfortPrisoner_off_nobg.png
deleted file mode 100644
index ce033a1..0000000
Binary files a/1.5/Textures/UI/Tab/ComfortPrisoner_off_nobg.png and /dev/null differ
diff --git a/1.5/Textures/UI/Tab/ComfortPrisoner_on.png b/1.5/Textures/UI/Tab/ComfortPrisoner_on.png
deleted file mode 100644
index c2a76ee..0000000
Binary files a/1.5/Textures/UI/Tab/ComfortPrisoner_on.png and /dev/null differ
diff --git a/1.5/Textures/UI/Tab/Service_off.png b/1.5/Textures/UI/Tab/Service_off.png
deleted file mode 100644
index 510041b..0000000
Binary files a/1.5/Textures/UI/Tab/Service_off.png and /dev/null differ
diff --git a/1.5/Textures/UI/Tab/Service_on.png b/1.5/Textures/UI/Tab/Service_on.png
deleted file mode 100644
index cdcc073..0000000
Binary files a/1.5/Textures/UI/Tab/Service_on.png and /dev/null differ
diff --git a/About/About.xml b/About/About.xml
index 5e06fb6..f068906 100644
--- a/About/About.xml
+++ b/About/About.xml
@@ -7,7 +7,6 @@
1.3
1.4
- 1.5
rjw.whoring