1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-28 18:15:23 +00:00

Added attribute/skill buttons to the HUD (#47)

This commit is contained in:
Kacper Drobny 2018-12-11 19:09:21 +01:00 committed by Tim Sarbin
parent de83a86aeb
commit c277cb2d89
14 changed files with 107 additions and 9 deletions

View File

@ -8,6 +8,7 @@
Cancel, Cancel,
Tall, Tall,
// Game UI // Game UI
Skill,
Run, Run,
Menu, Menu,
GoldCoin, GoldCoin,

View File

@ -0,0 +1,14 @@
namespace OpenDiablo2.Common.Enums
{
public enum ePanelType
{
None,
Character,
Inventory,
Skill,
Automap,
Message,
Quest,
Menu
}
}

View File

@ -38,5 +38,28 @@ namespace OpenDiablo2.Common.Extensions
log.Warn($"Unknown panel positon, {value}"); log.Warn($"Unknown panel positon, {value}");
return default(Point); return default(Point);
} }
public static ePanelType GetPanelType(this eButtonType value)
{
switch(value)
{
case eButtonType.MinipanelAutomap:
return ePanelType.Automap;
case eButtonType.MinipanelCharacter:
return ePanelType.Character;
case eButtonType.MinipanelInventory:
return ePanelType.Inventory;
case eButtonType.MinipanelMenu:
return ePanelType.Menu;
case eButtonType.MinipanelMessage:
return ePanelType.Message;
case eButtonType.MinipanelQuest:
return ePanelType.Quest;
case eButtonType.MinipanelSkill:
return ePanelType.Skill;
default:
return ePanelType.None;
}
}
} }
} }

View File

@ -14,6 +14,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
using OpenDiablo2.Common.Enums;
namespace OpenDiablo2.Common.Interfaces namespace OpenDiablo2.Common.Interfaces
{ {
public interface IGameHUD public interface IGameHUD
@ -23,6 +25,7 @@ namespace OpenDiablo2.Common.Interfaces
bool IsRightPanelVisible { get; } bool IsRightPanelVisible { get; }
bool IsMouseOver(); bool IsMouseOver();
void TogglePanel(ePanelType panelType);
void TogglePanel(IPanel panel); void TogglePanel(IPanel panel);
void OpenPanels(IPanel leftPanel, IPanel rightPanel); void OpenPanels(IPanel leftPanel, IPanel rightPanel);
void ClosePanels(); void ClosePanels();

View File

@ -1,4 +1,5 @@
using System; using OpenDiablo2.Common.Enums;
using System;
namespace OpenDiablo2.Common.Interfaces namespace OpenDiablo2.Common.Interfaces
{ {
@ -8,6 +9,7 @@ namespace OpenDiablo2.Common.Interfaces
{ {
event OnPanelToggledEvent OnPanelToggled; event OnPanelToggledEvent OnPanelToggled;
IPanel GetPanel(ePanelType panelType);
bool IsMouseOver(); bool IsMouseOver();
void UpdatePanelLocation(); void UpdatePanelLocation();
void OnMenuToggle(bool isToggled); void OnMenuToggle(bool isToggled);

View File

@ -25,7 +25,7 @@ namespace OpenDiablo2.Common.Interfaces
{ {
event OnPanelClosedEvent OnPanelClosed; event OnPanelClosedEvent OnPanelClosed;
eButtonType PanelType { get; } ePanelType PanelType { get; }
ePanelFrameType FrameType { get; } ePanelFrameType FrameType { get; }
void Render(); void Render();
void Update(); void Update();

View File

@ -12,6 +12,9 @@ namespace OpenDiablo2.Common.Models
public string PaletteName { get; internal set; } public string PaletteName { get; internal set; }
public bool Toggleable { get; internal set; } = false; public bool Toggleable { get; internal set; } = false;
public int BaseFrame { get; internal set; } = 0; public int BaseFrame { get; internal set; } = 0;
public int DisabledFrame { get; internal set; } = -1;
public bool IsDarkenedWhenDisabled => DisabledFrame == -1;
public static ImmutableDictionary<eButtonType, ButtonLayout> Values { get; } = new Dictionary<eButtonType, ButtonLayout> public static ImmutableDictionary<eButtonType, ButtonLayout> Values { get; } = new Dictionary<eButtonType, ButtonLayout>
{ {
@ -34,6 +37,7 @@ namespace OpenDiablo2.Common.Models
{eButtonType.Menu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MenuButton,PaletteName = Palettes.Units, Toggleable = true } }, {eButtonType.Menu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MenuButton,PaletteName = Palettes.Units, Toggleable = true } },
{eButtonType.GoldCoin, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.GoldCoinButton,PaletteName = Palettes.Units } }, {eButtonType.GoldCoin, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.GoldCoinButton,PaletteName = Palettes.Units } },
{eButtonType.Close, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.SquareButton,PaletteName = Palettes.Units, BaseFrame = 10 } }, {eButtonType.Close, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.SquareButton,PaletteName = Palettes.Units, BaseFrame = 10 } },
{eButtonType.Skill, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.AddSkillButton, PaletteName = Palettes.Units, DisabledFrame = 2 } },
}.ToImmutableDictionary(); }.ToImmutableDictionary();
} }

View File

@ -75,6 +75,7 @@
<Compile Include="Enums\eLevelId.cs" /> <Compile Include="Enums\eLevelId.cs" />
<Compile Include="Enums\eLevelSubType.cs" /> <Compile Include="Enums\eLevelSubType.cs" />
<Compile Include="Enums\eMPQFormatVersion.cs" /> <Compile Include="Enums\eMPQFormatVersion.cs" />
<Compile Include="Enums\ePanelType.cs" />
<Compile Include="Enums\eRenderCellType.cs" /> <Compile Include="Enums\eRenderCellType.cs" />
<Compile Include="Enums\eSceneType.cs" /> <Compile Include="Enums\eSceneType.cs" />
<Compile Include="Enums\eSessionType.cs" /> <Compile Include="Enums\eSessionType.cs" />

View File

@ -95,6 +95,7 @@ namespace OpenDiablo2.Common
public const string HealthMana = @"data\global\ui\PANEL\hlthmana.DC6"; public const string HealthMana = @"data\global\ui\PANEL\hlthmana.DC6";
public const string GameSmallMenuButton = @"data\global\ui\PANEL\menubutton.DC6"; // TODO: Used for inventory popout public const string GameSmallMenuButton = @"data\global\ui\PANEL\menubutton.DC6"; // TODO: Used for inventory popout
public const string SkillIcon = @"data\global\ui\PANEL\Skillicon.DC6"; // TODO: Used for skill icon button public const string SkillIcon = @"data\global\ui\PANEL\Skillicon.DC6"; // TODO: Used for skill icon button
public const string AddSkillButton = @"data\global\ui\PANEL\level.DC6";
// --- Mouse Pointers --- // --- Mouse Pointers ---
public const string CursorDefault = @"data\global\ui\CURSOR\ohand.DC6"; public const string CursorDefault = @"data\global\ui\CURSOR\ohand.DC6";

View File

@ -53,6 +53,7 @@ namespace OpenDiablo2.Core.UI
return; return;
enabled = value; enabled = value;
if(buttonLayout.IsDarkenedWhenDisabled)
sprite.Darken = !enabled; sprite.Darken = !enabled;
} }
} }
@ -186,7 +187,11 @@ namespace OpenDiablo2.Core.UI
if (AllowFrameChange) if (AllowFrameChange)
{ {
if (Toggled && pressed) if(!Enabled && buttonLayout.DisabledFrame >= 0)
{
frame = buttonLayout.DisabledFrame;
}
else if (Toggled && pressed)
{ {
frame = buttonLayout.BaseFrame + 3; frame = buttonLayout.BaseFrame + 3;
} }

View File

@ -45,7 +45,7 @@ namespace OpenDiablo2.Core.UI
closeButton.OnActivate = () => OnPanelClosed?.Invoke(this); closeButton.OnActivate = () => OnPanelClosed?.Invoke(this);
} }
public eButtonType PanelType => eButtonType.MinipanelCharacter; public ePanelType PanelType => ePanelType.Character;
public ePanelFrameType FrameType => ePanelFrameType.Left; public ePanelFrameType FrameType => ePanelFrameType.Left;
public void Update() public void Update()

View File

@ -32,10 +32,14 @@ namespace OpenDiablo2.Core.UI
private readonly IMouseInfoProvider mouseInfoProvider; private readonly IMouseInfoProvider mouseInfoProvider;
private readonly IMiniPanel minipanel; private readonly IMiniPanel minipanel;
private readonly IButton runButton, menuButton; private readonly IButton runButton, menuButton, addStatButton, addSkillButton;
private readonly ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite; private readonly ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite;
private readonly IPanelFrame leftPanelFrame, rightPanelFrame; private readonly IPanelFrame leftPanelFrame, rightPanelFrame;
// Test fields
private bool addNewAttribute = true;
private bool addNewSkill = false;
public GameHUD( public GameHUD(
IRenderWindow renderWindow, IRenderWindow renderWindow,
IGameState gameState, IGameState gameState,
@ -62,6 +66,15 @@ namespace OpenDiablo2.Core.UI
menuButton.OnToggle = minipanel.OnMenuToggle; menuButton.OnToggle = minipanel.OnMenuToggle;
menuButton.Toggle(); menuButton.Toggle();
addStatButton = createButton(eButtonType.Skill);
addStatButton.Location = new Point(207, 562);
addStatButton.Enabled = addNewAttribute;
addStatButton.OnActivate = () => TogglePanel(ePanelType.Character);
addSkillButton = createButton(eButtonType.Skill);
addSkillButton.Location = new Point(564, 562);
addSkillButton.Enabled = addNewSkill;
panelSprite = renderWindow.LoadSprite(ResourcePaths.GamePanels, Palettes.Act1, true); panelSprite = renderWindow.LoadSprite(ResourcePaths.GamePanels, Palettes.Act1, true);
healthManaSprite = renderWindow.LoadSprite(ResourcePaths.HealthMana, Palettes.Act1, true); healthManaSprite = renderWindow.LoadSprite(ResourcePaths.HealthMana, Palettes.Act1, true);
gameGlobeOverlapSprite = renderWindow.LoadSprite(ResourcePaths.GameGlobeOverlap, Palettes.Act1, true); gameGlobeOverlapSprite = renderWindow.LoadSprite(ResourcePaths.GameGlobeOverlap, Palettes.Act1, true);
@ -75,6 +88,11 @@ namespace OpenDiablo2.Core.UI
public bool IsRightPanelVisible => RightPanel != null; public bool IsRightPanelVisible => RightPanel != null;
public bool IsRunningEnabled => runButton.Toggled; public bool IsRunningEnabled => runButton.Toggled;
public void TogglePanel(ePanelType panelType)
{
TogglePanel(minipanel.GetPanel(panelType));
}
public void TogglePanel(IPanel panel) public void TogglePanel(IPanel panel)
{ {
switch (panel.FrameType) switch (panel.FrameType)
@ -168,12 +186,16 @@ namespace OpenDiablo2.Core.UI
runButton.Render(); runButton.Render();
menuButton.Render(); menuButton.Render();
addStatButton.Render();
addSkillButton.Render();
} }
public void Update() public void Update()
{ {
runButton.Update(); runButton.Update();
menuButton.Update(); menuButton.Update();
addStatButton.Update();
addSkillButton.Update();
if (IsLeftPanelVisible) if (IsLeftPanelVisible)
{ {

View File

@ -105,7 +105,7 @@ namespace OpenDiablo2.Core.UI
bootsContainer.Location = panelSprite.Location + new Size(251, 178); bootsContainer.Location = panelSprite.Location + new Size(251, 178);
} }
public eButtonType PanelType => eButtonType.MinipanelInventory; public ePanelType PanelType => ePanelType.Inventory;
public ePanelFrameType FrameType => ePanelFrameType.Right; public ePanelFrameType FrameType => ePanelFrameType.Right;
public bool IsSecondaryEquipped { get; private set; } public bool IsSecondaryEquipped { get; private set; }

View File

@ -1,5 +1,22 @@
using OpenDiablo2.Common; /* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C#
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
using OpenDiablo2.Common;
using OpenDiablo2.Common.Enums; using OpenDiablo2.Common.Enums;
using OpenDiablo2.Common.Extensions;
using OpenDiablo2.Common.Interfaces; using OpenDiablo2.Common.Interfaces;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -40,7 +57,7 @@ namespace OpenDiablo2.Core.UI
buttons = panelButtons.Select((x, i) => buttons = panelButtons.Select((x, i) =>
{ {
var newBtn = createButton(x); var newBtn = createButton(x);
var panel = panels.SingleOrDefault(o => o.PanelType == x); var panel = panels.SingleOrDefault(o => o.PanelType == x.GetPanelType());
if (panel != null) if (panel != null)
{ {
@ -55,6 +72,11 @@ namespace OpenDiablo2.Core.UI
public void OnMenuToggle(bool isToggled) => isPanelVisible = isToggled; public void OnMenuToggle(bool isToggled) => isPanelVisible = isToggled;
public IPanel GetPanel(ePanelType panelType)
{
return panels.SingleOrDefault(o => o.PanelType == panelType);
}
public bool IsMouseOver() public bool IsMouseOver()
{ {
int xDiff = mouseInfoProvider.MouseX - sprite.Location.X; int xDiff = mouseInfoProvider.MouseX - sprite.Location.X;