コード例 #1
0
        public static void OpenDeitySelectMenu(Building_SacrificialAltar altar, DeityType deityType)
        {
            var list = new List <FloatMenuOption>
            {
                new FloatMenuOption("(" + "NoneLower".Translate() + ")", delegate
                {
                    altar.Map.GetComponent <MapComponent_SacrificeTracker>().lastUsedAltar = altar;
                    altar.tempCurrentSacrificeDeity = null;
                })
            };

            foreach (var current in DeityTracker.Get.DeityCache.Keys)
            {
                if (current.discovered == false)
                {
                    continue;
                }

                Action action;
                var    localDeity = current;
                action = delegate
                {
                    MapComponent_SacrificeTracker.Get(altar.Map).lastUsedAltar = altar;
                    switch (deityType)
                    {
                    case DeityType.WorshipDeity:
                        altar.tempCurrentWorshipDeity = localDeity;
                        break;

                    case DeityType.OfferingDeity:
                        altar.tempCurrentOfferingDeity = localDeity;
                        break;

                    case DeityType.SacrificeDeity:
                        altar.tempCurrentSacrificeDeity = localDeity;
                        altar.tempCurrentSpell          = null;
                        break;
                    }
                };

                bool extraPartOnGUI(Rect rect)
                {
                    return(DeityInfoCardButton(rect.x + 5f, rect.y + ((rect.height - 24f) / 2f), current));
                }

                list.Add(new FloatMenuOption(localDeity.LabelCap, action, MenuOptionPriority.Default, null, null, 29f,
                                             extraPartOnGUI));
            }

            Find.WindowStack.Add(new FloatMenu(list));
        }
コード例 #2
0
        public static void OpenActorSelectMenu(Building_SacrificialAltar altar, ActorType actorType)
        {
            ///
            /// Error Handling
            ///
            if (altar == null)
            {
                Utility.ErrorReport("Altar Null Exception");
                return;
            }

            if (altar.Map == null)
            {
                Utility.ErrorReport("Map Null Exception");
            }

            if (altar.Map.mapPawns == null)
            {
                Utility.ErrorReport("mapPawns Null Exception");
                return;
            }

            if (altar.Map.mapPawns.FreeColonistsSpawned == null)
            {
                Utility.ErrorReport("FreeColonistsSpawned Null Exception");
                return;
            }
            //if (altar.Map.mapPawns.FreeColonistsSpawnedCount <= 0)
            //{
            //    Cthulhu.Utility.ErrorReport("Colonist Count Less Than or Equal To 0 Exception");
            //    return;
            //}

            ///
            /// Get Actor List
            ///

            var actorList = new List <Pawn>();
            var s         = new StringBuilder();

            switch (actorType)
            {
            case ActorType.executioner:
            case ActorType.offerer:
                // Cycle through candidates
                foreach (var candidate in altar.Map.mapPawns.FreeColonistsSpawned)
                {
                    if (!CultUtility.IsCultistAvailable(candidate))
                    {
                        continue;
                    }

                    // Executioners must be able to use tool and move.
                    if (candidate.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) &&
                        candidate.health.capacities.CapableOf(PawnCapacityDefOf.Moving))
                    {
                        // Add the actors.
                        actorList.Add(candidate);
                        Utility.DebugReport("Actor List :: Added " + candidate.Name);
                    }
                }

                Utility.DebugReport(s.ToString());
                break;

            case ActorType.preacher:
                // Cycle through candidates
                foreach (var candidate in altar.Map.mapPawns.FreeColonistsSpawned)
                {
                    if (!CultUtility.IsCultistAvailable(candidate))
                    {
                        continue;
                    }

                    // Preachers must be able to move and talk.
                    if (candidate.health.capacities.CapableOf(PawnCapacityDefOf.Moving) &&
                        candidate.health.capacities.CapableOf(PawnCapacityDefOf.Talking))
                    {
                        // Add the actors.
                        actorList.Add(candidate);
                        Utility.DebugReport("Actor List :: Added " + candidate.Name);
                    }
                }

                Utility.DebugReport(s.ToString());
                break;

            case ActorType.prisoner:
                ///
                /// ERROR HANDLING
                ///

                if (altar.Map.mapPawns.PrisonersOfColonySpawned == null)
                {
                    Messages.Message("No prisoners available.", MessageTypeDefOf.RejectInput);
                    return;
                }

                if (altar.Map.mapPawns.PrisonersOfColonySpawnedCount <= 0)
                {
                    Messages.Message("No prisoners available.", MessageTypeDefOf.RejectInput);
                    return;
                }


                /// Cycle through possible candidates in the map's prisoner list
                foreach (var candidate in altar.Map.mapPawns.PrisonersOfColonySpawned)
                {
                    if (!Utility.IsActorAvailable(candidate, true))
                    {
                        continue;
                    }

                    actorList.Add(candidate);
                }

                break;

            case ActorType.animalSacrifice:
                ///
                /// ERROR HANDLING
                ///

                if (altar.Map.mapPawns.AllPawnsSpawned == null)
                {
                    Messages.Message("No " + actorType + "s available.", MessageTypeDefOf.RejectInput);
                    return;
                }

                if (altar.Map.mapPawns.AllPawnsSpawnedCount <= 0)
                {
                    Messages.Message("No " + actorType + "s available.", MessageTypeDefOf.RejectInput);
                    return;
                }

                /// Cycle through possible candidates in the player's owned animals list.
                foreach (var candidate in altar.Map.mapPawns.AllPawnsSpawned)
                {
                    if (!Utility.IsActorAvailable(candidate, true))
                    {
                        continue;
                    }

                    if (candidate.Faction != Faction.OfPlayer)
                    {
                        continue;
                    }

                    if (candidate.RaceProps == null)
                    {
                        continue;
                    }

                    if (!candidate.RaceProps.Animal)
                    {
                        continue;
                    }

                    actorList.Add(candidate);
                }

                break;
            }

            /// Let the player know there are no prisoners available.
            if (actorList != null)
            {
                if (actorList.Count <= 0)
                {
                    Messages.Message("No " + actorType + "s available.", MessageTypeDefOf.RejectInput);
                    return;
                }
            }

            ///
            /// Create float menus
            ///

            //There must always be a none.
            var list = new List <FloatMenuOption>
            {
                new FloatMenuOption("(" + "NoneLower".Translate() + ")", delegate { altar.tempExecutioner = null; })
            };

            foreach (var actor in actorList)
            {
                Action action;
                var    localCol = actor;
                action = delegate
                {
                    switch (actorType)
                    {
                    case ActorType.executioner:
                        MapComponent_SacrificeTracker.Get(altar.Map).lastUsedAltar = altar;
                        altar.tempExecutioner = localCol;
                        break;

                    case ActorType.preacher:
                        altar.tempPreacher = localCol;
                        break;

                    case ActorType.offerer:
                        MapComponent_SacrificeTracker.Get(altar.Map).lastUsedAltar = altar;
                        altar.tempOfferer = localCol;
                        break;

                    case ActorType.prisoner:
                        MapComponent_SacrificeTracker.Get(altar.Map).lastUsedAltar     = altar;
                        MapComponent_SacrificeTracker.Get(altar.Map).lastSacrificeType =
                            CultUtility.SacrificeType.human;
                        altar.tempSacrifice = localCol;
                        break;

                    case ActorType.animalSacrifice:
                        MapComponent_SacrificeTracker.Get(altar.Map).lastUsedAltar     = altar;
                        MapComponent_SacrificeTracker.Get(altar.Map).lastSacrificeType =
                            CultUtility.SacrificeType.animal;
                        altar.tempSacrifice = localCol;
                        break;
                    }
                };
                list.Add(new FloatMenuOption(localCol.LabelShort, action));
            }

            Find.WindowStack.Add(new FloatMenu(list));
        }