Compare commits

...

9 commits

Author SHA1 Message Date
MrDarkside
141ad4253d Merge branch 'MrDarkside-main-patch-33001' into 'main'
Update 1.4/Languages/Russian/Keyed/RJW_Menstruation.xml

See merge request lutepickle/rjw_menstruation!4
2023-03-11 18:37:51 +00:00
lutepickle
c56e275a92 Merge branch 'dev' 2023-03-06 05:49:58 -08:00
lutepickle
297e37a4ef Add comment on why fixedLastName doesn't work 2023-03-06 05:49:40 -08:00
lutepickle
1bc5b45669 Fix danger day and estrus considering eggs to last 24x times as long as they should 2023-03-05 21:20:16 -08:00
lutepickle
842f6ceec1 A little code cleanup 2023-03-05 19:24:23 -08:00
lutepickle
8752aa1437 Add state to hediff tooltip, and time to next state in debug tooltip 2023-03-04 15:51:57 -08:00
lutepickle
f99d833e71 Set canine vaginas to periodic ovulation 2023-03-04 15:49:53 -08:00
lutepickle
51bc32248a Remove milk patch that was breaking MC's textures 2023-03-03 15:11:35 -08:00
MrDarkside
56c59f441d Update 1.4/Languages/Russian/Keyed/RJW_Menstruation.xml 2022-12-27 13:50:58 +00:00
14 changed files with 212 additions and 69 deletions

Binary file not shown.

View file

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<LanguageData>
<Mod_Title>RJW обновление беремености</Mod_Title>
<Menstrual_Blood>менструальная кровь</Menstrual_Blood>
<Info_noCum>Пусто</Info_noCum>
<Stage_Follicular>фолликул</Stage_Follicular>
<Stage_Ovulatory>Овуляция</Stage_Ovulatory>
<Stage_Luteal>Лютеиновая</Stage_Luteal>
<Stage_Bleeding>В период</Stage_Bleeding>
<Stage_Pregnant>Беременная</Stage_Pregnant>
<Stage_Recover>Восстановление после рождения</Stage_Recover>
<Stage_None>Нету</Stage_None>
<Stage_Climacteric>Климакс</Stage_Climacteric>
<Stage_Menopause>Менопауза</Stage_Menopause>
<Stage_Anestrus>Анэструс</Stage_Anestrus>
<Stage_Follicular_Desc>Яичники готовятся выпустить яйцеклетку. Овуляция произойдет в конце этой фазы.</Stage_Follicular_Desc>
<Stage_Follicular_Induced_Desc>Яичники готовятся выпустить яйцеклетку. Овуляция произойдет, если сперма попадает в матку.</Stage_Follicular_Induced_Desc>
<Stage_Ovulatory_Desc>Яичники выпускают яйцеклетку в матку.</Stage_Ovulatory_Desc>
<Stage_Luteal_Desc>Матка готова принять оплодотворенную яйцеклетку. Беременность наступит, если кто-то оплодотворит до окончания этапа.</Stage_Luteal_Desc>
<Stage_Bleeding_Desc>Матка сбрасывает свою слизистую оболочку вместе с любыми яйцеклетками, которые не смогли имплантироваться.</Stage_Bleeding_Desc>
<Stage_Pregnant_Desc>Ребенок растет в утробе матери. Со временем и заботой он станет новым жителем этого мира.</Stage_Pregnant_Desc>
<Stage_Recover_Desc>Матка восстанавливается после недавней беременности.</Stage_Recover_Desc>
<Stage_None_Desc>Матка не является фертильной и не может забеременеть.</Stage_None_Desc>
<Stage_Climacteric_Desc>Яичники близки к истощению, и менструальный цикл стал нерегулярным.</Stage_Climacteric_Desc>
<Stage_Menopause_Desc>Яичники истощены, и матка больше не может производить яйцеклетки.</Stage_Menopause_Desc>
<Stage_Anestrus_Desc>У матки закончился цикл. Цикл возобновится, как только будут выполнены условия.</Stage_Anestrus_Desc>
<Button_HealthTab>Статус</Button_HealthTab>
<Button_MilkTooltip>Лактация</Button_MilkTooltip>
<Dialog_WombInfo01>Состояние</Dialog_WombInfo01>
<Dialog_WombInfo02>Зародыш</Dialog_WombInfo02>
<Dialog_WombInfo03>Отец</Dialog_WombInfo03>
<Dialog_WombInfo04>Список спермы</Dialog_WombInfo04>
<Dialog_WombInfo05>Оплодотворенная</Dialog_WombInfo05>
<Dialog_WombInfo06>оплодотворение</Dialog_WombInfo06>
<Dialog_WombInfo07>Овулирование</Dialog_WombInfo07>
<Dialog_WombInfo08></Dialog_WombInfo08>
<Dialog_WombInfo09></Dialog_WombInfo09>
<Dialog_DoCleanWomb_Tooltip>Соберите сперму в ведро</Dialog_DoCleanWomb_Tooltip>
<Dialog_DontCleanWomb_Tooltip>Хранить сперму в утробе матери</Dialog_DontCleanWomb_Tooltip>
<Dialog_FatherUnknown>Неизвестно</Dialog_FatherUnknown>
<Option1_Label_1>Включить значок матки</Option1_Label_1>
<Option1_Label_2>Кнопка включения вкладки здоровье</Option1_Label_2>
<Option2_Label>Включить животный цикл</Option2_Label>
<Option2_Desc>Имитировать циклы животных.&#10;Не рекомендуется.</Option2_Desc>
<Option3_Label>Шанс имплантации</Option3_Label>
<Option3_Desc>Базовый шанс имплантации оплодотворенной яйцеклетки&#10;Это значение влияет на вероятность оплодотворения.</Option3_Desc>
<Option4_Label>Шанс оплодотворения</Option4_Label>
<Option4_Desc>Вероятность оплодотворения на мл сперматозоидов в час&#10;Это значение влияет на вероятность оплодотворения.</Option4_Desc>
<Option5_Label>Коэффициент распада спермы в час</Option5_Label>
<Option5_Desc>Количество спермы в матке будет уменьшаться на эту величину каждый час &#10;Это значение влияет на вероятность оплодотворения.</Option5_Desc>
<Option6_Label>Коэффициент распада фертильности спермы в час</Option6_Label>
<Option6_Desc>Сперма будет терять фертильность на это количество каждый час &#10;Это значение косвенно влияет на вероятность оплодотворения.</Option6_Desc>
<Option7_Label>Ускорение цикла</Option7_Label>
<Option7_Desc>Ускорить менструальный цикл&#10;Это может привести к ранней менопаузе и бесплодию.&#10;Рекомендуется установить значение ниже x12.&#10;Временная шкала Rimworld: x6(по умолчанию)</Option7_Desc>
<Option8_Label>Debug</Option8_Label>
<Option8_Desc>Показывать отладочную информацию.&#10;Также переопределяет "Уровень информации о зародыше" для всех.</Option8_Desc>
<Option9_Label>Статус матки</Option9_Label>
<Option9_Desc>Нарисовать значок матки в окне состояния.</Option9_Desc>
<Option10_Label>Состояние влагалища и груди</Option10_Label>
<Option10_Desc>Нарисовать значки влагалища, ануса и груди в окне состояния.</Option10_Desc>
<Option11_Label>Уровень информации о плоде</Option11_Label>
<Option11_Desc_1>Показать всю информацию о плоде.</Option11_Desc_1>
<Option11_Desc_2>Показать всю информацию о плоде после обнаруженной беременности.</Option11_Desc_2>
<Option11_Desc_3>Показывать только изображение плода после обнаруженной беременности.</Option11_Desc_3>
<Option11_Desc_4>Не показывайть никакой информации о плоде.</Option11_Desc_4>
<Option12_Label>Включить менопаузу</Option12_Label>
<Option12_Desc>Включите эффект менопаузы, который делает пешку бесплодной с течением времени&#10;Если у вас есть проблемы с гонками на долгую жизнь, отключите эту опцию.</Option12_Desc>
<Option13_Label>Использовать многоплодную беременность</Option13_Label>
<Option13_Desc>Использовать многоплодную беременность вместо беременности RJW по умолчанию&#10;Отключите эту опцию, если у вас проблемы с оплодотворением&#10;Беременность 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>
<Option18_Label>Включить наложение яиц</Option18_Label>
<Option18_Desc>Включить наложение яйца на значок матки.</Option18_Desc>
<Option19_Label_1>Количество кровотечения</Option19_Label_1>
<Option19_Label_2>Предполагаемое общее количество кровотечения</Option19_Label_2>
<Option19_Desc>Приблизительное количество кровотечения.&#10;Нормальное количество кровотечения у человека составляет около 20 ~ 80 мл за цикл.</Option19_Desc>
<Option20_Label_1>Колонист</Option20_Label_1>
<Option20_Label_2>Пленник</Option20_Label_2>
<Option20_Label_3>Союзная фракция</Option20_Label_3>
<Option20_Label_4>Нейтральная</Option20_Label_4>
<Option20_Label_5>Вражеская Фракция</Option20_Label_5>
<Option21_Label>Помеченые пешки:</Option21_Label>
<Option21_Desc>Для этих пешек появятся штуковина и кнопка</Option21_Desc>
<Option22_Label>Использовать гибридное расширение</Option22_Label>
<Option22_Desc>Переопределяет гибридное определение RJW и RaceSupport.&#10;Доминирующее гибридное расширение определяет, чье определение используется первым. Не рекомендуется изменять это.</Option22_Desc>
<Option23_Label>Доминирующее гибридное расширение</Option23_Label>
<Option23_Label_1>Мать</Option23_Label_1>
<Option23_Label_2>Отец</Option23_Label_2>
<Option_MaxBreastIncrementFactor_Label>Рост груди во время беременности</Option_MaxBreastIncrementFactor_Label>
<Option_MaxBreastIncrementFactor_Desc>Изменить, насколько вырастет грудь беременной пешки во время беременности. Некоторые пешки будут расти больше, чем другие.</Option_MaxBreastIncrementFactor_Desc>
<Option_MaxNippleIncrementFactor_Label>Изменение сосков во время беременности</Option_MaxNippleIncrementFactor_Label>
<Option_MaxNippleIncrementFactor_Desc>Изменить, насколько сильно изменятся соски беременной пешки в процессе.</Option_MaxNippleIncrementFactor_Desc>
<Option_PermanentNippleChange_Label>Постоянное изменение сосков после беременности</Option_PermanentNippleChange_Label>
<Option_PermanentNippleChange_Desc>Приблизительно определяет, какая часть сосков беременной пешки останется измененной после окончания беременности.</Option_PermanentNippleChange_Desc>
<Option28_Label>Настройка гибридов</Option28_Label>
<Option28_Tooltip>Откройте пользовательский гибридный редактор.&#10;Это переопределит гибридные определения XML-файлов.</Option28_Tooltip>
<Option29_Label>Разрешить сжатие значка</Option29_Label>
<Option29_Desc>Значок станет меньше, если это необходимо.</Option29_Desc>
<Option30_Label>Множитель продолжительности жизни яйца</Option30_Label>
<Option30_Desc>Увеличить продолжительность жизни яйцеклетки.&#10;Все неимплантированные яйцеклетки погибнут в конце лютеиновой стадии, независимо от этого параметра.</Option30_Desc>
<Option31_Label>Включить трансформацию влагалища после рождения</Option31_Label>
<Option31_Desc>Включить постоянное растяжение влагалища после родов.&#10;Если вы используете другой мод, обрабатывающий это, отключите эту опцию.</Option31_Desc>
<Option32_Label>Сила превращения</Option32_Label>
<Option32_Desc>Установить силу превращения.</Option32_Desc>
<Option_EnableGatherCumGizmo_Label>Включить сбор спермы gizmo</Option_EnableGatherCumGizmo_Label>
<Option_EstrusOverride_Label>Течка переопределяет настройки подключения RJW</Option_EstrusOverride_Label>
<Option_EstrusOverride_Desc>Если включено, пешка с видимой течкой будет использовать эти настройки для потенциальных подключений к оплодотворению вместо настроек RJW.&#10;Все настройки по умолчанию соответствуют их аналогам RJW.</Option_EstrusOverride_Desc>
<Option_EstrusFuckability_Label>Минимальная возможность перепихнуться во время течки</Option_EstrusFuckability_Label>
<Option_EstrusAttractability_Label>Подключение минимальная привлекательность во время течки</Option_EstrusAttractability_Label>
<Option_EstrusRelationship_Label>Минимальное мнение о перепихоне во время течки</Option_EstrusRelationship_Label>
<EstimatedCumLifespan>Расчетная продолжительность жизни спермотозоидов</EstimatedCumLifespan>
<EstimatedEggLifespan>Предполагаемый срок жизни яйца</EstimatedEggLifespan>
<FertilityDesc>Вероятность имплантации оплодотворенных яйцеклеток.&#10;Вероятность оплодотворения в этот час: {0}%</FertilityDesc>
<Option_PregnancyFromBaseRJW_Label>Использовать базовый RJW pregnancy</Option_PregnancyFromBaseRJW_Label>
<Option_PregnancyFromMultiplePregnancy_Label>Использовать менструацию при многоплодной беременности</Option_PregnancyFromMultiplePregnancy_Label>
<Option_PregnancyFromBiotech_Label>Использовать систему беремености из biotech</Option_PregnancyFromBiotech_Label>
<Option_EnableDraftedIcon_Label>Показывать статус матки при призыве</Option_EnableDraftedIcon_Label>
<Option_EnableDraftedIcon_Desc>Нарисуйте значок матки для набранных пешек</Option_EnableDraftedIcon_Desc>
<Button_ResetToDefault>Вернусть всё по умолчанию</Button_ResetToDefault>
<Gizmo_GatherCum>Собрать сперму</Gizmo_GatherCum>
<FloatMenu_CleanSelf>Вагинальное мытье</FloatMenu_CleanSelf>
<CustomHybrid_List_Title>Пользовательский гибридный редактор</CustomHybrid_List_Title>
<CustomHybrid_Title>Гибриды из {0}</CustomHybrid_Title>
<CustomHybrid_Tooltip>Когда {0} скрещивается с {1}, {2} родится с вероятностью {3}.&#10;Если обе расы имеют гибридные определения друг для друга, будет использоваться определение отца.</CustomHybrid_Tooltip>
<CannotNoEggs>Никаких яиц</CannotNoEggs>
</LanguageData>

View file

@ -11,27 +11,6 @@
<Patch> <Patch>
<Operation Class="PatchOperationAdd"> <Operation Class="PatchOperationAdd">
<xpath>/Defs/rjw.HediffDef_PartBase[defName="DogVagina"]</xpath>
<value>
<comps>
<li Class="RJW_Menstruation.CompProperties_Menstruation">
<maxCumCapacity>8</maxCumCapacity>
<baseImplantationChanceFactor>1.0</baseImplantationChanceFactor>
<basefertilizationChanceFactor>1.0</basefertilizationChanceFactor>
<follicularIntervalDays>14</follicularIntervalDays>
<lutealIntervalDays>166</lutealIntervalDays>
<bleedingIntervalDays>8</bleedingIntervalDays>
<recoveryIntervalDays>15</recoveryIntervalDays>
<eggLifespanDays>4</eggLifespanDays>
<wombTex>Womb/Womb</wombTex>
<vagTex>Genitals/Vagina</vagTex>
<estrusDaysBeforeOvulation>9</estrusDaysBeforeOvulation>
</li>
</comps>
</value>
</Operation>
<!--<Operation Class="PatchOperationAdd">
<xpath>/Defs/rjw.HediffDef_PartBase[defName="DogVagina"]</xpath> <xpath>/Defs/rjw.HediffDef_PartBase[defName="DogVagina"]</xpath>
<value> <value>
<comps> <comps>
@ -51,7 +30,7 @@
</li> </li>
</comps> </comps>
</value> </value>
</Operation>--> </Operation>
<Operation Class="PatchOperationAdd"> <Operation Class="PatchOperationAdd">
<xpath>/Defs/rjw.HediffDef_PartBase[defName="CatVagina"]</xpath> <xpath>/Defs/rjw.HediffDef_PartBase[defName="CatVagina"]</xpath>

View file

@ -28,10 +28,7 @@ namespace RJW_Menstruation
} }
} }
} }
if (filth != null) filth?.AddSources(sources);
{
filth.AddSources(sources);
}
return false; return false;
} }
if (filth != null) if (filth != null)

View file

@ -75,7 +75,7 @@ namespace RJW_Menstruation
case Stage.Ovulatory: case Stage.Ovulatory:
return true; return true;
case Stage.Luteal: case Stage.Luteal:
return IsEggExist && curStageHrs < EggLifespanHours * 24; return IsEggExist && curStageHrs < EggLifespanHours;
default: default:
return false; return false;
} }
@ -93,7 +93,7 @@ namespace RJW_Menstruation
case Stage.Ovulatory: case Stage.Ovulatory:
return true; return true;
case Stage.Luteal: case Stage.Luteal:
return IsEggExist && curStageHrs < EggLifespanHours * 24; return IsEggExist && curStageHrs < EggLifespanHours;
default: default:
return false; return false;
} }

View file

@ -498,7 +498,7 @@ namespace RJW_Menstruation
case Stage.Ovulatory: case Stage.Ovulatory:
return true; return true;
case Stage.Luteal: case Stage.Luteal:
return curStageHrs < EggLifespanHours * 24; return curStageHrs < EggLifespanHours;
default: default:
return false; return false;
} }
@ -744,6 +744,38 @@ namespace RJW_Menstruation
base.CompPostPostRemoved(); base.CompPostPostRemoved();
} }
public override string CompTipStringExtra
{
get
{
StringBuilder tip = new StringBuilder();
tip.Append(Translations.Dialog_WombInfo01);
tip.Append(": ");
tip.Append(GetCurStageLabel);
string fertInfo = GetFertilizingInfo;
if(CurrentVisibleStage == Stage.Luteal && fertInfo.Length > 0)
{
tip.AppendLine();
tip.Append(fertInfo);
}
return tip.ToString();
}
}
protected virtual int HoursToNextStage()
{
return Math.Max(0,(currentIntervalHours - curStageHrs) / Configurations.CycleAcceleration);
}
public override string CompDebugString()
{
if (curStage == Stage.None || curStage == Stage.Infertile || curStage == Stage.Pregnant) return base.CompDebugString();
StringBuilder debugString = new StringBuilder();
debugString.Append($"Time to next state: ");
debugString.Append(GenDate.ToStringTicksToPeriod(HoursToNextStage() * GenDate.TicksPerHour));
return debugString.ToString();
}
/// <summary> /// <summary>
/// Get fluid in womb that not a cum /// Get fluid in womb that not a cum
/// </summary> /// </summary>
@ -1200,7 +1232,7 @@ namespace RJW_Menstruation
case Stage.Ovulatory: case Stage.Ovulatory:
return true; return true;
case Stage.Luteal: case Stage.Luteal:
return curStageHrs < EggLifespanHours * 24; return curStageHrs < EggLifespanHours;
default: default:
return false; return false;
} }
@ -1531,7 +1563,7 @@ namespace RJW_Menstruation
ovulated = (int)eggnum + eggstack; ovulated = (int)eggnum + eggstack;
for (int i = 0; i < ovulated; i++) for (int i = 0; i < ovulated; i++)
eggs.Add(new Egg((int)(EggLifespanHours * 24 / CycleFactor))); eggs.Add(new Egg((int)(EggLifespanHours / CycleFactor)));
ovarypower -= ovulated; ovarypower -= ovulated;
eggstack = 0; eggstack = 0;

View file

@ -57,6 +57,12 @@ namespace RJW_Menstruation
Scribe_Values.Look(ref averageCycleIntervalHours, "averageCycleIntervalHours", averageCycleIntervalHours, true); Scribe_Values.Look(ref averageCycleIntervalHours, "averageCycleIntervalHours", averageCycleIntervalHours, true);
} }
protected override int HoursToNextStage()
{
if (curStage == Stage.Anestrus && hoursToNextCycle > 0) return hoursToNextCycle / Configurations.CycleAcceleration;
else return base.HoursToNextStage();
}
protected override void BleedingAction() protected override void BleedingAction()
{ {
if (curStageHrs >= currentIntervalHours) if (curStageHrs >= currentIntervalHours)

View file

@ -79,6 +79,7 @@ namespace RJW_Menstruation
kind: babyPawnKind, kind: babyPawnKind,
faction: mother.Faction, faction: mother.Faction,
allowDowned: true, allowDowned: true,
// fixedLastName seems not to actually do anything, as we eventually end up in PawnBioAndNameGenerator.NameResolvedFrom, which ignores its forcedLastName argument
fixedLastName: (string)RandomLastName.Invoke(null, new object[] { mother, mother, xxx.is_human(father) ? father : null }), fixedLastName: (string)RandomLastName.Invoke(null, new object[] { mother, mother, xxx.is_human(father) ? father : null }),
forceNoIdeo: true, forceNoIdeo: true,
forcedEndogenes: PregnancyUtility.GetInheritedGenes(father, mother), forcedEndogenes: PregnancyUtility.GetInheritedGenes(father, mother),
@ -207,8 +208,7 @@ namespace RJW_Menstruation
do do
{ {
Pawn baby = comp.babies[0]; Pawn baby = comp.babies[0];
Pawn thisFather = baby.GetFather(); Pawn thisFather = baby.GetFather() ?? father;
if (thisFather == null) thisFather = father;
baby.relations.ClearAllRelations(); // To keep ApplyBirthOutcome from erroring when it tries to set up relations baby.relations.ClearAllRelations(); // To keep ApplyBirthOutcome from erroring when it tries to set up relations
PregnancyUtility.ApplyBirthOutcome(thisOutcome, quality, ritual, genes, geneticMother, birtherThing, thisFather, doctor, lordJobRitual, assignments); PregnancyUtility.ApplyBirthOutcome(thisOutcome, quality, ritual, genes, geneticMother, birtherThing, thisFather, doctor, lordJobRitual, assignments);
@ -258,8 +258,7 @@ namespace RJW_Menstruation
do do
{ {
Pawn baby = comp.babies[0]; Pawn baby = comp.babies[0];
Pawn thisFather = baby.GetFather(); Pawn thisFather = baby.GetFather() ?? father;
if (thisFather == null) thisFather = father;
baby.relations.ClearAllRelations(); baby.relations.ClearAllRelations();
PregnancyUtility.ApplyBirthOutcome(outcome, quality, ritual, genes, geneticMother, birtherThing, thisFather, doctor, lordJobRitual, assignments); PregnancyUtility.ApplyBirthOutcome(outcome, quality, ritual, genes, geneticMother, birtherThing, thisFather, doctor, lordJobRitual, assignments);

View file

@ -151,10 +151,7 @@ namespace RJW_Menstruation
else if (gestationProgress < 0.8f) icon = fetustex + "04"; else if (gestationProgress < 0.8f) icon = fetustex + "04";
else icon = fetustex + "05"; else icon = fetustex + "05";
Texture2D result = TryGetTwinsIcon(icon, babycount); return TryGetTwinsIcon(icon, babycount) ?? ContentFinder<Texture2D>.Get((icon), true);
if (result == null) result = ContentFinder<Texture2D>.Get((icon), true);
return result;
} }
public static Texture2D TryGetTwinsIcon(string path, int babycount) public static Texture2D TryGetTwinsIcon(string path, int babycount)
@ -205,10 +202,7 @@ namespace RJW_Menstruation
if (hediffs.Count == 1) return ContentFinder<Texture2D>.Get(path + "Womb_Egged_Large", true); if (hediffs.Count == 1) return ContentFinder<Texture2D>.Get(path + "Womb_Egged_Large", true);
else return ContentFinder<Texture2D>.Get(path + "Womb_Egged_ManyMixed", true); else return ContentFinder<Texture2D>.Get(path + "Womb_Egged_ManyMixed", true);
} }
Texture2D result = ContentFinder<Texture2D>.Get(path + "Womb_Egged_" + hediffs.Count(), false); return ContentFinder<Texture2D>.Get(path + "Womb_Egged_" + hediffs.Count(), false) ?? ContentFinder<Texture2D>.Get(path + "Womb_Egged_Many", true);
if (result == null) result = ContentFinder<Texture2D>.Get(path + "Womb_Egged_Many", true);
return result;
} }
public static Texture2D GetWombIcon(this HediffComp_Menstruation comp) public static Texture2D GetWombIcon(this HediffComp_Menstruation comp)
{ {
@ -307,8 +301,8 @@ namespace RJW_Menstruation
public static Texture2D GetAnalIcon(this Pawn pawn, bool drawOrigin = false) public static Texture2D GetAnalIcon(this Pawn pawn, bool drawOrigin = false)
{ {
Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)); Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ??
if (hediff == null) hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => h.def.defName.ToLower().Contains("anus")); Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => h.def.defName.ToLower().Contains("anus"));
if (hediff == null) return ContentFinder<Texture2D>.Get(("Genitals/Anal00"), true); if (hediff == null) return ContentFinder<Texture2D>.Get(("Genitals/Anal00"), true);
string icon; string icon;

View file

@ -150,8 +150,7 @@ namespace RJW_Menstruation
if (Configurations.EnableBirthVaginaMorph) if (Configurations.EnableBirthVaginaMorph)
{ {
// The comp still has the pregnancy attached at this point in the process // The comp still has the pregnancy attached at this point in the process
Hediff vagina = __instance.GetMenstruationCompFromPregnancy()?.parent; Hediff vagina = (__instance.GetMenstruationCompFromPregnancy()?.parent) ?? mother.health.hediffSet.hediffs.FirstOrFallback(x => VariousDefOf.AllVaginas.Contains(x.def));
if (vagina == null) vagina = mother.health.hediffSet.hediffs.FirstOrFallback(x => VariousDefOf.AllVaginas.Contains(x.def));
if (vagina == null) return; if (vagina == null) return;
float morph = Mathf.Max(baby.BodySize - Mathf.Pow(vagina.Severity * mother.BodySize, 2), 0f); float morph = Mathf.Max(baby.BodySize - Mathf.Pow(vagina.Severity * mother.BodySize, 2), 0f);
vagina.Severity += morph * Configurations.VaginaMorphPower; vagina.Severity += morph * Configurations.VaginaMorphPower;

View file

@ -37,20 +37,14 @@ namespace RJW_Menstruation
{ {
BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo fieldInfo = type?.GetField(name, flags); FieldInfo fieldInfo = type?.GetField(name, flags);
if (fieldInfo != null) fieldInfo?.SetValue(null, value);
{
fieldInfo.SetValue(null, value);
}
} }
public static void SetMemberValue(this object obj, string name, object value) public static void SetMemberValue(this object obj, string name, object value)
{ {
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo fieldInfo = obj?.GetType().GetField(name, flags); FieldInfo fieldInfo = obj?.GetType().GetField(name, flags);
if (fieldInfo != null) fieldInfo?.SetValue(obj, value);
{
fieldInfo.SetValue(obj, value);
}
} }

View file

@ -66,12 +66,10 @@ namespace RJW_Menstruation
public static float GetCumVolume(this Pawn pawn, List<Hediff> hediffs) public static float GetCumVolume(this Pawn pawn, List<Hediff> hediffs)
{ {
CompHediffBodyPart part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>(); CompHediffBodyPart part = (((hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("penis")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>()) ??
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>(); (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorf")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>())) ??
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>(); (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("ovipositorm")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>())) ??
if (part == null) part = hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>(); (hediffs?.FindAll((Hediff hed) => hed.def.defName.ToLower().Contains("tentacle")).InRandomOrder().FirstOrDefault()?.TryGetComp<CompHediffBodyPart>());
return pawn.GetCumVolume(part); return pawn.GetCumVolume(part);
} }
@ -194,9 +192,8 @@ namespace RJW_Menstruation
public static void DrawBreastIcon(this Pawn pawn, Rect rect) public static void DrawBreastIcon(this Pawn pawn, Rect rect)
{ {
Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def)); Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def)) ??
if (hediff == null) Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_uddersBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_uddersBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
Texture2D breast, nipple, areola; Texture2D breast, nipple, areola;
if (hediff != null) if (hediff != null)
{ {
@ -359,15 +356,15 @@ namespace RJW_Menstruation
} }
public static string GetAnusLabel(this Pawn pawn) public static string GetAnusLabel(this Pawn pawn)
{ {
Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)); Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllAnuses.Contains(h.def)) ??
if (hediff == null) hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => h.def.defName.ToLower().Contains("anus")); Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_anusBPR(pawn)).FirstOrDefault(h => h.def.defName.ToLower().Contains("anus"));
if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")"; if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
else return ""; else return "";
} }
public static string GetBreastLabel(this Pawn pawn) public static string GetBreastLabel(this Pawn pawn)
{ {
Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def)); Hediff hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_breastsBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def)) ??
if (hediff == null) hediff = Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_uddersBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def)); Genital_Helper.get_PartsHediffList(pawn, Genital_Helper.get_uddersBPR(pawn)).FirstOrDefault(h => VariousDefOf.AllBreasts.Contains(h.def));
if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")"; if (hediff != null) return hediff.LabelBase.CapitalizeFirst() + "\n(" + hediff.LabelInBrackets + ")";
else return ""; else return "";
} }

View file

@ -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.8.6</version> <version>1.0.8.7</version>
<dependencies> <dependencies>
</dependencies> </dependencies>
<incompatibleWith /> <incompatibleWith />

View file

@ -1,3 +1,9 @@
Version 1.0.8.7
- Fix missing texture when using Milkable Colonists.
- Fix estrus and egg lifespan lasting far longer than intended.
- Canine vaginas now use the new periodic ovulator cycle.
- Hovering over a vagina hediff will show the current state in the tooltip.
Version 1.0.8.6 Version 1.0.8.6
- Updated Traditional Chinese translation by Hydrogen. - Updated Traditional Chinese translation by Hydrogen.
- Fix error when trying to terminate a non-Biotech pregnancy. - Fix error when trying to terminate a non-Biotech pregnancy.