mirror of
				https://gitgud.io/lutepickle/rjw_menstruation.git
				synced 2024-08-14 22:46:52 +00:00 
			
		
		
		
	added multiple pregnancy
This commit is contained in:
		
							parent
							
								
									4e5c02f5f0
								
							
						
					
					
						commit
						fb170aacb2
					
				
					 15 changed files with 755 additions and 58 deletions
				
			
		| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
				
			||||||
<Manifest>
 | 
					<Manifest>
 | 
				
			||||||
	<identifier>RJW Menstruation</identifier>
 | 
						<identifier>RJW Menstruation</identifier>
 | 
				
			||||||
	<version>1.0.0.8</version>
 | 
						<version>1.0.1.0</version>
 | 
				
			||||||
	<dependencies>
 | 
						<dependencies>
 | 
				
			||||||
	</dependencies>
 | 
						</dependencies>
 | 
				
			||||||
	<incompatibleWith />
 | 
						<incompatibleWith />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -50,7 +50,15 @@
 | 
				
			||||||
  <Option11_Desc_4>Do not show fetus image and informations</Option11_Desc_4>
 | 
					  <Option11_Desc_4>Do not show fetus image and informations</Option11_Desc_4>
 | 
				
			||||||
  <Option12_Label>enable menopause</Option12_Label>
 | 
					  <Option12_Label>enable menopause</Option12_Label>
 | 
				
			||||||
  <Option12_Desc>enable menopause effect that makes pawn infertile in time progress
if you have problems with long life races, turn off this option.
this option will apply after save loaded</Option12_Desc>
 | 
					  <Option12_Desc>enable menopause effect that makes pawn infertile in time progress
if you have problems with long life races, turn off this option.
this option will apply after save loaded</Option12_Desc>
 | 
				
			||||||
  <Option13_Label></Option13_Label>
 | 
					  <Option13_Label>use multiple pregnancy</Option13_Label>
 | 
				
			||||||
  <Option13_Desc> </Option13_Desc>
 | 
					  <Option13_Desc>use multiple pregnancy instead RJW's default pregnancy</Option13_Desc>
 | 
				
			||||||
 | 
					  <Option14_Label>enable hetero ovular twins</Option14_Label>
 | 
				
			||||||
 | 
					  <Option14_Desc>enable multiple eggs can get pregnant</Option14_Desc>
 | 
				
			||||||
 | 
					  <Option15_Label>enable enzygotic twins</Option15_Label>
 | 
				
			||||||
 | 
					  <Option15_Desc>enable single egg to result multiple offsprings</Option15_Desc>
 | 
				
			||||||
 | 
					  <Option16_Label>enzygotic twins chance</Option16_Label>
 | 
				
			||||||
 | 
					  <Option16_Desc>set chance of twins</Option16_Desc>
 | 
				
			||||||
 | 
					  <Option17_Label>max enzygotic twins</Option17_Label>
 | 
				
			||||||
 | 
					  <Option17_Desc>set max number of twins</Option17_Desc>
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
</LanguageData>
 | 
					</LanguageData>
 | 
				
			||||||
| 
						 | 
					@ -50,8 +50,16 @@
 | 
				
			||||||
  <Option11_Desc_4>태아에 대한 어떠한 정보도 표시하지 않습니다.</Option11_Desc_4>
 | 
					  <Option11_Desc_4>태아에 대한 어떠한 정보도 표시하지 않습니다.</Option11_Desc_4>
 | 
				
			||||||
  <Option12_Label>폐경기 활성화</Option12_Label>
 | 
					  <Option12_Label>폐경기 활성화</Option12_Label>
 | 
				
			||||||
  <Option12_Desc>시간이 지남에따라 불임상태로 만드는 폐경기를 활성화합니다.
수명이 긴 종족을 사용할때 문제가 있으면 이 옵션을 끄세요.
변경한후에 세이브로드가 필요합니다.</Option12_Desc>
 | 
					  <Option12_Desc>시간이 지남에따라 불임상태로 만드는 폐경기를 활성화합니다.
수명이 긴 종족을 사용할때 문제가 있으면 이 옵션을 끄세요.
변경한후에 세이브로드가 필요합니다.</Option12_Desc>
 | 
				
			||||||
  <Option13_Label></Option13_Label>
 | 
					  <Option13_Label>다중임신</Option13_Label>
 | 
				
			||||||
  <Option13_Desc> </Option13_Desc>
 | 
					  <Option13_Desc>RJW의 기본임신 대신 다중임신을 사용합니다.</Option13_Desc>
 | 
				
			||||||
 | 
					  <Option14_Label>이란성 쌍둥이 활성화</Option14_Label>
 | 
				
			||||||
 | 
					  <Option14_Desc>다수의 난자가 임신으로 이어지게 합니다.</Option14_Desc>
 | 
				
			||||||
 | 
					  <Option15_Label>일란성 쌍둥이 활성화</Option15_Label>
 | 
				
			||||||
 | 
					  <Option15_Desc>하나의 난자가 다수의 태아로 나뉘게 합니다.</Option15_Desc>
 | 
				
			||||||
 | 
					  <Option16_Label>일란성 쌍둥이 확률</Option16_Label>
 | 
				
			||||||
 | 
					  <Option16_Desc>일란성 쌍둥이가 발생할 확률을 설정합니다.</Option16_Desc>
 | 
				
			||||||
 | 
					  <Option17_Label>최대 일란성 쌍둥이 수</Option17_Label>
 | 
				
			||||||
 | 
					  <Option17_Desc>일란성 쌍둥이의 수를 제한합니다.</Option17_Desc>
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
</LanguageData>
 | 
					</LanguageData>
 | 
				
			||||||
| 
						 | 
					@ -1,19 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<Patch>
 | 
					 | 
				
			||||||
	<Operation Class="PatchOperationReplace">
 | 
					 | 
				
			||||||
		<xpath>Defs/HediffDef[defName="RJW_IUD"]/stages</xpath>
 | 
					 | 
				
			||||||
		<value>
 | 
					 | 
				
			||||||
			<stages>
 | 
					 | 
				
			||||||
				<li>
 | 
					 | 
				
			||||||
					<capMods>
 | 
					 | 
				
			||||||
						<li>
 | 
					 | 
				
			||||||
							<capacity>RJW_Fertility</capacity>
 | 
					 | 
				
			||||||
							<setMax>1.0</setMax>
 | 
					 | 
				
			||||||
						</li>
 | 
					 | 
				
			||||||
					</capMods>
 | 
					 | 
				
			||||||
				</li>
 | 
					 | 
				
			||||||
			</stages>
 | 
					 | 
				
			||||||
		</value>
 | 
					 | 
				
			||||||
	</Operation>
 | 
					 | 
				
			||||||
</Patch>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>15</maxCumCapacity>
 | 
				
			||||||
					<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
										<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
				
			||||||
					<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
										<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
				
			||||||
					<deviationFactor>0.05</deviationFactor>
 | 
										<deviationFactor>0.05</deviationFactor>
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>50</maxCumCapacity>
 | 
				
			||||||
					<baseImplantationChanceFactor>0.5</baseImplantationChanceFactor>
 | 
										<baseImplantationChanceFactor>0.5</baseImplantationChanceFactor>
 | 
				
			||||||
					<basefertilizationChanceFactor>0.2</basefertilizationChanceFactor>
 | 
										<basefertilizationChanceFactor>0.2</basefertilizationChanceFactor>
 | 
				
			||||||
					<deviationFactor>0.05</deviationFactor>
 | 
										<deviationFactor>0.05</deviationFactor>
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>15</maxCumCapacity>
 | 
				
			||||||
					<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
										<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
				
			||||||
					<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
										<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
				
			||||||
					<deviationFactor>0.05</deviationFactor>
 | 
										<deviationFactor>0.05</deviationFactor>
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>15</maxCumCapacity>
 | 
				
			||||||
					<wombTex>Womb/Womb</wombTex>
 | 
										<wombTex>Womb/Womb</wombTex>
 | 
				
			||||||
					<vagTex>Genitals/BionicVagina</vagTex>
 | 
										<vagTex>Genitals/BionicVagina</vagTex>
 | 
				
			||||||
					<infertile>true</infertile>
 | 
										<infertile>true</infertile>
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>15</maxCumCapacity>
 | 
				
			||||||
					<wombTex>Womb/Womb</wombTex>
 | 
										<wombTex>Womb/Womb</wombTex>
 | 
				
			||||||
					<vagTex>Genitals/BionicVagina</vagTex>
 | 
										<vagTex>Genitals/BionicVagina</vagTex>
 | 
				
			||||||
					<infertile>true</infertile>
 | 
										<infertile>true</infertile>
 | 
				
			||||||
| 
						 | 
					@ -104,7 +104,7 @@
 | 
				
			||||||
		<value>
 | 
							<value>
 | 
				
			||||||
			<comps>
 | 
								<comps>
 | 
				
			||||||
				<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
									<li Class="RJW_Menstruation.CompProperties_Menstruation">
 | 
				
			||||||
					<maxCumCapacity>500</maxCumCapacity>
 | 
										<maxCumCapacity>15</maxCumCapacity>
 | 
				
			||||||
					<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
										<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
 | 
				
			||||||
					<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
										<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
 | 
				
			||||||
					<deviationFactor>0.05</deviationFactor>
 | 
										<deviationFactor>0.05</deviationFactor>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,20 @@
 | 
				
			||||||
 | 
					Version 1.0.1.0
 | 
				
			||||||
 | 
					 - requires RJW 4.6.1 or later
 | 
				
			||||||
 | 
					 - added multiple pregnancy
 | 
				
			||||||
 | 
					   - added options for twins
 | 
				
			||||||
 | 
					     - if you turn off both twin options, you will get only one baby on every pregnancy. 
 | 
				
			||||||
 | 
					   - male's litter curve size does not affect to number of offspring
 | 
				
			||||||
 | 
					   - female can get multiple offsprings with multiple races.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Version 1.0.0.10
 | 
				
			||||||
 | 
					 - fixed cycle acceleration option was not saved.
 | 
				
			||||||
 | 
					 - cum capacity decreased greatly.
 | 
				
			||||||
 | 
					 - blood amount during in period decreased.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Version 1.0.0.9
 | 
				
			||||||
 | 
					 - update for RJW 4.6.0 (if you didn't update RJW, you don't need to update this mod)
 | 
				
			||||||
 | 
					   - removed patch file for IUD.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Version 1.0.0.8
 | 
					Version 1.0.0.8
 | 
				
			||||||
 - added option for disable menopause.
 | 
					 - added option for disable menopause.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,16 +10,18 @@ namespace RJW_Menstruation
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class Configurations : ModSettings
 | 
					    public class Configurations : ModSettings
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public static readonly float ImplantationChanceDefault = 0.25f;
 | 
					        public const float ImplantationChanceDefault = 0.25f;
 | 
				
			||||||
        public static readonly int ImplantationChanceAdjustDefault = 25;
 | 
					        public const int ImplantationChanceAdjustDefault = 25;
 | 
				
			||||||
        public static readonly float FertilizeChanceDefault = 0.05f;
 | 
					        public const float FertilizeChanceDefault = 0.05f;
 | 
				
			||||||
        public static readonly int FertilizeChanceAdjustDefault = 50;
 | 
					        public const int FertilizeChanceAdjustDefault = 50;
 | 
				
			||||||
        public static readonly float CumDecayRatioDefault = 0.05f;
 | 
					        public const float CumDecayRatioDefault = 0.05f;
 | 
				
			||||||
        public static readonly int CumDecayRatioAdjustDefault = 50;
 | 
					        public const int CumDecayRatioAdjustDefault = 50;
 | 
				
			||||||
        public static readonly float CumFertilityDecayRatioDefault = 0.2f;
 | 
					        public const float CumFertilityDecayRatioDefault = 0.2f;
 | 
				
			||||||
        public static readonly int CumFertilityDecayRatioAdjustDefault = 200;
 | 
					        public const int CumFertilityDecayRatioAdjustDefault = 200;
 | 
				
			||||||
        public static readonly int CycleAccelerationDefault = 6;
 | 
					        public const int CycleAccelerationDefault = 6;
 | 
				
			||||||
 | 
					        public const float EnzygoticTwinsChanceDefault = 0.002f;
 | 
				
			||||||
 | 
					        public const int EnzygoticTwinsChanceAdjustDefault = 2;
 | 
				
			||||||
 | 
					        public const int MaxEnzygoticTwinsDefault = 9;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static float ImplantationChance = ImplantationChanceDefault;
 | 
					        public static float ImplantationChance = ImplantationChanceDefault;
 | 
				
			||||||
        public static int ImplantationChanceAdjust = ImplantationChanceAdjustDefault;
 | 
					        public static int ImplantationChanceAdjust = ImplantationChanceAdjustDefault;
 | 
				
			||||||
| 
						 | 
					@ -37,6 +39,12 @@ namespace RJW_Menstruation
 | 
				
			||||||
        public static bool Debug = false;
 | 
					        public static bool Debug = false;
 | 
				
			||||||
        public static bool EnableMenopause = true;
 | 
					        public static bool EnableMenopause = true;
 | 
				
			||||||
        public static DetailLevel InfoDetail = DetailLevel.All;
 | 
					        public static DetailLevel InfoDetail = DetailLevel.All;
 | 
				
			||||||
 | 
					        public static bool UseMultiplePregnancy = true;
 | 
				
			||||||
 | 
					        public static bool EnableHeteroOvularTwins = true;
 | 
				
			||||||
 | 
					        public static bool EnableEnzygoticTwins = true;
 | 
				
			||||||
 | 
					        public static float EnzygoticTwinsChance = EnzygoticTwinsChanceDefault;
 | 
				
			||||||
 | 
					        public static int EnzygoticTwinsChanceAdjust = EnzygoticTwinsChanceAdjustDefault;
 | 
				
			||||||
 | 
					        public static int MaxEnzygoticTwins = MaxEnzygoticTwinsDefault;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public enum DetailLevel
 | 
					        public enum DetailLevel
 | 
				
			||||||
| 
						 | 
					@ -77,13 +85,19 @@ namespace RJW_Menstruation
 | 
				
			||||||
            Scribe_Values.Look(ref CumDecayRatio, "CumDecayRatio", CumDecayRatio, true);
 | 
					            Scribe_Values.Look(ref CumDecayRatio, "CumDecayRatio", CumDecayRatio, true);
 | 
				
			||||||
            Scribe_Values.Look(ref CumFertilityDecayRatioAdjust, "CumFertilityDecayRatioAdjust", CumFertilityDecayRatioAdjust, true);
 | 
					            Scribe_Values.Look(ref CumFertilityDecayRatioAdjust, "CumFertilityDecayRatioAdjust", CumFertilityDecayRatioAdjust, true);
 | 
				
			||||||
            Scribe_Values.Look(ref CumFertilityDecayRatio, "CumFertilityDecayRatio", CumFertilityDecayRatio, true);
 | 
					            Scribe_Values.Look(ref CumFertilityDecayRatio, "CumFertilityDecayRatio", CumFertilityDecayRatio, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref CycleAcceleration, "CycleAcceleration", CycleAcceleration, true);
 | 
				
			||||||
            Scribe_Values.Look(ref EnableWombIcon, "EnableWombIcon", EnableWombIcon, true);
 | 
					            Scribe_Values.Look(ref EnableWombIcon, "EnableWombIcon", EnableWombIcon, true);
 | 
				
			||||||
            Scribe_Values.Look(ref EnableAnimalCycle, "EnableAnimalCycle", EnableAnimalCycle, true);
 | 
					            Scribe_Values.Look(ref EnableAnimalCycle, "EnableAnimalCycle", EnableAnimalCycle, true);
 | 
				
			||||||
            Scribe_Values.Look(ref DrawWombStatus, "DrawWombStatus", DrawWombStatus, true);
 | 
					            Scribe_Values.Look(ref DrawWombStatus, "DrawWombStatus", DrawWombStatus, true);
 | 
				
			||||||
            Scribe_Values.Look(ref DrawVaginaStatus, "DrawVaginaStatus", DrawVaginaStatus, true);
 | 
					            Scribe_Values.Look(ref DrawVaginaStatus, "DrawVaginaStatus", DrawVaginaStatus, true);
 | 
				
			||||||
            Scribe_Values.Look(ref Debug, "Debug", Debug, true);
 | 
					            Scribe_Values.Look(ref Debug, "Debug", Debug, true);
 | 
				
			||||||
            Scribe_Values.Look(ref InfoDetail, "InfoDetail", InfoDetail, true);
 | 
					            Scribe_Values.Look(ref InfoDetail, "InfoDetail", InfoDetail, true);
 | 
				
			||||||
            Scribe_Values.Look(ref EnableMenopause, "EnableMenopause", EnableMenopause, true);
 | 
					            Scribe_Values.Look(ref UseMultiplePregnancy, "UseMultiplePregnancy", UseMultiplePregnancy, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref EnableHeteroOvularTwins, "EnableHeteroOvularTwins", EnableHeteroOvularTwins, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref EnableEnzygoticTwins, "EnableEnzygoticTwins", EnableEnzygoticTwins, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref EnzygoticTwinsChance, "EnzygoticTwinsChance", EnzygoticTwinsChance, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref EnzygoticTwinsChanceAdjust, "EnzygoticTwinsChanceAdjust", EnzygoticTwinsChanceAdjust, true);
 | 
				
			||||||
 | 
					            Scribe_Values.Look(ref MaxEnzygoticTwins, "MaxEnzygoticTwins", MaxEnzygoticTwins, true);
 | 
				
			||||||
            base.ExposeData();
 | 
					            base.ExposeData();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,12 +109,16 @@ namespace RJW_Menstruation
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private readonly Configurations config;
 | 
					        private readonly Configurations config;
 | 
				
			||||||
 | 
					        private static Vector2 scroll;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public RJW_Menstruation(ModContentPack content) : base(content)
 | 
					        public RJW_Menstruation(ModContentPack content) : base(content)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            config = GetSettings<Configurations>();
 | 
					            config = GetSettings<Configurations>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override string SettingsCategory()
 | 
					        public override string SettingsCategory()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return Translations.Mod_Title;
 | 
					            return Translations.Mod_Title;
 | 
				
			||||||
| 
						 | 
					@ -108,10 +126,13 @@ namespace RJW_Menstruation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public override void DoSettingsWindowContents(Rect inRect)
 | 
					        public override void DoSettingsWindowContents(Rect inRect)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Rect mainRect = inRect.ContractedBy(20f);
 | 
					            Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f);
 | 
				
			||||||
 | 
					            Rect mainRect = new Rect(0f, 0f, inRect.width - 30f, inRect.height + 300f);
 | 
				
			||||||
            Listing_Standard listmain = new Listing_Standard();
 | 
					            Listing_Standard listmain = new Listing_Standard();
 | 
				
			||||||
 | 
					            listmain.maxOneColumn = true;
 | 
				
			||||||
 | 
					            listmain.BeginScrollView(outRect, ref scroll, ref mainRect);
 | 
				
			||||||
            listmain.Begin(mainRect);
 | 
					            listmain.Begin(mainRect);
 | 
				
			||||||
 | 
					            listmain.Gap(20f);
 | 
				
			||||||
            listmain.CheckboxLabeled(Translations.Option1_Label, ref Configurations.EnableWombIcon, Translations.Option1_Desc);
 | 
					            listmain.CheckboxLabeled(Translations.Option1_Label, ref Configurations.EnableWombIcon, Translations.Option1_Desc);
 | 
				
			||||||
            if (Configurations.EnableWombIcon)
 | 
					            if (Configurations.EnableWombIcon)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -164,6 +185,28 @@ namespace RJW_Menstruation
 | 
				
			||||||
            listmain.Label(Translations.Option7_Label + " x" + Configurations.CycleAcceleration, -1, Translations.Option7_Desc);
 | 
					            listmain.Label(Translations.Option7_Label + " x" + Configurations.CycleAcceleration, -1, Translations.Option7_Desc);
 | 
				
			||||||
            Configurations.CycleAcceleration = (int)listmain.Slider(Configurations.CycleAcceleration,1,50);
 | 
					            Configurations.CycleAcceleration = (int)listmain.Slider(Configurations.CycleAcceleration,1,50);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            listmain.CheckboxLabeled(Translations.Option13_Label, ref Configurations.UseMultiplePregnancy, Translations.Option13_Desc);
 | 
				
			||||||
 | 
					            if (Configurations.UseMultiplePregnancy)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                float sectionheight = 50f;
 | 
				
			||||||
 | 
					                if (Configurations.EnableEnzygoticTwins) sectionheight += 100;
 | 
				
			||||||
 | 
					                Listing_Standard twinsection = listmain.BeginSection_NewTemp(sectionheight);
 | 
				
			||||||
 | 
					                twinsection.CheckboxLabeled(Translations.Option14_Label, ref Configurations.EnableHeteroOvularTwins, Translations.Option14_Desc);
 | 
				
			||||||
 | 
					                twinsection.CheckboxLabeled(Translations.Option15_Label, ref Configurations.EnableEnzygoticTwins, Translations.Option15_Desc);
 | 
				
			||||||
 | 
					                if (Configurations.EnableEnzygoticTwins)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    twinsection.Label(Translations.Option16_Label + " " + Configurations.EnzygoticTwinsChance*100 + "%", -1, Translations.Option16_Desc);
 | 
				
			||||||
 | 
					                    Configurations.EnzygoticTwinsChanceAdjust = (int)twinsection.Slider(Configurations.EnzygoticTwinsChanceAdjust, 0, 1000);
 | 
				
			||||||
 | 
					                    Configurations.EnzygoticTwinsChance = (float)Configurations.EnzygoticTwinsChanceAdjust / 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    twinsection.Label(Translations.Option17_Label + " " + Configurations.MaxEnzygoticTwins, -1, Translations.Option17_Desc);
 | 
				
			||||||
 | 
					                    Configurations.MaxEnzygoticTwins = (int)twinsection.Slider(Configurations.MaxEnzygoticTwins, 2, 100);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                listmain.EndSection(twinsection);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            listmain.EndScrollView(ref mainRect);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            listmain.CheckboxLabeled(Translations.Option8_Label, ref Configurations.Debug, Translations.Option8_Desc);
 | 
					            listmain.CheckboxLabeled(Translations.Option8_Label, ref Configurations.Debug, Translations.Option8_Desc);
 | 
				
			||||||
            if (listmain.ButtonText("reset to default"))
 | 
					            if (listmain.ButtonText("reset to default"))
 | 
				
			||||||
| 
						 | 
					@ -175,9 +218,13 @@ namespace RJW_Menstruation
 | 
				
			||||||
                Configurations.EnableWombIcon = true;
 | 
					                Configurations.EnableWombIcon = true;
 | 
				
			||||||
                Configurations.EnableAnimalCycle = false;
 | 
					                Configurations.EnableAnimalCycle = false;
 | 
				
			||||||
                Configurations.CycleAcceleration = Configurations.CycleAccelerationDefault;
 | 
					                Configurations.CycleAcceleration = Configurations.CycleAccelerationDefault;
 | 
				
			||||||
 | 
					                Configurations.EnzygoticTwinsChanceAdjust = Configurations.EnzygoticTwinsChanceAdjustDefault;
 | 
				
			||||||
 | 
					                Configurations.EnableEnzygoticTwins = true;
 | 
				
			||||||
 | 
					                Configurations.EnableHeteroOvularTwins = true;
 | 
				
			||||||
 | 
					                Configurations.UseMultiplePregnancy = true;
 | 
				
			||||||
 | 
					                Configurations.MaxEnzygoticTwins = Configurations.MaxEnzygoticTwinsDefault;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
            listmain.End();
 | 
					            listmain.End();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
            get
 | 
					            get
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
				float width = 300f + 2 * windowMargin;
 | 
									float width = 300f + 2 * windowMargin;
 | 
				
			||||||
				float height = 800f;
 | 
									float height = 820f;
 | 
				
			||||||
				if (!Configurations.DrawWombStatus) height -= wombRectHeight; 
 | 
									if (!Configurations.DrawWombStatus) height -= wombRectHeight; 
 | 
				
			||||||
				if (!Configurations.DrawVaginaStatus) height -= genitalRectHeight; 
 | 
									if (!Configurations.DrawVaginaStatus) height -= genitalRectHeight; 
 | 
				
			||||||
				return new Vector2(width,height);
 | 
									return new Vector2(width,height);
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Rect windowRect = inRect.ContractedBy(windowMargin);
 | 
								Rect windowRect = inRect.ContractedBy(windowMargin);
 | 
				
			||||||
			Rect mainRect = new Rect(windowRect.x, windowRect.y, windowRect.width, windowRect.height - 20f);
 | 
								Rect mainRect = new Rect(windowRect.x, windowRect.y, windowRect.width, windowRect.height);
 | 
				
			||||||
			Rect closeRect = new Rect(windowRect.xMax, 0f, 20f, 20f);
 | 
								Rect closeRect = new Rect(windowRect.xMax, 0f, 20f, 20f);
 | 
				
			||||||
			MainContents(mainRect);
 | 
								MainContents(mainRect);
 | 
				
			||||||
			if (Widgets.CloseButtonFor(closeRect))
 | 
								if (Widgets.CloseButtonFor(closeRect))
 | 
				
			||||||
| 
						 | 
					@ -101,7 +101,36 @@ namespace RJW_Menstruation
 | 
				
			||||||
			if (pawn.IsPregnant() && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
 | 
								if (pawn.IsPregnant() && Utility.ShowFetusImage((Hediff_BasePregnancy)hediff))
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				womb = Utility.GetPregnancyIcon(comp, hediff);
 | 
									womb = Utility.GetPregnancyIcon(comp, hediff);
 | 
				
			||||||
				if (hediff is Hediff_BasePregnancy)
 | 
									if (hediff is Hediff_MultiplePregnancy)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Hediff_MultiplePregnancy h = (Hediff_MultiplePregnancy)hediff;
 | 
				
			||||||
 | 
										if (h.GestationProgress < 0.2f) cum = Utility.GetCumIcon(comp);
 | 
				
			||||||
 | 
										else cum = ContentFinder<Texture2D>.Get(("Womb/Empty"), true);
 | 
				
			||||||
 | 
										Pawn fetus = Utility.GetFetus(pawn);
 | 
				
			||||||
 | 
										if (fetus != null && Utility.ShowFetusInfo())
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											string feinfo = h.GetBabyInfo();
 | 
				
			||||||
 | 
											string fainfo = h.GetFatherInfo() + "  ";
 | 
				
			||||||
 | 
											if (feinfo.Length + fainfo.Length > 45)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
												preginfoheight = fontheight + 2;
 | 
				
			||||||
 | 
												buttonstyle.alignment = TextAnchor.UpperLeft;
 | 
				
			||||||
 | 
												fontstyleright.alignment = TextAnchor.LowerRight;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
												preginfoheight = fontheight;
 | 
				
			||||||
 | 
												buttonstyle.alignment = TextAnchor.MiddleLeft;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
 | 
				
			||||||
 | 
											fontstyleright.normal.textColor = Color.white;
 | 
				
			||||||
 | 
											GUI.Box(preginfo, feinfo, buttonstyle);
 | 
				
			||||||
 | 
											GUI.Label(preginfo, fainfo, fontstyleright);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else if (hediff is Hediff_BasePregnancy)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
 | 
										Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
 | 
				
			||||||
					if (h.GestationProgress < 0.2f) cum = Utility.GetCumIcon(comp);
 | 
										if (h.GestationProgress < 0.2f) cum = Utility.GetCumIcon(comp);
 | 
				
			||||||
| 
						 | 
					@ -109,10 +138,13 @@ namespace RJW_Menstruation
 | 
				
			||||||
					Pawn fetus = Utility.GetFetus(pawn);
 | 
										Pawn fetus = Utility.GetFetus(pawn);
 | 
				
			||||||
					if (fetus != null && Utility.ShowFetusInfo())
 | 
										if (fetus != null && Utility.ShowFetusInfo())
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						preginfoheight = fontheight;
 | 
											preginfoheight = fontheight;
 | 
				
			||||||
						Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
 | 
											Rect preginfo = new Rect(0f, mainRect.yMax - wombRectHeight - 2, wombRectWidth, preginfoheight);
 | 
				
			||||||
						fontstyleright.normal.textColor = Color.white;
 | 
											fontstyleright.normal.textColor = Color.white;
 | 
				
			||||||
 | 
											fontstyleright.alignment = TextAnchor.MiddleRight;
 | 
				
			||||||
						buttonstyle.alignment = TextAnchor.MiddleLeft;
 | 
											buttonstyle.alignment = TextAnchor.MiddleLeft;
 | 
				
			||||||
 | 
											
 | 
				
			||||||
						GUI.Box(preginfo, h.babies.Count + " " + fetus.def.label + " " + Translations.Dialog_WombInfo02, buttonstyle);
 | 
											GUI.Box(preginfo, h.babies.Count + " " + fetus.def.label + " " + Translations.Dialog_WombInfo02, buttonstyle);
 | 
				
			||||||
						GUI.Label(preginfo, Translations.Dialog_WombInfo03 + ": " + h.father.LabelShort + "  ", fontstyleright);
 | 
											GUI.Label(preginfo, Translations.Dialog_WombInfo03 + ": " + h.father.LabelShort + "  ", fontstyleright);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
| 
						 | 
					@ -156,9 +188,12 @@ namespace RJW_Menstruation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			fontstyleright.normal.textColor = Color.red;
 | 
								fontstyleright.normal.textColor = Color.red;
 | 
				
			||||||
			if (comp.GetFertilization) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo05 + "  ", fontstyleright);
 | 
								fontstyleright.alignment = TextAnchor.MiddleRight;
 | 
				
			||||||
			else if (comp.GetEggFertilizing) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo06 + "  ", fontstyleright);
 | 
								//if (comp.GetFertilization) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo05 + "  ", fontstyleright);
 | 
				
			||||||
			else if (comp.GetEgg) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo07 + "  ", fontstyleright);
 | 
								//else if (comp.GetEggFertilizing) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo06 + "  ", fontstyleright);
 | 
				
			||||||
 | 
								//else if (comp.GetEgg) GUI.Label(wombInfoRect, Translations.Dialog_WombInfo07 + "  ", fontstyleright);
 | 
				
			||||||
 | 
								GUI.Label(wombInfoRect, comp.GetFertilizingInfo + "  ", fontstyleright);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//Widgets.Label(wombInfoRect,Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel);
 | 
								//Widgets.Label(wombInfoRect,Translations.Dialog_WombInfo01 + ": " + comp.GetCurStageLabel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,6 +233,31 @@ namespace RJW_Menstruation
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public string GetFertilizingInfo
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                string res = "";
 | 
				
			||||||
 | 
					                if (!eggs.NullOrEmpty())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (cums.NullOrEmpty()) return eggs.Count + " " + Translations.Dialog_WombInfo07;
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        int fertilized = 0;
 | 
				
			||||||
 | 
					                        foreach (Egg egg in eggs)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (egg.fertilized) fertilized++;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (fertilized != 0) res += fertilized + " " + Translations.Dialog_WombInfo05;
 | 
				
			||||||
 | 
					                        if (fertilized != 0 && eggs.Count - fertilized != 0) res += ", ";
 | 
				
			||||||
 | 
					                        if (eggs.Count - fertilized != 0) res += eggs.Count - fertilized + " " + Translations.Dialog_WombInfo06;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return res;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool GetEggFertilizing
 | 
					        public bool GetEggFertilizing
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            get
 | 
					            get
 | 
				
			||||||
| 
						 | 
					@ -627,6 +652,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                float rand = Rand.Range(0.0f, 1.0f);
 | 
					                float rand = Rand.Range(0.0f, 1.0f);
 | 
				
			||||||
                if (!cum.notcum && rand < cum.fertvolume * cum.fertFactor * Configurations.FertilizeChance * Props.basefertilizationChanceFactor)
 | 
					                if (!cum.notcum && rand < cum.fertvolume * cum.fertFactor * Configurations.FertilizeChance * Props.basefertilizationChanceFactor)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    if (!RJWPregnancySettings.bestial_pregnancy_enabled && (xxx.is_animal(parent.pawn) ^ xxx.is_animal(cum.pawn))) continue;
 | 
				
			||||||
                    return cum.pawn;
 | 
					                    return cum.pawn;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -645,14 +671,48 @@ namespace RJW_Menstruation
 | 
				
			||||||
                    if (egg.position < 24 || !egg.fertilized) continue;
 | 
					                    if (egg.position < 24 || !egg.fertilized) continue;
 | 
				
			||||||
                    else if (Rand.Range(0.0f, 1.0f) <= Configurations.ImplantationChance * Props.baseImplantationChanceFactor * ImplantFactor * InterspeciesImplantFactor(egg.fertilizer))
 | 
					                    else if (Rand.Range(0.0f, 1.0f) <= Configurations.ImplantationChance * Props.baseImplantationChanceFactor * ImplantFactor * InterspeciesImplantFactor(egg.fertilizer))
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        if (!parent.pawn.IsPregnant()) PregnancyHelper.PregnancyDecider(parent.pawn, egg.fertilizer);
 | 
					                        if (!parent.pawn.IsPregnant())
 | 
				
			||||||
                        pregnant = true;
 | 
					                        {
 | 
				
			||||||
                        break;
 | 
					                            if (!Configurations.UseMultiplePregnancy)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                PregnancyHelper.PregnancyDecider(parent.pawn, egg.fertilizer);
 | 
				
			||||||
 | 
					                                pregnant = true;
 | 
				
			||||||
 | 
					                                break;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                Hediff_BasePregnancy.Create<Hediff_MultiplePregnancy>(parent.pawn, egg.fertilizer);
 | 
				
			||||||
 | 
					                                Hediff hediff = PregnancyHelper.GetPregnancy(parent.pawn);
 | 
				
			||||||
 | 
					                                if (hediff is Hediff_BasePregnancy)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    Hediff_BasePregnancy h = (Hediff_BasePregnancy)hediff;
 | 
				
			||||||
 | 
					                                    if (h.babies.Count > 1) h.babies.RemoveRange(1, h.babies.Count - 1);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                pregnant = true;
 | 
				
			||||||
 | 
					                                deadeggs.Add(egg);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else if (Configurations.UseMultiplePregnancy && Configurations.EnableHeteroOvularTwins)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            Hediff hediff = PregnancyHelper.GetPregnancy(parent.pawn);
 | 
				
			||||||
 | 
					                            if (hediff is Hediff_MultiplePregnancy)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                Hediff_MultiplePregnancy h = (Hediff_MultiplePregnancy)hediff;
 | 
				
			||||||
 | 
					                                h.AddNewBaby(parent.pawn, egg.fertilizer);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            pregnant = true;
 | 
				
			||||||
 | 
					                            deadeggs.Add(egg);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            pregnant = true;
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else deadeggs.Add(egg);
 | 
					                    else deadeggs.Add(egg);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (pregnant)
 | 
					                if (pregnant && (!Configurations.UseMultiplePregnancy || !Configurations.EnableHeteroOvularTwins))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    eggs.Clear();
 | 
					                    eggs.Clear();
 | 
				
			||||||
                    deadeggs.Clear();
 | 
					                    deadeggs.Clear();
 | 
				
			||||||
| 
						 | 
					@ -666,6 +726,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    deadeggs.Clear();
 | 
					                    deadeggs.Clear();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                if (pregnant) return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -673,7 +734,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
        private void BleedOut()
 | 
					        private void BleedOut()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            //FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, ThingDefOf.Filth_Blood,parent.pawn.Label);
 | 
					            //FilthMaker.TryMakeFilth(parent.pawn.Position, parent.pawn.Map, ThingDefOf.Filth_Blood,parent.pawn.Label);
 | 
				
			||||||
            CumIn(parent.pawn, Rand.Range(0f, 15f), Translations.Menstrual_Blood,-4.0f,ThingDefOf.Filth_Blood);
 | 
					            CumIn(parent.pawn, Rand.Range(0f, 5f), Translations.Menstrual_Blood,-5.0f,ThingDefOf.Filth_Blood);
 | 
				
			||||||
            GetNotCum(Translations.Menstrual_Blood).color = Colors.blood;
 | 
					            GetNotCum(Translations.Menstrual_Blood).color = Colors.blood;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -812,7 +873,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            if (curStageHrs < bleedingIntervalhours / 6) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut();
 | 
					                            if (curStageHrs < bleedingIntervalhours / 4) for (int i = 0; i < Configurations.CycleAcceleration; i++) BleedOut();
 | 
				
			||||||
                            curStageHrs+=Configurations.CycleAcceleration;
 | 
					                            curStageHrs+=Configurations.CycleAcceleration;
 | 
				
			||||||
                            StayCurrentStage();
 | 
					                            StayCurrentStage();
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
| 
						 | 
					@ -842,6 +903,12 @@ namespace RJW_Menstruation
 | 
				
			||||||
                case Stage.Pregnant:
 | 
					                case Stage.Pregnant:
 | 
				
			||||||
                    action = delegate
 | 
					                    action = delegate
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (!eggs.NullOrEmpty())
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            EggDecay();
 | 
				
			||||||
 | 
					                            FertilizationCheck();
 | 
				
			||||||
 | 
					                            Implant();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
                        if (parent.pawn.IsPregnant()) StayCurrentStageConst(Stage.Pregnant);
 | 
					                        if (parent.pawn.IsPregnant()) StayCurrentStageConst(Stage.Pregnant);
 | 
				
			||||||
                        else GoNextStage(Stage.Recover);
 | 
					                        else GoNextStage(Stage.Recover);
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
| 
						 | 
					@ -1059,6 +1126,8 @@ namespace RJW_Menstruation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        public class Egg : IExposable
 | 
					        public class Egg : IExposable
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            public bool fertilized;
 | 
					            public bool fertilized;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,505 @@
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using System.Reflection;
 | 
				
			||||||
 | 
					using rjw;
 | 
				
			||||||
 | 
					using Verse;
 | 
				
			||||||
 | 
					using RimWorld;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace RJW_Menstruation
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class Hediff_MultiplePregnancy : Hediff_BasePregnancy
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public override void GiveBirth()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (babies.NullOrEmpty())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ModLog.Warning(" no babies (debug?) " + this.GetType().Name);
 | 
				
			||||||
 | 
									if (father == null)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										father = Trytogetfather(ref pawn);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									Initialize(pawn, father);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								List<Pawn> siblings = new List<Pawn>();
 | 
				
			||||||
 | 
								foreach (Pawn baby in babies)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (xxx.is_animal(baby))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										BestialBirth(baby, siblings);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										HumanlikeBirth(baby, siblings);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								pawn.health.RemoveHediff(this);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public string GetBabyInfo()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								string res = "";
 | 
				
			||||||
 | 
								if (!babies.NullOrEmpty())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									var babiesdistinct = babies.Distinct(new RaceComparer());
 | 
				
			||||||
 | 
									int iteration = 0;
 | 
				
			||||||
 | 
									foreach (Pawn baby in babiesdistinct)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										int num = babies.Where(x => x.def.Equals(baby.def)).Count();
 | 
				
			||||||
 | 
										if (iteration > 0) res += ", ";
 | 
				
			||||||
 | 
										res += num + " " + baby.def.label;
 | 
				
			||||||
 | 
										iteration++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									res += " " + Translations.Dialog_WombInfo02;
 | 
				
			||||||
 | 
									return res;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return "Null";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public string GetFatherInfo()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								string res = Translations.Dialog_WombInfo03 + ": ";
 | 
				
			||||||
 | 
								if (!babies.NullOrEmpty())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									var babiesdistinct = babies.Distinct(new FatherComparer(pawn));
 | 
				
			||||||
 | 
									int iteration = 0;
 | 
				
			||||||
 | 
									foreach (Pawn baby in babiesdistinct)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										if (iteration > 0) res += ", ";
 | 
				
			||||||
 | 
										res += Utility.GetFather(baby, pawn)?.LabelShort ?? "Unknown";
 | 
				
			||||||
 | 
										iteration++;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return res;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return "Null";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void HumanlikeBirth(Pawn baby, List<Pawn> siblings)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								Pawn mother = pawn; Pawn father = Utility.GetFather(baby,pawn);
 | 
				
			||||||
 | 
								//backup melanin, LastName for when baby reset by other mod on spawn/backstorychange
 | 
				
			||||||
 | 
								//var skin_whiteness = baby.story.melanin;
 | 
				
			||||||
 | 
								//var last_name = baby.story.birthLastName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								PawnUtility.TrySpawnHatchedOrBornPawn(baby, mother);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var sex_need = mother.needs?.TryGetNeed<Need_Sex>();
 | 
				
			||||||
 | 
								if (mother.Faction != null && !(mother.Faction?.IsPlayer ?? false) && sex_need != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									sex_need.CurLevel = 1.0f;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (mother.Faction != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (mother.Faction != baby.Faction)
 | 
				
			||||||
 | 
										baby.SetFaction(mother.Faction);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (mother.IsPrisonerOfColony)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									baby.guest.CapturedBy(Faction.OfPlayer);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								foreach (Pawn sibling in siblings)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									baby.relations.AddDirectRelation(PawnRelationDefOf.Sibling, sibling);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								siblings.Add(baby);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								PostBirth(mother, father, baby);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							private void BestialBirth(Pawn baby, List<Pawn> siblings)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								Pawn mother = pawn; Pawn father = Utility.GetFather(baby,pawn);
 | 
				
			||||||
 | 
								//backup melanin, LastName for when baby reset by other mod on spawn/backstorychange
 | 
				
			||||||
 | 
								//var skin_whiteness = baby.story.melanin;
 | 
				
			||||||
 | 
								//var last_name = baby.story.birthLastName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								PawnUtility.TrySpawnHatchedOrBornPawn(baby, mother);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Need_Sex sex_need = mother.needs?.TryGetNeed<Need_Sex>();
 | 
				
			||||||
 | 
								if (mother.Faction != null && !(mother.Faction?.IsPlayer ?? false) && sex_need != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									sex_need.CurLevel = 1.0f;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (mother.Faction != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (mother.Faction != baby.Faction)
 | 
				
			||||||
 | 
										baby.SetFaction(mother.Faction);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								foreach (Pawn sibling in siblings)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									baby.relations.AddDirectRelation(PawnRelationDefOf.Sibling, sibling);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								siblings.Add(baby);
 | 
				
			||||||
 | 
								train(baby, mother, father);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								PostBirth(mother, father, baby);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//restore melanin, LastName for when baby reset by other mod on spawn/backstorychange
 | 
				
			||||||
 | 
								//baby.story.melanin = skin_whiteness;
 | 
				
			||||||
 | 
								//baby.story.birthLastName = last_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void GenerateBabies()
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								AddNewBaby(pawn, father);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							protected void train(Pawn baby, Pawn mother, Pawn father)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								bool _;
 | 
				
			||||||
 | 
								if (!xxx.is_human(baby) && baby.Faction == Faction.OfPlayer)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (xxx.is_human(mother) && baby.Faction == Faction.OfPlayer && baby.training.CanAssignToTrain(TrainableDefOf.Obedience, out _).Accepted)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										baby.training.Train(TrainableDefOf.Obedience, mother);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (xxx.is_human(mother) && baby.Faction == Faction.OfPlayer && baby.training.CanAssignToTrain(TrainableDefOf.Tameness, out _).Accepted)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										baby.training.Train(TrainableDefOf.Tameness, mother);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public bool AddNewBaby(Pawn mother, Pawn father)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								float melanin;
 | 
				
			||||||
 | 
								string lastname;
 | 
				
			||||||
 | 
								if (xxx.is_human(mother))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
									if (xxx.is_human(father))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										melanin = (mother.story.melanin + father.story.melanin) / 2;
 | 
				
			||||||
 | 
										lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										melanin = mother.story.melanin;
 | 
				
			||||||
 | 
										lastname = NameTriple.FromString(mother.Name.ToStringFull).Last;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
									if (xxx.is_human(father))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										melanin = father.story.melanin;
 | 
				
			||||||
 | 
										lastname = NameTriple.FromString(father.Name.ToStringFull).Last;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else melanin = Rand.Range(0, 1.0f);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								PawnGenerationRequest request = new PawnGenerationRequest(
 | 
				
			||||||
 | 
									newborn: true,
 | 
				
			||||||
 | 
									allowDowned: true,
 | 
				
			||||||
 | 
									canGeneratePawnRelations: false,
 | 
				
			||||||
 | 
									colonistRelationChanceFactor: 0,
 | 
				
			||||||
 | 
									allowFood: false,
 | 
				
			||||||
 | 
									allowAddictions: false,
 | 
				
			||||||
 | 
									relationWithExtraPawnChanceFactor: 0,
 | 
				
			||||||
 | 
									fixedMelanin: melanin,
 | 
				
			||||||
 | 
									kind: BabyPawnKindDecider(mother, father)
 | 
				
			||||||
 | 
									);
 | 
				
			||||||
 | 
								Pawn baby = PawnGenerator.GeneratePawn(request);
 | 
				
			||||||
 | 
								if (baby != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
									if (xxx.is_human(baby))
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										List<Trait> traitpool = new List<Trait>();
 | 
				
			||||||
 | 
										baby.SetMother(mother);
 | 
				
			||||||
 | 
										if (mother != father) baby.SetFather(father);
 | 
				
			||||||
 | 
										
 | 
				
			||||||
 | 
										if (xxx.has_traits(pawn) && pawn.RaceProps.Humanlike)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											foreach (Trait momtrait in pawn.story.traits.allTraits)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (!RJWPregnancySettings.trait_filtering_enabled || !non_genetic_traits.Contains(momtrait.def.defName))
 | 
				
			||||||
 | 
													traitpool.Add(momtrait);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (father != null && xxx.has_traits(father) && father.RaceProps.Humanlike)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											foreach (Trait poptrait in father.story.traits.allTraits)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												if (!RJWPregnancySettings.trait_filtering_enabled || !non_genetic_traits.Contains(poptrait.def.defName))
 | 
				
			||||||
 | 
													traitpool.Add(poptrait);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										updateTraits(baby, traitpool);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
										baby.relations.AddDirectRelation(VariousDefOf.Relation_birthgiver, mother);
 | 
				
			||||||
 | 
										mother.relations.AddDirectRelation(VariousDefOf.Relation_spawn, baby);
 | 
				
			||||||
 | 
										if (mother != father)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											baby.relations.AddDirectRelation(VariousDefOf.Relation_birthgiver, father);
 | 
				
			||||||
 | 
											father.relations.AddDirectRelation(VariousDefOf.Relation_spawn, baby);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									int division = 1;
 | 
				
			||||||
 | 
									while (Rand.Chance(Configurations.EnzygoticTwinsChance) && division < Configurations.MaxEnzygoticTwins) division++;
 | 
				
			||||||
 | 
									for (int i = 0; i < division; i++) babies.Add(baby);
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// Decide pawnkind from mother and father <para/>
 | 
				
			||||||
 | 
							/// Come from RJW
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="mother"></param>
 | 
				
			||||||
 | 
							/// <param name="father"></param>
 | 
				
			||||||
 | 
							/// <returns></returns>
 | 
				
			||||||
 | 
							public PawnKindDef BabyPawnKindDecider(Pawn mother, Pawn father)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								PawnKindDef spawn_kind_def = mother.kindDef;
 | 
				
			||||||
 | 
								int flag = 0;
 | 
				
			||||||
 | 
								if (xxx.is_human(mother)) flag += 2; 
 | 
				
			||||||
 | 
								if (xxx.is_human(father)) flag += 1;
 | 
				
			||||||
 | 
					            //Mother - Father = Flag
 | 
				
			||||||
 | 
								//Human  - Human  =  3
 | 
				
			||||||
 | 
					            //Human  - Animal =  2
 | 
				
			||||||
 | 
					            //Animal - Human  =  1
 | 
				
			||||||
 | 
					            //Animal - Animal =  0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            switch (flag)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
									case 3:
 | 
				
			||||||
 | 
										if (!Rand.Chance(RJWPregnancySettings.humanlike_DNA_from_mother)) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case 2:
 | 
				
			||||||
 | 
										if (RJWPregnancySettings.bestiality_DNA_inheritance == 0f) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										else if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case 1:
 | 
				
			||||||
 | 
										if (RJWPregnancySettings.bestiality_DNA_inheritance == 1f) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										else if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case 0:
 | 
				
			||||||
 | 
										if (!Rand.Chance(RJWPregnancySettings.bestial_DNA_from_mother)) spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								bool IsAndroidmother = AndroidsCompatibility.IsAndroid(mother);
 | 
				
			||||||
 | 
								bool IsAndroidfather = AndroidsCompatibility.IsAndroid(father);
 | 
				
			||||||
 | 
								if (IsAndroidmother && !IsAndroidfather)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (!IsAndroidmother && IsAndroidfather)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									spawn_kind_def = mother.kindDef;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								string MotherRaceName = "";
 | 
				
			||||||
 | 
								string FatherRaceName = "";
 | 
				
			||||||
 | 
								MotherRaceName = mother.kindDef.race.defName;
 | 
				
			||||||
 | 
								if (father != null)
 | 
				
			||||||
 | 
									FatherRaceName = father.kindDef.race.defName;
 | 
				
			||||||
 | 
								if (MotherRaceName != FatherRaceName && FatherRaceName != "")
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									var groups = DefDatabase<RaceGroupDef>.AllDefs.Where(x => !(x.hybridRaceParents.NullOrEmpty() || x.hybridChildKindDef.NullOrEmpty()));
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									//ModLog.Message(" found custom RaceGroupDefs " + groups.Count());
 | 
				
			||||||
 | 
									foreach (var t in groups)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										if ((t.hybridRaceParents.Contains(MotherRaceName) && t.hybridRaceParents.Contains(FatherRaceName))
 | 
				
			||||||
 | 
											|| (t.hybridRaceParents.Contains("Any") && (t.hybridRaceParents.Contains(MotherRaceName) || t.hybridRaceParents.Contains(FatherRaceName))))
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											//ModLog.Message(" has hybridRaceParents");
 | 
				
			||||||
 | 
											if (t.hybridChildKindDef.Contains("MotherKindDef"))
 | 
				
			||||||
 | 
												spawn_kind_def = mother.kindDef;
 | 
				
			||||||
 | 
											else if (t.hybridChildKindDef.Contains("FatherKindDef") && father != null)
 | 
				
			||||||
 | 
												spawn_kind_def = father.kindDef;
 | 
				
			||||||
 | 
											else
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
												//ModLog.Message(" trying hybridChildKindDef " + t.defName);
 | 
				
			||||||
 | 
												var child_kind_def_list = new List<PawnKindDef>();
 | 
				
			||||||
 | 
												child_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => t.hybridChildKindDef.Contains(x.defName)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												//ModLog.Message(" found custom hybridChildKindDefs " + t.hybridChildKindDef.Count);
 | 
				
			||||||
 | 
												if (!child_kind_def_list.NullOrEmpty())
 | 
				
			||||||
 | 
													spawn_kind_def = child_kind_def_list.RandomElement();
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
									spawn_kind_def = mother.RaceProps.AnyPawnKind;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (spawn_kind_def.defName.Contains("Nymph"))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									//child is nymph, try to find other PawnKindDef
 | 
				
			||||||
 | 
									var spawn_kind_def_list = new List<PawnKindDef>();
 | 
				
			||||||
 | 
									spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == spawn_kind_def.race && !x.defName.Contains("Nymph")));
 | 
				
			||||||
 | 
									//no other PawnKindDef found try mother
 | 
				
			||||||
 | 
									if (spawn_kind_def_list.NullOrEmpty())
 | 
				
			||||||
 | 
										spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == mother.kindDef.race && !x.defName.Contains("Nymph")));
 | 
				
			||||||
 | 
									//no other PawnKindDef found try father
 | 
				
			||||||
 | 
									if (spawn_kind_def_list.NullOrEmpty() && father != null)
 | 
				
			||||||
 | 
										spawn_kind_def_list.AddRange(DefDatabase<PawnKindDef>.AllDefs.Where(x => x.race == father.kindDef.race && !x.defName.Contains("Nymph")));
 | 
				
			||||||
 | 
									//no other PawnKindDef found fallback to generic colonist
 | 
				
			||||||
 | 
									if (spawn_kind_def_list.NullOrEmpty())
 | 
				
			||||||
 | 
										spawn_kind_def = PawnKindDefOf.Colonist;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									spawn_kind_def = spawn_kind_def_list.RandomElement();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return spawn_kind_def;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// Copy from RJW
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="pawn"></param>
 | 
				
			||||||
 | 
							/// <param name="parenttraits"></param>
 | 
				
			||||||
 | 
							public void updateTraits(Pawn pawn, List<Trait> parenttraits)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								if (pawn?.story?.traits == null) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								List<Trait> traitlist = new List<Trait>(pawn.story.traits.allTraits);
 | 
				
			||||||
 | 
								if (!parenttraits.NullOrEmpty()) traitlist.AddRange(parenttraits);
 | 
				
			||||||
 | 
								else return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var forcedTraits = traitlist
 | 
				
			||||||
 | 
									.Where(x => x.ScenForced)
 | 
				
			||||||
 | 
									.Distinct(new TraitComparer(ignoreDegree: true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								List<Trait> res = new List<Trait>();
 | 
				
			||||||
 | 
								res.AddRange(forcedTraits);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var comparer = new TraitComparer(); // trait comparision implementation, because without game compares traits *by reference*, makeing them all unique.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								while (res.Count < traitlist.Count && traitlist.Count > 0)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									int index = Rand.Range(0, traitlist.Count); // getting trait and removing from the pull
 | 
				
			||||||
 | 
									var trait = traitlist[index];
 | 
				
			||||||
 | 
									traitlist.RemoveAt(index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (!res.Any(x => comparer.Equals(x, trait) ||  // skipping traits conflicting with already added
 | 
				
			||||||
 | 
																 x.def.ConflictsWith(trait)))
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										res.Add(new Trait(trait.def, trait.Degree, false));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								pawn.story.traits.allTraits = res;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/// <summary>
 | 
				
			||||||
 | 
						/// Copy from RJW
 | 
				
			||||||
 | 
						/// </summary>
 | 
				
			||||||
 | 
						public class TraitComparer : IEqualityComparer<Trait>
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							bool ignoreForced;
 | 
				
			||||||
 | 
							bool ignoreDegree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public TraitComparer(bool ignoreDegree = false, bool ignoreForced = true)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								this.ignoreDegree = ignoreDegree;
 | 
				
			||||||
 | 
								this.ignoreForced = ignoreForced;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public bool Equals(Trait x, Trait y)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
									x.def == y.def &&
 | 
				
			||||||
 | 
									(ignoreDegree || (x.Degree == y.Degree)) &&
 | 
				
			||||||
 | 
									(ignoreForced || (x.ScenForced == y.ScenForced));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public int GetHashCode(Trait obj)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
									(obj.def.GetHashCode() << 5) +
 | 
				
			||||||
 | 
									(ignoreDegree ? 0 : obj.Degree) +
 | 
				
			||||||
 | 
									((ignoreForced || obj.ScenForced) ? 0 : 0x10);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public class RaceComparer : IEqualityComparer<Pawn>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public bool Equals(Pawn x, Pawn y)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								return x.def.Equals(y.def);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int GetHashCode(Pawn obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								return obj.def.GetHashCode();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public class FatherComparer : IEqualityComparer<Pawn>
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							Pawn mother;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							public FatherComparer(Pawn mother)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
								this.mother = mother;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public bool Equals(Pawn x, Pawn y)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (Utility.GetFather(x, mother) == null && Utility.GetFather(y, mother) == null) return true;
 | 
				
			||||||
 | 
								return Utility.GetFather(x,mother)?.Label.Equals(Utility.GetFather(y,mother)?.Label) ?? false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public int GetHashCode(Pawn obj)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return obj.def.GetHashCode();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -60,6 +60,7 @@
 | 
				
			||||||
    <Compile Include="Dialog_WombStatus.cs" />
 | 
					    <Compile Include="Dialog_WombStatus.cs" />
 | 
				
			||||||
    <Compile Include="DNADef.cs" />
 | 
					    <Compile Include="DNADef.cs" />
 | 
				
			||||||
    <Compile Include="DrugOutcomDoers.cs" />
 | 
					    <Compile Include="DrugOutcomDoers.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Hediff_MultiplePregnancy.cs" />
 | 
				
			||||||
    <Compile Include="Patch\GetGizmos.cs" />
 | 
					    <Compile Include="Patch\GetGizmos.cs" />
 | 
				
			||||||
    <Compile Include="Gizmo_Womb.cs" />
 | 
					    <Compile Include="Gizmo_Womb.cs" />
 | 
				
			||||||
    <Compile Include="Patch\Harmony.cs" />
 | 
					    <Compile Include="Patch\Harmony.cs" />
 | 
				
			||||||
| 
						 | 
					@ -84,7 +85,7 @@
 | 
				
			||||||
      <Private>False</Private>
 | 
					      <Private>False</Private>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="RJW">
 | 
					    <Reference Include="RJW">
 | 
				
			||||||
      <HintPath>..\..\..\..\RJW\1.1\Assemblies\RJW.dll</HintPath>
 | 
					      <HintPath>..\..\..\..\RJW\1.2\Assemblies\RJW.dll</HintPath>
 | 
				
			||||||
      <Private>False</Private>
 | 
					      <Private>False</Private>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="Unity.TextMeshPro">
 | 
					    <Reference Include="Unity.TextMeshPro">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,14 @@ namespace RJW_Menstruation
 | 
				
			||||||
        public static readonly string Option12_Desc =  "Option12_Desc".Translate();
 | 
					        public static readonly string Option12_Desc =  "Option12_Desc".Translate();
 | 
				
			||||||
        public static readonly string Option13_Label = "Option13_Label".Translate();
 | 
					        public static readonly string Option13_Label = "Option13_Label".Translate();
 | 
				
			||||||
        public static readonly string Option13_Desc =  "Option13_Desc".Translate();
 | 
					        public static readonly string Option13_Desc =  "Option13_Desc".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option14_Label = "Option14_Label".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option14_Desc =  "Option14_Desc".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option15_Label = "Option15_Label".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option15_Desc =  "Option15_Desc".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option16_Label = "Option16_Label".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option16_Desc =  "Option16_Desc".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option17_Label = "Option17_Label".Translate();
 | 
				
			||||||
 | 
					        public static readonly string Option17_Desc =  "Option17_Desc".Translate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static bool HasMenstruationComp(Pawn pawn)
 | 
					        public static bool HasMenstruationComp(Pawn pawn)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn)).FindAll((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
 | 
					            var hedifflist = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_genitalsBPR(pawn))?.FindAll((Hediff h) => h.def.defName.ToLower().Contains("vagina"));
 | 
				
			||||||
            HediffComp_Menstruation result;
 | 
					            HediffComp_Menstruation result;
 | 
				
			||||||
            if (hedifflist.NullOrEmpty()) return false;
 | 
					            if (hedifflist.NullOrEmpty()) return false;
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
| 
						 | 
					@ -239,6 +239,22 @@ namespace RJW_Menstruation
 | 
				
			||||||
            else return false;
 | 
					            else return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static Pawn GetFather(Pawn pawn, Pawn mother)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Pawn res = pawn.GetFather();
 | 
				
			||||||
 | 
					            if (res != null) return res;
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                res = pawn.relations?.GetFirstDirectRelationPawn(VariousDefOf.Relation_birthgiver, x => !x.Equals(mother)) ?? null;
 | 
				
			||||||
 | 
					                return res;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,5 +24,7 @@ namespace RJW_Menstruation
 | 
				
			||||||
        public static readonly HediffDef Hediff_Climacteric = DefDatabase<HediffDef>.GetNamed("Hediff_Climacteric");
 | 
					        public static readonly HediffDef Hediff_Climacteric = DefDatabase<HediffDef>.GetNamed("Hediff_Climacteric");
 | 
				
			||||||
        public static readonly HediffDef Hediff_Menopause = DefDatabase<HediffDef>.GetNamed("Hediff_Menopause");
 | 
					        public static readonly HediffDef Hediff_Menopause = DefDatabase<HediffDef>.GetNamed("Hediff_Menopause");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static readonly PawnRelationDef Relation_birthgiver = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Sire");
 | 
				
			||||||
 | 
					        public static readonly PawnRelationDef Relation_spawn = DefDatabase<PawnRelationDef>.AllDefs.FirstOrDefault(d => d.defName == "RJW_Pup");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue