protected override void Impregnate(Pawn pawn, Pawn part, bool isAnalSex) { if (xxx.is_human(part)) { if (pawn.gender == Gender.Female) { HediffDef_InsectEgg egg = (from x in DefDatabase <HediffDef_InsectEgg> .AllDefs where x.IsParent(pawn.def.defName) select x).RandomElement <HediffDef_InsectEgg>(); if (egg != null) { //--Log.Message("[RJW]JobDriver_RapeEnemyByInsect::aftersex() - Planting egg " + egg.ToString()); PlantSomething(egg, part, isAnalSex, Rand.Range(1, 2)); } /*else * { * //--Log.Message("[RJW]JobDriver_RapeEnemyByInsect::aftersex() - There is no EggData of " + pawn.def.defName); * }*/ } else { //--Log.Message("[RJW]JobDriver_RapeEnemyByInsect::aftersex() - Fertilize eggs"); foreach (var egg in (from x in part.health.hediffSet.GetHediffs <Hediff_InsectEgg>() where x.IsParent(pawn.def.defName) select x)) { egg.Fertilize(pawn); } } } }
public static void DoEgg(Pawn pawn, Pawn partner) { if (RJWPregnancySettings.insect_pregnancy_enabled) { if (RJWSettings.DevMode) { Log.Message(" insect pregnancy"); } //female "insect" plant eggs //futa "insect" 50% plant eggs if ((Genital_Helper.has_ovipositorF(pawn) && !Genital_Helper.has_ovipositorM(pawn)) || (Genital_Helper.has_ovipositorF(pawn) && Genital_Helper.has_ovipositorM(pawn) && Rand.Value > 0.5f)) { float maxeggssize = partner.BodySize * (xxx.has_quirk(partner, "Incubator") ? 2f : 1f) * (Genital_Helper.has_ovipositorF(partner) ? 2f : 0.5f); float eggedsize = 0; foreach (Hediff_InsectEgg egg in partner.health.hediffSet.GetHediffs <Hediff_InsectEgg>()) { if (egg.father != null) { eggedsize += egg.father.RaceProps.baseBodySize / 5; } else { eggedsize += egg.implanter.RaceProps.baseBodySize / 5; } } if (RJWSettings.DevMode) { Log.Message(" determine " + xxx.get_pawnname(partner) + " size of eggs inside: " + eggedsize + ", max: " + maxeggssize); } if (eggedsize < maxeggssize) { HediffDef_InsectEgg egg = null; string defname = ""; float eggssize = pawn.RaceProps.baseBodySize / 5; while (egg == null) { if (defname == "") { if (RJWSettings.DevMode) { Log.Message(" trying to find " + pawn.kindDef.defName + " egg"); } defname = pawn.kindDef.defName; } else { if (RJWSettings.DevMode) { Log.Message(" no " + defname + " egg found, defaulting to Unknown egg"); } defname = "Unknown"; } //Rand.PopState(); //Rand.PushState(RJW_Multiplayer.PredictableSeed()); if (egg == null) { egg = (from x in DefDatabase <HediffDef_InsectEgg> .AllDefs where x.IsParent(defname) select x).RandomElement(); } } if (RJWSettings.DevMode) { Log.Message("I choose you " + egg + "!"); } int count; float maxeggs = 100; float mineggs = 0; if (egg.eggsize != 0) { maxeggs = ((maxeggssize - eggedsize) / eggssize); if (RJWSettings.DevMode) { Log.Message(" max eggs: " + maxeggs); } } if (maxeggs >= 1) { mineggs = 1; } count = Rand.Range((int)mineggs, (int)(maxeggs)); if (RJWSettings.DevMode) { Log.Message(" planting eggs: " + egg.ToString() + " (" + count + ")"); } PlantSomething(egg, partner, false, count); //set implanter foreach (var egg1 in partner.health.hediffSet.GetHediffs <Hediff_InsectEgg>()) { egg1.Implanter(pawn); } //TODO: add widget toggle for bind all/neutral/hostile pawns if (!pawn.IsColonist) { if (!partner.health.hediffSet.HasHediff(HediffDef.Named("RJW_Cocoon")) && pawn.Faction != partner.Faction) { //if (!partner.health.hediffSet.HasHediff(HediffDef.Named("RJW_Cocoon")) && pawn.Faction != partner.Faction && pawn.HostileTo(partner)) partner.health.AddHediff(HediffDef.Named("RJW_Cocoon")); } } } } //male "insect" fertilize eggs else if (!pawn.health.hediffSet.HasHediff(xxx.sterilized)) { foreach (var egg in (from x in partner.health.hediffSet.GetHediffs <Hediff_InsectEgg>() where x.IsParent(pawn) select x)) { egg.Fertilize(pawn); } } return; } }
public override void Tick() { ageTicks++; if (!pawn.IsHashIntervalTick(10000)) // run every ~3min { return; } var partBase = def as HediffDef_PartBase; if (partBase != null) { if (partBase.produceEggs) { var IsPlayerFaction = pawn.Faction?.IsPlayer ?? false; //colonists/animals if (pawn.Map.IsPlayerHome || IsPlayerFaction || pawn.IsPrisonerOfColony) { ageTicks++; if (nextEggTick < 0) { nextEggTick = Rand.Range(partBase.minEggTick, partBase.maxEggTick); return; } if (pawn.health.capacities.GetLevel(PawnCapacityDefOf.Moving) <= 0.5) { return; } if (nextEggTick > 0 && ageTicks >= nextEggTick) { float maxEggsSize = (pawn.BodySize / 5) * (xxx.has_quirk(pawn, "Incubator") ? 2f : 1f) * (Genital_Helper.has_ovipositorF(pawn) ? 2f : 0.5f); float eggedsize = 0; foreach (var ownEgg in pawn.health.hediffSet.GetHediffs <Hediff_InsectEgg>()) { if (ownEgg.father != null) { eggedsize += ownEgg.father.RaceProps.baseBodySize / 5; } else { eggedsize += ownEgg.implanter.RaceProps.baseBodySize / 5; } } if (RJWSettings.DevMode) { Log.Message($"{xxx.get_pawnname(pawn)} filled with {eggedsize} out of max capacity of {maxEggsSize} eggs."); } if (eggedsize < maxEggsSize) { HediffDef_InsectEgg egg = null; string defname = ""; while (egg == null) { if (defname == "") { if (RJWSettings.DevMode) { Log.Message(" trying to find " + pawn.kindDef.defName + " egg"); } defname = pawn.kindDef.defName; } else { if (RJWSettings.DevMode) { Log.Message(" no " + defname + " egg found, defaulting to Unknown egg"); } defname = "Unknown"; } //Rand.PopState(); //Rand.PushState(RJW_Multiplayer.PredictableSeed()); egg = (from x in DefDatabase <HediffDef_InsectEgg> .AllDefs where x.IsParent(defname) select x) .RandomElement(); } if (RJWSettings.DevMode) { Log.Message("I choose you " + egg + "!"); } var genitals = Genital_Helper.get_genitalsBPR(pawn); if (genitals != null) { var addedEgg = pawn.health.AddHediff(egg, genitals) as Hediff_InsectEgg; addedEgg?.Implanter(pawn); } } // Reset for next egg. ageTicks = 0; nextEggTick = -1; } } } } }