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); }
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; }
public UseAbilityButtonGump(AbilityDefinition def, bool primary) : this() { _isPrimary = primary; UIManager.GetGump <UseAbilityButtonGump>(2000 + (uint)def.Index)?.Dispose(); _definition = def; BuildGump(); }
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]); }
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)); }
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; } }
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);
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));
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;