using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using rjw; using Verse; using RimWorld; namespace RJW_BGS { internal class RJWcopy { //Code copied from rjw, as their code was internal and I need the dictionary to know which genes to add to the pawn public static void Racegroupdictbuilder() { foreach (PawnKindDef pawnKindDef2 in from pawnKindDef in DefDatabase.AllDefs where pawnKindDef.race.race != null select pawnKindDef) { RaceGroupDef raceGroupDef = null; bool temp = TryGetRaceGroupDef(pawnKindDef2, out raceGroupDef); } } public static bool TryGetRaceGroupDef(PawnKindDef pawnKindDef, out RaceGroupDef raceGroupDef) { if (RaceGroupByPawnKind.TryGetValue(pawnKindDef, out raceGroupDef)) { return raceGroupDef != null; } raceGroupDef = GetRaceGroupDefInternal(pawnKindDef); RaceGroupByPawnKind.Add(pawnKindDef, raceGroupDef); return raceGroupDef != null; } public static RaceGroupDef GetRaceGroupDefInternal(PawnKindDef kindDef) { string raceName = kindDef.race.defName; string pawnKindName = kindDef.defName; IEnumerable allDefs = DefDatabase.AllDefs; List pawnKindDefs = allDefs.Where(delegate (RaceGroupDef group) { List pawnKindNames = group.pawnKindNames; return pawnKindNames != null && pawnKindNames.Contains(pawnKindName); }).ToList(); List raceNameDefs = allDefs.Where(delegate (RaceGroupDef group) { List raceNames = group.raceNames; return raceNames != null && raceNames.Contains(raceName); }).ToList(); int availableDefs = pawnKindDefs.Count() + raceNameDefs.Count(); if (availableDefs == 0) { //Exit Early return null; } if (availableDefs == 1) { return pawnKindDefs.Concat(raceNameDefs).Single(); } RaceGroupDef result; if ((result = pawnKindDefs.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null) { if ((result = raceNameDefs.FirstOrDefault((RaceGroupDef match) => !IsThisMod(match))) == null) { result = (pawnKindDefs.FirstOrDefault() ?? raceNameDefs.FirstOrDefault()); } } return result; } //slightly modified copy of code above so it also works for racegenedefs public static RaceGeneDef GetRaceGenDefInternal(PawnKindDef kindDef) { if (kindDef == null) { return null; } string raceName = kindDef.race.defName; string pawnKindName = kindDef.defName; RaceGroupDef raceGroupDef = GetRaceGroupDef(kindDef); IEnumerable allDefs = DefDatabase.AllDefs; Log.Message(allDefs.Count().ToString()); List pawnKindDefs = allDefs.Where(delegate (RaceGeneDef group) { List pawnKindNames = group.pawnKindNames; return pawnKindNames != null && pawnKindNames.Contains(pawnKindName); }).ToList(); List raceKindDefs = allDefs.Where(delegate (RaceGeneDef group) { List raceNames = group.raceNames; return raceNames != null && raceNames.Contains(raceName); }).ToList(); List raceGroupDefs = new List(); if (raceGroupDef != null) { /* // Log Messages for Debugging Only, prints the Genes found for this individual Log.Message("found a raceGroupDef"); Log.Message(raceGroupDef.defName); foreach (RaceGeneDef rgd in allDefs) { Log.Message(rgd.defName); } */ raceGroupDefs = allDefs.Where(delegate (RaceGeneDef group) { String raceGroupDefName = group.raceGroup; return raceGroupDefName != null && raceGroupDefName == raceGroupDef.defName; }).ToList(); } RaceGeneDef result = null; //First check if there is a matching pawnkinddef then race, then racegroup if (pawnKindDefs.Any()) { result = pawnKindDefs.RandomElement(); } else if (raceKindDefs.Any() && result == null) { result = raceKindDefs.RandomElement(); } else if (raceGroupDefs.Any() && result == null) { result = raceGroupDefs.RandomElement(); } else { result = null; } return result; } private static RaceGroupDef GetRaceGroupDef(PawnKindDef kindDef) { RaceGroupDef raceGroupDef = null; bool temp = TryGetRaceGroupDef(kindDef, out raceGroupDef); return raceGroupDef; } private static bool IsThisMod(Def def) { return LoadedModManager.RunningMods.Single((ModContentPack pack) => pack.Name == "RimJobWorld").AllDefs.Contains(def); } private static readonly IDictionary RaceGroupByPawnKind = new Dictionary(); } }