Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
 /// <summary> Removes the transformed instance from the list. </summary>
 /// <param name="tfPawn"> The tf pawn. </param>
 public void RemoveInstance(TransformedPawn tfPawn)
 {
     TransformedPawnsLst.Remove(tfPawn);
 }
Esempio n. 6
0
        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();
                }
            }
        }