public static Backstory Extract(XElement xml) { if (xml == null) { Logger.Err("Trying to extract backstory from null XElement."); return(null); } if (string.IsNullOrEmpty((string)xml.Element("title")) && string.IsNullOrEmpty((string)xml.Element("Title"))) { Logger.Err("Found backstory with empty Title."); return(null); } var backstory = new Backstory(); if (!string.IsNullOrEmpty((string)xml.Element("title"))) { backstory = new Backstory { Title = (string)xml.Element("title"), TitleShort = (string)xml.Element("titleShort"), Description = (string)xml.Element("desc"), }; } if (!string.IsNullOrEmpty((string)xml.Element("Title"))) { backstory = new Backstory { Title = (string)xml.Element("Title"), TitleShort = (string)xml.Element("TitleShort"), Description = (string)xml.Element("BaseDesc"), }; if (backstory.Description == null) { backstory.Description = (string)xml.Element("baseDesc"); } } backstory.Description = backstory.Description.Replace("\\n", "\n"); backstory.DisplayTitle = backstory.Title; backstory.WorkDisables = ExtractWorkDisables(xml.Element("WorkDisables")); backstory.SkillGains = ExtractSkillGains(xml.Element("SkillGains")); backstory.Id = RemoveNonAlphanumeric(CapitalizedNoSpaces(backstory.Title.Replace('-', ' '))) + Math.Abs(StableStringHash(backstory.Description) % 100); //backstory.Id = backstory.Title.Replace(" ", "") + backstory.Description.StableStringHash(); if (!string.IsNullOrEmpty(backstory.Description)) { //backstory.Description = DecriptionCutterRegex.Replace(backstory.Description, "$1\n"); } return(backstory); }
private static void CheckStory(Backstory story) { if (!Debug) { return; } foreach (var s in Backstories.Values) { if (s.Title == story.Title && s.Id != story.Id) { Logger.Warn($"Possible backstory collision between {s.Id} and {story.Id}"); } } }
private static Backstory FixStoryId(Backstory story) { var list = new List <Backstory>(); foreach (var s in Backstories.Values) { if (s.Title == story.Title) { list.Add(s); } } if (list.Count == 0) { return(null); } if (list.Count == 1) { Logger.Debug($" [FIX] Fix success. Found candidate story:{list[0].Id}"); story.Id = list[0].Id; return(list[0]); } Logger.Debug(" [FIX] Found multiple story candidates."); var storyDesc = story.Description.Substring(0, 50); foreach (var s in list) { if (s.Description.Substring(0, 50) == storyDesc) { Logger.Debug($" [FIX]Fix success. Found candidate story:{s.Id}"); return(s); } } return(null); }
public DataLoader() { Race human = new Race(); human.DefName = "Human"; human.Label = "Human"; Genders.Add("Female"); Genders.Add("Male"); human.BodyType.Add("Male"); human.BodyType.Add("Female"); human.BodyType.Add("Average"); human.BodyType.Add("Thin"); human.BodyType.Add("Hulk"); human.BodyType.Add("Fat"); human.HairsByGender["Female"] = new List <Hair>(); human.HairsByGender["Male"] = new List <Hair>(); foreach (var firstType in new string[] { "Average", "Narrow" }) { foreach (var secondType in new string[] { "Normal", "Pointy", "Wide" }) { human.HeadType.Add(new CrownType { CrownFirstType = firstType, CrownSubType = secondType }); } } Quality.Add("Awful"); Quality.Add("Poor"); Quality.Add("Normal"); Quality.Add("Good"); Quality.Add("Excellent"); Quality.Add("Masterwork"); Quality.Add("Legendary"); RaceDictionary[human.DefName] = human; ResourceLoader.Load(); var allXmlFiles = Directory.GetFiles("Data", "*.xml", SearchOption.AllDirectories); List <Hair> allHairs = new List <Hair>(); foreach (var xmlFile in allXmlFiles) { string[] pathComponents = xmlFile.Split('\\'); if (!pathComponents[2].Equals("Defs")) { continue; } using (var fileStream = File.OpenRead(xmlFile)) { var docRoot = XDocument.Load(fileStream).Root; CurrentDocumentPath = xmlFile; var workTypeDefsRoot = docRoot.XPathSelectElements("WorkTypeDef/workTags/.."); if (workTypeDefsRoot.Count() != 0) { var workTypeDefs = from workTypeDef in workTypeDefsRoot select new WorkType { DefName = workTypeDef.Element("defName").GetValue(), FullName = workTypeDef.Element("gerundLabel").GetValue(), WorkTags = workTypeDef.Element("workTags") .Elements("li") .Select(element => element.GetValue()).ToArray() }; WorkTypes.AddRange(workTypeDefs); } foreach (var raceVars in docRoot.Descendants("AlienRace.ThingDef_AlienRace")) { Race race = new Race(); race.DefName = raceVars.Element("defName").GetValue(); race.Label = raceVars.Element("label").GetValue(); var alienraceElement = raceVars.Element("alienrace"); if (alienraceElement == null) { alienraceElement = raceVars.Element("alienRace"); } race.HairsByGender["Female"] = new List <Hair>(); race.HairsByGender["Male"] = new List <Hair>(); foreach (var bodyType in alienraceElement.XPathSelectElements("generalSettings/alienPartGenerator/alienbodytypes/li")) { race.BodyType.Add(bodyType.GetValue()); } foreach (var crownType in alienraceElement.XPathSelectElements("generalSettings/alienPartGenerator/aliencrowntypes/li")) { string[] crownStrings = crownType.GetValue().Split('_'); race.HeadType.Add(new CrownType { CrownFirstType = crownStrings[0], CrownSubType = crownStrings[1] }); } if (race.HeadType.Count == 0) { race.HeadType.Add(new CrownType { CrownFirstType = "Average", CrownSubType = "Normal" }); } var useGenderedHeads = alienraceElement.XPathSelectElement("generalSettings/alienPartGenerator/UseGenderedHeads"); if (useGenderedHeads != null) { race.UseGenderedHeads = Convert.ToBoolean(useGenderedHeads.GetValue()); } foreach (var path in alienraceElement.XPathSelectElement("graphicPaths/li").Elements()) { race.GraphicPaths[path.Name.ToString().ToLower()] = path.GetValue(); } RaceDictionary[race.DefName] = race; } foreach (var hairVars in docRoot.Descendants("HairDef")) { Hair hair = new Hair( hairVars.Element("hairGender").GetValue(), hairVars.Element("label").GetValue(), hairVars.Element("defName").GetValue(), hairVars.XPathSelectElements("hairTags/li")); allHairs.Add(hair); } foreach (var traitDef in docRoot.Descendants("TraitDef")) { var traits = (from trait in traitDef.XPathSelectElements("degreeDatas/li") select new TraitDef { Def = traitDef.Element("defName").Value, Label = textInfo.ToTitleCase(trait.Element("label").Value), Degree = trait.Element("degree") != null ? trait.Element("degree").Value : "0", Description = trait.Element("description").Value }); foreach (var trait in traits) { if (!Traits.ContainsKey(trait.Def + trait.Degree)) { Traits.Add(trait.Def + trait.Degree, trait); } } } foreach (var hediffRoot in docRoot.XPathSelectElements("HediffDef/hediffClass/..")) { var parentClass = hediffRoot.Element("hediffClass").Value; var parentName = hediffRoot.Attribute("Name") != null?hediffRoot.Attribute("Name").Value : "None"; Hediff coreHediff; if (!Hediffs.TryGetValue(parentClass, out coreHediff)) { Hediffs.Add(parentClass, coreHediff = new Hediff(parentClass, parentName)); } var hediffs = (from hediff in docRoot.XPathSelectElements("//HediffDef[boolean(@ParentName) and not(@Abstract)]") .Where(x => x.Attribute("ParentName").Value == parentName) select new HediffDef { ParentClass = parentClass, ParentName = hediff.Attribute("ParentName").Value, Def = hediff.Element("defName").Value, Label = textInfo.ToTitleCase(hediff.Element("label").Value), }); foreach (var hediff in hediffs) { coreHediff.SubDiffs[hediff.Def] = hediff; } } foreach (var def in docRoot.Descendants("AlienRace.BackstoryDef")) { if (def.Attribute("Abstract") == null || def.Attribute("Abstract").Value != "True") { Backstory backstory = new Backstory { Id = (string)def.Element("defName"), Title = (string)def.Element("title"), DisplayTitle = "(AlienRace)" + (string)def.Element("title"), TitleShort = (string)def.Element("titleShort"), Description = (string)def.Element("baseDescription"), Slot = (string)def.Element("slot"), SkillGains = new Dictionary <string, int>(), WorkDisables = new List <string>() }; foreach (var skillGain in def.XPathSelectElements("skillGains/li")) { string defName = (string)skillGain.Element("defName"); int amount = Convert.ToInt32(skillGain.Element("amount").GetValue()); backstory.SkillGains.Add(defName, amount); } foreach (var workDisables in def.XPathSelectElements("workDisables/li")) { backstory.WorkDisables.Add(workDisables.GetValue()); } ResourceLoader.Backstories[backstory.Id] = backstory; if (string.IsNullOrEmpty(backstory.Slot)) { ResourceLoader.ChildhoodStories.Add(backstory); ResourceLoader.AdulthoodStories.Add(backstory); } else if (backstory.Slot == "Childhood") { ResourceLoader.ChildhoodStories.Add(backstory); } else { ResourceLoader.AdulthoodStories.Add(backstory); } } } foreach (var relationDef in docRoot.XPathSelectElements("PawnRelationDef")) { var pawnRelation = new PawnRelationDef(relationDef); PawnRelationDefs.Add(pawnRelation.DefName, pawnRelation); } foreach (var thingDef in docRoot.XPathSelectElements("ThingDef")) { ThingDef def = new ThingDef(thingDef); if (ThingDefs.TryGetValue(def.Name, out ThingDef value)) { value.updateDef(thingDef); } else { ThingDefs.Add(def.Name, def); } } foreach (var bodyDefElement in docRoot.XPathSelectElements("BodyDef")) { BodyDef bodyDef = new BodyDef(bodyDefElement); if (bodyDef.DefName != null) { BodyDefsByDef[bodyDef.DefName] = bodyDef; } } fileStream.Close(); } } Dictionary <string, Race> tempRaceDic = RaceDictionary.Values.ToDictionary(x => x.Label.ToLower(), x => x); foreach (Hair hair in allHairs) { List <Race> races = new List <Race>(); foreach (var hairTags in hair.HairTags) { Race race; if (tempRaceDic.TryGetValue(hairTags, out race)) { races.Add(race); } } if (races.Count == 0) { races.Add(RaceDictionary["Human"]); if (RaceDictionary.TryGetValue("Alien_Orassan", out var race)) { races.Add(race); } } foreach (var race in races) { if (hair.Gender.Equals("Any") || hair.Gender.Contains("Usually")) { foreach (var list in race.HairsByGender.Values.ToList()) { list.Add(hair); } } else { List <Hair> hairListForGender; if (race.HairsByGender.TryGetValue(hair.Gender, out hairListForGender)) { hairListForGender.Add(hair); } } } } foreach (ThingDef thingDef in ThingDefs.Values) { if (thingDef.ParentName != null && ThingDefs.TryGetValue(thingDef.ParentName, out ThingDef value)) { thingDef.Parent = value; } if (thingDef.DefName != null && !ThingDefsByDefName.ContainsKey(thingDef.DefName)) { ThingDefsByDefName.Add(thingDef.DefName, thingDef); } foreach (string stuffPropCat in thingDef.StuffPropsCategories) { if (ThingDefsByStuffCategory.TryGetValue(stuffPropCat, out var list)) { list.Add(thingDef); } else { List <ThingDef> thingDefs = new List <ThingDef>(); thingDefs.Add(thingDef); ThingDefsByStuffCategory.Add(stuffPropCat, thingDefs); } } } ResourceLoader.ChildhoodStories = ResourceLoader.ChildhoodStories.OrderBy(x => x.DisplayTitle).ToList(); ResourceLoader.AdulthoodStories = ResourceLoader.AdulthoodStories.OrderBy(x => x.DisplayTitle).ToList(); }
public static void Load() { Logger.Debug("Loading backstory database."); Backstories.Clear(); ChildhoodStories = null; AdulthoodStories = null; List <Backstory> childhodStories = new List <Backstory>(); List <Backstory> adultStories = new List <Backstory>(); Backstories["None"] = new Backstory { DisplayTitle = "-- No Backstory --", Id = "None", Description = "", Title = "", Slot = "Both" }; childhodStories.Add(Backstories["None"]); adultStories.Add(Backstories["None"]); var resources = Properties.Resources.ResourceManager .GetResourceSet(CultureInfo.InvariantCulture, true, true); using (var stream = new MemoryStream(Encoding.UTF8.GetBytes((string)resources.GetObject("Backstories")))) { var root = XDocument.Load(stream).Root; foreach (var story in root.Elements()) { var backstory = Backstory.Extract(story); //backstory.Slot = "Both"; backstory.Id = story.Name.LocalName; backstory.DisplayTitle = backstory.Title; if (Backstories.ContainsKey(backstory.Id)) { Logger.Warn($"Backstory database already contains entry with key:{backstory.Id}"); continue; } //CheckStory(backstory); Backstories[backstory.Id] = backstory; //Logger.Debug($"[Builtin Backstory] {backstory.Id}: {backstory.DisplayTitle}"); if (string.IsNullOrEmpty(backstory.Slot)) { childhodStories.Add(backstory); adultStories.Add(backstory); } else if (backstory.Slot == "Childhood") { childhodStories.Add(backstory); } else { adultStories.Add(backstory); } } stream.Close(); stream.Dispose(); } var resourceList = new[] { "CivilAdulthoods", "CivilChildhoods", "OutsiderAdulthoods", "RaiderAdulthoods", "rimworld_creations", "TribalAdulthoods", "TribalChildhoods", "TynanCustom" }; foreach (var resourceName in resourceList) { var stories = new List <Backstory>(); using (var stream = new MemoryStream(Encoding.UTF8.GetBytes((string)resources.GetObject(resourceName)))) { var root = XDocument.Load(stream).Root; foreach (var story in root.Descendants("Backstory")) { var backstory = Backstory.Extract(story); if (backstory != null) { stories.Add(backstory); } } foreach (var story in root.Descendants("Childhood")) { var backstory = Backstory.Extract(story); if (backstory != null) { backstory.Slot = "Childhood"; stories.Add(backstory); } } foreach (var story in root.Descendants("Adulthood")) { var backstory = Backstory.Extract(story); if (backstory != null) { backstory.Slot = "Adulthood"; stories.Add(backstory); } } foreach (var backstory in stories) { if (backstory.Title == "") { Logger.Err($"Story with empty title:{backstory.Id}"); continue; } Backstory old; if (!Backstories.TryGetValue(backstory.Id, out old)) { Logger.Debug($"Possible ID missmatch: {backstory.Id}: Attempting to fix."); old = FixStoryId(backstory); } if (old == null) { Logger.Err("[FIX] Fix FAILED. No matching title found."); continue; } childhodStories.Remove(old); adultStories.Remove(old); if (resourceName.StartsWith("Tribal")) { backstory.DisplayTitle = "(Tribal) " + backstory.DisplayTitle; } else if (resourceName == "rimworld_creations" || resourceName == "TynanCustom") { backstory.DisplayTitle = "(Special) " + backstory.DisplayTitle; } //CheckStory(backstory); Backstories[backstory.Id] = backstory; if (string.IsNullOrEmpty(backstory.Slot)) { childhodStories.Add(backstory); adultStories.Add(backstory); } else if (backstory.Slot == "Childhood") { childhodStories.Add(backstory); } else { adultStories.Add(backstory); } } stream.Close(); stream.Dispose(); } } // Sanity checker foreach (var story in Backstories.Values) { if (string.IsNullOrEmpty(story.ToString())) { Logger.Err($"Empty/null story:{story.Title}"); } } ChildhoodStories = childhodStories.OrderBy(x => x.DisplayTitle).ToList(); AdulthoodStories = adultStories.OrderBy(x => x.DisplayTitle).ToList(); resources.Close(); resources.Dispose(); }