Esempio n. 1
0
        public override void Update(double totalMS, double frameMS)
        {
            base.Update(totalMS, frameMS);

            if (IsDisposed)
            {
                return;
            }

            for (int i = 0; i < 2; i++)
            {
                int index = ((byte)(i == 0 ? World.Player.PrimaryAbility : World.Player.SecondaryAbility) & 0x7F) - 1;

                AbilityDefinition def = AbilityData.Abilities[index];

                if (i == 0)
                {
                    if (_primAbility.Graphic != def.Icon)
                    {
                        _primAbility.Graphic = def.Icon;
                    }
                }
                else
                {
                    if (_secAbility.Graphic != def.Icon)
                    {
                        _secAbility.Graphic = def.Icon;
                    }
                }
            }
        }
        public bool TryActivateAbility(AbilityDefinition ability)
        {
            PlayerAbility playerAbility = GetPlayerAbility(ability);

            if (playerAbility == null)
            {
                return(false);
            }

            if (playerAbility.Cooldown > 0 || ability.InternalGetManaCost(this) > player.statMana)
            {
                return(false);
            }

            if (!ability.InternalCanCastAbility(this, playerAbility))
            {
                return(false);
            }

            if (ability.InternalCastAbility(this, playerAbility, true))
            {
                ability.OnAbilityCasted(this, playerAbility);

                if (Main.netMode == NetmodeID.MultiplayerClient && player.whoAmI == Main.myPlayer)
                {
                    NetworkPacketManager.Instance.AbilityCasted.SendPacketToAllClients(player.whoAmI, player.whoAmI, ability.UnlocalizedName, AcquiredAbilities[ability].Cooldown);
                }

                player.statMana -= (int)Math.Ceiling(ability.InternalGetManaCost(this));

                return(true);
            }

            return(false);
        }
Esempio n. 3
0
        public static List <SkillDefinition> LoadSkills(string xmlfile)
        {
            List <SkillDefinition> skills = new List <SkillDefinition>();
            XPathDocument          doc    = new XPathDocument(xmlfile);
            XPathNavigator         nav    = doc.CreateNavigator();

            foreach (XPathNavigator n in nav.Select("/battle/skills/skill"))
            {
                string          name     = n.GetAttribute("name", "");
                string          descr    = n.GetAttribute("description", "");
                string          cost     = n.GetAttribute("cost", "");
                string          baseattr = n.GetAttribute("base", "");
                SkillDefinition skill    = new SkillDefinition();
                skill.Name        = name;
                skill.Description = descr;
                skill.BaseAbility = AbilityDefinition.ParseAbility(baseattr);
                skill.Expcost     = int.Parse(cost);
                foreach (XPathNavigator n2 in n.Select("provides"))
                {
                    skill.Provide(n2.GetAttribute("value", ""));
                }
                foreach (XPathNavigator n3 in n.Select("requires"))
                {
                    skill.Require(n3.GetAttribute("value", ""));
                }
                skills.Add(skill);
            }

            return(skills);
        }
        public PlayerAbility(AbilityDefinition ability, int level, int cooldown)
        {
            Ability = ability;
            Level   = level;

            Cooldown = cooldown;
        }
Esempio n. 5
0
 public UseAbilityButtonGump(AbilityDefinition def, bool primary) : this()
 {
     _isPrimary = primary;
     UIManager.GetGump <UseAbilityButtonGump>(2000 + (uint)def.Index)?.Dispose();
     _definition = def;
     BuildGump();
 }
Esempio n. 6
0
 public UseAbilityButtonGump(AbilityDefinition def, bool primary) : this()
 {
     _isPrimary = primary;
     Engine.UI.GetByLocalSerial <UseAbilityButtonGump>((uint)def.Index)?.Dispose();
     _definition = def;
     BuildGump();
 }
        private void OnAbilityUpgradeButtonClicked(UIMouseEvent evt, UIElement element)
        {
            DoTariaPlayer   dotariaPlayer = DoTariaPlayer.Get(Main.LocalPlayer);
            UIAbilityButton upgradeButton = element as UIAbilityButton;

            if (upgradeButton == null)
            {
                Main.NewText("Upgrade button was null ?");
                return;
            }

            if (!_upgradeButtonsForAbilityDefinitions.ContainsKey(upgradeButton))
            {
                Main.NewText("Upgrade button was clicked when it shouldn't be accessible.");
                return;
            }

            AbilityDefinition ability = _upgradeButtonsForAbilityDefinitions[upgradeButton];

            if (!CanUpgradeAbility(dotariaPlayer, ability))
            {
                Main.NewText("Tried leveling an ability without meeting the requirements.");
                return;
            }

            dotariaPlayer.AcquireOrLevelUp(ability);
        }
        public PlayerAbility GetPlayerAbility(AbilityDefinition ability)
        {
            if (!HasAbility(ability))
            {
                return(null);
            }

            return(AcquiredAbilities[ability]);
        }
        private UIAbilityButton GetAbilityButtonForAbility(AbilityDefinition ability)
        {
            if (!_abilityButtonsForAbilityDefinitions.ContainsKey(ability))
            {
                return(null);
            }

            return(_abilityButtonsForAbilityDefinitions[ability]);
        }
        public bool TryActivateAbility(AbilitySlot abilitySlot)
        {
            AbilityDefinition ability = GetAbilityForSlot(abilitySlot);

            if (ability == null || !HasAbility(ability))
            {
                return(false);
            }

            return(TryActivateAbility(ability));
        }
        private UIAbilityButton GetUpgradeButtonForAbility(AbilityDefinition ability)
        {
            UIAbilityButton abilityButton = GetAbilityButtonForAbility(ability);

            if (abilityButton == null || !_upgradeButtonsForAbilityButtons.ContainsKey(abilityButton))
            {
                return(null);
            }

            return(_upgradeButtonsForAbilityButtons[abilityButton]);
        }
Esempio n. 12
0
        public override void Restore(BinaryReader reader)
        {
            base.Restore(reader);

            int    index   = reader.ReadInt32();
            string name    = reader.ReadUTF8String(reader.ReadInt32());
            int    graphic = reader.ReadInt32();

            _definition = new AbilityDefinition(index, name, (ushort)graphic);
            _isPrimary  = reader.ReadBoolean();

            BuildGump();
        }
        private void ProcessTriggersHotkeys(TriggersSet triggersSet)
        {
            foreach (KeyValuePair <ModHotKey, AbilitySlot> kvp in DoTariaMod.Instance.ModHotKeys)
            {
                if (kvp.Key.JustReleased)
                {
                    AbilityDefinition ability = GetAbilityForSlot(kvp.Value);
                    if (ability == null)
                    {
                        return;
                    }

                    TryActivateAbility(ability);
                }
            }
        }
        public void AcquireOrLevelUp(AbilityDefinition ability, bool callAbilityLeveledUp = true, bool networkCall = false)
        {
            if (!HasAbility(ability))
            {
                AcquiredAbilities.Add(ability, new PlayerAbility(ability, 1, 0));
            }
            else
            {
                AcquiredAbilities[ability].Level++;
            }

            if (callAbilityLeveledUp)
            {
                ability.InternalOnAbilityLeveledUp(this);
            }

            this.SendIfLocal(new PlayerAbilityLeveledUpPacket(ability));
        }
Esempio n. 15
0
        public override void Update(double totalMS, double frameMS)
        {
            base.Update(totalMS, frameMS);

            if (IsDisposed)
            {
                return;
            }

            int index = ((byte)World.Player.Abilities[_isPrimary ? 0 : 1] & 0x7F) - 1;

            AbilityDefinition def = AbilityData.Abilities[index];

            if (_definition.Index != def.Index)
            {
                _definition     = def;
                _button.Graphic = def.Icon;
            }
        }
Esempio n. 16
0
        private void LoadAbilities(TagCompound tag)
        {
            AcquiredAbilities.Clear();

            IList <string> abilitiesInformationUnparsed = tag.GetList <string>(nameof(AcquiredAbilities));

            for (int i = 0; i < abilitiesInformationUnparsed.Count; i++)
            {
                string[] splitInformation        = abilitiesInformationUnparsed[i].Split('|');
                string[] splitAbilityInformation = splitInformation[1].Split(':');

                AbilityDefinition ability = AbilityDefinitionManager.Instance[splitInformation[0]];
                AcquiredAbilities.Add(ability, new PlayerAbility(ability, int.Parse(splitAbilityInformation[0]), int.Parse(splitAbilityInformation[1])));
            }

            foreach (AbilityDefinition ability in Hero.Abilities)
            {
                if (ability.UnlockableAtLevel == 0 && !HasAbility(ability))
                {
                    AcquireOrLevelUp(ability); // TODO Add a way to verify this.
                }
            }
        }
 public bool HasAbility(AbilityDefinition ability) => AcquiredAbilities.ContainsKey(ability);
Esempio n. 18
0
        private void DrawDescription(SpriteBatch spriteBatch, AbilityDefinition ability)
        {
            DoTariaPlayer doTariaPlayer = DoTariaPlayer.Get(Main.LocalPlayer);
            PlayerAbility currentPlayerAbility;

            if (doTariaPlayer.HasAbility(ability))
            {
                currentPlayerAbility = doTariaPlayer.GetPlayerAbility(ability);
            }
            else
            {
                currentPlayerAbility = new PlayerAbility(ability, 1, 0);
            }

            int
                panelWidth  = 300,
                panelHeight = 34;

            Vector2 position = Main.MouseWorld + new Vector2(Main.cursorTextures[0].Width, Main.cursorTextures[0].Height * 2) - Main.screenPosition;

            StringBuilder description = new StringBuilder("Ability: ");


            if (ability.AbilityTargetType == AbilityTargetType.NoTarget && ability.AbilityType == AbilityType.Passive)
            {
                description.Append(ability.AbilityType);
            }
            else
            {
                description.Append(ability.AbilityTargetType.ToString().AddSpaceBeforeCapitals());
            }

            description.AppendLine();

            if (ability.AbilityTargetUnitType != AbilityTargetUnitType.None)
            {
                description.Append("Affects: ");

                if (!(ability.AbilityTargetUnitFaction == AbilityTargetFaction.Self || ability.AbilityTargetUnitFaction == (AbilityTargetFaction.Enemies & AbilityTargetFaction.Allies)))
                {
                    description.Append(ability.AbilityTargetUnitFaction).Append(" ");
                }

                description.Append(ability.AbilityTargetUnitType.ToString().AddSpaceBeforeCapitals()).AppendLine();
            }

            description.Append(ability.GetAbilityTooltip(doTariaPlayer, currentPlayerAbility));

            DispelType dispelType = ability.GetDispelType(doTariaPlayer, currentPlayerAbility);

            if (dispelType != DispelType.None)
            {
                description.AppendLine().Append("Dispel type: ").Append(dispelType.ToString()).Append(" Dispel");
            }

            description.AppendLine();
            string finaliziedDescription = SpliceText(description.ToString(), 34);

            panelHeight += finaliziedDescription.Split('\n').Length * 26;

            spriteBatch.Draw(Main.magicPixel, position, new Rectangle(0, 0, panelWidth, panelHeight), Color.Black * 0.75f, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f);
            spriteBatch.Draw(Main.magicPixel, position + new Vector2(2, 2), new Rectangle(0, 0, panelWidth - 4, 32), Color.Gray * 0.75f, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f);
            spriteBatch.DrawString(Main.fontMouseText, ability.DisplayName, position + new Vector2(6, 8), Color.White);
            spriteBatch.DrawString(Main.fontMouseText, "Level: " + CurrentLevel, position + new Vector2(panelWidth - 56, 12), Color.White, 0, Vector2.Zero, 0.75f, SpriteEffects.None, 1f);

            spriteBatch.DrawString(Main.fontMouseText, finaliziedDescription, position + new Vector2(10, 40), Color.Gray, 0, Vector2.Zero, 0.85f, SpriteEffects.None, 1f);

            Texture2D manacostTexture = DoTariaMod.Instance.GetTexture("UserInterfaces/Abilities/ManacostIcon");
            Texture2D cooldownTexture = DoTariaMod.Instance.GetTexture("UserInterfaces/Abilities/CooldownIcon");

            Func <DoTariaPlayer, PlayerAbility, float> cooldownGetter = (player, playerAbility) => (float)Math.Round((double)playerAbility.Ability.InternalGetCooldown(player, playerAbility), 2);

            List <float> differentCooldowns = AbilitiesHelper.GetDifferentValues(cooldownGetter, doTariaPlayer, ability);

            if (!(differentCooldowns.Count == 1 && differentCooldowns[0] == 0f))
            {
                spriteBatch.Draw(cooldownTexture, position + new Vector2(10, panelHeight - 22), null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f);
                spriteBatch.DrawString(Main.fontMouseText,
                                       AbilitiesHelper.GenerateCleanSlashedString(AbilitiesHelper.GetAllValues((player, pAbility) => (float)Math.Round((double)pAbility.Ability.InternalGetCooldown(player, pAbility), 2),
                                                                                                               doTariaPlayer, ability), differentCooldowns), position + new Vector2(30, panelHeight - 24), Color.Gray);
            }

            if (ability.AbilityType == AbilityType.Active)
            {
                spriteBatch.Draw(manacostTexture, position + new Vector2(panelWidth / 2, panelHeight - 22), null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 1f);
                spriteBatch.DrawString(Main.fontMouseText, AbilitiesHelper.GenerateCleanSlashedString((player, playerAbility) => (float)Math.Ceiling(playerAbility.Ability.InternalGetManaCost(player, playerAbility)), doTariaPlayer, ability),
                                       position + new Vector2(panelWidth / 2 + 20, panelHeight - 24), Color.Gray);
            }
        }
 public PlayerAbilityLeveledUpPacket(AbilityDefinition ability)
 {
     AbilityName = ability.UnlocalizedName;
 }
        public static List <float> GetDifferentValues(Func <DoTariaPlayer, PlayerAbility, float> informationGetter, DoTariaPlayer dotariaPlayer, AbilityDefinition ability)
        {
            List <float> differentValues = new List <float>();

            for (int i = 1; i <= ability.MaxLevel; i++)
            {
                float value = informationGetter(dotariaPlayer, new PlayerAbility(ability, i, 0));

                if (!differentValues.Contains(value))
                {
                    differentValues.Add(value);
                }
            }

            return(differentValues);
        }
 public PlayerAbility(AbilityDefinition ability) : this(ability, 1, 0)
 {
 }
        public static float[] GetAllValues(Func <DoTariaPlayer, PlayerAbility, float> informationGetter, DoTariaPlayer dotariaPlayer, AbilityDefinition ability)
        {
            float[] values = new float[ability.MaxLevel];

            for (int i = 1; i <= ability.MaxLevel; i++)
            {
                values[i - 1] = informationGetter(dotariaPlayer, new PlayerAbility(ability, i, 0));
            }

            return(values);
        }
 public static string GenerateCleanSlashedString(Func <DoTariaPlayer, PlayerAbility, float> informationGetter, DoTariaPlayer dotariaPlayer, AbilityDefinition ability) =>
 GenerateCleanSlashedString(GetAllValues(informationGetter, dotariaPlayer, ability), GetDifferentValues(informationGetter, dotariaPlayer, ability));
 public UseAbilityButtonGump(AbilityDefinition def, bool primary) : this()
 {
     _isPrimary  = primary;
     _definition = def;
     BuildGump();
 }
 public AbilityCastedPacket(AbilityDefinition ability, int newCooldown)
 {
     AbilityName = ability.UnlocalizedName;
     NewCooldown = newCooldown;
 }
 private bool CanUpgradeAbility(DoTariaPlayer dotariaPlayer, AbilityDefinition ability) =>
 ability.CanUnlock(dotariaPlayer) && (!dotariaPlayer.HasAbility(ability) || ability.InternalCanLevelUp(dotariaPlayer));
Esempio n. 27
0
        private void BuildGump()
        {
            Add(new GumpPic(0, 0, 0x2B02, 0));


            Add(_pageCornerLeft                = new GumpPic(50, 8, 0x08BB, 0));
            _pageCornerLeft.LocalSerial        = 0;
            _pageCornerLeft.Page               = int.MaxValue;
            _pageCornerLeft.MouseClick        += PageCornerOnMouseClick;
            _pageCornerLeft.MouseDoubleClick  += PageCornerOnMouseDoubleClick;
            Add(_pageCornerRight               = new GumpPic(321, 8, 0x08BC, 0));
            _pageCornerRight.LocalSerial       = 1;
            _pageCornerRight.Page              = 1;
            _pageCornerRight.MouseClick       += PageCornerOnMouseClick;
            _pageCornerRight.MouseDoubleClick += PageCornerOnMouseDoubleClick;

            int offs = 0;

            for (int page = 1; page <= _dictionaryPagesCount; page++)
            {
                for (int j = 0; j < 2; j++)
                {
                    int indexX       = 96;
                    int dataX        = 52;
                    int y            = 0;
                    int spellsOnPage = 9;

                    if (j % 2 != 0)
                    {
                        indexX       = 259;
                        dataX        = 215;
                        spellsOnPage = 4;
                    }

                    Label text = new Label("INDEX", false, 0x0288, font: 6)
                    {
                        X = indexX, Y = 6
                    };
                    Add(text, page);

                    for (int i = 0; i < spellsOnPage; i++)
                    {
                        if (offs >= _abilityCount)
                        {
                            break;
                        }

                        text = new HoveredLabel(AbilityData.Abilities[offs].Name, false, 0x0288, 0x33, font: 9)
                        {
                            X = dataX, Y = 42 + y, AcceptMouseInput = true,
                        };

                        Add(text, page);

                        y += 15;
                        offs++;
                    }

                    if (spellsOnPage == 4)
                    {
                        _primAbility = new GumpPic(215, 105, (ushort)(0x5200 + ((byte)World.Player.PrimaryAbility & 0x7F) - 1), 0);
                        text         = new Label("Primary Ability Icon", false, 0x0288, 80, 6)
                        {
                            X = 265, Y = 105
                        };
                        Add(_primAbility);
                        Add(text, page);

                        _primAbility.DragBegin += (sender, e) =>
                        {
                            AbilityDefinition def = AbilityData.Abilities[((byte)World.Player.PrimaryAbility & 0x7F) - 1];

                            UseAbilityButtonGump gump = new UseAbilityButtonGump(def, true)
                            {
                                X = Mouse.Position.X - 22, Y = Mouse.Position.Y - 22
                            };
                            Engine.UI.Add(gump);
                            Engine.UI.AttemptDragControl(gump, Mouse.Position, true);
                        };

                        _secAbility = new GumpPic(215, 150, (ushort)(0x5200 + ((byte)World.Player.SecondaryAbility & 0x7F) - 1), 0);
                        text        = new Label("Secondary Ability Icon", false, 0x0288, 80, 6)
                        {
                            X = 265, Y = 150
                        };
                        Add(_secAbility);
                        Add(text, page);

                        _secAbility.DragBegin += (sender, e) =>
                        {
                            AbilityDefinition def = AbilityData.Abilities[((byte)World.Player.SecondaryAbility & 0x7F) - 1];

                            UseAbilityButtonGump gump = new UseAbilityButtonGump(def, false)
                            {
                                X = Mouse.Position.X - 22,
                                Y = Mouse.Position.Y - 22
                            };
                            Engine.UI.Add(gump);
                            Engine.UI.AttemptDragControl(gump, Mouse.Position, true);
                        };
                    }
                }
            }
        }
 public bool HasAbility(AbilityDefinition ability, int level) => HasAbility(ability) && level <= AcquiredAbilities[ability].Level;