public static Building_MutagenChamber FindCryptosleepCasketFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false) { IEnumerable <ThingDef> enumerable = from def in DefDatabase <ThingDef> .AllDefs where typeof(Building_MutagenChamber).IsAssignableFrom(def.thingClass) select def; foreach (ThingDef item in enumerable) { Building_MutagenChamber building_MutagenChamber = (Building_MutagenChamber)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(item), PathEndMode.InteractionCell, TraverseParms.For(traveler), 9999f, delegate(Thing x) { int result; if (!((Building_MutagenChamber)x).HasAnyContents && ((Building_MutagenChamber)x).flickComp.SwitchIsOn) { Pawn p2 = traveler; LocalTargetInfo target = x; bool ignoreOtherReservations2 = ignoreOtherReservations; result = (p2.CanReserve(target, 1, -1, null, ignoreOtherReservations2) ? 1 : 0); } else { result = 0; } return((byte)result != 0); }); if (building_MutagenChamber != null) { return(building_MutagenChamber); } } return(null); }
List <FloatMenuOption> GenMenuOptions(bool merge = false) { List <FloatMenuOption> menuOptions = new List <FloatMenuOption>(); List <Building_MutagenChamber> linkedChambers = Chambers; Building_MutagenChamber firstChamber = linkedChambers.First(); if (firstChamber.def == BuildingDefOf.BigMutagenicChamber) { maxBodySize = 5.0f; } else { maxBodySize = 2.9f; } IEnumerable <PawnKindDef> pks = GetAnimalOptions(); if (linkedChambers.All(x => x.ContainedThing != null) && linkedChambers.Count > 1 && ModulatorOptions.merges.Count > 0) { menuOptions.Add(new FloatMenuOption("Merge Chambers", () => SetMergeAction(ModulatorOptions.merges), priority: MenuOptionPriority.High)); } if (!merge) { foreach (PawnKindDef pk in pks) { menuOptions.Add(new FloatMenuOption(pk.LabelCap, () => SetAnimalAction(pk))); } menuOptions = menuOptions.OrderBy(o => o.Label).ToList(); } return(menuOptions); }
private void GizmoListOptions() { List <Building_MutagenChamber> chambers = Chambers; Building_MutagenChamber firstChamber = chambers.First(); Building_MutagenChamber lastChamber = chambers.Last(); if (firstChamber.daysIn > 0f || lastChamber.daysIn > 0f) { if (firstChamber != lastChamber) { if (chambers.All(x => x.ContainedThing != null) && chambers.Count > 1 && ModulatorOptions.merges.Count > 0) { Find.WindowStack.Add(new FloatMenu(GenMenuOptions(true))); } else { Messages.Message("Can't change a morph while there is one in progress.", MessageTypeDefOf.CautionInput); } } else { Messages.Message("Can't change a morph while there is one in progress.", MessageTypeDefOf.CautionInput); } } else { if (LinkedFacilities.OfType <Building_MutagenChamber>().Any()) { Find.WindowStack.Add(new FloatMenu(GenMenuOptions())); } } }
private static bool Prefix_AddHumanlikeOrders(Vector3 clickPos, Pawn pawn, List <FloatMenuOption> opts) { if (pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)) { foreach (LocalTargetInfo localTargetInfo3 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true)) { LocalTargetInfo localTargetInfo4 = localTargetInfo3; var victim = (Pawn)localTargetInfo4.Thing; MutagenDef mutagen = MutagenDefOf.MergeMutagen; if (mutagen.CanTransform(victim) && pawn.CanReserveAndReach(victim, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true) && Building_MutagenChamber.FindCryptosleepCasketFor(victim, pawn, true) != null) { string text4 = "CarryToChamber".Translate(localTargetInfo4.Thing.LabelCap, localTargetInfo4.Thing); JobDef jDef = Mutagen_JobDefOf.CarryToMutagenChamber; Action action3 = delegate { Building_MutagenChamber building_chamber = Building_MutagenChamber.FindCryptosleepCasketFor(victim, pawn); if (building_chamber == null) { building_chamber = Building_MutagenChamber.FindCryptosleepCasketFor(victim, pawn, true); } if (building_chamber == null) { Messages.Message("CannotCarryToChamber".Translate() + ": " + "NoChamber".Translate(), victim, MessageTypeDefOf.RejectInput, false); return; } var job = new Job(jDef, victim, building_chamber); job.count = 1; pawn.jobs.TryTakeOrderedJob(job); }; string label = text4; Action action2 = action3; Pawn revalidateClickTarget = victim; opts.Add(FloatMenuUtility .DecoratePrioritizedTask(new FloatMenuOption(label, action2, MenuOptionPriority.Default, null, revalidateClickTarget), pawn, victim)); } } } return(true); }
/// <summary>Makes the new toils.</summary> /// <returns></returns> protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDespawnedOrNull(TargetIndex.A); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell)); Toil prepare = Toils_General.Wait(500); prepare.FailOnCannotTouch(TargetIndex.A, PathEndMode.InteractionCell); prepare.WithProgressBarToilDelay(TargetIndex.A); yield return(prepare); Toil enter = new Toil(); enter.initAction = delegate { Pawn actor = enter.actor; Building_MutagenChamber pod = (Building_MutagenChamber)actor.CurJob.targetA.Thing; Action action = delegate { actor.DeSpawn(); pod.TryAcceptThing(actor); }; if (!pod.def.building.isPlayerEjectable) { int freeColonistsSpawnedOrInPlayerEjectablePodsCount = Map.mapPawns.FreeColonistsSpawnedOrInPlayerEjectablePodsCount; if (freeColonistsSpawnedOrInPlayerEjectablePodsCount <= 1) { Find.WindowStack.Add(Dialog_MessageBox.CreateConfirmation("CasketWarning".Translate(actor.Named("PAWN")).AdjustedFor(actor), action)); } else { action(); } } else { action(); } }; enter.defaultCompleteMode = ToilCompleteMode.Instant; yield return(enter); }
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(); } }