2022-06-05 05:37:57 +00:00
using HarmonyLib ;
2021-08-13 15:23:12 +00:00
using RimWorld ;
2022-06-05 05:37:57 +00:00
using rjw ;
using rjw.Modules.Interactions.Internals.Implementation ;
2021-11-25 20:22:33 +00:00
using rjw.Modules.Interactions.Objects ;
2022-06-19 13:26:35 +00:00
using RJWSexperience.Ideology.Precepts ;
2022-06-05 05:37:57 +00:00
using System ;
using Verse ;
2021-08-13 15:23:12 +00:00
namespace RJWSexperience.Ideology
{
2022-06-05 05:37:57 +00:00
public static class RJWUtility_Ideo
{
public static HistoryEvent TaggedEvent ( this HistoryEventDef def , Pawn pawn , string tag , Pawn partner )
{
return new HistoryEvent ( def , pawn . Named ( HistoryEventArgsNames . Doer ) , tag . Named ( HistoryEventArgsNamesCustom . Tag ) , partner . Named ( HistoryEventArgsNamesCustom . Partner ) ) ;
}
public static Faction GetFactionUsingPrecept ( this Pawn baby , out Ideo ideo )
{
Faction playerfaction = Find . FactionManager . OfPlayer ;
Ideo mainideo = playerfaction . ideos . PrimaryIdeo ;
if ( mainideo ! = null )
{
if ( mainideo . HasPrecept ( VariousDefOf . BabyFaction_AlwaysFather ) )
{
Pawn parent = baby . GetFather ( ) ? ? baby . GetMother ( ) ;
ideo = parent . Ideo ;
return parent . Faction ;
}
else if ( mainideo . HasPrecept ( VariousDefOf . BabyFaction_AlwaysColony ) )
{
ideo = mainideo ;
return playerfaction ;
}
}
Pawn mother = baby . GetMother ( ) ;
ideo = mother ? . Ideo ;
return mother ? . Faction ? ? baby . Faction ;
}
}
[HarmonyPatch(typeof(xxx), "is_rapist")]
public static class RJW_Patch_is_rapist
{
public static void Postfix ( Pawn pawn , ref bool __result )
{
Ideo ideo = pawn . Ideo ;
if ( ideo ! = null & & ! pawn . IsSubmissive ( ) )
{
__result = __result | | ideo . HasMeme ( VariousDefOf . Rapist ) ;
}
}
}
[HarmonyPatch(typeof(xxx), "is_zoophile")]
public static class RJW_Patch_is_zoophile
{
public static void Postfix ( Pawn pawn , ref bool __result )
{
Ideo ideo = pawn . Ideo ;
if ( ideo ! = null )
{
__result = __result | | ideo . HasMeme ( VariousDefOf . Zoophile ) ;
}
}
}
[HarmonyPatch(typeof(xxx), "is_necrophiliac")]
public static class RJW_Patch_is_necrophiliac
{
public static void Postfix ( Pawn pawn , ref bool __result )
{
Ideo ideo = pawn . Ideo ;
if ( ideo ! = null )
{
__result = __result | | ideo . HasMeme ( VariousDefOf . Necrophile ) ;
}
}
}
[HarmonyPatch(typeof(SexUtility), "Aftersex", new Type[] { typeof ( SexProps ) } ) ]
public static class RJW_Patch_Aftersex
{
public static void Postfix ( SexProps props )
{
Pawn pawn = props . pawn ;
Pawn partner = props . partner ;
if ( partner ! = null )
{
2022-06-19 18:49:17 +00:00
if ( xxx . is_human ( pawn ) ) AfterSexHuman ( pawn , partner , props . isRape , props . sexType ) ;
else if ( xxx . is_human ( partner ) ) AfterSexHuman ( partner , pawn , false , props . sexType , true ) ;
2022-06-05 05:37:57 +00:00
}
}
public static void AfterSexHuman ( Pawn human , Pawn partner , bool rape , xxx . rjwSextype sextype , bool isHumanReceiving = false )
{
string tag = "" ;
if ( IdeoUtility . IsIncest ( human , partner ) )
{
tag + = HETag . Incestous ;
}
if ( partner . Dead )
{
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . SexWithCorpse . TaggedEvent ( human , tag + HETag . Gender ( human ) , partner ) ) ;
}
else if ( partner . IsAnimal ( ) )
{
if ( isHumanReceiving & & rape )
{
if ( human . IsSlave ) RapeEffectSlave ( human ) ;
if ( human . Ideo ? . IsVeneratedAnimal ( partner ) ? ? false ) Find . HistoryEventsManager . RecordEvent ( VariousDefOf . SexWithVeneratedAnimal . TaggedEvent ( human , tag + HETag . BeenRaped + HETag . Gender ( human ) , partner ) ) ;
else Find . HistoryEventsManager . RecordEvent ( VariousDefOf . SexWithAnimal . TaggedEvent ( human , tag + HETag . BeenRaped + HETag . Gender ( human ) , partner ) ) ;
}
else
{
if ( human . Ideo ? . IsVeneratedAnimal ( partner ) ? ? false ) Find . HistoryEventsManager . RecordEvent ( VariousDefOf . SexWithVeneratedAnimal . TaggedEvent ( human , tag + HETag . Gender ( human ) , partner ) ) ;
else Find . HistoryEventsManager . RecordEvent ( VariousDefOf . SexWithAnimal . TaggedEvent ( human , tag + HETag . Gender ( human ) , partner ) ) ;
}
}
else if ( xxx . is_human ( partner ) )
{
if ( rape )
{
if ( partner . IsSlave )
{
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . RapedSlave . TaggedEvent ( human , tag + HETag . Rape + HETag . Gender ( human ) , partner ) ) ;
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . WasRapedSlave . TaggedEvent ( partner , tag + HETag . BeenRaped + HETag . Gender ( partner ) , human ) ) ;
RapeEffectSlave ( partner ) ;
}
else if ( partner . IsPrisoner )
{
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . RapedPrisoner . TaggedEvent ( human , tag + HETag . Rape + HETag . Gender ( human ) , partner ) ) ;
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . WasRapedPrisoner . TaggedEvent ( partner , tag + HETag . BeenRaped + HETag . Gender ( partner ) , human ) ) ;
partner . guest . will = Math . Max ( 0 , partner . guest . will - 0.2f ) ;
}
else
{
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . Raped . TaggedEvent ( human , tag + HETag . Rape + HETag . Gender ( human ) , partner ) ) ;
Find . HistoryEventsManager . RecordEvent ( VariousDefOf . WasRaped . TaggedEvent ( partner , tag + HETag . BeenRaped + HETag . Gender ( partner ) , human ) ) ;
}
}
else
{
HistoryEventDef sexevent = GetSexHistoryDef ( sextype ) ;
if ( sexevent ! = null )
{
Find . HistoryEventsManager . RecordEvent ( sexevent . TaggedEvent ( human , tag + HETag . Gender ( human ) , partner ) ) ;
Find . HistoryEventsManager . RecordEvent ( sexevent . TaggedEvent ( partner , tag + HETag . Gender ( partner ) , human ) ) ;
}
}
}
}
public static void RapeEffectSlave ( Pawn victim )
{
Need_Suppression suppression = victim . needs . TryGetNeed < Need_Suppression > ( ) ;
if ( suppression ! = null )
{
Hediff broken = victim . health . hediffSet . GetFirstHediffOfDef ( xxx . feelingBroken ) ;
if ( broken ! = null ) suppression . CurLevel + = ( 0.3f * broken . Severity ) + 0.05f ;
else suppression . CurLevel + = 0.05f ;
}
}
/// <summary>
/// only for non-violate human sex
/// </summary>
/// <param name="sextype"></param>
/// <returns></returns>
public static HistoryEventDef GetSexHistoryDef ( xxx . rjwSextype sextype )
{
switch ( sextype )
{
case xxx . rjwSextype . None :
case xxx . rjwSextype . MechImplant :
default :
return null ;
case xxx . rjwSextype . Vaginal :
return VariousDefOf . VaginalSex ;
case xxx . rjwSextype . Anal :
case xxx . rjwSextype . Rimming :
return VariousDefOf . AnalSex ;
case xxx . rjwSextype . Oral :
case xxx . rjwSextype . Fellatio :
case xxx . rjwSextype . Cunnilingus :
return VariousDefOf . OralSex ;
case xxx . rjwSextype . Masturbation :
case xxx . rjwSextype . Boobjob :
case xxx . rjwSextype . Handjob :
case xxx . rjwSextype . Footjob :
case xxx . rjwSextype . Fingering :
case xxx . rjwSextype . MutualMasturbation :
return VariousDefOf . MiscSex ;
case xxx . rjwSextype . DoublePenetration :
case xxx . rjwSextype . Scissoring :
case xxx . rjwSextype . Fisting :
case xxx . rjwSextype . Sixtynine :
return VariousDefOf . PromiscuousSex ;
}
}
}
/// <summary>
/// Set prefer sextype using precepts
/// </summary>
2022-06-18 18:48:30 +00:00
[HarmonyPatch(typeof(InteractionScoringService), nameof(InteractionScoringService.Score), new Type[] { typeof ( InteractionWithExtension ) , typeof ( InteractionPawn ) , typeof ( InteractionPawn ) } ) ]
2022-06-05 05:37:57 +00:00
public static class RJW_Patch_DetermineSexScores
{
2022-06-18 18:48:30 +00:00
public static void Postfix ( InteractionWithExtension interaction , InteractionPawn dominant , InteractionPawn submissive , ref InteractionScore __result )
2022-06-05 05:37:57 +00:00
{
2022-06-18 18:48:30 +00:00
Ideo ideo = dominant . Pawn . Ideo ;
2022-06-19 18:49:17 +00:00
if ( ideo ! = null )
__result . Dominant = PreceptSextype ( ideo , dominant . Pawn . GetStatValue ( xxx . sex_drive_stat ) , __result . Dominant , interaction ) ;
2022-06-05 05:37:57 +00:00
2022-06-18 18:48:30 +00:00
ideo = submissive . Pawn . Ideo ;
2022-06-19 18:49:17 +00:00
if ( ideo ! = null )
__result . Submissive = PreceptSextype ( ideo , submissive . Pawn . GetStatValue ( xxx . sex_drive_stat ) , __result . Submissive , interaction ) ;
2022-06-05 05:37:57 +00:00
}
2022-06-18 18:48:30 +00:00
public static float PreceptSextype ( Ideo ideo , float sexdrive , float score , InteractionWithExtension interaction )
2022-06-05 05:37:57 +00:00
{
2022-06-19 12:40:38 +00:00
for ( int i = 0 ; i < ideo . PreceptsListForReading . Count ; i + + )
{
2022-06-19 13:26:35 +00:00
if ( ideo . PreceptsListForReading [ i ] . def . GetModExtension < DefExtension_PreferSextype > ( ) ? . HasSextype ( interaction . Extension . rjwSextype ) = = true )
2022-06-19 12:40:38 +00:00
{
float mult = 8.0f * Math . Max ( 0.3f , 1 / Math . Max ( 0.01f , sexdrive ) ) ;
return score * mult ;
}
}
return score ;
2022-06-05 05:37:57 +00:00
}
}
2022-06-19 12:40:38 +00:00
[HarmonyPatch(typeof(SexAppraiser), nameof(SexAppraiser.would_fuck), new Type[] { typeof ( Pawn ) , typeof ( Pawn ) , typeof ( bool ) , typeof ( bool ) , typeof ( bool ) } ) ]
2022-06-05 05:37:57 +00:00
public static class RJW_Patch_would_fuck
{
2022-06-19 12:40:38 +00:00
public static void Postfix ( Pawn fucker , Pawn fucked , ref float __result )
2022-06-05 05:37:57 +00:00
{
2022-06-19 12:40:38 +00:00
if ( ! xxx . is_human ( fucker ) )
return ;
Ideo ideo = fucker . Ideo ;
if ( ideo = = null )
return ;
for ( int i = 0 ; i < ideo . PreceptsListForReading . Count ; i + + )
2022-06-19 13:26:35 +00:00
ideo . PreceptsListForReading [ i ] . def . GetModExtension < DefExtension_ModifyPreference > ( ) ? . Apply ( fucker , fucked , ref __result ) ;
2022-06-05 05:37:57 +00:00
}
}
[HarmonyPatch(typeof(PawnDesignations_Breedee), "UpdateCanDesignateBreeding")]
public static class RJW_Patch_UpdateCanDesignateBreeding
{
public static void Postfix ( Pawn pawn , ref bool __result )
{
Ideo ideo = pawn . Ideo ;
if ( ideo ? . HasMeme ( VariousDefOf . Zoophile ) = = true )
{
SaveStorage . DataStore . GetPawnData ( pawn ) . CanDesignateBreeding = true ;
__result = true ;
}
}
}
[HarmonyPatch(typeof(PawnDesignations_Comfort), "UpdateCanDesignateComfort")]
public static class RJW_PatchUpdateCanDesignateComfort
{
public static void Postfix ( Pawn pawn , ref bool __result )
{
if ( pawn . IsSubmissive ( ) )
{
SaveStorage . DataStore . GetPawnData ( pawn ) . CanDesignateComfort = true ;
__result = true ;
}
}
}
[HarmonyPatch(typeof(Hediff_BasePregnancy), "PostBirth")]
public static class RJW_Patch_PostBirth
{
public static void Postfix ( Pawn mother , Pawn father , Pawn baby )
{
if ( ! mother . IsAnimal ( ) )
{
Faction faction = baby . GetFactionUsingPrecept ( out Ideo ideo ) ;
if ( baby . Faction ! = faction ) baby . SetFaction ( faction ) ;
baby . ideo ? . SetIdeo ( ideo ) ;
if ( baby . Faction = = Find . FactionManager . OfPlayer & & ! baby . IsSlave ) baby . guest ? . SetGuestStatus ( null , GuestStatus . Guest ) ;
}
}
}
2021-08-13 15:23:12 +00:00
}