void EditSkill(SkillMetadata skill) { var originalName = skill.Name; var skillWindow = new SkillEditorWindow(skill); skillWindow.Owner = this; var result = skillWindow.ShowDialog(); if (!result.HasValue || !result.Value) { return; } skillWindow.Skill.CopyTo(skill); BindingOperations.GetBindingExpression(skillListView, ListView.ItemsSourceProperty).UpdateTarget(); if (!string.Equals(skill.Name, originalName, StringComparison.Ordinal)) { SkillMetadataManager.Instance.RenameSkill(originalName, skill.Name); } skillListView.SelectedItem = skill; skillListView.ScrollIntoView(skill); }
private async Task HandleEventMessage(ITurnContext turnContext) { if (turnContext.Activity.Name == "skillBegin") { var state = await _accessors.DemoSkillState.GetAsync(turnContext, () => new DemoSkillState()); SkillMetadata skillMetadata = turnContext.Activity.Value as SkillMetadata; if (skillMetadata != null) { // .Configuration has any configuration settings required for operation // .Parameters has any user information configured to be passed } } else if (turnContext.Activity.Name == "tokens/response") { // Auth dialog completion var dialogContext = await _dialogs.CreateContextAsync(turnContext); var result = await dialogContext.ContinueDialogAsync(); // If the dialog completed when we sent the token, end the skill conversation if (result.Status != DialogTurnStatus.Waiting) { var response = turnContext.Activity.CreateReply(); response.Type = ActivityTypes.EndOfConversation; await turnContext.SendActivityAsync(response); } } }
private bool VerifySkillTypeOf(SkillType type, SkillSubType subType) { SkillMetadata skillData = GetSkillMetadata(); if (skillData != null && skillData.Type == type.GetValue() && skillData.SubType == subType.GetValue()) { return(true); } return(false); }
private bool VerifySkillTypeOf(SkillType type, SkillSubType subType, BuffType buffType, BuffSubType buffSubType) { SkillMetadata skillData = GetSkillMetadata(); if (skillData != null && skillData.Type == type.GetValue() && skillData.SubType == subType.GetValue()) { SkillAdditionalData skillAdditionalData = skillData.SkillLevels.Find(s => s.Level == SkillLevel).SkillAdditionalData; if (skillAdditionalData != null && skillAdditionalData.BuffType == buffType.GetValue() && skillAdditionalData.BuffSubType == buffSubType.GetValue()) { return(true); } } return(false); }
public SkillEditorWindow(SkillMetadata skill, bool isEditMode = true) : this() { nameTextBox.Text = originalName = skill.Name; groupNameTextBox.Text = skill.GroupName; manaUpDown.Value = skill.ManaCost; cooldownTextBox.Text = skill.Cooldown.ToShortEnglish(); assailCheckBox.IsChecked = skill.IsAssail; dialogCheckBox.IsChecked = skill.OpensDialog; improveCheckBox.IsChecked = !skill.CanImprove; disarmCheckBox.IsChecked = skill.RequiresDisarm; SetPlayerClass(skill.Class); this.IsEditMode = isEditMode; if (isEditMode) { this.Title = "Edit Skill"; } }
public static List <SkillMetadata> Parse(MemoryMappedFile m2dFile, IEnumerable <PackFileEntry> entries) { List <SkillMetadata> skillList = new List <SkillMetadata>(); foreach (PackFileEntry entry in entries) { // Parsing Skills if (entry.Name.StartsWith("skill")) { string skillId = Path.GetFileNameWithoutExtension(entry.Name); SkillMetadata metadata = new SkillMetadata(); List <SkillLevel> skillLevels = new List <SkillLevel>(); metadata.SkillId = int.Parse(skillId); XmlDocument document = m2dFile.GetDocument(entry.FileHeader); XmlNodeList levels = document.SelectNodes("/ms2/level"); foreach (XmlNode level in levels) { // Getting all skills level string feature = level.Attributes["feature"] != null ? level.Attributes["feature"].Value : ""; int levelValue = level.Attributes["value"].Value != null?int.Parse(level.Attributes["value"].Value) : 0; int spirit = level.SelectSingleNode("consume/stat").Attributes["sp"] != null?int.Parse(level.SelectSingleNode("consume/stat").Attributes["sp"].Value) : 0; float damageRate = level.SelectSingleNode("motion/attack/damageProperty") != null?float.Parse(level.SelectSingleNode("motion/attack/damageProperty").Attributes["rate"].Value) : 0; skillLevels.Add(new SkillLevel(levelValue, spirit, damageRate, feature)); } metadata.SkillLevels = skillLevels; skillList.Add(metadata); } // Parsing SubSkills else if (entry.Name.StartsWith("table/job")) { XmlDocument document = m2dFile.GetDocument(entry.FileHeader); XmlNodeList jobs = document.SelectNodes("/ms2/job"); foreach (XmlNode job in jobs) { if (job.Attributes["feature"] != null) // Getting attribute that just have "feature" { string feature = job.Attributes["feature"].Value; if (feature == "JobChange_02") // Getting JobChange_02 skillList for now until better handle Awakening system. { XmlNode skills = job.SelectSingleNode("skills"); int jobCode = int.Parse(job.Attributes["code"].Value); for (int i = 0; i < skills.ChildNodes.Count; i++) { int id = int.Parse(skills.ChildNodes[i].Attributes["main"].Value); int[] sub = new int[0]; SkillMetadata skill = skillList.Find(x => x.SkillId == id); // This find the skill in the SkillList skill.Job = jobCode; if (skills.ChildNodes[i].Attributes["sub"] != null) { if (skillList.Select(x => x.SkillId).Contains(id)) { sub = Array.ConvertAll(skills.ChildNodes[i].Attributes["sub"].Value.Split(","), int.Parse); skill.SubSkills = sub; for (int n = 0; n < sub.Length; n++) { if (skillList.Select(x => x.SkillId).Contains(sub[n])) { skillList.Find(x => x.SkillId == sub[n]).Job = jobCode; } } } } } XmlNode learn = job.SelectSingleNode("learn"); for (int i = 0; i < learn.ChildNodes.Count; i++) { int id = int.Parse(learn.ChildNodes[i].Attributes["id"].Value); skillList.Find(x => x.SkillId == id).Learned = 1; } } } else if (job.Attributes["code"].Value == "001") { XmlNode skills = job.SelectSingleNode("skills"); for (int i = 0; i < skills.ChildNodes.Count; i++) { int id = int.Parse(skills.ChildNodes[i].Attributes["main"].Value); int[] sub = new int[0]; if (skills.ChildNodes[i].Attributes["sub"] != null) { sub = Array.ConvertAll(skills.ChildNodes[i].Attributes["sub"].Value.Split(","), int.Parse); } } } } } } return(skillList); }
public static List <SkillMetadata> Parse(MemoryMappedFile m2dFile, IEnumerable <PackFileEntry> entries) { List <SkillMetadata> skillList = new List <SkillMetadata>(); foreach (PackFileEntry skill in entries) { if (!skill.Name.StartsWith("skill/10")) { continue; } string skillId = Path.GetFileNameWithoutExtension(skill.Name); SkillMetadata metadata = new SkillMetadata(); List <SkillMotion> motions = new List <SkillMotion>(); List <SkillLevel> skillLevel = new List <SkillLevel>(); metadata.SkillId = int.Parse(skillId); Debug.Assert(metadata.SkillId > 0, $"Invalid Id {metadata.SkillId} from {skillId}"); //using XmlReader reader = m2dFile.GetReader(skill.FileHeader); XmlDocument document = m2dFile.GetDocument(skill.FileHeader); XmlNodeList basic = document.SelectNodes("/ms2/basic"); foreach (XmlNode node in basic) { if (node.Attributes.GetNamedItem("feature") != null) { // Get Rank metadata.Feature = node.Attributes["feature"].Value; } XmlNode kinds = node.SelectSingleNode("kinds"); metadata.Type = kinds.Attributes["type"].Value != null?int.Parse(kinds.Attributes["type"].Value) : 0; metadata.SubType = kinds.Attributes["subType"].Value != null?int.Parse(kinds.Attributes["subType"].Value) : 0; metadata.RangeType = kinds.Attributes["rangeType"].Value != null?int.Parse(kinds.Attributes["rangeType"].Value) : 0; metadata.Element = kinds.Attributes["element"].Value != null?int.Parse(kinds.Attributes["element"].Value) : 0; } XmlNodeList levels = document.SelectNodes("/ms2/level"); foreach (XmlNode node in levels) { int level = node.Attributes["value"].Value != null?int.Parse(node.Attributes["value"].Value) : 1; XmlNode consume = node.SelectSingleNode("consume/stat"); int spirit = 0; int upgradeLevel = 0; int[] upgradeSkillId = new int[0]; int[] upgradeSkillLevel = new int[0]; if (consume.Attributes.GetNamedItem("sp") != null) { spirit = int.Parse(consume.Attributes["sp"].Value); } XmlNode upgrade = node.SelectSingleNode("upgrade"); if (upgrade.Attributes != null) { if (upgrade.Attributes.GetNamedItem("level") != null) { upgradeLevel = int.Parse(upgrade.Attributes["level"].Value); } if (upgrade.Attributes.GetNamedItem("skillIDs") != null) { upgradeSkillId = Array.ConvertAll(upgrade.Attributes.GetNamedItem("skillIDs").Value.Split(","), int.Parse); } if (upgrade.Attributes.GetNamedItem("skillLevels") != null) { upgradeSkillLevel = Array.ConvertAll(upgrade.Attributes.GetNamedItem("skillLevels").Value.Split(","), int.Parse); } } XmlNode motion = node.SelectSingleNode("motion/motionProperty"); string sequenceName = ""; string motionEffect = ""; string strTagEffects = ""; if (motion.Attributes != null) { if (motion.Attributes.GetNamedItem("sequenceName") != null) { sequenceName = motion.Attributes["sequenceName"].Value; } if (motion.Attributes.GetNamedItem("motionEffect") != null) { motionEffect = motion.Attributes["motionEffect"].Value; } if (motion.Attributes.GetNamedItem("strTagEffects") != null) { strTagEffects = motion.Attributes["strTagEffects"].Value; } } motions.Add(new SkillMotion(sequenceName, motionEffect, strTagEffects)); metadata.SkillLevel.Add(new SkillLevel(level, spirit, upgradeLevel, upgradeSkillId, upgradeSkillLevel, motions)); } skillList.Add(metadata); } return(skillList); }
public static List <SkillMetadata> Parse(MemoryMappedFile m2dFile, IEnumerable <PackFileEntry> entries) { List <SkillMetadata> skillList = new List <SkillMetadata>(); foreach (PackFileEntry skill in entries) { if (!skill.Name.StartsWith("skill")) { continue; } string skillId = Path.GetFileNameWithoutExtension(skill.Name); SkillMetadata metadata = new SkillMetadata(); List <SkillLevel> skillLevel = new List <SkillLevel>(); metadata.SkillId = int.Parse(skillId); Debug.Assert(metadata.SkillId > 0, $"Invalid Id {metadata.SkillId} from {skillId}"); //using XmlReader reader = m2dFile.GetReader(skill.FileHeader); XmlDocument document = m2dFile.GetDocument(skill.FileHeader); XmlNodeList basic = document.SelectNodes("/ms2/basic"); foreach (XmlNode node in basic) { if (node.Attributes.GetNamedItem("feature") != null) { // Get Rank metadata.Feature = node.Attributes["feature"].Value; } XmlNode kinds = node.SelectSingleNode("kinds"); metadata.Type = kinds.Attributes["type"].Value != null?int.Parse(kinds.Attributes["type"].Value) : 0; if (kinds.Attributes.GetNamedItem("subType") != null) { // Get Rank metadata.SubType = kinds.Attributes["subType"].Value != null?int.Parse(kinds.Attributes["subType"].Value) : 0; } XmlNode stateAttr = node.SelectSingleNode("stateAttr"); if (stateAttr.Attributes.GetNamedItem("useDefaultSkill") != null) { // Get Rank metadata.DefaultSkill = stateAttr.Attributes["useDefaultSkill"].Value != null?byte.Parse(stateAttr.Attributes["useDefaultSkill"].Value) : 0; } } XmlNodeList levels = document.SelectNodes("/ms2/level"); foreach (XmlNode node in levels) { if (node.Attributes.GetNamedItem("feature") == null || node.Attributes.GetNamedItem("feature").Value == metadata.Feature) { int level = node.Attributes["value"].Value != null?int.Parse(node.Attributes["value"].Value) : 1; XmlNode consume = node.SelectSingleNode("consume/stat"); int spirit = 0; int upgradeLevel = 0; int[] upgradeSkillId = new int[0]; int[] upgradeSkillLevel = new int[0]; if (consume.Attributes.GetNamedItem("sp") != null) { spirit = int.Parse(consume.Attributes["sp"].Value); } XmlNode upgrade = node.SelectSingleNode("upgrade"); if (upgrade.Attributes != null) { if (upgrade.Attributes.GetNamedItem("level") != null) { upgradeLevel = int.Parse(upgrade.Attributes["level"].Value); } if (upgrade.Attributes.GetNamedItem("skillIDs") != null) { upgradeSkillId = Array.ConvertAll(upgrade.Attributes.GetNamedItem("skillIDs").Value.Split(","), int.Parse); } if (upgrade.Attributes.GetNamedItem("skillLevels") != null) { upgradeSkillLevel = Array.ConvertAll(upgrade.Attributes.GetNamedItem("skillLevels").Value.Split(","), int.Parse); } } skillLevel.Add(new SkillLevel(level, spirit, upgradeLevel, upgradeSkillId, upgradeSkillLevel)); metadata.SkillLevel = skillLevel[0]; } } skillList.Add(metadata); } return(skillList); }
public void Update(ProcessMemoryAccessor accessor) { if (accessor == null) { throw new ArgumentNullException("accessor"); } var version = Owner.Version; if (version == null) { ResetDefaults(); return; } var skillbookVariable = version.GetVariable(SkillbookKey); if (skillbookVariable == null) { ResetDefaults(); return; } Debug.WriteLine($"Updating skillbok (pid={accessor.ProcessId})..."); Stream stream = null; try { stream = accessor.GetStream(); using (var reader = new BinaryReader(stream, Encoding.ASCII)) { stream = null; var skillbookPointer = skillbookVariable.DereferenceValue(reader); if (skillbookPointer == 0) { ResetDefaults(); return; } reader.BaseStream.Position = skillbookPointer; for (int i = 0; i < skillbookVariable.Count; i++) { SkillMetadata metadata = null; try { bool hasSkill = reader.ReadInt16() != 0; ushort iconIndex = reader.ReadUInt16(); string name = reader.ReadFixedString(skillbookVariable.MaxLength); int currentLevel, maximumLevel; if (!Ability.TryParseLevels(name, out name, out currentLevel, out maximumLevel)) { if (!string.IsNullOrWhiteSpace(name)) { skills[i].Name = name.Trim(); } } skills[i].IsEmpty = !hasSkill; skills[i].IconIndex = iconIndex; skills[i].Icon = IconManager.Instance.GetSkillIcon(iconIndex); skills[i].Name = name; skills[i].CurrentLevel = currentLevel; skills[i].MaximumLevel = maximumLevel; if (!skills[i].IsEmpty && !string.IsNullOrWhiteSpace(skills[i].Name)) { metadata = SkillMetadataManager.Instance.GetSkill(name); } var isActive = this.IsActive(skills[i].Name); skills[i].IsActive = isActive.HasValue && isActive.Value; if (metadata != null) { skills[i].Cooldown = metadata.Cooldown; skills[i].ManaCost = metadata.ManaCost; skills[i].CanImprove = metadata.CanImprove; skills[i].IsAssail = metadata.IsAssail; skills[i].OpensDialog = metadata.OpensDialog; skills[i].RequiresDisarm = metadata.RequiresDisarm; } else { skills[i].Cooldown = TimeSpan.Zero; skills[i].ManaCost = 0; skills[i].CanImprove = true; skills[i].IsAssail = false; skills[i].OpensDialog = false; skills[i].RequiresDisarm = false; } skills[i].IsOnCooldown = IsSkillOnCooldown(i, version, reader); if (!skills[i].IsEmpty) { Debug.WriteLine($"Skill slot {i + 1}: {skills[i].Name} (cur={skills[i].CurrentLevel}, max={skills[i].MaximumLevel}, icon={skills[i].IconIndex})"); } } catch { } } } } finally { stream?.Dispose(); } }
public bool IsChainSkill() { SkillMetadata skillData = GetSkillMetadata(); return(skillData.Type == SkillType.None.GetValue() && skillData.SubType == SkillType.None.GetValue()); }