Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #5
0
        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";
            }
        }
Beispiel #6
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
        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());
        }