diff --git a/Common/Defs/AbilityDefs/Ability_ParalysingKiss.xml b/Common/Defs/AbilityDefs/Ability_ParalysingKiss.xml index 8fd3eec..e327973 100644 --- a/Common/Defs/AbilityDefs/Ability_ParalysingKiss.xml +++ b/Common/Defs/AbilityDefs/Ability_ParalysingKiss.xml @@ -8,7 +8,7 @@ true true false - + 5 Mote_CoagulateStencil diff --git a/Common/Defs/GeneDefs/GeneDefs_Hive.xml b/Common/Defs/GeneDefs/GeneDefs_Hive.xml index fa978fc..5b838eb 100644 --- a/Common/Defs/GeneDefs/GeneDefs_Hive.xml +++ b/Common/Defs/GeneDefs/GeneDefs_Hive.xml @@ -14,7 +14,9 @@ 0.25 -
  • + + +
  • 0.7 @@ -22,13 +24,13 @@ -0.5
  • - -
  • +
  • 0.4 0.2
  • +
  • rjw_genes_hive_caste
  • @@ -52,7 +54,7 @@
    -
  • +
  • 0.9 @@ -81,7 +83,7 @@ -
  • +
  • 0.7 @@ -89,7 +91,7 @@ -0.5
  • -
  • +
  • 0.7 @@ -97,7 +99,7 @@ -0.5
  • -
  • +
  • 1.2 1.2 diff --git a/Common/Defs/ThoughtDefs/Thoughts_Hive.xml b/Common/Defs/ThoughtDefs/Thoughts_Hive.xml new file mode 100644 index 0000000..b728812 --- /dev/null +++ b/Common/Defs/ThoughtDefs/Thoughts_Hive.xml @@ -0,0 +1,89 @@ + + + + + + + rjw_genes_rival_queen_mood + RJW_Genes.Thoughtworker_RivalQueen_Mood + false + +
  • + + There is another queen nearby! + -70 +
  • + + + + + + rjw_genes_rival_queen_social + Thought_SituationalSocial + RJW_Genes.Thoughtworker_RivalQueen_Social + +
  • + + {0} threatens my dominion. {0} must be perished. + -130 +
  • +
    +
    + + + + rjw_genes_multiple_queens_mood + RJW_Genes.Thoughtworker_MultipleQueens_Mood + false + +
  • + + I have too many queens around me! + -30 +
  • +
    +
    + + + + rjw_genes_queen_loyalty_social + Thought_SituationalSocial + RJW_Genes.Thoughtworker_QueenPresent_Social + +
  • + + {0} is my queen. My one and only reason to live. + +80 +
  • +
    +
    + + + + rjw_genes_no_queen_mood + RJW_Genes.Thoughtworker_QueenAbsent_Mood + false + +
  • + + We do not have a queen! How are we suppossed to face the cruelties of the world without a shepherd? + -20 +
  • +
    +
    + + + + rjw_genes_queen_present_mood + RJW_Genes.Thoughtworker_QueenPresent_Mood + false + +
  • + + Our queen is so wonderful. + +10 +
  • +
    +
    + + diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs index e4af81f..a364a16 100644 --- a/Source/GeneDefOf.cs +++ b/Source/GeneDefOf.cs @@ -92,6 +92,15 @@ namespace RJW_Genes public static readonly GeneDef rjw_genes_succubus_tail; public static readonly GeneDef rjw_genes_succubus_wings; + // Hive + public static readonly GeneDef rjw_genes_queen; + public static readonly GeneDef rjw_genes_drone; + public static readonly GeneDef rjw_genes_worker; + public static readonly GeneDef rjw_genes_zealous_loyalty; + public static readonly GeneDef rjw_genes_cocoonweaver; + public static readonly GeneDef rjw_genes_spawn_spelopede; + + //Other Defs public static readonly XenotypeDef rjw_genes_succubus; public static readonly DutyDef rjw_genes_flirt; diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs index bf68255..1e66488 100644 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs +++ b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_MultipleQueens.cs @@ -19,8 +19,15 @@ namespace RJW_Genes public override bool Applies(StatRequest req) { - // => ModsConfig.BiotechActive && req.HasThing && req.Thing.Spawned && req.Thing.Position.InSunlight(req.Thing.Map); - throw new NotImplementedException(); + if (req.Pawn == null || !req.Pawn.Spawned) + return false; + + if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty)) + { + return HiveUtility.QueensOnMap() >= 2; + } + + return false; } } } diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs index e0bb7e1..512ac13 100644 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs +++ b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenAbsent.cs @@ -19,8 +19,15 @@ namespace RJW_Genes public override bool Applies(StatRequest req) { - //ModsConfig.BiotechActive && req.HasThing && req.Thing.Spawned && req.Thing.Position.InSunlight(req.Thing.Map); - throw new NotImplementedException(); + if (req.Pawn == null || !req.Pawn.Spawned) + return false; + + if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty)) + { + return HiveUtility.QueensOnMap() == 0; + } + + return false; } } } diff --git a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs index 7e9087d..4e3bdff 100644 --- a/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs +++ b/Source/Genes/Hive/Genes/ConditionalStatAffecters/ConditionalStatAffecter_QueenCloseBy.cs @@ -17,12 +17,36 @@ namespace RJW_Genes /// public class ConditionalStatAffecter_QueenCloseBy : ConditionalStatAffecter { + + const float EFFECT_DISTANCE = 10.0f; + public override string Label => (string)"StatsReport_QueenCloseBy".Translate(); public override bool Applies(StatRequest req) { - // => ModsConfig.BiotechActive && req.HasThing && req.Thing.Spawned && req.Thing.Position.InSunlight(req.Thing.Map); - throw new NotImplementedException(); - } + if (req.Pawn == null || !req.Pawn.Spawned) + return false; + + // Case A: Check for Loyal Pawns if their One Queen is nearby + if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) + { + Pawn queen = HiveUtility.GetQueensOnMap()[0]; + + return req.Pawn.Position.DistanceTo(queen.Position) <= EFFECT_DISTANCE; + } + + // Case A: Check for Queen if another Queen is nearby + if (GeneUtility.HasGeneNullCheck(req.Pawn, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() >= 2) + { + foreach (Pawn queen in HiveUtility.GetQueensOnMap()) + { + if (queen != req.Pawn && req.Pawn.Position.DistanceTo(queen.Position) <= EFFECT_DISTANCE) + return true; + } + } + + + return false; + } } } diff --git a/Source/Genes/Hive/Helpers/HiveUtility.cs b/Source/Genes/Hive/Helpers/HiveUtility.cs new file mode 100644 index 0000000..707957e --- /dev/null +++ b/Source/Genes/Hive/Helpers/HiveUtility.cs @@ -0,0 +1,39 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Genes +{ + internal class HiveUtility + { + public static bool IsAdultQueen(Pawn pawn) + { + + if (pawn == null || !pawn.Spawned) + return false; + + if (GeneUtility.HasGeneNullCheck(pawn, GeneDefOf.rjw_genes_queen)) + { + return pawn.ageTracker.Adult; + } + + return false; + } + + public static int QueensOnMap() + { + List playersPawns = Find.CurrentMap.mapPawns.SpawnedPawnsInFaction(Faction.OfPlayer); + return playersPawns.Count(pawn => pawn.Spawned && IsAdultQueen(pawn)); + } + + public static List GetQueensOnMap() + { + List playersPawns = Find.CurrentMap.mapPawns.SpawnedPawnsInFaction(Faction.OfPlayer); + return playersPawns.FindAll(pawn => pawn.Spawned && IsAdultQueen(pawn)); + } + } +} diff --git a/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs b/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs new file mode 100644 index 0000000..fd3d1e6 --- /dev/null +++ b/Source/Genes/Hive/Thoughts/ThoughtWorker_QueenPresent_Social.cs @@ -0,0 +1,38 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Genes +{ + public class ThoughtWorker_QueenPresent_Social : ThoughtWorker + { + protected override ThoughtState CurrentSocialStateInternal(Pawn p, Pawn other) + { + if (!p.RaceProps.Humanlike) + return (ThoughtState) false; + + if (!other.RaceProps.Humanlike) + return (ThoughtState) false; + + if (!RelationsUtility.PawnsKnowEachOther(p, other)) + return (ThoughtState) false; + + // Only check if they are spawned + if (!p.Spawned || !other.Spawned) + { + return (ThoughtState)false; + } + + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) + { + return (ThoughtState) HiveUtility.IsAdultQueen(other); + } + + return (ThoughtState)false; + } + } +} diff --git a/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs b/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs new file mode 100644 index 0000000..21d116a --- /dev/null +++ b/Source/Genes/Hive/Thoughts/ThoughtWorker_RivalQueen_Social.cs @@ -0,0 +1,36 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace RJW_Genes +{ + public class ThoughtWorker_RivalQueen_Social : ThoughtWorker + { + protected override ThoughtState CurrentSocialStateInternal(Pawn p, Pawn other) + { + if (!p.RaceProps.Humanlike) + return (ThoughtState)false; + if (!other.RaceProps.Humanlike) + return (ThoughtState)false; + + if (!RelationsUtility.PawnsKnowEachOther(p, other)) + return (ThoughtState)false; + + // Only check if they are spawned + if (!p.Spawned || !other.Spawned) + { + return (ThoughtState)false; + } + + if(HiveUtility.IsAdultQueen(p) && HiveUtility.IsAdultQueen(other)) + { + return (ThoughtState)true; + } + return (ThoughtState)false; + } + } +} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs new file mode 100644 index 0000000..52ee842 --- /dev/null +++ b/Source/Genes/Hive/Thoughts/Thoughtworker_MultipleQueens_Mood.cs @@ -0,0 +1,33 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Verse; + +namespace RJW_Genes +{ + public class Thoughtworker_MultipleQueens_Mood : ThoughtWorker + { + + protected override ThoughtState CurrentStateInternal(Pawn p) + { + // Error Handling and Check for Pawn being on Map + if (p == null || !p.Spawned) + return (ThoughtState) false; + // Queens cannot have loyalty thoughts + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) + return (ThoughtState)false; + + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() >= 2) + { + return (ThoughtState)true; + } + + return (ThoughtState) false; + } + + } +} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs new file mode 100644 index 0000000..7693c1d --- /dev/null +++ b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenAbsent_Mood.cs @@ -0,0 +1,33 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Verse; + +namespace RJW_Genes +{ + public class Thoughtworker_QueenAbsent_Mood : ThoughtWorker + { + + protected override ThoughtState CurrentStateInternal(Pawn p) + { + // Error Handling and Check for Pawn being on Map + if (p == null || !p.Spawned) + return (ThoughtState) false; + // Queens cannot have loyalty thoughts + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) + return (ThoughtState)false; + + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 0) + { + return (ThoughtState)true; + } + + return (ThoughtState) false; + } + + } +} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs new file mode 100644 index 0000000..8ee3401 --- /dev/null +++ b/Source/Genes/Hive/Thoughts/Thoughtworker_QueenPresent_Mood.cs @@ -0,0 +1,33 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Verse; + +namespace RJW_Genes +{ + public class Thoughtworker_QueenPresent_Mood : ThoughtWorker + { + + protected override ThoughtState CurrentStateInternal(Pawn p) + { + // Error Handling and Check for Pawn being on Map + if (p == null || !p.Spawned) + return (ThoughtState) false; + // Queens cannot have loyalty thoughts + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_queen)) + return (ThoughtState)false; + + if (GeneUtility.HasGeneNullCheck(p, GeneDefOf.rjw_genes_zealous_loyalty) && HiveUtility.QueensOnMap() == 1) + { + return (ThoughtState)true; + } + + return (ThoughtState) false; + } + + } +} diff --git a/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs b/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs new file mode 100644 index 0000000..19ba88e --- /dev/null +++ b/Source/Genes/Hive/Thoughts/Thoughtworker_RivalQueen_Mood.cs @@ -0,0 +1,29 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Verse; + +namespace RJW_Genes +{ + public class Thoughtworker_RivalQueen_Mood : ThoughtWorker + { + + protected override ThoughtState CurrentStateInternal(Pawn p) + { + if (p == null || !p.Spawned) + return (ThoughtState) false; + + if (HiveUtility.IsAdultQueen(p) && HiveUtility.QueensOnMap() >= 2) + { + return (ThoughtState) true; + } + + return (ThoughtState) false; + } + + } +} diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index a8ead0a..928a8de 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -91,6 +91,16 @@ + + + + + + + + + + @@ -196,8 +206,6 @@ False - - - + \ No newline at end of file