public TreeNode BuildTree() { var treeView = new TreeNode($"{_charGen.Id:X8}"); var starterAreas = new TreeNode("Starter Areas"); foreach (var starterArea in _charGen.StarterAreas) { var starterAreaTree = new StarterArea(starterArea).BuildTree(); var starterAreaNode = new TreeNode(starterAreaTree[0].Name.Replace("Name: ", "")); starterAreaNode.Items.AddRange(starterAreaTree[1].Items); starterAreas.Items.Add(starterAreaNode); } var heritageGroups = new TreeNode("Heritage Groups"); foreach (var kvp in _charGen.HeritageGroups) { var heritageTree = new HeritageGroupCG(kvp.Value).BuildTree(); var hg = new TreeNode(heritageTree[0].Name.Replace("Name: ", "")); heritageTree.RemoveAt(0); hg.Items.AddRange(heritageTree); heritageGroups.Items.Add(hg); } treeView.Items.AddRange(new List <TreeNode>() { starterAreas, heritageGroups }); return(treeView); }
public CharGen(string filename) { Console.WriteLine("Reading charGen from {0}...", filename); StreamReader inputFile = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read)); byte[] buffer = new byte[1024]; FileId = Utils.ReadUInt32(buffer, inputFile); FileId2 = Utils.ReadUInt32(buffer, inputFile); if (FileId != 0x0E000002) { Console.WriteLine("Invalid header, aborting."); return; } uint count = Utils.ReadCompressedUInt32(buffer, inputFile); for (int i = 0; i < count; i++) { StarterAreas.Add(new StarterArea(buffer, inputFile)); } Unknown = Utils.ReadByte(buffer, inputFile); count = Utils.ReadCompressedUInt32(buffer, inputFile); for (int i = 0; i < count; i++) { uint key = Utils.ReadUInt32(buffer, inputFile); HeritageGroupCG value = new HeritageGroupCG(buffer, inputFile); HeritageGroups.Add(key, value); } inputFile.Close(); Console.WriteLine("Done"); }
public void modify() { foreach (KeyValuePair <uint, HeritageGroupCG> entry in HeritageGroups) { HeritageGroupCG heritage = entry.Value; heritage.SkillCredits = 50; switch (heritage.Name) { case "Aluvian": heritage.Skills = new List <SkillCG>(); heritage.Skills.Add(new SkillCG((uint)eSkills.Dagger, 0, 4)); heritage.Skills.Add(new SkillCG((uint)eSkills.PersonalAppraisal, 0, 2)); break; case "Gharu'ndim": heritage.Skills = new List <SkillCG>(); heritage.Skills.Add(new SkillCG((uint)eSkills.Staff, 0, 4)); heritage.Skills.Add(new SkillCG((uint)eSkills.ItemAppraisal, 0, 2)); break; case "Sho": heritage.Skills = new List <SkillCG>(); heritage.Skills.Add(new SkillCG((uint)eSkills.UnarmedCombat, 0, 6)); break; } foreach (TemplateCG template in heritage.Templates) { switch (template.Name) { case "Bow Hunter": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.ArcaneLore); template.PrimarySkillsList.Add((uint)eSkills.Bow); template.PrimarySkillsList.Add((uint)eSkills.MeleeDefense); template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.ItemEnchantment); break; case "Life Caster": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.LifeMagic); template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.CreatureEnchantment); template.NormalSkillsList.Add((uint)eSkills.ManaConversion); template.NormalSkillsList.Add((uint)eSkills.WarMagic); break; case "War Mage": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.WarMagic); template.PrimarySkillsList.Add((uint)eSkills.ManaConversion); template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.ArcaneLore); template.NormalSkillsList.Add((uint)eSkills.Healing); break; case "Wayfarer": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.ArcaneLore); template.PrimarySkillsList.Add((uint)eSkills.Dagger); if (heritage.Name == "Aluvian") { template.PrimarySkillsList.Add((uint)eSkills.Lockpick); } template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.Crossbow); template.NormalSkillsList.Add((uint)eSkills.Healing); template.NormalSkillsList.Add((uint)eSkills.ItemEnchantment); if (heritage.Name != "Aluvian") { template.NormalSkillsList.Add((uint)eSkills.Lockpick); } template.NormalSkillsList.Add((uint)eSkills.MeleeDefense); break; case "Soldier": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.ArcaneLore); template.PrimarySkillsList.Add((uint)eSkills.Axe); template.PrimarySkillsList.Add((uint)eSkills.MeleeDefense); template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.Crossbow); template.NormalSkillsList.Add((uint)eSkills.Healing); break; case "Swashbuckler": template.PrimarySkillsList = new List <uint>(); template.PrimarySkillsList.Add((uint)eSkills.ArcaneLore); template.PrimarySkillsList.Add((uint)eSkills.MeleeDefense); template.PrimarySkillsList.Add((uint)eSkills.Sword); template.NormalSkillsList = new List <uint>(); template.NormalSkillsList.Add((uint)eSkills.ItemEnchantment); break; } } } }
public static CharGen ReadFromDat() { // Check the FileCache so we don't need to hit the FileSystem repeatedly if (DatManager.PortalDat.FileCache.ContainsKey(0x0E000002)) { return((CharGen)DatManager.PortalDat.FileCache[0x0E000002]); } else { // Create the datReader for the proper file DatReader datReader = DatManager.PortalDat.GetReaderForFile(0x0E000002); CharGen cg = new CharGen(); cg.Did = datReader.ReadInt32(); datReader.Offset = 8; /// STARTER AREAS. There are 5 dungeons per starting city, and one landscape span for Olthoi. int numStarterAreas = datReader.ReadByte(); for (int i = 0; i < numStarterAreas; i++) { string starterAreaName = datReader.ReadPString(); int numAreas = datReader.ReadByte(); List <Loc> starterAreas = new List <Loc>(); for (int j = 0; j < numAreas; j++) { Loc starterArea = new Loc(datReader.ReadInt32(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle(), datReader.ReadSingle()); starterAreas.Add(starterArea); } cg.StarterAreas.Add(starterAreas); } /// HERITAGE GROUPS -- 11 standard player races and 2 Olthoi. datReader.Offset++; // Not sure what this byte 0x01 is indicating, but we'll skip it because we can. int heritageGroupCount = datReader.ReadByte(); for (int i = 0; i < heritageGroupCount; i++) { HeritageGroupCG heritage = new HeritageGroupCG(); int heritageIndex = datReader.ReadInt32(); heritage.Name = datReader.ReadPString(); heritage.IconImage = datReader.ReadUInt32(); heritage.SetupID = datReader.ReadUInt32(); heritage.EnvironmentSetupID = datReader.ReadUInt32(); heritage.AttributeCredits = datReader.ReadUInt32(); heritage.SkillCredits = datReader.ReadUInt32(); // Start Areas correspond go the CG.StarterAreas List. int numPrimaryStartAreas = datReader.ReadByte(); for (int j = 0; j < numPrimaryStartAreas; j++) { heritage.PrimaryStartAreaList.Add(datReader.ReadInt32()); } int numSecondaryStartAreas = datReader.ReadByte(); for (int j = 0; j < numSecondaryStartAreas; j++) { heritage.SecondaryStartAreaList.Add(datReader.ReadInt32()); } // Racial Skills int skillCount = datReader.ReadByte(); for (int j = 0; j < skillCount; j++) { SkillCG skill = new SkillCG(); skill.SkillNum = datReader.ReadUInt32(); skill.NormalCost = datReader.ReadUInt32(); skill.PrimaryCost = datReader.ReadUInt32(); heritage.SkillList.Add(skill); } // Adventurer, Bow Hunter, etc. int templateCount = datReader.ReadByte(); for (int j = 0; j < templateCount; j++) { TemplateCG template = new TemplateCG(); template.Name = datReader.ReadPString(); template.IconImage = datReader.ReadUInt32(); template.Title = datReader.ReadUInt32(); // Attributes template.Strength = datReader.ReadUInt32(); template.Endurance = datReader.ReadUInt32(); template.Coordination = datReader.ReadUInt32(); template.Quickness = datReader.ReadUInt32(); template.Focus = datReader.ReadUInt32(); template.Self = datReader.ReadUInt32(); skillCount = datReader.ReadByte(); for (int k = 0; k < skillCount; k++) { template.NormalSkillsList.Add(datReader.ReadUInt32()); } skillCount = datReader.ReadByte(); for (int k = 0; k < skillCount; k++) { template.PrimarySkillsList.Add(datReader.ReadUInt32()); } heritage.TemplateList.Add(template); } datReader.Offset++; // 0x01 byte here. Not sure what/why, so skip it! int numGenders = datReader.ReadByte(); // this is always 2, but let's read it anyways... for (int j = 0; j < numGenders; j++) { SexCG sex = new SexCG(); int genderID = datReader.ReadInt32(); sex.Name = datReader.ReadPString(); sex.Scale = datReader.ReadUInt32(); sex.SetupID = datReader.ReadUInt32(); sex.SoundTable = datReader.ReadUInt32(); sex.IconImage = datReader.ReadUInt32(); sex.BasePalette = datReader.ReadUInt32(); sex.SkinPalSet = datReader.ReadUInt32(); sex.PhysicsTable = datReader.ReadUInt32(); sex.MotionTable = datReader.ReadUInt32(); sex.CombatTable = datReader.ReadUInt32(); sex.BaseObjDesc = ObjDesc.ReadFromDat(ref datReader); int numHairColors = datReader.ReadByte(); for (int k = 0; k < numHairColors; k++) { sex.HairColorList.Add(datReader.ReadUInt32()); } int numHairStyles = datReader.ReadByte(); for (int k = 0; k < numHairStyles; k++) { HairStyleCG hairstyle = new HairStyleCG(); hairstyle.IconImage = datReader.ReadUInt32(); hairstyle.Bald = Convert.ToBoolean(datReader.ReadByte()); hairstyle.AlternateSetup = datReader.ReadUInt32(); hairstyle.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.HairStyleList.Add(hairstyle); } int numEyeColors = datReader.ReadByte(); for (int k = 0; k < numEyeColors; k++) { sex.EyeColorList.Add(datReader.ReadUInt32()); } int numEyeStrips = datReader.ReadByte(); for (int k = 0; k < numEyeStrips; k++) { EyeStripCG eyestrip = new EyeStripCG(); eyestrip.IconImage = datReader.ReadUInt32(); eyestrip.IconImageBald = datReader.ReadUInt32(); eyestrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); eyestrip.ObjDescBald = ObjDesc.ReadFromDat(ref datReader); sex.EyeStripList.Add(eyestrip); } int numNoseStrips = datReader.ReadByte(); // Breathe Right? for (int k = 0; k < numNoseStrips; k++) { FaceStripCG nosestrip = new FaceStripCG(); nosestrip.IconImage = datReader.ReadUInt32(); nosestrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.NoseStripList.Add(nosestrip); } int numMouthStrips = datReader.ReadByte(); // Breathe Right? for (int k = 0; k < numMouthStrips; k++) { FaceStripCG mouthstrip = new FaceStripCG(); mouthstrip.IconImage = datReader.ReadUInt32(); mouthstrip.ObjDesc = ObjDesc.ReadFromDat(ref datReader); sex.MouthStripList.Add(mouthstrip); } int numHeadGear = datReader.ReadByte(); for (int k = 0; k < numHeadGear; k++) { GearCG headgear = new GearCG(); headgear.Name = datReader.ReadPString(); headgear.ClothingTable = datReader.ReadUInt32(); headgear.WeenieDefault = datReader.ReadUInt32(); sex.HeadgearList.Add(headgear); } int numShirts = datReader.ReadByte(); for (int k = 0; k < numShirts; k++) { GearCG shirt = new GearCG(); shirt.Name = datReader.ReadPString(); shirt.ClothingTable = datReader.ReadUInt32(); shirt.WeenieDefault = datReader.ReadUInt32(); sex.ShirtList.Add(shirt); } int numPants = datReader.ReadByte(); for (int k = 0; k < numPants; k++) { GearCG pants = new GearCG(); pants.Name = datReader.ReadPString(); pants.ClothingTable = datReader.ReadUInt32(); pants.WeenieDefault = datReader.ReadUInt32(); sex.PantsList.Add(pants); } int numFootwear = datReader.ReadByte(); for (int k = 0; k < numFootwear; k++) { GearCG footwear = new GearCG(); footwear.Name = datReader.ReadPString(); footwear.ClothingTable = datReader.ReadUInt32(); footwear.WeenieDefault = datReader.ReadUInt32(); sex.FootwearList.Add(footwear); } int numClothingColors = datReader.ReadByte(); for (int k = 0; k < numClothingColors; k++) { sex.ClothingColorsList.Add(datReader.ReadUInt32()); } heritage.SexList.Add(genderID, sex); } cg.HeritageGroups.Add(heritageIndex, heritage); } // Store this object in the FileCache DatManager.PortalDat.FileCache[0x0E000002] = cg; return(cg); } }