Exemplo n.º 1
0
        public static Building_CryptosleepCasket FindCryptosleepCasketFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false)
        {
            IEnumerable <ThingDef> enumerable = from def in DefDatabase <ThingDef> .AllDefs
                                                where typeof(Building_CryptosleepCasket).IsAssignableFrom(def.thingClass)
                                                select def;

            foreach (ThingDef item in enumerable)
            {
                Building_CryptosleepCasket building_CryptosleepCasket = (Building_CryptosleepCasket)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(item), PathEndMode.InteractionCell, TraverseParms.For(traveler), 9999f, delegate(Thing x)
                {
                    int result;
                    if (!((Building_CryptosleepCasket)x).HasAnyContents)
                    {
                        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_CryptosleepCasket != null)
                {
                    return(building_CryptosleepCasket);
                }
            }
            return(null);
        }
Exemplo n.º 2
0
        private static void CountdownEnded()
        {
            List <Building> list          = ShipUtility.ShipBuildingsAttachedTo(ShipCountdown.shipRoot).ToList <Building>();
            StringBuilder   stringBuilder = new StringBuilder();

            foreach (Building current in list)
            {
                Building_CryptosleepCasket building_CryptosleepCasket = current as Building_CryptosleepCasket;
                if (building_CryptosleepCasket != null && building_CryptosleepCasket.HasAnyContents)
                {
                    stringBuilder.AppendLine("   " + building_CryptosleepCasket.ContainedThing.LabelCap);
                    Find.StoryWatcher.statsRecord.colonistsLaunched++;
                    TaleRecorder.RecordTale(TaleDefOf.LaunchedShip, new object[]
                    {
                        building_CryptosleepCasket.ContainedThing
                    });
                }
                current.Destroy(DestroyMode.Vanish);
            }
            string victoryText = "GameOverShipLaunched".Translate(new object[]
            {
                stringBuilder.ToString(),
                GameVictoryUtility.PawnsLeftBehind()
            });

            GameVictoryUtility.ShowCredits(victoryText);
        }
Exemplo n.º 3
0
        public static Building_CryptosleepCasket FindCryptosleepCasketFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false)
        {
            IEnumerable <ThingDef> enumerable = from def in DefDatabase <ThingDef> .AllDefs
                                                where typeof(Building_CryptosleepCasket).IsAssignableFrom(def.thingClass)
                                                select def;

            foreach (ThingDef current in enumerable)
            {
                Building_CryptosleepCasket building_CryptosleepCasket = (Building_CryptosleepCasket)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(current), PathEndMode.InteractionCell, TraverseParms.For(traveler, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, delegate(Thing x)
                {
                    bool arg_33_0;
                    if (!((Building_CryptosleepCasket)x).HasAnyContents)
                    {
                        Pawn traveler2                = traveler;
                        LocalTargetInfo target        = x;
                        bool ignoreOtherReservations2 = ignoreOtherReservations;
                        arg_33_0 = traveler2.CanReserve(target, 1, -1, null, ignoreOtherReservations2);
                    }
                    else
                    {
                        arg_33_0 = false;
                    }
                    return(arg_33_0);
                }, null, 0, -1, false, RegionType.Set_Passable, false);
                if (building_CryptosleepCasket != null)
                {
                    return(building_CryptosleepCasket);
                }
            }
            return(null);
        }
Exemplo n.º 4
0
 private static void CountdownEnded()
 {
     if (shipRoot != null)
     {
         List <Building> list          = ShipUtility.ShipBuildingsAttachedTo(shipRoot).ToList();
         StringBuilder   stringBuilder = new StringBuilder();
         foreach (Building item in list)
         {
             Building_CryptosleepCasket building_CryptosleepCasket = item as Building_CryptosleepCasket;
             if (building_CryptosleepCasket != null && building_CryptosleepCasket.HasAnyContents)
             {
                 stringBuilder.AppendLine("   " + building_CryptosleepCasket.ContainedThing.LabelCap);
                 Find.StoryWatcher.statsRecord.colonistsLaunched++;
                 TaleRecorder.RecordTale(TaleDefOf.LaunchedShip, building_CryptosleepCasket.ContainedThing);
             }
         }
         GameVictoryUtility.ShowCredits(GameVictoryUtility.MakeEndCredits("GameOverShipLaunchedIntro".Translate(), "GameOverShipLaunchedEnding".Translate(), stringBuilder.ToString()));
         foreach (Building item2 in list)
         {
             item2.Destroy();
         }
     }
     else if (!customLaunchString.NullOrEmpty())
     {
         GameVictoryUtility.ShowCredits(customLaunchString);
     }
     else
     {
         GameVictoryUtility.ShowCredits(GameVictoryUtility.MakeEndCredits("GameOverShipLaunchedIntro".Translate(), "GameOverShipLaunchedEnding".Translate(), null));
     }
 }
Exemplo n.º 5
0
        public static IEnumerable <string> LaunchFailReasons(Building rootBuilding)
        {
            List <Building> shipParts = ShipUtility.ShipBuildingsAttachedTo(rootBuilding).ToList <Building>();

            using (Dictionary <ThingDef, int> .Enumerator enumerator = ShipUtility.RequiredParts().GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    KeyValuePair <ThingDef, int> partDef = enumerator.Current;
                    int shipPartCount = shipParts.Count((Building pa) => pa.def == partDef.Key);
                    if (shipPartCount < partDef.Value)
                    {
                        yield return(string.Format("{0}: {1}x {2} ({3} {4})", new object[]
                        {
                            "ShipReportMissingPart".Translate(),
                            partDef.Value - shipPartCount,
                            partDef.Key.label,
                            "ShipReportMissingPartRequires".Translate(),
                            partDef.Value
                        }));
                    }
                }
            }
            bool fullPodFound = false;

            foreach (Building building in shipParts)
            {
                if (building.def == ThingDefOf.Ship_CryptosleepCasket)
                {
                    Building_CryptosleepCasket building_CryptosleepCasket = building as Building_CryptosleepCasket;
                    if (building_CryptosleepCasket != null && building_CryptosleepCasket.HasAnyContents)
                    {
                        fullPodFound = true;
                        break;
                    }
                }
            }
            foreach (Building part in shipParts)
            {
                CompHibernatable hibernatable = part.TryGetComp <CompHibernatable>();
                if (hibernatable != null && hibernatable.State == HibernatableStateDefOf.Hibernating)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportHibernating".Translate(), part.LabelCap));
                }
                else if (hibernatable != null && !hibernatable.Running)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportNotReady".Translate(), part.LabelCap));
                }
            }
            if (!fullPodFound)
            {
                yield return("ShipReportNoFullPods".Translate());
            }
            yield break;
        }
Exemplo n.º 6
0
        public static IEnumerable <string> LaunchFailReasons(Building rootBuilding)
        {
            List <Building> shipParts = ShipUtility.ShipBuildingsAttachedTo(rootBuilding).ToList();

            foreach (KeyValuePair <ThingDef, int> item in ShipUtility.RequiredParts())
            {
                int shipPartCount = shipParts.Count((Building pa) => pa.def == item.Key);
                if (shipPartCount < item.Value)
                {
                    yield return(string.Format("{0}: {1}x {2} ({3} {4})", "ShipReportMissingPart".Translate(), item.Value - shipPartCount, item.Key.label, "ShipReportMissingPartRequires".Translate(), item.Value));

                    /*Error: Unable to find new state assignment for yield return*/;
                }
            }
            bool fullPodFound = false;

            foreach (Building item2 in shipParts)
            {
                if (item2.def == ThingDefOf.Ship_CryptosleepCasket)
                {
                    Building_CryptosleepCasket building_CryptosleepCasket = item2 as Building_CryptosleepCasket;
                    if (building_CryptosleepCasket != null && building_CryptosleepCasket.HasAnyContents)
                    {
                        fullPodFound = true;
                        break;
                    }
                }
            }
            foreach (Building item3 in shipParts)
            {
                CompHibernatable hibernatable = item3.TryGetComp <CompHibernatable>();
                if (hibernatable != null && hibernatable.State == HibernatableStateDefOf.Hibernating)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportHibernating".Translate(), item3.Label));

                    /*Error: Unable to find new state assignment for yield return*/;
                }
                if (hibernatable != null && !hibernatable.Running)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportNotReady".Translate(), item3.Label));

                    /*Error: Unable to find new state assignment for yield return*/;
                }
            }
            if (fullPodFound)
            {
                yield break;
            }
            yield return("ShipReportNoFullPods".Translate());

            /*Error: Unable to find new state assignment for yield return*/;
IL_036f:
            /*Error near IL_0370: Unexpected return in MoveNext()*/;
        }
Exemplo n.º 7
0
 public static Building_CryptosleepCasket FindCryptosleepCasketFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false)
 {
     foreach (ThingDef item in DefDatabase <ThingDef> .AllDefs.Where((ThingDef def) => typeof(Building_CryptosleepCasket).IsAssignableFrom(def.thingClass)))
     {
         Building_CryptosleepCasket building_CryptosleepCasket = (Building_CryptosleepCasket)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(item), PathEndMode.InteractionCell, TraverseParms.For(traveler), 9999f, (Thing x) => !((Building_CryptosleepCasket)x).HasAnyContents && traveler.CanReserve(x, 1, -1, null, ignoreOtherReservations));
         if (building_CryptosleepCasket != null)
         {
             return(building_CryptosleepCasket);
         }
     }
     return(null);
 }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedOrNull(TargetIndex.A);
            yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell));

            Toil prepare = Toils_General.Wait(500, TargetIndex.None);

            prepare.FailOnCannotTouch(TargetIndex.A, PathEndMode.InteractionCell);
            prepare.WithProgressBarToilDelay(TargetIndex.A, false, -0.5f);
            yield return(prepare);

            Toil enter = new Toil();

            enter.initAction = delegate()
            {
                Pawn actor = enter.actor;
                Building_CryptosleepCasket pod = (Building_CryptosleepCasket)actor.CurJob.targetA.Thing;
                Action action = delegate()
                {
                    actor.DeSpawn(DestroyMode.Vanish);
                    pod.TryAcceptThing(actor, true);
                };
                if (!pod.def.building.isPlayerEjectable)
                {
                    int freeColonistsSpawnedOrInPlayerEjectablePodsCount = this.Map.mapPawns.FreeColonistsSpawnedOrInPlayerEjectablePodsCount;
                    if (freeColonistsSpawnedOrInPlayerEjectablePodsCount <= 1)
                    {
                        Find.WindowStack.Add(Dialog_MessageBox.CreateConfirmation("CasketWarning".Translate().AdjustedFor(actor, "PAWN"), action, false, null));
                    }
                    else
                    {
                        action();
                    }
                }
                else
                {
                    action();
                }
            };
            enter.defaultCompleteMode = ToilCompleteMode.Instant;
            yield return(enter);

            yield break;
        }
Exemplo n.º 9
0
        public static IEnumerable <string> LaunchFailReasons(Building rootBuilding)
        {
            List <Building> shipParts = ShipBuildingsAttachedTo(rootBuilding).ToList();

            foreach (KeyValuePair <ThingDef, int> partDef in RequiredParts())
            {
                int num = shipParts.Count((Building pa) => pa.def == partDef.Key);
                if (num < partDef.Value)
                {
                    yield return(string.Format("{0}: {1}x {2} ({3} {4})", "ShipReportMissingPart".Translate(), partDef.Value - num, partDef.Key.label, "ShipReportMissingPartRequires".Translate(), partDef.Value));
                }
            }
            bool fullPodFound = false;

            foreach (Building item in shipParts)
            {
                if (item.def == ThingDefOf.Ship_CryptosleepCasket)
                {
                    Building_CryptosleepCasket building_CryptosleepCasket = item as Building_CryptosleepCasket;
                    if (building_CryptosleepCasket != null && building_CryptosleepCasket.HasAnyContents)
                    {
                        fullPodFound = true;
                        break;
                    }
                }
            }
            foreach (Building item2 in shipParts)
            {
                CompHibernatable compHibernatable = item2.TryGetComp <CompHibernatable>();
                if (compHibernatable != null && compHibernatable.State == HibernatableStateDefOf.Hibernating)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportHibernating".Translate(), item2.LabelCap));
                }
                else if (compHibernatable != null && !compHibernatable.Running)
                {
                    yield return(string.Format("{0}: {1}", "ShipReportNotReady".Translate(), item2.LabelCap));
                }
            }
            if (!fullPodFound)
            {
                yield return("ShipReportNoFullPods".Translate());
            }
        }
            public bool MoveNext()
            {
                uint num = (uint)this.$PC;

                this.$PC = -1;
                switch (num)
                {
                case 0u:
                    this.FailOnDespawnedOrNull(TargetIndex.A);
                    this.$current = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell);
                    if (!this.$disposing)
                    {
                        this.$PC = 1;
                    }
                    return(true);

                case 1u:
                    prepare = Toils_General.Wait(500, TargetIndex.None);
                    prepare.FailOnCannotTouch(TargetIndex.A, PathEndMode.InteractionCell);
                    prepare.WithProgressBarToilDelay(TargetIndex.A, false, -0.5f);
                    this.$current = prepare;
                    if (!this.$disposing)
                    {
                        this.$PC = 2;
                    }
                    return(true);

                case 2u:
                {
                    Toil enter = new Toil();
                    enter.initAction = delegate()
                    {
                        Pawn actor = enter.actor;
                        Building_CryptosleepCasket pod = (Building_CryptosleepCasket)actor.CurJob.targetA.Thing;
                        Action action = delegate()
                        {
                            actor.DeSpawn(DestroyMode.Vanish);
                            pod.TryAcceptThing(actor, true);
                        };
                        if (!pod.def.building.isPlayerEjectable)
                        {
                            int freeColonistsSpawnedOrInPlayerEjectablePodsCount = this.Map.mapPawns.FreeColonistsSpawnedOrInPlayerEjectablePodsCount;
                            if (freeColonistsSpawnedOrInPlayerEjectablePodsCount <= 1)
                            {
                                Find.WindowStack.Add(Dialog_MessageBox.CreateConfirmation("CasketWarning".Translate().AdjustedFor(actor, "PAWN"), action, false, null));
                            }
                            else
                            {
                                action();
                            }
                        }
                        else
                        {
                            action();
                        }
                    };
                    enter.defaultCompleteMode = ToilCompleteMode.Instant;
                    this.$current             = enter;
                    if (!this.$disposing)
                    {
                        this.$PC = 3;
                    }
                    return(true);
                }

                case 3u:
                    this.$PC = -1;
                    break;
                }
                return(false);
            }
Exemplo n.º 11
0
        private static void AddHumanlikeOrders(Vector3 clickPos, Pawn pawn, List <FloatMenuOption> opts)
        {
            IntVec3 c = IntVec3.FromVector3(clickPos);

            foreach (Thing thing2 in c.GetThingList(pawn.Map))
            {
                Thing t = thing2;
                if (t.def.ingestible != null && pawn.RaceProps.CanEverEat(t) && t.IngestibleNow)
                {
                    string text = (!t.def.ingestible.ingestCommandString.NullOrEmpty()) ? string.Format(t.def.ingestible.ingestCommandString, t.LabelShort) : "ConsumeThing".Translate(t.LabelShort);
                    if (!t.IsSociallyProper(pawn))
                    {
                        text = text + " (" + "ReservedForPrisoners".Translate() + ")";
                    }
                    FloatMenuOption item3;
                    if (t.def.IsNonMedicalDrug && pawn.IsTeetotaler())
                    {
                        item3 = new FloatMenuOption(text + " (" + TraitDefOf.DrugDesire.DataAtDegree(-1).label + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    }
                    else if (!pawn.CanReach(t, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn))
                    {
                        item3 = new FloatMenuOption(text + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    }
                    else
                    {
                        MenuOptionPriority priority = (MenuOptionPriority)((!(t is Corpse)) ? 4 : 2);
                        item3 = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(text, delegate
                        {
                            t.SetForbidden(false, true);
                            Job job13   = new Job(JobDefOf.Ingest, t);
                            job13.count = FoodUtility.WillIngestStackCountOf(pawn, t.def);
                            pawn.jobs.TryTakeOrderedJob(job13, JobTag.Misc);
                        }, priority, null, null, 0f, null, null), pawn, t, "ReservedBy");
                    }
                    opts.Add(item3);
                }
            }
            if (pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                foreach (LocalTargetInfo item7 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true))
                {
                    Pawn victim = (Pawn)item7.Thing;
                    if (!victim.InBed() && pawn.CanReserveAndReach(victim, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true))
                    {
                        if (!victim.IsPrisonerOfColony && !victim.InMentalState && (victim.Faction == Faction.OfPlayer || victim.Faction == null || !victim.Faction.HostileTo(Faction.OfPlayer)))
                        {
                            string label  = "Rescue".Translate(victim.LabelCap);
                            Action action = delegate
                            {
                                Building_Bed building_Bed2 = RestUtility.FindBedFor(victim, pawn, false, false, false);
                                if (building_Bed2 == null)
                                {
                                    building_Bed2 = RestUtility.FindBedFor(victim, pawn, false, false, true);
                                }
                                if (building_Bed2 == null)
                                {
                                    string str2 = (!victim.RaceProps.Animal) ? "NoNonPrisonerBed".Translate() : "NoAnimalBed".Translate();
                                    Messages.Message("CannotRescue".Translate() + ": " + str2, victim, MessageTypeDefOf.RejectInput);
                                }
                                else
                                {
                                    Job job12 = new Job(JobDefOf.Rescue, victim, building_Bed2);
                                    job12.count = 1;
                                    pawn.jobs.TryTakeOrderedJob(job12, JobTag.Misc);
                                    PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.Rescuing, KnowledgeAmount.Total);
                                }
                            };
                            MenuOptionPriority priority2 = MenuOptionPriority.RescueOrCapture;
                            Pawn revalidateClickTarget   = victim;
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, revalidateClickTarget, 0f, null, null), pawn, victim, "ReservedBy"));
                        }
                        if (!victim.NonHumanlikeOrWildMan() && (victim.InMentalState || victim.Faction != Faction.OfPlayer || (victim.Downed && (victim.guilt.IsGuilty || victim.IsPrisonerOfColony))))
                        {
                            string label  = "Capture".Translate(victim.LabelCap);
                            Action action = delegate
                            {
                                Building_Bed building_Bed = RestUtility.FindBedFor(victim, pawn, true, false, false);
                                if (building_Bed == null)
                                {
                                    building_Bed = RestUtility.FindBedFor(victim, pawn, true, false, true);
                                }
                                if (building_Bed == null)
                                {
                                    Messages.Message("CannotCapture".Translate() + ": " + "NoPrisonerBed".Translate(), victim, MessageTypeDefOf.RejectInput);
                                }
                                else
                                {
                                    Job job11 = new Job(JobDefOf.Capture, victim, building_Bed);
                                    job11.count = 1;
                                    pawn.jobs.TryTakeOrderedJob(job11, JobTag.Misc);
                                    PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.Capturing, KnowledgeAmount.Total);
                                }
                            };
                            MenuOptionPriority priority2 = MenuOptionPriority.RescueOrCapture;
                            Pawn revalidateClickTarget   = victim;
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, revalidateClickTarget, 0f, null, null), pawn, victim, "ReservedBy"));
                        }
                    }
                }
                foreach (LocalTargetInfo item8 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true))
                {
                    LocalTargetInfo localTargetInfo = item8;
                    Pawn            victim2         = (Pawn)localTargetInfo.Thing;
                    if (victim2.Downed && pawn.CanReserveAndReach(victim2, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true) && Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, true) != null)
                    {
                        string text2   = "CarryToCryptosleepCasket".Translate(localTargetInfo.Thing.LabelCap);
                        JobDef jDef    = JobDefOf.CarryToCryptosleepCasket;
                        Action action2 = delegate
                        {
                            Building_CryptosleepCasket building_CryptosleepCasket = Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, false);
                            if (building_CryptosleepCasket == null)
                            {
                                building_CryptosleepCasket = Building_CryptosleepCasket.FindCryptosleepCasketFor(victim2, pawn, true);
                            }
                            if (building_CryptosleepCasket == null)
                            {
                                Messages.Message("CannotCarryToCryptosleepCasket".Translate() + ": " + "NoCryptosleepCasket".Translate(), victim2, MessageTypeDefOf.RejectInput);
                            }
                            else
                            {
                                Job job10 = new Job(jDef, victim2, building_CryptosleepCasket);
                                job10.count = 1;
                                pawn.jobs.TryTakeOrderedJob(job10, JobTag.Misc);
                            }
                        };
                        string label  = text2;
                        Action action = action2;
                        Pawn   revalidateClickTarget = victim2;
                        opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, MenuOptionPriority.Default, null, revalidateClickTarget, 0f, null, null), pawn, victim2, "ReservedBy"));
                    }
                }
            }
            foreach (LocalTargetInfo item9 in GenUI.TargetsAt(clickPos, TargetingParameters.ForStrip(pawn), true))
            {
                LocalTargetInfo stripTarg = item9;
                FloatMenuOption item4     = pawn.CanReach(stripTarg, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn) ? FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("Strip".Translate(stripTarg.Thing.LabelCap), delegate
                {
                    stripTarg.Thing.SetForbidden(false, false);
                    pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.Strip, stripTarg), JobTag.Misc);
                }, MenuOptionPriority.Default, null, null, 0f, null, null), pawn, stripTarg, "ReservedBy") : new FloatMenuOption("CannotStrip".Translate(stripTarg.Thing.LabelCap) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                opts.Add(item4);
            }
            if (pawn.equipment != null)
            {
                ThingWithComps equipment = null;
                List <Thing>   thingList = c.GetThingList(pawn.Map);
                int            num       = 0;
                while (num < thingList.Count)
                {
                    if (thingList[num].TryGetComp <CompEquippable>() == null)
                    {
                        num++;
                        continue;
                    }
                    equipment = (ThingWithComps)thingList[num];
                    break;
                }
                if (equipment != null)
                {
                    string          labelShort = equipment.LabelShort;
                    FloatMenuOption item5;
                    if (equipment.def.IsWeapon && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
                    {
                        item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "IsIncapableOfViolenceLower".Translate(pawn.LabelShort) + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    }
                    else if (!pawn.CanReach(equipment, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn))
                    {
                        item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    }
                    else if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
                    {
                        item5 = new FloatMenuOption("CannotEquip".Translate(labelShort) + " (" + "Incapable".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    }
                    else
                    {
                        string text3 = "Equip".Translate(labelShort);
                        if (equipment.def.IsRangedWeapon && pawn.story != null && pawn.story.traits.HasTrait(TraitDefOf.Brawler))
                        {
                            text3 = text3 + " " + "EquipWarningBrawler".Translate();
                        }
                        item5 = FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(text3, delegate
                        {
                            equipment.SetForbidden(false, true);
                            pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.Equip, equipment), JobTag.Misc);
                            MoteMaker.MakeStaticMote(equipment.DrawPos, equipment.Map, ThingDefOf.Mote_FeedbackEquip, 1f);
                            PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.EquippingWeapons, KnowledgeAmount.Total);
                        }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, equipment, "ReservedBy");
                    }
                    opts.Add(item5);
                }
            }
            if (pawn.apparel != null)
            {
                Apparel apparel = pawn.Map.thingGrid.ThingAt <Apparel>(c);
                if (apparel != null)
                {
                    FloatMenuOption item6 = pawn.CanReach(apparel, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn) ? (ApparelUtility.HasPartsToWear(pawn, apparel.def) ? FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("ForceWear".Translate(apparel.LabelShort), delegate
                    {
                        apparel.SetForbidden(false, true);
                        Job job9 = new Job(JobDefOf.Wear, apparel);
                        pawn.jobs.TryTakeOrderedJob(job9, JobTag.Misc);
                    }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, apparel, "ReservedBy") : new FloatMenuOption("CannotWear".Translate(apparel.Label) + " (" + "CannotWearBecauseOfMissingBodyParts".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null)) : new FloatMenuOption("CannotWear".Translate(apparel.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null);
                    opts.Add(item6);
                }
            }
            if (!pawn.Map.IsPlayerHome)
            {
                Thing item = c.GetFirstItem(pawn.Map);
                if (item != null && item.def.EverHaulable)
                {
                    if (!pawn.CanReach(item, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn))
                    {
                        opts.Add(new FloatMenuOption("CannotPickUp".Translate(item.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                    }
                    else if (MassUtility.WillBeOverEncumberedAfterPickingUp(pawn, item, 1))
                    {
                        opts.Add(new FloatMenuOption("CannotPickUp".Translate(item.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                    }
                    else if (item.stackCount == 1)
                    {
                        opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUp".Translate(item.Label), delegate
                        {
                            item.SetForbidden(false, false);
                            Job job8   = new Job(JobDefOf.TakeInventory, item);
                            job8.count = 1;
                            pawn.jobs.TryTakeOrderedJob(job8, JobTag.Misc);
                        }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy"));
                    }
                    else
                    {
                        if (MassUtility.WillBeOverEncumberedAfterPickingUp(pawn, item, item.stackCount))
                        {
                            opts.Add(new FloatMenuOption("CannotPickUpAll".Translate(item.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                        }
                        else
                        {
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUpAll".Translate(item.Label), delegate
                            {
                                item.SetForbidden(false, false);
                                Job job7   = new Job(JobDefOf.TakeInventory, item);
                                job7.count = item.stackCount;
                                pawn.jobs.TryTakeOrderedJob(job7, JobTag.Misc);
                            }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy"));
                        }
                        opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("PickUpSome".Translate(item.Label), delegate
                        {
                            int to2 = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(pawn, item), item.stackCount);
                            Dialog_Slider window2 = new Dialog_Slider("PickUpCount".Translate(item.LabelShort), 1, to2, delegate(int count)
                            {
                                item.SetForbidden(false, false);
                                Job job6   = new Job(JobDefOf.TakeInventory, item);
                                job6.count = count;
                                pawn.jobs.TryTakeOrderedJob(job6, JobTag.Misc);
                            }, -2147483648);
                            Find.WindowStack.Add(window2);
                        }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item, "ReservedBy"));
                    }
                }
            }
            if (!pawn.Map.IsPlayerHome)
            {
                Thing item2 = c.GetFirstItem(pawn.Map);
                if (item2 != null && item2.def.EverHaulable)
                {
                    Pawn bestPackAnimal = GiveToPackAnimalUtility.PackAnimalWithTheMostFreeSpace(pawn.Map, pawn.Faction);
                    if (bestPackAnimal != null)
                    {
                        if (!pawn.CanReach(item2, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn))
                        {
                            opts.Add(new FloatMenuOption("CannotGiveToPackAnimal".Translate(item2.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                        }
                        else if (MassUtility.WillBeOverEncumberedAfterPickingUp(bestPackAnimal, item2, 1))
                        {
                            opts.Add(new FloatMenuOption("CannotGiveToPackAnimal".Translate(item2.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                        }
                        else if (item2.stackCount == 1)
                        {
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimal".Translate(item2.Label), delegate
                            {
                                item2.SetForbidden(false, false);
                                Job job5   = new Job(JobDefOf.GiveToPackAnimal, item2);
                                job5.count = 1;
                                pawn.jobs.TryTakeOrderedJob(job5, JobTag.Misc);
                            }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy"));
                        }
                        else
                        {
                            if (MassUtility.WillBeOverEncumberedAfterPickingUp(bestPackAnimal, item2, item2.stackCount))
                            {
                                opts.Add(new FloatMenuOption("CannotGiveToPackAnimalAll".Translate(item2.Label) + " (" + "TooHeavy".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                            }
                            else
                            {
                                opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimalAll".Translate(item2.Label), delegate
                                {
                                    item2.SetForbidden(false, false);
                                    Job job4   = new Job(JobDefOf.GiveToPackAnimal, item2);
                                    job4.count = item2.stackCount;
                                    pawn.jobs.TryTakeOrderedJob(job4, JobTag.Misc);
                                }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy"));
                            }
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("GiveToPackAnimalSome".Translate(item2.Label), delegate
                            {
                                int to = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(bestPackAnimal, item2), item2.stackCount);
                                Dialog_Slider window = new Dialog_Slider("GiveToPackAnimalCount".Translate(item2.LabelShort), 1, to, delegate(int count)
                                {
                                    item2.SetForbidden(false, false);
                                    Job job3   = new Job(JobDefOf.GiveToPackAnimal, item2);
                                    job3.count = count;
                                    pawn.jobs.TryTakeOrderedJob(job3, JobTag.Misc);
                                }, -2147483648);
                                Find.WindowStack.Add(window);
                            }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item2, "ReservedBy"));
                        }
                    }
                }
            }
            if (!pawn.Map.IsPlayerHome && pawn.Map.exitMapGrid.MapUsesExitGrid)
            {
                foreach (LocalTargetInfo item10 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true))
                {
                    Pawn p = (Pawn)item10.Thing;
                    if (p.Faction == Faction.OfPlayer || p.HostFaction == Faction.OfPlayer)
                    {
                        IntVec3 exitSpot;
                        if (!pawn.CanReach(p, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn))
                        {
                            opts.Add(new FloatMenuOption("CannotCarryToExit".Translate(p.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                        }
                        else if (!RCellFinder.TryFindBestExitSpot(pawn, out exitSpot, TraverseMode.ByPawn))
                        {
                            opts.Add(new FloatMenuOption("CannotCarryToExit".Translate(p.Label) + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                        }
                        else
                        {
                            opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption("CarryToExit".Translate(p.Label), delegate
                            {
                                Job job2   = new Job(JobDefOf.CarryDownedPawnToExit, p, exitSpot);
                                job2.count = 1;
                                pawn.jobs.TryTakeOrderedJob(job2, JobTag.Misc);
                            }, MenuOptionPriority.High, null, null, 0f, null, null), pawn, item10, "ReservedBy"));
                        }
                    }
                }
            }
            if (pawn.equipment != null && pawn.equipment.Primary != null && GenUI.TargetsAt(clickPos, TargetingParameters.ForSelf(pawn), true).Any())
            {
                Action action3 = delegate
                {
                    pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.DropEquipment, pawn.equipment.Primary), JobTag.Misc);
                };
                opts.Add(new FloatMenuOption("Drop".Translate(pawn.equipment.Primary.Label), action3, MenuOptionPriority.Default, null, null, 0f, null, null));
            }
            foreach (LocalTargetInfo item11 in GenUI.TargetsAt(clickPos, TargetingParameters.ForTrade(), true))
            {
                LocalTargetInfo dest = item11;
                if (!pawn.CanReach(dest, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn))
                {
                    opts.Add(new FloatMenuOption("CannotTrade".Translate() + " (" + "NoPath".Translate() + ")", null, MenuOptionPriority.Default, null, null, 0f, null, null));
                }
                else if (pawn.skills.GetSkill(SkillDefOf.Social).TotallyDisabled)
                {
                    opts.Add(new FloatMenuOption("CannotPrioritizeWorkTypeDisabled".Translate(SkillDefOf.Social.LabelCap), null, MenuOptionPriority.Default, null, null, 0f, null, null));
                }
                else
                {
                    Pawn   pTarg   = (Pawn)dest.Thing;
                    Action action4 = delegate
                    {
                        Job job = new Job(JobDefOf.TradeWithPawn, pTarg);
                        job.playerForced = true;
                        pawn.jobs.TryTakeOrderedJob(job, JobTag.Misc);
                        PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.InteractingWithTraders, KnowledgeAmount.Total);
                    };
                    string str = string.Empty;
                    if (pTarg.Faction != null)
                    {
                        str = " (" + pTarg.Faction.Name + ")";
                    }
                    string             label     = "TradeWith".Translate(pTarg.LabelShort + ", " + pTarg.TraderKind.label) + str;
                    Action             action    = action4;
                    MenuOptionPriority priority2 = MenuOptionPriority.InitiateSocial;
                    Thing thing = dest.Thing;
                    opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, priority2, null, thing, 0f, null, null), pawn, pTarg, "ReservedBy"));
                }
            }
            foreach (Thing item12 in pawn.Map.thingGrid.ThingsAt(c))
            {
                foreach (FloatMenuOption floatMenuOption in item12.GetFloatMenuOptions(pawn))
                {
                    opts.Add(floatMenuOption);
                }
            }
        }