2022-11-26 20:32:32 +00:00
|
|
|
|
using System;
|
2023-01-15 08:18:04 +00:00
|
|
|
|
using System.Collections.Generic;
|
2022-11-26 20:32:32 +00:00
|
|
|
|
using Verse;
|
2022-12-28 12:37:27 +00:00
|
|
|
|
using RimWorld;
|
2022-11-20 19:53:05 +00:00
|
|
|
|
namespace RJW_Genes
|
|
|
|
|
{
|
|
|
|
|
public class GeneUtility
|
|
|
|
|
{
|
2023-01-17 07:56:26 +00:00
|
|
|
|
|
2023-01-08 14:51:07 +00:00
|
|
|
|
//Split function so I can offsetlifeforce from gene without needing to look for the gene agian (for the constant drain tick)
|
|
|
|
|
public static Gene_LifeForce GetLifeForceGene(Pawn pawn)
|
2022-12-28 12:37:27 +00:00
|
|
|
|
{
|
2023-01-09 13:14:51 +00:00
|
|
|
|
Pawn_GeneTracker genes = pawn.genes;
|
|
|
|
|
Gene_LifeForce gene_LifeForce = genes.GetFirstGeneOfType<Gene_LifeForce>();
|
2023-01-08 14:51:07 +00:00
|
|
|
|
return gene_LifeForce;
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-09 13:14:51 +00:00
|
|
|
|
public static void OffsetLifeForce(IGeneResourceDrain drain, float offset)
|
|
|
|
|
{
|
|
|
|
|
float old_value = drain.Resource.Value;
|
|
|
|
|
drain.Resource.Value += offset;
|
2023-01-17 15:44:08 +00:00
|
|
|
|
PostOffSetLifeForce(drain, old_value);
|
2023-01-08 14:51:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-09 13:14:51 +00:00
|
|
|
|
public static void PostOffSetLifeForce(IGeneResourceDrain drain, float old_value)
|
2023-01-08 14:51:07 +00:00
|
|
|
|
{
|
2023-01-09 13:14:51 +00:00
|
|
|
|
if (old_value > 0.2f && drain.Resource.Value <= 0.2f)
|
2023-01-17 15:44:08 +00:00
|
|
|
|
{
|
2023-01-20 07:40:09 +00:00
|
|
|
|
//TODO: Mood debuff
|
2023-01-17 15:44:08 +00:00
|
|
|
|
}
|
|
|
|
|
else if (old_value > 0f && drain.Resource.Value <= 0f)
|
2022-12-28 12:37:27 +00:00
|
|
|
|
{
|
2023-01-09 13:14:51 +00:00
|
|
|
|
Pawn pawn = drain.Pawn;
|
2023-01-17 15:44:08 +00:00
|
|
|
|
if (!drain.Pawn.health.hediffSet.HasHediff(HediffDefOf.rjw_genes_fertilin_craving))
|
|
|
|
|
{
|
|
|
|
|
drain.Pawn.health.AddHediff(HediffDefOf.rjw_genes_fertilin_craving);
|
|
|
|
|
}
|
2022-12-27 12:48:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-22 08:59:16 +00:00
|
|
|
|
|
2022-12-27 12:48:38 +00:00
|
|
|
|
public static bool HasLowLifeForce(Pawn pawn)
|
|
|
|
|
{
|
|
|
|
|
if (HasLifeForce(pawn))
|
|
|
|
|
{
|
2023-03-10 07:03:07 +00:00
|
|
|
|
Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType<Gene_LifeForce>();
|
|
|
|
|
if (gene == null || !gene.Active)
|
|
|
|
|
return false;
|
2022-12-27 12:48:38 +00:00
|
|
|
|
if (gene.Resource.Value < gene.targetValue)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool HasCriticalLifeForce(Pawn pawn)
|
|
|
|
|
{
|
|
|
|
|
if (HasLifeForce(pawn))
|
|
|
|
|
{
|
|
|
|
|
Gene_LifeForce gene = pawn.genes.GetFirstGeneOfType<Gene_LifeForce>();
|
2023-03-10 07:03:07 +00:00
|
|
|
|
if (gene == null || !gene.Active)
|
|
|
|
|
return false;
|
2022-12-27 12:48:38 +00:00
|
|
|
|
if (gene.Resource.Value < gene.MinLevelForAlert)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-20 19:53:05 +00:00
|
|
|
|
public static float MaxEggSizeMul(Pawn pawn)
|
|
|
|
|
{
|
|
|
|
|
float MaxEggSize = 1;
|
|
|
|
|
if (IsInsectIncubator(pawn))
|
|
|
|
|
{
|
|
|
|
|
MaxEggSize *= 2;
|
|
|
|
|
}
|
|
|
|
|
return MaxEggSize;
|
|
|
|
|
}
|
2023-01-15 08:50:29 +00:00
|
|
|
|
public static List<Gene_GenitaliaResizingGene> GetGenitaliaResizingGenes(Pawn pawn)
|
2023-01-15 08:18:04 +00:00
|
|
|
|
{
|
2023-01-15 08:50:29 +00:00
|
|
|
|
var ResizingGenes = new List<Gene_GenitaliaResizingGene>();
|
2023-01-15 08:18:04 +00:00
|
|
|
|
|
|
|
|
|
// Error Handling: Issue with Pawn or Genes return empty.
|
|
|
|
|
if (pawn == null || pawn.genes == null)
|
|
|
|
|
return ResizingGenes;
|
|
|
|
|
|
2023-01-15 08:50:29 +00:00
|
|
|
|
foreach (Gene gene in pawn.genes.GenesListForReading)
|
|
|
|
|
if (gene is Gene_GenitaliaResizingGene resizing_gene)
|
|
|
|
|
ResizingGenes.Add(resizing_gene);
|
2023-01-15 08:18:04 +00:00
|
|
|
|
|
|
|
|
|
return ResizingGenes;
|
|
|
|
|
}
|
2023-01-17 07:56:26 +00:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Unified small check for a pawn if it has a specified Gene.
|
|
|
|
|
/// Handles some errors and returns false as default.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pawn">The pawn for which to look up a gene.</param>
|
|
|
|
|
/// <param name="genedef">The gene to look up.</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static bool HasGeneNullCheck(Pawn pawn, GeneDef genedef)
|
|
|
|
|
{
|
|
|
|
|
if (pawn.genes == null)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return pawn.genes.HasGene(genedef);
|
|
|
|
|
}
|
2023-01-20 07:40:09 +00:00
|
|
|
|
|
2023-01-17 07:56:26 +00:00
|
|
|
|
public static bool HasLifeForce(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_lifeforce); }
|
|
|
|
|
public static bool IsMechbreeder(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_mechbreeder); }
|
|
|
|
|
public static bool IsInsectIncubator(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_insectincubator); }
|
|
|
|
|
public static bool IsYouthFountain(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_youth_fountain); }
|
|
|
|
|
public static bool IsAgeDrainer(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_sex_age_drain); }
|
|
|
|
|
public static bool IsInsectBreeder(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_insectbreeder); }
|
|
|
|
|
public static bool IsElastic(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_elasticity); }
|
|
|
|
|
public static bool IsCumflationImmune(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_cumflation_immunity); }
|
|
|
|
|
public static bool IsGenerousDonor(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_generous_donor); }
|
2023-01-20 07:40:09 +00:00
|
|
|
|
public static bool IsPussyHealer(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_pussyhealing); }
|
2023-01-17 07:56:26 +00:00
|
|
|
|
public static bool IsUnbreakable(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_unbreakable); }
|
2023-01-17 08:08:56 +00:00
|
|
|
|
public static bool HasParalysingKiss(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_paralysingkiss); }
|
|
|
|
|
public static bool HasSeduce(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_seduce); }
|
|
|
|
|
public static bool IsSexualDrainer(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_drainer); }
|
2023-01-22 08:59:16 +00:00
|
|
|
|
public static bool IsCumEater(Pawn pawn) { return HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_cum_eater); }
|
|
|
|
|
|
2022-11-20 19:53:05 +00:00
|
|
|
|
}
|
2023-03-10 07:03:07 +00:00
|
|
|
|
}
|