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