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; }
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(); } }
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); } }