예제 #1
0
        private static void TryTagAnimal([NotNull] ChamberDatabase database, [NotNull] Pawn pawn)
        {
            if (database.TaggedAnimals.Contains(pawn.kindDef))
            {
                if (pawn.kindDef.GetAllMutationsFrom().Taggable().Any(m => !m.IsTagged()))
                {
                    TryTagMutations(database, pawn);
                    return;
                }
                else
                {
                    Messages.Message("PMNothingTaggable".Translate(pawn.kindDef.Named("animal")), MessageTypeDefOf.NeutralEvent);
                    return;
                }
            }


            if (!database.TryAddToDatabase(pawn.kindDef, out string reason))
            {
                Messages.Message(reason, MessageTypeDefOf.RejectInput);
            }
            else
            {
                Messages.Message("PMAnimalAddedToDatabase".Translate(pawn.kindDef.Named("animal")),
                                 MessageTypeDefOf.TaskCompletion);
            }
        }
예제 #2
0
        private static void TryTagMutations(ChamberDatabase database, Pawn pawn)
        {
            var mutations = pawn.kindDef.GetAllMutationsFrom().Taggable().Where(m => !m.IsTagged());
            var max       = Rand.Range(MIN_MUTATIONS_TAGGED, MAX_MUTATIONS_TAGGED);

            if (database.FreeStorage > 0 && !database.CanTag)
            {
                Messages.Message(ChamberDatabase.NOT_ENOUGH_POWER.Translate(), MessageTypeDefOf.RejectInput);
                return;
            }

            _scratchList.Clear();
            foreach (MutationDef mutationDef in mutations)
            {
                var n = _scratchList.First;
                while (n != null) //sort the mutations in order of least required space to most
                {
                    if (mutationDef.GetRequiredStorage() < n.Value.GetRequiredStorage())
                    {
                        break;
                    }

                    n = n.Next;
                }

                if (n == null)
                {
                    _scratchList.AddLast(mutationDef);
                }
                else
                {
                    _scratchList.AddBefore(n, mutationDef);
                }
            }

            int c    = 0;
            var node = _scratchList.First;

            while (c < max && node != null)
            {
                var mut = node.Value;
                if (database.FreeStorage < mut.GetRequiredStorage())
                {
                    break;
                }
                database.AddToDatabase(mut);
                node = node.Next;
                c++;
            }

            if (c == 0)
            {
                Messages.Message("PMMutationNotEnoughSpace".Translate(pawn.kindDef.Named("animal")), MessageTypeDefOf.NeutralEvent);
            }
            else
            {
                var msgTxt = "PMMutationTagged".Translate(pawn.kindDef.Named("animal"), c.Named("num"));
                Messages.Message(msgTxt, MessageTypeDefOf.PositiveEvent);
            }
        }
예제 #3
0
 static IEnumerable <DebugMenuOption> GetTaggableAnimalActions([NotNull] ChamberDatabase db)
 {
     foreach (PawnKindDef pawnKindDef in DefDatabase <PawnKindDef> .AllDefs)
     {
         if (!pawnKindDef.race.IsValidAnimal() || db.TaggedAnimals.Contains(pawnKindDef))
         {
             continue;
         }
         var tmpPk = pawnKindDef;
         yield return(new DebugMenuOption(pawnKindDef.label, DebugMenuOptionMode.Action,
                                          () => db.AddToDatabase(tmpPk)));
     }
 }