public static void GetThoseDats() { var path = @"C:\Program Files (x86)\Grinding Gear Games\Path of Exile\Content.ggpk"; //var file = @"C:\ggpk2\Metadata\StatDescriptions\stat_descriptions.txt"; var ggpk = new GgpkFileSystem(path); var datIndex = new DatFileIndex(ggpk, DetSpecificationIndex.Default); var stats = new StatsDatLoader().Load(datIndex); var mods = new ModifiersDatLoader(stats).Load(datIndex); var we = mods.SelectMany(c => c.Value.SpawnWeights.Select(e => e.TagId)).Distinct().ToList(); Console.WriteLine("First 10 mods:"); int i = 0; foreach (var row in datIndex["Mods.dat"]) { Console.WriteLine(row["Name"]); if (++i == 10) { break; } } }
public IReadOnlyDictionary <string, Stat> Load(DatFileIndex source) { var statsDat = source["Stats.dat"]; var stats = new Dictionary <string, Stat>(statsDat.Count); foreach (var s in statsDat) { var id = s["Id"].Value.ToString(); var isLocal = ((bool)s["IsLocal"].Value); var mainHandAlias = ((DatRow)s["MainHandAlias_StatsKey"].Value)?["Id"]?.ToString(); var offHandAlias = ((DatRow)s["OffHandAlias_StatsKey"].Value)?["Id"]?.ToString(); stats.Add(id, new Stat(id, isLocal, mainHandAlias, offHandAlias)); } return(stats); }
private static void Translations() { var ggpk = new GgpkFileSystem(GgpkPath); var file = ggpk.Directories .First(c => c.Name == "Metadata").Directories .First(c => c.Name == "StatDescriptions").Files .First(c => c.Name == "stat_descriptions.txt") .GetStream(); var datIndex = new DatFileIndex(ggpk, DetSpecificationIndex.Default); var stats = new StatsDatLoader().Load(datIndex); var mods = new ModifiersDatLoader(stats).Load(datIndex); var transLoader = new TranslationsLoader(stats); var transIndex = transLoader.Load(file); var passiveSkills = datIndex.Where(c => c.Key.ToLower().Contains("tree")).ToList(); }
private static void PsgExtract() { var sw = Stopwatch.StartNew(); Console.WriteLine("Reading PassiveSkillGraph.psg..."); var psgFile = new DiskFile(@"C:\ggpk3\Metadata\PassiveSkillGraph.psg"); var diskDirectory = new DiskDirectory(@"C:\ggpk3\Data\"); var datIndex = new DatFileIndex(diskDirectory, DetSpecificationIndex.Default); var stats = new StatsDatLoader().Load(datIndex); var mods = new ModifiersDatLoader(stats).Load(datIndex); var passiveTree = new SkillTreeLoader(stats, datIndex); var psg = new PsgFile(psgFile); var result = passiveTree.Load(psg); sw.Stop(); Console.WriteLine($"Parsed Passive Skill Graph in {sw.ElapsedMilliseconds}ms.\r\n"); Console.WriteLine($"{psg.Groups.Count} groups, with {psg.Groups.Sum(c => c.Count)} nodes in total"); }
public IReadOnlyDictionary <string, Modifier> Load(DatFileIndex source) { var modsDat = source["Mods.dat"]; var numMods = modsDat.Count; var dict = new Dictionary <string, Modifier>(numMods); for (int i = 0; i < numMods; i++) { var m = modsDat[i]; var id = m["Id"].ToString(); var name = m["Name"].ToString(); var genType = (GenerationType)m["GenerationType"].Value; var domain = (Domain)m["Domain"].Value; var isEssenceOnly = (bool)m["IsEssenceOnlyModifier"].Value; var group = m["CorrectGroup"].Value.ToString(); var requiredLevel = (int)m["Level"].Value; var addsTags = ((List <DatRow>)m["TagsKeys"].Value) .Select(c => c["Id"].Value.ToString()).ToList(); var statRanges = Enumerable.Range(1, 5) .Select(x => { var key = ((DatRow)m[$"StatsKey{x}"].Value)?["Id"].Value.ToString(); if (key == null) { return(null); } var stat = _stats[key]; var min = (int)m[$"Stat{x}Min"].Value; var max = (int)m[$"Stat{x}Max"].Value; // Can't recall what this was for. Pending deletion. // var statData = (List<object>)m[$"Data{x}"].Value; return(new ModifierStatValueRange(stat, min, max)); }) .Where(c => c != null) .ToList(); var spawnWeightTags = ((List <DatRow>)m["SpawnWeight_TagsKeys"].Value) .Select(c => c["Id"].Value.ToString()).ToList(); var spawnWeightValues = ((List <object>)m["SpawnWeight_Values"].Value) .Cast <uint>().ToList(); var spawnWeights = spawnWeightTags .Zip(spawnWeightValues, (s, v) => new TagWeight(s, (int)v)) .ToList(); var generationWeightTags = ((List <DatRow>)m["GenerationWeight_TagsKeys"].Value) .Select(c => c["Id"].Value.ToString()).ToList(); var generationWeightValues = ((List <object>)m["GenerationWeight_Values"].Value) .Cast <int>().ToList(); var generationWeights = generationWeightTags .Zip(generationWeightValues, (s, v) => new TagWeight(s, (int)v)) .ToList(); var mod = new Modifier(id, name, domain, genType, isEssenceOnly, group, requiredLevel, statRanges, addsTags, spawnWeights, generationWeights); dict.Add(id, mod); } return(dict); }
public SkillTreeLoader(IReadOnlyDictionary <string, Stat> stats, DatFileIndex datIndex) { _stats = stats; _datIndex = datIndex; }
public DatJsonTests(ITestOutputHelper output, DatFixture fixture) { _output = output; _specIndex = fixture.SpecIndex; _datFileIndex = fixture.DatFileIndex; }
public DatFixture() { DatFileIndex = new DatFileIndex( new DiskDirectory(@"Dats"), SpecIndex); }