From 7585da099c87d684a395589151582669ad899483 Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 1 Nov 2022 12:15:06 -0400 Subject: [PATCH] Initial upload --- .gitignore | 398 ++++++++++++++++++ 1.4/Assemblies/RJW-Quirks.dll | Bin 0 -> 98304 bytes 1.4/Defs/QuirkDefs/QuirkDef.xml | 116 +++++ 1.4/Defs/QuirkDefs/QuirkDef_Humanlike.xml | 268 ++++++++++++ 1.4/Defs/QuirkDefs/QuirkDef_RaceTag.xml | 188 +++++++++ 1.4/Defs/RjwEventDefs/RjwEventDef.xml | 43 ++ .../RjwEventHandlerDefs/QuirkHandlers.xml | 38 ++ About/About.xml | 34 ++ RJW-Quirks/Core.cs | 18 + RJW-Quirks/Data/RaceTags.cs | 64 +++ .../HarmonyPatches/Patch_CasualSex_Helper.cs | 74 ++++ .../HarmonyPatches/Patch_CondomUtility.cs | 37 ++ .../HarmonyPatches/Patch_Dialog_Sexcard.cs | 131 ++++++ RJW-Quirks/HarmonyPatches/Patch_DrawNude.cs | 24 ++ .../Patch_Hediff_BasePregnancy.cs | 35 ++ .../Patch_Hediff_PartBaseArtifical.cs | 43 ++ .../Patch_Hediff_PartBaseNatural.cs | 47 +++ .../Patch_JobGiver_Masturbate.cs | 59 +++ .../Patch_QuirkPartPreference.cs | 28 ++ ...atch_RecordsTracker_NotifyRecordChanged.cs | 30 ++ .../HarmonyPatches/Patch_SexAppraiser.cs | 64 +++ RJW-Quirks/HarmonyPatches/Patch_SexUtility.cs | 146 +++++++ .../Interactions/QuirksPartKindUsageRule.cs | 71 ++++ .../Modules/Quirks/CompProperties_QuirkSet.cs | 17 + RJW-Quirks/Modules/Quirks/Comps/Adder.cs | 53 +++ .../Quirks/Comps/Adder_OnRecordExceeding.cs | 52 +++ RJW-Quirks/Modules/Quirks/Comps/CompAdder.cs | 25 ++ .../Modules/Quirks/Comps/HediffAdder.cs | 44 ++ .../Modules/Quirks/Comps/HediffRemover.cs | 48 +++ .../Quirks/Comps/PartKindUsageRules.cs | 27 ++ .../PartKindUsageRules_ImpregnationFetish.cs | 42 ++ .../Quirks/Comps/PartKindUsageRules_Static.cs | 45 ++ RJW-Quirks/Modules/Quirks/Comps/QuirkComp.cs | 32 ++ .../Quirks/Comps/SexAppraisalModifier.cs | 41 ++ .../SexAppraisalModifier_ApplyMultiplier.cs | 28 ++ .../Comps/SexAppraisalModifier_SetValue.cs | 28 ++ .../Modules/Quirks/Comps/ThoughtAdder.cs | 37 ++ .../Quirks/Comps/ThoughtAdder_OnSexEvent.cs | 30 ++ .../ThoughtAdder_OnSexEvent_NonPreferred.cs | 9 + .../ThoughtAdder_OnSexEvent_Preferred.cs | 9 + .../Modules/Quirks/Comps/ValueModifier.cs | 36 ++ .../Comps/ValueModifier_ApplyMultiplier.cs | 27 ++ .../Quirks/Comps/ValueModifier_ApplyOffset.cs | 27 ++ .../Quirks/EventHandlers/QuirkGenerator.cs | 111 +++++ .../EventHandlers/QuirkRjwEventHandler.cs | 22 + .../EventHandlers/QuirkSetRjwEventHandler.cs | 30 ++ .../RecordChangedRjwEventHandler.cs | 72 ++++ RJW-Quirks/Modules/Quirks/OwnerRequirement.cs | 58 +++ RJW-Quirks/Modules/Quirks/Quirk.cs | 71 ++++ RJW-Quirks/Modules/Quirks/QuirkDef.cs | 147 +++++++ RJW-Quirks/Modules/Quirks/QuirkDefOf.cs | 15 + .../Modules/Quirks/QuirkModifierPriority.cs | 11 + RJW-Quirks/Modules/Quirks/QuirkRarity.cs | 8 + RJW-Quirks/Modules/Quirks/QuirkSet.cs | 339 +++++++++++++++ .../Modules/Quirks/SexSelectors/BySextype.cs | 25 ++ .../Quirks/SexSelectors/CanBeImpregnated.cs | 9 + .../Quirks/SexSelectors/CanImpregnate.cs | 9 + .../Modules/Quirks/SexSelectors/Clothed.cs | 9 + .../Quirks/SexSelectors/ISexSelector.cs | 10 + .../Modules/Quirks/SexSelectors/LogicalAnd.cs | 20 + .../Quirks/SexSelectors/LogicalMultipart.cs | 36 ++ .../Modules/Quirks/SexSelectors/LogicalNot.cs | 39 ++ .../Modules/Quirks/SexSelectors/LogicalOr.cs | 20 + .../Modules/Quirks/SexSelectors/Seen.cs | 23 + .../Quirks/SexSelectors/SexSelector.cs | 19 + .../SexSelectors/WithPreferedPartner.cs | 9 + RJW-Quirks/Modules/Shared/Events/RjwEvent.cs | 21 + .../Modules/Shared/Events/RjwEventArgNames.cs | 11 + .../Modules/Shared/Events/RjwEventDef.cs | 10 + .../Modules/Shared/Events/RjwEventDefOf.cs | 14 + .../Modules/Shared/Events/RjwEventHandler.cs | 8 + .../Shared/Events/RjwEventHandlerDef.cs | 45 ++ .../Modules/Shared/Events/RjwEventManager.cs | 97 +++++ RJW-Quirks/Modules/Shared/IDefPart.cs | 16 + .../Shared/Selectors/IPartnerSelector.cs | 16 + .../Modules/Shared/Selectors/IPawnSelector.cs | 15 + .../Selectors/Partner/CanBeImpregnatedBy.cs | 10 + .../Shared/Selectors/Partner/CanImpregnate.cs | 10 + .../Selectors/Partner/HasOneOfRelations.cs | 48 +++ .../Shared/Selectors/Partner/LogicalAnd.cs | 23 + .../Selectors/Partner/LogicalMultipart.cs | 31 ++ .../Shared/Selectors/Partner/LogicalNot.cs | 34 ++ .../Shared/Selectors/Partner/LogicalOr.cs | 23 + .../Selectors/Partner/PartnerSelector.cs | 16 + .../Shared/Selectors/Pawn/HasBodyType.cs | 26 ++ .../Shared/Selectors/Pawn/HasDegreeOfTrait.cs | 31 ++ .../Shared/Selectors/Pawn/HasFertility.cs | 10 + .../Shared/Selectors/Pawn/HasGender.cs | 25 ++ .../Shared/Selectors/Pawn/HasHumanScaleAge.cs | 31 ++ .../Shared/Selectors/Pawn/HasRaceTag.cs | 44 ++ .../Shared/Selectors/Pawn/HasSkillLevel.cs | 36 ++ .../Shared/Selectors/Pawn/HasStatValue.cs | 36 ++ .../Modules/Shared/Selectors/Pawn/HasTrait.cs | 26 ++ .../Shared/Selectors/Pawn/IsDisfigured.cs | 10 + .../Shared/Selectors/Pawn/IsHumanlike.cs | 9 + .../Shared/Selectors/Pawn/IsSleeping.cs | 10 + .../Selectors/Pawn/IsVisiblyPregnant.cs | 10 + .../Shared/Selectors/Pawn/LogicalAnd.cs | 20 + .../Shared/Selectors/Pawn/LogicalMultipart.cs | 30 ++ .../Shared/Selectors/Pawn/LogicalNot.cs | 33 ++ .../Shared/Selectors/Pawn/LogicalOr.cs | 20 + .../Shared/Selectors/Pawn/PawnSelector.cs | 17 + RJW-Quirks/PawnExtensions.cs | 32 ++ RJW-Quirks/Properties/AssemblyInfo.cs | 35 ++ RJW-Quirks/RJW-Quirks.csproj | 171 ++++++++ RJW-Quirks/RJW-Quirks.sln | 25 ++ 106 files changed, 4860 insertions(+) create mode 100644 .gitignore create mode 100644 1.4/Assemblies/RJW-Quirks.dll create mode 100644 1.4/Defs/QuirkDefs/QuirkDef.xml create mode 100644 1.4/Defs/QuirkDefs/QuirkDef_Humanlike.xml create mode 100644 1.4/Defs/QuirkDefs/QuirkDef_RaceTag.xml create mode 100644 1.4/Defs/RjwEventDefs/RjwEventDef.xml create mode 100644 1.4/Defs/RjwEventHandlerDefs/QuirkHandlers.xml create mode 100644 About/About.xml create mode 100644 RJW-Quirks/Core.cs create mode 100644 RJW-Quirks/Data/RaceTags.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_CasualSex_Helper.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_CondomUtility.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_Dialog_Sexcard.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_DrawNude.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_Hediff_BasePregnancy.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseArtifical.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseNatural.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_JobGiver_Masturbate.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_QuirkPartPreference.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_RecordsTracker_NotifyRecordChanged.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_SexAppraiser.cs create mode 100644 RJW-Quirks/HarmonyPatches/Patch_SexUtility.cs create mode 100644 RJW-Quirks/Modules/Interactions/QuirksPartKindUsageRule.cs create mode 100644 RJW-Quirks/Modules/Quirks/CompProperties_QuirkSet.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/Adder.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/Adder_OnRecordExceeding.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/CompAdder.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/HediffAdder.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/HediffRemover.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/PartKindUsageRules.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/PartKindUsageRules_ImpregnationFetish.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/PartKindUsageRules_Static.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/QuirkComp.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/SexAppraisalModifier.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/SexAppraisalModifier_ApplyMultiplier.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/SexAppraisalModifier_SetValue.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ThoughtAdder.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ThoughtAdder_OnSexEvent.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ThoughtAdder_OnSexEvent_NonPreferred.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ThoughtAdder_OnSexEvent_Preferred.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ValueModifier.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ValueModifier_ApplyMultiplier.cs create mode 100644 RJW-Quirks/Modules/Quirks/Comps/ValueModifier_ApplyOffset.cs create mode 100644 RJW-Quirks/Modules/Quirks/EventHandlers/QuirkGenerator.cs create mode 100644 RJW-Quirks/Modules/Quirks/EventHandlers/QuirkRjwEventHandler.cs create mode 100644 RJW-Quirks/Modules/Quirks/EventHandlers/QuirkSetRjwEventHandler.cs create mode 100644 RJW-Quirks/Modules/Quirks/EventHandlers/RecordChangedRjwEventHandler.cs create mode 100644 RJW-Quirks/Modules/Quirks/OwnerRequirement.cs create mode 100644 RJW-Quirks/Modules/Quirks/Quirk.cs create mode 100644 RJW-Quirks/Modules/Quirks/QuirkDef.cs create mode 100644 RJW-Quirks/Modules/Quirks/QuirkDefOf.cs create mode 100644 RJW-Quirks/Modules/Quirks/QuirkModifierPriority.cs create mode 100644 RJW-Quirks/Modules/Quirks/QuirkRarity.cs create mode 100644 RJW-Quirks/Modules/Quirks/QuirkSet.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/BySextype.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/CanBeImpregnated.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/CanImpregnate.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/Clothed.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/ISexSelector.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/LogicalAnd.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/LogicalMultipart.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/LogicalNot.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/LogicalOr.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/Seen.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/SexSelector.cs create mode 100644 RJW-Quirks/Modules/Quirks/SexSelectors/WithPreferedPartner.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEvent.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventArgNames.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventDef.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventDefOf.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventHandler.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventHandlerDef.cs create mode 100644 RJW-Quirks/Modules/Shared/Events/RjwEventManager.cs create mode 100644 RJW-Quirks/Modules/Shared/IDefPart.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/IPartnerSelector.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/IPawnSelector.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/CanBeImpregnatedBy.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/CanImpregnate.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/HasOneOfRelations.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/LogicalAnd.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/LogicalMultipart.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/LogicalNot.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/LogicalOr.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Partner/PartnerSelector.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasBodyType.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasDegreeOfTrait.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasFertility.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasGender.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasHumanScaleAge.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasRaceTag.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasSkillLevel.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasStatValue.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/HasTrait.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/IsDisfigured.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/IsHumanlike.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/IsSleeping.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/IsVisiblyPregnant.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/LogicalAnd.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/LogicalMultipart.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/LogicalNot.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/LogicalOr.cs create mode 100644 RJW-Quirks/Modules/Shared/Selectors/Pawn/PawnSelector.cs create mode 100644 RJW-Quirks/PawnExtensions.cs create mode 100644 RJW-Quirks/Properties/AssemblyInfo.cs create mode 100644 RJW-Quirks/RJW-Quirks.csproj create mode 100644 RJW-Quirks/RJW-Quirks.sln diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8dd4607 --- /dev/null +++ b/.gitignore @@ -0,0 +1,398 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml \ No newline at end of file diff --git a/1.4/Assemblies/RJW-Quirks.dll b/1.4/Assemblies/RJW-Quirks.dll new file mode 100644 index 0000000000000000000000000000000000000000..0d790aa53b20e21d5b37ac4d9c50c30f1168c164 GIT binary patch literal 98304 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 + + + + Breeder + + {pawn} has given birth so many times that {pawn_possessive} body has adapted to breeding. {pawn_possessive} pregnancies are shorter and produce more offspring. + ForcedOnly + true + +
  • + RecordChanged + CountOfBirthHuman + 10 +
  • +
  • + RecordChanged + CountOfBirthAnimal + 20 +
  • +
  • + maxLitterOnBirth + 2.0 +
  • +
    +
    + + + Fertile + + {pawn} has unusually high fertility and so is more likely to have children. + +
  • Infertile
  • +
    + +
  • + + RaceHasNoFertility +
  • +
    + +
  • + QuirkAddedTo + IncreasedFertility +
  • +
  • + QuirkRemovedFrom + IncreasedFertility +
  • +
    +
    + + + Incubator + + {pawn} has birthed so many eggs that {pawn_possessive} body has adapted to handling them. {pawn_possessive} egg incubation speed has increased. + ForcedOnly + true + +
  • + RecordChanged + CountOfBirthEgg + 100 +
  • +
  • + maxEggsSize + 2.0 +
  • +
  • + maxLitterOnBirth + 2.0 +
  • +
    +
    + + + Infertile + + {pawn} has unusually low fertility and so is unlikely to have children. + +
  • Fertile
  • +
    + +
  • + + RaceHasNoFertility +
  • +
    + +
  • + QuirkAddedTo + DecreasedFertility +
  • +
  • + QuirkRemovedFrom + DecreasedFertility +
  • +
    +
    + + + Messy + + {pawn} not only produces copious amounts of fluid during sex but {pawn_pronoun} rarely bothers to clean {pawn_possessive}self afterwards. + +
  • + cumFilthAmount + 2.0 +
  • +
  • + cleanAfterFapChance + -0.75 +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/QuirkDefs/QuirkDef_Humanlike.xml b/1.4/Defs/QuirkDefs/QuirkDef_Humanlike.xml new file mode 100644 index 0000000..222ecd3 --- /dev/null +++ b/1.4/Defs/QuirkDefs/QuirkDef_Humanlike.xml @@ -0,0 +1,268 @@ + + + + + +
  • + + NotHumanlike +
  • +
    +
    + + + Endytophile + + {pawn} prefers to keep {pawn_possessive} clothes on during sex. + + +
  • + Orgasm + ThatsMyFetish +
  • +
    +
    + + + Exhibitionist + + {pawn} enjoys having sex where others can see. + + +
  • + Orgasm + ThatsMyFetish +
  • +
    +
    + + + Gerontophile + + {pawn} prefers older partners (55+ on a human scale). + + 55 + + + +
  • + Orgasm + ThatsMyFetish +
  • +
  • + ageFactor + 1.0 + First +
  • +
    +
    + + + ImpregnationFetish + + {pawn} really likes the idea of someone becoming pregnant. {pawn_pronoun} prefers partners and sex positions where there is a possibility of pregnancy. {pawn_pronoun} doesn't care if {pawn_pronoun} is getting pregnant or {pawn_possessive} partner is as long as babby is formed. + + +
  • +
  • +
    +
    + + +
  • +
  • +
    +
    + +
  • + Orgasm + ThatsMyFetish +
  • +
  • +
  • + RecordChanged + CountOfBirthHuman + 10 + {pawn} has given birth so many times that {pawn_pronoun} developed a fetish for impregnation +
  • +
  • + RecordChanged + CountOfBirthAnimal + 20 + {pawn} has given birth so many times that {pawn_pronoun} developed a fetish for impregnation +
  • +
  • + RecordChanged + CountOfBirthEgg + 100 + {pawn} has birthed so many eggs that {pawn_pronoun} developed a fetish for impregnation +
  • +
  • + bodyFactor + 1.25 +
  • +
    +
    + + + Podophile + + {pawn} really likes feet and prefers foot-related sex acts. + + Footjob + + +
  • + Orgasm + ThatsMyFetish +
  • +
  • + +
  • + Foot + 2.0 +
  • + + +
    +
    + + + PregnancyFetish + + {pawn} prefers partners who are visibly pregnant. + + + +
  • + Orgasm + ThatsMyFetish +
  • +
  • + bodyFactor + 1.25 +
  • +
    +
    + + + Sapiosexual + + {pawn} prefers smart partners. + + +
  • + Transhumanist +
  • +
  • + GreatMemory +
  • +
  • + TooSmart +
  • +
  • + RCT_Savant +
  • +
  • + RCT_Inventor +
  • +
  • + SYR_CreativeThinker +
  • +
  • + Intellectual + 15 +
  • +
    +
    + +
  • + opinionFactor + 1.4 +
  • +
    +
    + + + Somnophile + + {pawn} prefers {pawn_possessive} partners to be asleep. + + + +
  • + Orgasm + ThatsMyFetish +
  • +
  • + bodyFactor + 1.25 +
  • +
    +
    + + + Teratophile + + {pawn} prefers ugly partners. {pawn_pronoun} would also prefer larger and wilder animals if {pawn_pronoun} were into that sort of thing... + + +
  • + CreepyBreathing +
  • +
  • + Beauty + -1 +
  • +
  • + Beauty + -2 +
  • +
  • + Fat +
  • +
  • +
  • + PawnBeauty + -0.1 +
  • +
    +
    + +
  • + bodyFactor + 1.4 + First +
  • + +
  • + wouldFuckAnimalBodySizeMin + 0.8 +
  • +
  • + wouldFuckAnimalBodySizeMax + 2.0 +
  • +
  • + wouldFuckAnimalWildnessModifier + 0.3 +
  • +
    +
    + + + Vigorous + + {pawn} is invigorated by sex. {pawn_pronoun} does not get tired as much during sex. + +
  • + ticksToNextLovin + 0.8 +
  • +
  • + reduceRest + 0.5 +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/QuirkDefs/QuirkDef_RaceTag.xml b/1.4/Defs/QuirkDefs/QuirkDef_RaceTag.xml new file mode 100644 index 0000000..9579cc9 --- /dev/null +++ b/1.4/Defs/QuirkDefs/QuirkDef_RaceTag.xml @@ -0,0 +1,188 @@ + + + + + + + +
  • + Orgasm + ThatsMyFetish +
  • +
    +
    + + + ChitinLover + + {pawn} enjoys the smooth strength of a chitinous exoskeleton. {pawn_pronoun} prefers arachnoid or insectoid partners. + + Chitin + + +
  • + + + + Chitin + + + QuirkForOwnRace +
  • +
    +
    + + + DemonLover + + {pawn} is after the naughty ones. {pawn_pronoun} prefers {pawn_possessive} partners to come from the literal depths of hell, or at least look the part. + + Demon + + +
  • + + + Demon + + + QuirkForOwnRace +
  • +
    +
    + + + FeatherLover + + {pawn} loves that downy fluff. {pawn_pronoun} prefers avian or dinosaur partners. Because dinosaurs are birds and have feathers, as {pawn_pronoun} will explain at great length if given a chance. + + Feathers + + +
  • + + + Feathers + + + QuirkForOwnRace +
  • +
    +
    + + + FurLover + + {pawn} prefers a partner with a thick, luxurious, snuggly-soft coat of fur. + + Fur + + +
  • + + + Fur + + + QuirkForOwnRace +
  • +
    +
    + + + PlantLover + + {pawn} likes watering plants. If you know what I mean. + + Plant + + +
  • + + + Plant + + + QuirkForOwnRace +
  • +
    +
    + + + RobotLover + + Which is better, 2D or 3D? {pawn} knows that 3D-printed gives you the best of both worlds. + + Robot + + +
  • + + + Robot + + + QuirkForOwnRace +
  • +
    +
    + + + ScaleLover + + Who wouldn't want to fuck a dragon? Definitely not {pawn}. {pawn} wants to fuck a dragon. + + Scales + + +
  • + + + Scales + + + QuirkForOwnRace +
  • +
    +
    + + + SkinLover + + {pawn} prefers {pawn_possessive} partners to have smooth sensitive skin without fur or scales getting in the way. Lucky for {pawn_objective} humans are all over the place. + + Skin + + +
  • + + + Skin + + + QuirkForOwnRace +
  • +
    +
    + + + SlimeLover + + Because of their slippery and malleable nature slimes are very, very good at sex. As you will hear over and over if you listen to {pawn} talk for any length of time. + + Slime + + +
  • + + + Slime + + + QuirkForOwnRace +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.4/Defs/RjwEventDefs/RjwEventDef.xml b/1.4/Defs/RjwEventDefs/RjwEventDef.xml new file mode 100644 index 0000000..3018066 --- /dev/null +++ b/1.4/Defs/RjwEventDefs/RjwEventDef.xml @@ -0,0 +1,43 @@ + + + + + + QuirkAddedTo + +
  • Pawn
  • +
  • Quirk
  • +
    +
    + + + QuirkRemovedFrom + +
  • Pawn
  • +
  • Quirk
  • +
    +
    + + + Orgasm + +
  • SexProps
  • +
    +
    + + + RecordChanged + +
  • Pawn
  • +
  • Record
  • +
    +
    + + + PawnSexualized + +
  • Pawn
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.4/Defs/RjwEventHandlerDefs/QuirkHandlers.xml b/1.4/Defs/RjwEventHandlerDefs/QuirkHandlers.xml new file mode 100644 index 0000000..7bb1fc7 --- /dev/null +++ b/1.4/Defs/RjwEventHandlerDefs/QuirkHandlers.xml @@ -0,0 +1,38 @@ + + + + + + Quirk + rjwquirks.Modules.Quirks.EventHandlers.QuirkRjwEventHandler + +
  • QuirkAddedTo
  • +
  • QuirkRemovedFrom
  • +
    +
    + + + QuirkSet + rjwquirks.Modules.Quirks.EventHandlers.QuirkSetRjwEventHandler + +
  • Orgasm
  • +
    +
    + + + QuirkRecordChanged + rjwquirks.Modules.Quirks.EventHandlers.RecordChangedRjwEventHandler + +
  • RecordChanged
  • +
    +
    + + + QuirkGenerator + rjwquirks.Modules.Quirks.EventHandlers.QuirkGenerator + +
  • PawnSexualized
  • +
    +
    + +
    \ No newline at end of file diff --git a/About/About.xml b/About/About.xml new file mode 100644 index 0000000..bd4a5d3 --- /dev/null +++ b/About/About.xml @@ -0,0 +1,34 @@ + + + + RJW Quirks + Rain + + +
  • 1.4
  • +
    + rain.quirks + +
  • + brrainz.harmony + Harmony + steam://url/CommunityFilePage/2009463077 + https://github.com/pardeike/HarmonyRimWorld/releases/latest +
  • +
    + +
  • rim.job.world
  • +
    + +
  • gregorycurrie.AnimalGenetics
  • +
  • EdB.PrepareCarefully
  • +
  • EdB.PrepareCarefully.UnofficialPatch
  • +
  • Dalrae.GaramRaceAddon
  • +
  • IGNI.LostForest
  • +
  • Sierra.RT.MedievalTalents
  • +
  • com.yayo.raceQuestPawn
  • +
    + +big peepee sim + +
    diff --git a/RJW-Quirks/Core.cs b/RJW-Quirks/Core.cs new file mode 100644 index 0000000..a4abaac --- /dev/null +++ b/RJW-Quirks/Core.cs @@ -0,0 +1,18 @@ +using HarmonyLib; +using HugsLib; +using Verse; + +namespace rjwquirks +{ + public class Core : ModBase + { + // Originally did not use Hugslib, but due to RJW using hugslib I needed to in order for proper patching at correct times. could probably be done with priorities or something but this was easier + /*public Core(ModContentPack pack) + { + //var harmony = new Harmony("rain.quirks"); + //harmony.PatchAll(); + }*/ + + public override string ModIdentifier => "quirk"; + } +} diff --git a/RJW-Quirks/Data/RaceTags.cs b/RJW-Quirks/Data/RaceTags.cs new file mode 100644 index 0000000..bd5cde5 --- /dev/null +++ b/RJW-Quirks/Data/RaceTags.cs @@ -0,0 +1,64 @@ +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.Data +{ + public class RaceTags + { + private readonly static Dictionary tagDatabase = new Dictionary(); + + // I only created tags for RaceGroupDef properties that seemed like keywords (like slime) rather than behavior (like oviPregnancy). + public readonly static RaceTags Chitin = new RaceTags("Chitin"); + public readonly static RaceTags Demon = new RaceTags("Demon"); + public readonly static RaceTags Feathers = new RaceTags("Feathers"); + public readonly static RaceTags Fur = new RaceTags("Fur"); + public readonly static RaceTags Plant = new RaceTags("Plant"); + public readonly static RaceTags Robot = new RaceTags("Robot"); + public readonly static RaceTags Scales = new RaceTags("Scales"); + public readonly static RaceTags Skin = new RaceTags("Skin"); + public readonly static RaceTags Slime = new RaceTags("Slime"); + + + public string Key { get; } + + private RaceTags(string key) + { + Key = key; + tagDatabase.Add(key, this); + } + + public static bool TryParse(string key, out RaceTags raceTag) + { + return tagDatabase.TryGetValue(key, out raceTag); + } + + /// + /// For backwards compatability only. Shouldn't add more special cases here. + /// + public bool DefaultWhenNoRaceGroupDef(Pawn pawn) + { + if (this == Demon) + { + return xxx.is_demon(pawn); + } + else if (this == Slime) + { + return xxx.is_slime(pawn); + } + else if (this == Skin) + { + return true; + } + else + { + return false; + } + } + + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_CasualSex_Helper.cs b/RJW-Quirks/HarmonyPatches/Patch_CasualSex_Helper.cs new file mode 100644 index 0000000..57302ae --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_CasualSex_Helper.cs @@ -0,0 +1,74 @@ +using HarmonyLib; +using RimWorld; +using rjw; +using rjwquirks.Modules.Quirks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + [HarmonyPatch(typeof(CasualSex_Helper), nameof(CasualSex_Helper.GetScore))] + public class Patch_CasualSex_Helper + { + // Edits the "score" of a cell for a pawn to fuck in + public static void Postfix(Pawn pawn, IntVec3 cell, Pawn partner, ref int __result) + { + QuirkSet quirks = pawn.GetQuirks(); + + if (quirks.AllQuirks.EnumerableNullOrEmpty()) + return; + + List all_pawns = pawn.Map.mapPawns.AllPawnsSpawned.Where(x + => x.Position.DistanceTo(pawn.Position) < 100 + && xxx.is_human(x) + && x != pawn + && x != partner + ).ToList(); + + // Somnophile code + if (partner != null && quirks.Contains(QuirkDefOf.Somnophile)) + { + if (all_pawns.Any(x + => !x.Awake() + && x.Position.DistanceTo(cell) < 6 + && GenSight.LineOfSight(cell, x.Position, pawn.Map) + )) + __result += 50; + } + + // Exhibitionist code + if (quirks.Contains(QuirkDefOf.Exhibitionist)) + { + bool might_be_seen = CasualSex_Helper.MightBeSeen(all_pawns, cell, pawn, partner); + Room room = cell.GetRoom(pawn.Map); + + // Readd the 30 score removed in regular RJW + __result += 30; + // Readd the 100 score taken from being in a doorway in regular RJW + __result += 100; + + if (might_be_seen) + __result += 5; + else + __result -= 10; + + if (room.Role == RoomRoleDefOf.Barracks || room.Role == RoomRoleDefOf.PrisonBarracks || room.Role == RoomRoleDefOf.PrisonCell + || room.Role == RoomRoleDefOf.Laboratory || room.Role == RoomRoleDefOf.RecRoom + || room.Role == RoomRoleDefOf.DiningRoom || room.Role == RoomRoleDefOf.Hospital + ) + __result += 15; // Add 15 instead of 10 to counteract the -5 in regular RJW + + Dictionary cell_doors = new Dictionary(); + + var doors = cell_doors.TryGetValue(room.ID); + + if (doors > 1) + __result += 7 * doors; // Multiply by 7 instead of 2 to counteract the negative in regular RJW + } + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_CondomUtility.cs b/RJW-Quirks/HarmonyPatches/Patch_CondomUtility.cs new file mode 100644 index 0000000..3f3add0 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_CondomUtility.cs @@ -0,0 +1,37 @@ +using HarmonyLib; +using rjw; +using rjwquirks.Modules.Quirks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + // Skips condom code entirely if they have pregnation fetish or similar. RJW used to do this with the same quirk. + [HarmonyPatch(typeof(CondomUtility))] + public class Patch_CondomUtility + { + [HarmonyPrefix] + [HarmonyPatch(nameof(CondomUtility.TryUseCondom))] + public static bool UseCondomPrefix(Pawn pawn) + { + if (xxx.is_human(pawn) && pawn.HasQuirk(QuirkDefOf.ImpregnationFetish)) + return false; + + return true; + } + + [HarmonyPrefix] + [HarmonyPatch(nameof(CondomUtility.GetCondomFromRoom))] + public static bool GetCondomPrefix(Pawn pawn) + { + if (xxx.is_human(pawn) && pawn.HasQuirk(QuirkDefOf.ImpregnationFetish)) + return false; + + return true; + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_Dialog_Sexcard.cs b/RJW-Quirks/HarmonyPatches/Patch_Dialog_Sexcard.cs new file mode 100644 index 0000000..0e54611 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_Dialog_Sexcard.cs @@ -0,0 +1,131 @@ +using HarmonyLib; +using rjw; +using rjwquirks.Modules.Quirks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + [HarmonyPatch(typeof(Dialog_Sexcard), "SexualityCard")] + public static class Patch_Dialog_Sexcard + { + static IEnumerable Transpiler(IEnumerable instructions) + { + MethodInfo InsertQuirks = AccessTools.Method(typeof(Patch_Dialog_Sexcard), nameof(DrawQuirks)); + MethodInfo DrawSexuality = AccessTools.Method(typeof(Dialog_Sexcard), "DrawSexuality"); + bool found = false; + + // When RJW calls draw sexuality we inject our quirk drawing. + foreach (CodeInstruction i in instructions) + { + if (i.opcode == OpCodes.Call && i.operand as MethodInfo == DrawSexuality) + found = true; + + if (found) + { + yield return new CodeInstruction(OpCodes.Ldarg_2); + yield return new CodeInstruction(OpCodes.Ldloc_3); + yield return new CodeInstruction(OpCodes.Call, InsertQuirks); + found = false; + } + + yield return i; + } + } + + public static void DrawQuirks(Pawn pawn, Rect rect) + { + QuirkSet quirks = pawn.GetQuirks(); + rect.y += 24; + + if (quirks == null) + return; + + var quirkString = quirks.AllQuirks + .Select(quirk => quirk.Label) + .OrderBy(Label => Label) + .ToCommaList(); + + if ((Current.ProgramState == ProgramState.Playing && + pawn.IsDesignatedHero() && pawn.IsHeroOwner() || Prefs.DevMode) || + Current.ProgramState == ProgramState.Entry) + { + if (Widgets.ButtonText(rect, "Quirks".Translate() + quirkString, false)) + DrawQuirkEditMenu(pawn, quirks); + } + else + Widgets.Label(rect, "Quirks".Translate() + quirkString); + + if (!Mouse.IsOver(rect)) return; + + Widgets.DrawHighlight(rect); + + TooltipHandler.TipRegion(rect, quirks.TipString()); + } + + static void DrawQuirkEditMenu(Pawn pawn, QuirkSet quirks) + { + var quirkDefsAll = DefDatabase.AllDefs.OrderBy(def => def.GetLabelFor(pawn)); + + var menuOptions = new List(); + + if (RJWSettings.DevMode) + menuOptions.Add(new FloatMenuOption("[DEV] Forced Reset", () => quirks.Clear(true))); + + menuOptions.Add(new FloatMenuOption("Reset", () => quirks.Clear())); + + foreach (QuirkDef quirkDef in quirkDefsAll) + { + if (quirkDef.hidden && !RJWSettings.DevMode && !quirks.Contains(quirkDef)) + continue; + + Quirk quirk = quirks.GetQuirk(quirkDef); + FloatMenuOption option; + + if (quirk == null) + { + AcceptanceReport report = quirks.CanBeAdded(quirkDef); + if (report.Accepted) + { + option = new FloatMenuOption( + quirkDef.GetLabelFor(pawn), + () => quirks.AddQuirk(quirkDef), + mouseoverGuiAction: (Rect rect) => TooltipHandler.TipRegion(rect, quirkDef.GetDescriptionFor(pawn)) + ); + } + else if (RJWSettings.DevMode) + option = new FloatMenuOption($"[DEV]{quirkDef.GetLabelFor(pawn)}: {report.Reason}", () => quirks.AddQuirk(quirkDef, true)); + else + // Game does not call mouseoverGuiAction for the disabled entries + option = new FloatMenuOption($"{quirkDef.GetLabelFor(pawn)}: {report.Reason}", null); + } + else + { + AcceptanceReport report = quirks.CanBeRemoved(quirkDef); + if (report.Accepted) + { + option = new FloatMenuOption( + "- " + quirk.Label, + () => quirks.RemoveQuirk(quirk), + mouseoverGuiAction: (Rect rect) => TooltipHandler.TipRegion(rect, quirk.Description) + ); + } + else if (RJWSettings.DevMode) + option = new FloatMenuOption($"- {quirk.Label}: {report.Reason}", () => quirks.RemoveQuirk(quirk, true)); + else + option = new FloatMenuOption($"- {quirk.Label}: {report.Reason}", null); + } + + menuOptions.Add(option); + } + Find.WindowStack.Add(new FloatMenu(menuOptions)); + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_DrawNude.cs b/RJW-Quirks/HarmonyPatches/Patch_DrawNude.cs new file mode 100644 index 0000000..b227131 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_DrawNude.cs @@ -0,0 +1,24 @@ +using HarmonyLib; +using rjw; +using rjwquirks.Modules.Quirks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + [HarmonyPatch(typeof(SexUtility), nameof(SexUtility.DrawNude))] + public class Patch_DrawNude + { + public static bool Prefix(Pawn pawn) + { + if (pawn.HasQuirk(QuirkDefOf.Endytophile)) + return false; + + return true; + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_Hediff_BasePregnancy.cs b/RJW-Quirks/HarmonyPatches/Patch_Hediff_BasePregnancy.cs new file mode 100644 index 0000000..c5268a4 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_Hediff_BasePregnancy.cs @@ -0,0 +1,35 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + /*[HarmonyPatch(typeof(Hediff_BasePregnancy))] + public class Patch_Hediff_BasePregnancy + { + [HarmonyTranspiler] + [HarmonyPatch("GenerateBabies")] + public static IEnumerable AdjustMaxLitterSize(IEnumerable instructions) + { + bool found = false; + + foreach (CodeInstruction i in instructions) + { + if (i.opcode == OpCodes.Ldc_R4 && i.operand as string == "0.33333334") + found = true; + + if (found && i.opcode == OpCodes.Stloc_S) + Log.Warning(i.operand as string); + + + yield return i; + } + } + }*/ +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseArtifical.cs b/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseArtifical.cs new file mode 100644 index 0000000..b10bc50 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseArtifical.cs @@ -0,0 +1,43 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + [HarmonyPatch(typeof(Hediff_PartBaseArtifical))] + public class Patch_Hediff_PartBaseArtifical + { + [HarmonyTranspiler] + [HarmonyPatch(nameof(Hediff_PartBaseArtifical.Tick))] + public static IEnumerable ChangeMaxEggsSize(IEnumerable instructions) + { + FieldInfo Pawn = AccessTools.Field(typeof(Hediff_PartBaseArtifical), nameof(Hediff_PartBaseArtifical.pawn)); + MethodInfo EggSize = AccessTools.Method(typeof(Patch_Hediff_PartBaseArtifical), nameof(EditMaxEggsSize)); + + foreach (CodeInstruction i in instructions) + { + if (i.opcode == OpCodes.Ldc_R4 && i.operand as string == "0.0") + { + yield return new CodeInstruction(OpCodes.Ldfld, Pawn); + yield return new CodeInstruction(OpCodes.Ldloc_3); + yield return new CodeInstruction(OpCodes.Call, EggSize); + } + + yield return i; + } + } + + public static void EditMaxEggsSize(Pawn pawn, float eggsSize) + { + if (pawn.GetQuirks() != null) + pawn.GetQuirks().ApplyValueModifiers("maxEggsSize", ref eggsSize); + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseNatural.cs b/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseNatural.cs new file mode 100644 index 0000000..9818e11 --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_Hediff_PartBaseNatural.cs @@ -0,0 +1,47 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace rjwquirks.HarmonyPatches +{ + [HarmonyPatch(typeof(Hediff_PartBaseNatural))] + public class Patch_Hediff_PartBaseNatural + { + [HarmonyTranspiler] + [HarmonyPatch(nameof(Hediff_PartBaseNatural.Tick))] + public static IEnumerable ChangeMaxEggsSize(IEnumerable instructions) + { + FieldInfo Pawn = AccessTools.Field(typeof(Hediff_PartBaseNatural), nameof(Hediff_PartBaseNatural.pawn)); + MethodInfo EggSize = AccessTools.Method(typeof(Patch_Hediff_PartBaseNatural), nameof(EditMaxEggsSize)); + bool found = false; + + foreach (CodeInstruction i in instructions) + { + if (i.opcode == OpCodes.Ldc_R4 && i.operand as string == "0.0" && found) + { + yield return new CodeInstruction(OpCodes.Ldfld, Pawn); + yield return new CodeInstruction(OpCodes.Ldloc_3); + yield return new CodeInstruction(OpCodes.Call, EggSize); + } + + if (i.opcode == OpCodes.Ldc_R4 && i.operand as string == "0.0") + found = true; + + yield return i; + } + } + + public static void EditMaxEggsSize(Pawn pawn, float eggsSize) + { + if (pawn.GetQuirks() != null) + pawn.GetQuirks().ApplyValueModifiers("maxEggsSize", ref eggsSize); + } + } +} diff --git a/RJW-Quirks/HarmonyPatches/Patch_JobGiver_Masturbate.cs b/RJW-Quirks/HarmonyPatches/Patch_JobGiver_Masturbate.cs new file mode 100644 index 0000000..03ae20a --- /dev/null +++ b/RJW-Quirks/HarmonyPatches/Patch_JobGiver_Masturbate.cs @@ -0,0 +1,59 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Verse; +using rjwquirks.Modules.Quirks; + +namespace rjwquirks.HarmonyPatches +{ + /*[HarmonyPatch(typeof(JobGiver_Masturbate))] + public class Patch_JobGiver_Masturbate + { + [HarmonyTranspiler] + [HarmonyPatch("TryGiveJob")] + public static IEnumerable ApplyQuirkToMasturbate(IEnumerable instructions) + { + MethodInfo Frustrated = AccessTools.Method(typeof(xxx), nameof(xxx.is_frustrated)); + MethodInfo Apply = AccessTools.Method(typeof(Patch_JobGiver_Masturbate), nameof(ApplyQuirk)); + var labels = instructions.ElementAt(0).labels.ListFullCopy