Esempio n. 1
0
        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);
            }
Esempio n. 5
0
        /// <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();
            }
        }