Ejemplo n.º 1
0
        /// <summary>Does the ingestion outcome special.</summary>
        /// <param name="pawn">The pawn.</param>
        /// <param name="ingested">The ingested.</param>
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            var gComp = Find.World.GetComponent <PawnmorphGameComp>();

            var status = gComp.GetPawnStatus(pawn);

            if (status == TransformedStatus.Transformed)
            {
                foreach (MutagenDef mutagenDef in DefDatabase <MutagenDef> .AllDefs)
                {
                    if (blackList.Contains(mutagenDef))
                    {
                        return; // Make it so this reverted can not revert certain kinds of transformations.
                    }
                    if (mutagenDef.MutagenCached.TryRevert(pawn))
                    {
                        return;
                    }
                }
            }

            TransformerUtility.RemoveAllMutations(pawn);
            pawn.RefreshGraphics();
            AspectTracker aT = pawn.GetAspectTracker();

            if (aT != null)
            {
                RemoveAspects(aT);
            }
        }
Ejemplo n.º 2
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);
            }
        }