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);
        }
Example #2
0
 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}");
         }
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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();
        }
Example #5
0
        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();
        }