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); } }
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); } }
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))); } }