/// <summary>Adds the transformed pawn.</summary> /// <param name="tfPair">The tf pair.</param> /// <exception cref="ArgumentNullException">tfPair</exception> public void AddTransformedPawn([NotNull] TransformedPawn tfPair) { if (tfPair == null) { throw new ArgumentNullException(nameof(tfPair)); } if (!tfPair.IsValid) { Log.Error($"tried to add invalid transformed pawn! {tfPair.ToDebugString()}\n"); return; } _transformedPawns.Add(tfPair); }
static void TryRevertTransformedPawn(Pawn pawn) { if (pawn == null) { return; } var gComp = Find.World.GetComponent <PawnmorphGameComp>(); (TransformedPawn pawn, TransformedStatus status)? tfPawn = gComp?.GetTransformedPawnContaining(pawn); TransformedPawn transformedPawn = tfPawn?.pawn; if (transformedPawn == null || tfPawn?.status != TransformedStatus.Transformed) { return; } MutagenDef mut = transformedPawn.mutagenDef ?? MutagenDefOf.defaultMutagen; mut.MutagenCached.TryRevert(transformedPawn); }
internal void MakePermanentlyFeral() { Hediff fHediff; if (StateDef.forcedHediff != null) { fHediff = Pawn.health.hediffSet.GetFirstHediffOfDef(StateDef.forcedHediff); } else { fHediff = null; } //transfer relationships back if possible var gComp = Find.World.GetComponent <PawnmorphGameComp>(); Pawn oPawn = gComp.GetTransformedPawnContaining(Pawn)?.Item1?.OriginalPawns.FirstOrDefault(); if (oPawn == Pawn) { oPawn = null; } Pawn_RelationsTracker aRelations = Pawn.relations; if (aRelations != null && oPawn != null) { FormerHumanUtilities.TransferRelationsToOriginal(oPawn, Pawn); } Pawn.health.AddHediff(TfHediffDefOf.PermanentlyFeral); if (fHediff != null) { Pawn.health.RemoveHediff(fHediff); } var loader = Find.World.GetComponent <PawnmorphGameComp>(); TransformedPawn inst = loader.GetTransformedPawnContaining(Pawn)?.Item1; var singleInst = inst as TransformedPawnSingle; //hacky, need to come up with a better solution foreach (Pawn instOriginalPawn in inst?.OriginalPawns ?? Enumerable.Empty <Pawn>() ) //needed to handle merges correctly { ReactionsHelper.OnPawnPermFeral(instOriginalPawn, Pawn, singleInst?.reactionStatus ?? FormerHumanReactionStatus.Wild); } //remove the original and destroy the pawns foreach (Pawn instOriginalPawn in inst?.OriginalPawns ?? Enumerable.Empty <Pawn>()) { instOriginalPawn.Destroy(); } if (inst != null) { loader.RemoveInstance(inst); } if (inst != null || Pawn.Faction == Faction.OfPlayer) { Find.LetterStack.ReceiveLetter("LetterHediffFromPermanentTFLabel".Translate(Pawn.LabelShort).CapitalizeFirst(), "LetterHediffFromPermanentTF".Translate(Pawn.LabelShort).CapitalizeFirst(), LetterDefOf.NegativeEvent, Pawn); } Pawn.needs?.AddOrRemoveNeedsAsAppropriate(); //make sure any comps get added/removed as appropriate PawnComponentsUtility.AddAndRemoveDynamicComponents(Pawn); }
private void TransformPawn(Pawn pawn) { TransformationRequest request; Mutagen mutagen; switch (_state) { case ChamberState.Transforming: request = new TransformationRequest(pawnTFKind, pawn) { forcedGender = TFGender.Switch, forcedGenderChance = 50, manhunterSettingsOverride = ManhunterTfSettings.Never, factionResponsible = Faction, forcedFaction = Faction }; mutagen = MutagenDefOf.defaultMutagen.MutagenCached; break; case ChamberState.MergeInto: request = new TransformationRequest(pawnTFKind, pawn, (Pawn)linkTo.innerContainer[0]) { forcedGender = TFGender.Switch, forcedGenderChance = 50, manhunterSettingsOverride = ManhunterTfSettings.Never, factionResponsible = Faction, forcedFaction = Faction }; mutagen = MutagenDefOf.MergeMutagen.MutagenCached; break; case ChamberState.MergeOutOf: return; case ChamberState.Idle: default: throw new ArgumentOutOfRangeException(); } TransformedPawn pmInst = mutagen.Transform(request); if (pmInst == null) { Log.Error($"mutagenic chamber could not transform pawns {string.Join(",",request.originals.Select(p => p.Name.ToStringFull).ToArray())} using mutagen {mutagen.def.defName}"); return; } SendLetter(pawn); base.EjectContents(); if (_state == ChamberState.MergeInto) { linkTo.EjectContents(); } foreach (Pawn pmInstOriginalPawn in pmInst.OriginalPawns) { if (pmInstOriginalPawn == null) { continue; } TransformerUtility.CleanUpHumanPawnPostTf(pmInstOriginalPawn, null); } foreach (Pawn pmInstOriginalPawn in pmInst.OriginalPawns) { pmInstOriginalPawn.DeSpawn(); } var comp = Find.World.GetComponent <PawnmorphGameComp>(); comp.AddTransformedPawn(pmInst); Find.TickManager.slower.SignalForceNormalSpeedShort(); PawnComponentsUtility.AddComponentsForSpawn(pmInst.TransformedPawns.First()); pawn.ownership.UnclaimAll(); if (modulator != null) { modulator.triggered = true; if (modulator.merging) { modulator.merging = false; modulator.random = true; } } if (!Destroyed) { SoundDefOf.CryptosleepCasket_Eject.PlayOneShot(SoundInfo.InMap(new TargetInfo(base.Position, base.Map))); fuelComp.ConsumeFuel(fuelComp.Fuel); } }
/// <summary> Removes the transformed instance from the list. </summary> /// <param name="tfPawn"> The tf pawn. </param> public void RemoveInstance(TransformedPawn tfPawn) { TransformedPawnsLst.Remove(tfPawn); }
private void EjectPawn() { _scratchList.Clear(); _scratchList.AddRange(innerContainer.OfType <Pawn>()); var pawn = _scratchList[0] as Pawn; if (pawn == null) { Log.Error("trying to eject empty muta chamber!"); return; } EjectContents(); SelectorComp.Enabled = false; TransformationRequest tfRequest; Mutagen mutagen = null; switch (_currentUse) { case ChamberUse.Mutation: tfRequest = null; break; case ChamberUse.Merge: var otherPawn = (Pawn)_scratchList[1]; if (otherPawn == null) { Log.Error("merging but cannot find other pawn! aborting!"); tfRequest = null; break; } tfRequest = new TransformationRequest(_targetAnimal, pawn, otherPawn) { addMutationToOriginal = false, factionResponsible = Faction, forcedFaction = Faction, forcedSapienceLevel = 1, manhunterSettingsOverride = ManhunterTfSettings.Never }; mutagen = MutagenDefOf.MergeMutagen.MutagenCached; break; case ChamberUse.Tf: PawnKindDef animal = SelectorComp.ChosenKind; if (animal == null) { animal = GetRandomAnimal(); } tfRequest = new TransformationRequest(animal, pawn) { addMutationToOriginal = true, factionResponsible = Faction, forcedFaction = Faction, forcedGender = TFGender.Original, forcedSapienceLevel = 1, manhunterSettingsOverride = ManhunterTfSettings.Never }; mutagen = MutagenDefOf.defaultMutagen.MutagenCached; break; default: throw new ArgumentOutOfRangeException(); } if (tfRequest == null) { return; } TransformedPawn tfPawn = mutagen.Transform(tfRequest); if (tfPawn == null) { Log.Error($"unable to transform pawn(s)! {_currentUse} {_innerState}"); return; } var gComp = Find.World.GetComponent <PawnmorphGameComp>(); gComp.AddTransformedPawn(tfPawn); foreach (Pawn oPawn in tfPawn.OriginalPawns) { if (oPawn.Spawned) { oPawn.DeSpawn(); } } }