@@ -16,6 +16,7 @@ public class RandomSettings
1616 static MethodInfo randomSkillMethodInfo ;
1717 static MethodInfo randomHealthMethodInfo ;
1818 static MethodInfo randomBodyTypeMethodInfo ;
19+ static MethodInfo randomGeneMethodInfo ;
1920
2021 public static int MinSkillRange ;
2122
@@ -56,6 +57,9 @@ public static void Init()
5657
5758 randomBodyTypeMethodInfo = typeof ( PawnGenerator )
5859 . GetMethod ( "GenerateBodyType" , BindingFlags . NonPublic | BindingFlags . Static ) ;
60+
61+ randomGeneMethodInfo = typeof ( PawnGenerator )
62+ . GetMethod ( "GenerateGenes" , BindingFlags . NonPublic | BindingFlags . Static ) ;
5963 }
6064
6165 public static void ResetRerollCounter ( )
@@ -71,13 +75,27 @@ public static bool Reroll(Pawn pawn)
7175 return CheckPawnIsSatisfied ( pawn ) ;
7276 }
7377
74- PawnGenerationRequest request = new PawnGenerationRequest (
75- Faction . OfPlayer . def . basicMemberKind ,
76- Faction . OfPlayer ,
77- PawnGenerationContext . PlayerStarter ,
78- forceGenerateNewPawn : true ,
79- mustBeCapableOfViolence : TutorSystem . TutorialMode ,
80- colonistRelationChanceFactor : 20f ) ;
78+ //PawnGenerationRequest request = new PawnGenerationRequest(
79+ // Faction.OfPlayer.def.basicMemberKind,
80+ // Faction.OfPlayer,
81+ // PawnGenerationContext.PlayerStarter,
82+
83+ // forceGenerateNewPawn: true,
84+ // mustBeCapableOfViolence: TutorSystem.TutorialMode,
85+ // colonistRelationChanceFactor: 20f);
86+
87+ //PawnGenerationRequest request = new PawnGenerationRequest(
88+ // Find.GameInitData.startingPawnKind ?? Faction.OfPlayer.def.basicMemberKind,
89+ // Faction.OfPlayer,
90+ // PawnGenerationContext.PlayerStarter,
91+ // forceGenerateNewPawn: true,
92+ // mustBeCapableOfViolence: TutorSystem.TutorialMode,
93+ // colonistRelationChanceFactor: 20f, allowPregnant: true,
94+ // forcedXenotype: (ModsConfig.BiotechActive ? XenotypeDefOf.Baseliner : null),
95+ // excludeBiologicalAgeRange: (ModsConfig.BiotechActive ? new FloatRange(12.1f, 13f) : new FloatRange?()));
96+
97+ int index = StartingPawnUtility . PawnIndex ( pawn ) ;
98+ PawnGenerationRequest request = StartingPawnUtility . GetGenerationRequest ( index ) ;
8199
82100 if ( ! CheckGenderIsSatisfied ( pawn ) )
83101 {
@@ -89,6 +107,8 @@ public static bool Reroll(Pawn pawn)
89107 {
90108 randomRerollCounter ++ ;
91109
110+ PawnGenerator . RedressPawn ( pawn , request ) ;
111+
92112 pawn . ageTracker = new Pawn_AgeTracker ( pawn ) ;
93113 randomAgeMethodInfo . Invoke ( null , new object [ ] { pawn , request } ) ;
94114 if ( ! CheckAgeIsSatisfied ( pawn ) )
@@ -130,10 +150,17 @@ public static bool Reroll(Pawn pawn)
130150 continue ;
131151
132152 // Handle custom scenario
133- Find . Scenario . Notify_PawnGenerated ( pawn , request . Context , true ) ;
134- if ( ! CheckPawnIsSatisfied ( pawn ) )
135- continue ;
153+ //Find.Scenario.Notify_PawnGenerated(pawn, request.Context, true);
154+ //if (!CheckPawnIsSatisfied(pawn))
155+ // continue;
156+
136157 // Generate Misc
158+ if ( ModsConfig . BiotechActive && pawn . genes != null )
159+ {
160+ pawn . genes . Reset ( ) ;
161+ XenotypeDef xenotype = ModsConfig . BiotechActive ? PawnGenerator . GetXenotypeForGeneratedPawn ( request ) : null ;
162+ randomGeneMethodInfo . Invoke ( null , new object [ ] { pawn , xenotype , request } ) ;
163+ }
137164 randomBodyTypeMethodInfo . Invoke ( null , new object [ ] { pawn , request } ) ;
138165 GeneratePawnStyle ( pawn ) ;
139166
@@ -316,31 +343,55 @@ public static bool CheckTraitsIsSatisfied(Pawn pawn)
316343 return true ;
317344 }
318345
346+ private static bool IsGeneAffectedHealth ( Hediff hediff )
347+ {
348+ if ( ! ModsConfig . BiotechActive )
349+ return false ;
350+
351+ if ( hediff is Hediff_ChemicalDependency chemicalDependency && chemicalDependency . LinkedGene != null )
352+ return true ;
353+
354+ return false ;
355+ }
356+
319357 public static bool CheckHealthIsSatisfied ( Pawn pawn )
320358 {
359+
321360 // handle health options
322361 switch ( pawnFilter . FilterHealthCondition )
323362 {
324363 case PawnFilter . HealthOptions . AllowAll :
325364 break ;
326365 case PawnFilter . HealthOptions . OnlyStartCondition :
327- var foundNotStartCondition = pawn . health . hediffSet . hediffs . FirstOrDefault ( ( hediff ) => hediff . def . defName != "CryptosleepSickness" && hediff . def . defName != "Malnutrition" ) ;
366+ var foundNotStartCondition =
367+ pawn . health . hediffSet . hediffs
368+ . FirstOrDefault ( ( hediff ) => hediff . def . defName != "CryptosleepSickness" && hediff . def . defName != "Malnutrition" && ! IsGeneAffectedHealth ( hediff ) ) ;
328369 if ( foundNotStartCondition != null )
329370 return false ;
330371 break ;
331372 case PawnFilter . HealthOptions . NoPain :
332- var foundPain = pawn . health . hediffSet . hediffs . FirstOrDefault ( ( hediff ) => hediff . PainOffset > 0f ) ;
373+ var foundPain = pawn . health . hediffSet . hediffs . FirstOrDefault ( ( hediff ) => hediff . PainOffset > 0f && ! IsGeneAffectedHealth ( hediff ) ) ;
333374 if ( foundPain != null )
334375 return false ;
335376 break ;
336377 case PawnFilter . HealthOptions . NoAddiction :
337- var foundAddiction = pawn . health . hediffSet . hediffs . FirstOrDefault ( ( hediff ) => hediff is Hediff_Addiction ) ;
378+ var foundAddiction = pawn . health . hediffSet . hediffs . FirstOrDefault ( ( hediff ) => hediff is Hediff_Addiction && ! IsGeneAffectedHealth ( hediff ) ) ;
338379 if ( foundAddiction != null )
339380 return false ;
340381 break ;
341382 case PawnFilter . HealthOptions . AllowNone :
342- if ( pawn . health . hediffSet . hediffs . Count > 0 )
343- return false ;
383+ if ( ModsConfig . BiotechActive )
384+ {
385+ if ( pawn . health . hediffSet . hediffs . Where ( i => ! IsGeneAffectedHealth ( i ) ) . Count ( ) > 0 )
386+ return false ;
387+ }
388+ else
389+ {
390+ if ( pawn . health . hediffSet . hediffs . Count > 0 )
391+ return false ;
392+ }
393+
394+
344395 break ;
345396// case PawnFilter.HealthOptions.OnlyPositiveImplants:
346397// var hediffs = pawn.health.hediffSet.hediffs;
0 commit comments