Ejemplo n.º 1
0
        public override void EjectContents() //should refactor the mutagenic chamber, make it a state machine
        {
            DebugLogUtils.Assert(innerContainer.Count == 1, "innerContainer.Count == 1");

            var pawn = (Pawn)innerContainer[0];

            if (pawn == null)
            {
                Log.Warning($"mutagenic chamber ejecting nothing");

                return;
            }



            if (IsFinished)
            {
                TransformPawn(pawn);
            }
            else
            {
                base.EjectContents();
                if (!Destroyed)
                {
                    SoundDefOf.CryptosleepCasket_Eject.PlayOneShot(SoundInfo.InMap(new TargetInfo(base.Position, base.Map)));
                    fuelComp.ConsumeFuel(fuelComp.Fuel);
                }


                if (_state != ChamberState.MergeOutOf || (linkTo?.daysIn ?? 0) < 1)
                {
                    pawn.health.AddHediff(Hediffs.MorphTransformationDefOf.FullRandomTFAnyOutcome);
                }

                pawn.health.AddHediff(Hediffs.MorphTransformationDefOf.FullRandomTFAnyOutcome);
                if (_state == ChamberState.MergeInto)
                {
                    linkTo?.EjectContents();
                }
            }

            _state = ChamberState.Idle;
            daysIn = 0;
        }
Ejemplo n.º 2
0
        public void NotifyChamberFinished(Building_MutagenChamber chamber)
        {
            if (!LinkedFacilities.Contains(chamber))
            {
                Log.Error($"mutagen modulator received message from chamber that it was not linked to!");
                return;
            }


            chamber.EjectContents();
            var linkedTo = chamber.linkTo;

            linkedTo?.ClearContents();

            if (random)
            {
                chamber.PickRandom();
                linkedTo?.PickRandom();
            }
        }
Ejemplo n.º 3
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);
            }
        }