2023-01-20 07:40:09 +00:00
using System.Collections.Generic ;
2022-12-25 11:38:05 +00:00
using Verse ;
using RimWorld ;
namespace RJW_Genes
{
public class Gene_Aphrodisiac_Pheromones : Gene
{
2022-12-27 13:54:47 +00:00
2023-01-20 07:40:09 +00:00
// Summary: once every one hour check for all pawns nearby and in line of sight (same room) and add/renew a hediff which lasts for 1 hour.
2022-12-25 11:38:05 +00:00
public override void Tick ( )
{
base . Tick ( ) ;
2023-01-16 12:14:13 +00:00
if ( this . pawn . IsHashIntervalTick ( 2500 ) & & this . pawn . Map ! = null )
2022-12-25 11:38:05 +00:00
{
2023-01-20 07:40:09 +00:00
// Only spread pheromones if sexdrive above 1
2023-01-06 11:42:04 +00:00
float sexfrequency = this . pawn . GetStatValue ( StatDef . Named ( "SexFrequency" ) ) ;
if ( sexfrequency > 1f )
{
foreach ( Pawn pawn in this . AffectedPawns ( this . pawn . Position , this . pawn . Map ) )
{
this . InduceAphrodisiac ( pawn , sexfrequency ) ;
}
}
2022-12-25 11:38:05 +00:00
}
}
2023-01-20 07:40:09 +00:00
// Creates an IEnumerable of all pawns which are closeby and in lineofsight, self and other pawns with aphrodisiac pheromones gene are skipped (to prevent loops).
2022-12-25 11:38:05 +00:00
private IEnumerable < Pawn > AffectedPawns ( IntVec3 pos , Map map )
{
foreach ( Pawn pawn in map . mapPawns . AllPawns )
{
2023-01-20 07:40:09 +00:00
if ( pawn ! = null & & this . pawn ! = null & & pawn ! = this . pawn
& & pos . DistanceTo ( pawn . Position ) < 5 & & GenSight . LineOfSight ( pos , pawn . Position , pawn . Map )
& & ! GeneUtility . HasGeneNullCheck ( pawn , GeneDefOf . rjw_genes_aphrodisiac_pheromones ) )
2022-12-25 11:38:05 +00:00
{
yield return pawn ;
}
}
2023-01-20 07:40:09 +00:00
2022-12-25 11:38:05 +00:00
yield break ;
}
2023-01-20 07:40:09 +00:00
// Applies or renews a hediff which increases sexdrive for 6 hours
2023-01-06 11:42:04 +00:00
private void InduceAphrodisiac ( Pawn pawn , float sexfrequency )
2022-12-25 11:38:05 +00:00
{
2023-01-17 07:56:26 +00:00
Hediff hediff = pawn . health . hediffSet . GetFirstHediffOfDef ( HediffDefOf . rjw_genes_aphrodisiac_pheromone ) ;
2023-01-06 11:42:04 +00:00
2022-12-25 11:38:05 +00:00
if ( hediff ! = null )
{
hediff . Severity = 1f ;
}
else
{
2023-01-17 07:56:26 +00:00
Hediff aphrodisiac = HediffMaker . MakeHediff ( HediffDefOf . rjw_genes_aphrodisiac_pheromone , pawn ) ;
2023-01-06 11:42:04 +00:00
foreach ( StatModifier stat in aphrodisiac . CurStage . statFactors )
{
if ( stat . stat . defName = = "SexFrequency" )
{
stat . value = ModifySexfrequency ( pawn , sexfrequency ) ;
pawn . health . AddHediff ( aphrodisiac ) ;
}
}
2022-12-25 11:38:05 +00:00
}
}
2023-01-06 11:42:04 +00:00
2023-01-20 07:40:09 +00:00
// Function to modify aphrodisiac strength, currently has no effect, but provides an easy hook for other modders and patches.
2023-01-06 11:42:04 +00:00
public float ModifySexfrequency ( Pawn pawn , float sexfrequency )
{
return sexfrequency ;
}
2022-12-25 11:38:05 +00:00
}
}