From f3793e0a602414539e66625c7bb5af07b1805545 Mon Sep 17 00:00:00 2001 From: Diego M Date: Thu, 29 Nov 2018 21:11:25 -0300 Subject: [PATCH] Basic Character Panel and Inventory Panel drawing (#30) * Initial minipanel work * Character and Inventory panel implementation, frame included * Separate panel frame from the actual inventory and character panels so they can be reused by other panels --- OpenDiablo2.Common/Enums/ePanelFrameType.cs | 8 + .../Interfaces/ICharacterPanel.cs | 10 + OpenDiablo2.Common/Interfaces/IGameState.cs | 6 + .../Interfaces/IInventoryPanel.cs | 10 + OpenDiablo2.Common/Interfaces/IPanelFrame.cs | 11 + OpenDiablo2.Common/OpenDiablo2.Common.csproj | 234 +++++++++--------- OpenDiablo2.Common/ResourcePaths.cs | 3 + OpenDiablo2.Core/AutofacModule.cs | 3 + OpenDiablo2.Core/GameState/GameState.cs | 17 ++ OpenDiablo2.Core/OpenDiablo2.Core.csproj | 163 ++++++------ OpenDiablo2.Core/UI/CharacterPanel.cs | 44 ++++ OpenDiablo2.Core/UI/InventoryPanel.cs | 42 ++++ OpenDiablo2.Core/UI/MiniPanel.cs | 6 +- OpenDiablo2.Core/UI/PanelFrame.cs | 67 +++++ OpenDiablo2.Scenes/Game.cs | 26 +- OpenDiablo2/Program.cs | 6 + 16 files changed, 457 insertions(+), 199 deletions(-) create mode 100644 OpenDiablo2.Common/Enums/ePanelFrameType.cs create mode 100644 OpenDiablo2.Common/Interfaces/ICharacterPanel.cs create mode 100644 OpenDiablo2.Common/Interfaces/IInventoryPanel.cs create mode 100644 OpenDiablo2.Common/Interfaces/IPanelFrame.cs create mode 100644 OpenDiablo2.Core/UI/CharacterPanel.cs create mode 100644 OpenDiablo2.Core/UI/InventoryPanel.cs create mode 100644 OpenDiablo2.Core/UI/PanelFrame.cs diff --git a/OpenDiablo2.Common/Enums/ePanelFrameType.cs b/OpenDiablo2.Common/Enums/ePanelFrameType.cs new file mode 100644 index 00000000..f8e3c2b8 --- /dev/null +++ b/OpenDiablo2.Common/Enums/ePanelFrameType.cs @@ -0,0 +1,8 @@ +namespace OpenDiablo2.Common.Enums +{ + public enum ePanelFrameType + { + Left, + Right + } +} diff --git a/OpenDiablo2.Common/Interfaces/ICharacterPanel.cs b/OpenDiablo2.Common/Interfaces/ICharacterPanel.cs new file mode 100644 index 00000000..3199519d --- /dev/null +++ b/OpenDiablo2.Common/Interfaces/ICharacterPanel.cs @@ -0,0 +1,10 @@ +using System; + +namespace OpenDiablo2.Common.Interfaces +{ + public interface ICharacterPanel : IDisposable + { + void Render(); + void Update(); + } +} diff --git a/OpenDiablo2.Common/Interfaces/IGameState.cs b/OpenDiablo2.Common/Interfaces/IGameState.cs index d2e903ff..9520f766 100644 --- a/OpenDiablo2.Common/Interfaces/IGameState.cs +++ b/OpenDiablo2.Common/Interfaces/IGameState.cs @@ -12,6 +12,12 @@ namespace OpenDiablo2.Common.Interfaces string MapName { get; } Palette CurrentPalette { get; } + bool ToggleShowInventoryPanel(); + bool ShowInventoryPanel { get; set; } + + bool ToggleShowCharacterPanel(); + bool ShowCharacterPanel { get; set; } + void Initialize(string text, eHero value); void Update(long ms); IEnumerable GetMapCellInfo(int cellX, int cellY, eRenderCellType renderCellType); diff --git a/OpenDiablo2.Common/Interfaces/IInventoryPanel.cs b/OpenDiablo2.Common/Interfaces/IInventoryPanel.cs new file mode 100644 index 00000000..50f842a2 --- /dev/null +++ b/OpenDiablo2.Common/Interfaces/IInventoryPanel.cs @@ -0,0 +1,10 @@ +using System; + +namespace OpenDiablo2.Common.Interfaces +{ + public interface IInventoryPanel : IDisposable + { + void Render(); + void Update(); + } +} diff --git a/OpenDiablo2.Common/Interfaces/IPanelFrame.cs b/OpenDiablo2.Common/Interfaces/IPanelFrame.cs new file mode 100644 index 00000000..799eaede --- /dev/null +++ b/OpenDiablo2.Common/Interfaces/IPanelFrame.cs @@ -0,0 +1,11 @@ +using OpenDiablo2.Common.Enums; +using System; + +namespace OpenDiablo2.Common.Interfaces +{ + public interface IPanelFrame : IDisposable + { + void Render(); + void Update(); + } +} diff --git a/OpenDiablo2.Common/OpenDiablo2.Common.csproj b/OpenDiablo2.Common/OpenDiablo2.Common.csproj index ede763df..b0477340 100644 --- a/OpenDiablo2.Common/OpenDiablo2.Common.csproj +++ b/OpenDiablo2.Common/OpenDiablo2.Common.csproj @@ -1,116 +1,120 @@ - - - - - Debug - AnyCPU - {B743160E-A0BB-45DC-9998-967A85E50562} - Library - Properties - OpenDiablo2.Common - OpenDiablo2.Common - v4.6.1 - 512 - true - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - - ..\packages\DotNetZip.1.12.0\lib\net20\DotNetZip.dll - - - ..\packages\NetSword.Common.ICSharpCode.SharpZipLib.0.84.0\lib\ICSharpCode.SharpZipLib.dll - - - ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + AnyCPU + {B743160E-A0BB-45DC-9998-967A85E50562} + Library + Properties + OpenDiablo2.Common + OpenDiablo2.Common + v4.6.1 + 512 + true + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\DotNetZip.1.12.0\lib\net20\DotNetZip.dll + + + ..\packages\NetSword.Common.ICSharpCode.SharpZipLib.0.84.0\lib\ICSharpCode.SharpZipLib.dll + + + ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OpenDiablo2.Common/ResourcePaths.cs b/OpenDiablo2.Common/ResourcePaths.cs index 67206bbc..33e40c5f 100644 --- a/OpenDiablo2.Common/ResourcePaths.cs +++ b/OpenDiablo2.Common/ResourcePaths.cs @@ -111,6 +111,9 @@ namespace OpenDiablo2.Common public static string MinipanelSmall = "data\\global\\ui\\PANEL\\minipanel_s.dc6"; public static string MinipanelButton = "data\\global\\ui\\PANEL\\minipanelbtn.DC6"; + public static string Frame = "data\\global\\ui\\PANEL\\800borderframe.dc6"; + public static string InventoryCharacterPanel = "data\\global\\ui\\PANEL\\invchar.DC6"; + public static string RunButton = "data\\global\\ui\\PANEL\\runbutton.dc6"; public static string MenuButton = "data\\global\\ui\\PANEL\\menubutton.DC6"; diff --git a/OpenDiablo2.Core/AutofacModule.cs b/OpenDiablo2.Core/AutofacModule.cs index c5feadf4..52793968 100644 --- a/OpenDiablo2.Core/AutofacModule.cs +++ b/OpenDiablo2.Core/AutofacModule.cs @@ -20,6 +20,9 @@ namespace OpenDiablo2.Core builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().InstancePerDependency(); + builder.RegisterType().As().InstancePerDependency(); + builder.RegisterType().As().InstancePerDependency(); + builder.RegisterType().As().InstancePerDependency(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); diff --git a/OpenDiablo2.Core/GameState/GameState.cs b/OpenDiablo2.Core/GameState/GameState.cs index 8a676571..317d3512 100644 --- a/OpenDiablo2.Core/GameState/GameState.cs +++ b/OpenDiablo2.Core/GameState/GameState.cs @@ -34,6 +34,9 @@ namespace OpenDiablo2.Core.GameState_ public string MapName { get; private set; } public Palette CurrentPalette => paletteProvider.PaletteTable[$"ACT{Act}"]; + public bool ShowInventoryPanel { get; set; } = false; + public bool ShowCharacterPanel { get; set; } = false; + public int Seed { get; internal set; } public GameState( @@ -223,6 +226,20 @@ namespace OpenDiablo2.Core.GameState_ } + public bool ToggleShowInventoryPanel() + { + ShowInventoryPanel = !ShowInventoryPanel; + + return ShowInventoryPanel; + } + + public bool ToggleShowCharacterPanel() + { + ShowCharacterPanel = !ShowCharacterPanel; + + return ShowCharacterPanel; + } + private MapCellInfo GetMapCellInfo( MapInfo map, diff --git a/OpenDiablo2.Core/OpenDiablo2.Core.csproj b/OpenDiablo2.Core/OpenDiablo2.Core.csproj index a2809855..0e57cf3f 100644 --- a/OpenDiablo2.Core/OpenDiablo2.Core.csproj +++ b/OpenDiablo2.Core/OpenDiablo2.Core.csproj @@ -1,82 +1,85 @@ - - - - - Debug - AnyCPU - {8FC6BF7D-835A-47C1-A6B2-125495FA0900} - Library - Properties - OpenDiablo2.Core - OpenDiablo2.Core - v4.6.1 - 512 - true - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - - ..\packages\Autofac.4.8.1\lib\net45\Autofac.dll - - - ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll - - - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - ..\packages\Xabe.FFmpeg.3.1.4\lib\netstandard2.0\Xabe.FFmpeg.dll - - - - - - - - + + + + + Debug + AnyCPU + {8FC6BF7D-835A-47C1-A6B2-125495FA0900} + Library + Properties + OpenDiablo2.Core + OpenDiablo2.Core + v4.6.1 + 512 + true + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + prompt + MinimumRecommendedRules.ruleset + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + prompt + MinimumRecommendedRules.ruleset + + + + ..\packages\Autofac.4.8.1\lib\net45\Autofac.dll + + + ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll + + + ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + ..\packages\Xabe.FFmpeg.3.1.4\lib\netstandard2.0\Xabe.FFmpeg.dll + + + + + + + + - - - - - - - - - - - {b743160e-a0bb-45dc-9998-967a85e50562} - OpenDiablo2.Common - - - - - - + + + + + + + + + + + + + + {b743160e-a0bb-45dc-9998-967a85e50562} + OpenDiablo2.Common + + + + + + \ No newline at end of file diff --git a/OpenDiablo2.Core/UI/CharacterPanel.cs b/OpenDiablo2.Core/UI/CharacterPanel.cs new file mode 100644 index 00000000..43c46e6a --- /dev/null +++ b/OpenDiablo2.Core/UI/CharacterPanel.cs @@ -0,0 +1,44 @@ +using System; +using System.Drawing; +using OpenDiablo2.Common; +using OpenDiablo2.Common.Enums; +using OpenDiablo2.Common.Interfaces; + +namespace OpenDiablo2.Core.UI +{ + public sealed class CharacterPanel : ICharacterPanel + { + private readonly IRenderWindow renderWindow; + private ISprite sprite; + private IPanelFrame panelFrame; + + public Point Location { get; set; } + + public CharacterPanel(IRenderWindow renderWindow, Func createPanelFrame) + { + this.renderWindow = renderWindow; + this.panelFrame = createPanelFrame(ePanelFrameType.Left); + + sprite = renderWindow.LoadSprite(ResourcePaths.InventoryCharacterPanel, Palettes.Units, new Point(79,61)); + Location = new Point(0, 0); + + + } + + public void Update() + { + + } + + public void Render() + { + panelFrame.Render(); + renderWindow.Draw(sprite, 2, 2, 0); + } + + public void Dispose() + { + sprite.Dispose(); + } + } +} diff --git a/OpenDiablo2.Core/UI/InventoryPanel.cs b/OpenDiablo2.Core/UI/InventoryPanel.cs new file mode 100644 index 00000000..89d8159d --- /dev/null +++ b/OpenDiablo2.Core/UI/InventoryPanel.cs @@ -0,0 +1,42 @@ +using System; +using System.Drawing; +using OpenDiablo2.Common; +using OpenDiablo2.Common.Enums; +using OpenDiablo2.Common.Interfaces; + +namespace OpenDiablo2.Core.UI +{ + public sealed class InventoryPanel : IInventoryPanel + { + private readonly IRenderWindow renderWindow; + private ISprite sprite; + private IPanelFrame panelFrame; + + public Point Location { get; set; } + + public InventoryPanel(Func createPanelFrame, IRenderWindow renderWindow) + { + this.renderWindow = renderWindow; + this.panelFrame = createPanelFrame(ePanelFrameType.Right); + + sprite = renderWindow.LoadSprite(ResourcePaths.InventoryCharacterPanel, Palettes.Units, new Point(402,61)); + Location = new Point(400, 0); + } + + public void Update() + { + + } + + public void Render() + { + panelFrame.Render(); + renderWindow.Draw(sprite, 2, 2, 1); + } + + public void Dispose() + { + sprite.Dispose(); + } + } +} diff --git a/OpenDiablo2.Core/UI/MiniPanel.cs b/OpenDiablo2.Core/UI/MiniPanel.cs index 25396454..14bd23ff 100644 --- a/OpenDiablo2.Core/UI/MiniPanel.cs +++ b/OpenDiablo2.Core/UI/MiniPanel.cs @@ -6,7 +6,7 @@ using OpenDiablo2.Common.Interfaces; namespace OpenDiablo2.Core.UI { - // TODO: Allow to set Minipanel.buttons.character.OnAction or similar for button delegates + // TODO: Self-align when side panels are open public sealed class MiniPanel : IMiniPanel { private readonly IRenderWindow renderWindow; @@ -28,7 +28,7 @@ namespace OpenDiablo2.Core.UI } } - public MiniPanel(IRenderWindow renderWindow, Func createButton) + public MiniPanel(IRenderWindow renderWindow, IGameState gameState, Func createButton) { this.renderWindow = renderWindow; @@ -37,9 +37,11 @@ namespace OpenDiablo2.Core.UI characterBtn = createButton(eButtonType.MinipanelCharacter); characterBtn.Location = new Point(3 + Location.X, 3 + Location.Y); + characterBtn.OnActivate = () => gameState.ToggleShowCharacterPanel(); inventoryBtn = createButton(eButtonType.MinipanelInventory); inventoryBtn.Location = new Point(24 + Location.X, 3 + Location.Y); + inventoryBtn.OnActivate = () => gameState.ToggleShowInventoryPanel(); skillBtn = createButton(eButtonType.MinipanelSkill); skillBtn.Location = new Point(45 + Location.X, 3 + Location.Y); diff --git a/OpenDiablo2.Core/UI/PanelFrame.cs b/OpenDiablo2.Core/UI/PanelFrame.cs new file mode 100644 index 00000000..3a7e0d2f --- /dev/null +++ b/OpenDiablo2.Core/UI/PanelFrame.cs @@ -0,0 +1,67 @@ +using System; +using System.Drawing; +using OpenDiablo2.Common; +using OpenDiablo2.Common.Enums; +using OpenDiablo2.Common.Interfaces; + +namespace OpenDiablo2.Core.UI +{ + public sealed class PanelFrame : IPanelFrame + { + private readonly IRenderWindow renderWindow; + private ISprite sprite; + private ePanelFrameType panelFrameType; + + public Point Location { get; set; } + + public PanelFrame(IRenderWindow renderWindow, ePanelFrameType panelFrameType) + { + this.renderWindow = renderWindow; + this.panelFrameType = panelFrameType; + + sprite = renderWindow.LoadSprite(ResourcePaths.Frame, Palettes.Units, new Point(0, 0)); + + Location = new Point(0, 0); + + + } + + private void DrawPanel() + { + switch(this.panelFrameType) + { + case ePanelFrameType.Left: + renderWindow.Draw(sprite, 0, new Point(0, 256)); + renderWindow.Draw(sprite, 1, new Point(256, 66)); + renderWindow.Draw(sprite, 2, new Point(0, 256 + 231)); + renderWindow.Draw(sprite, 3, new Point(0, 256 + 231 + 66)); + renderWindow.Draw(sprite, 4, new Point(256, 256 + 231 + 66)); + break; + case ePanelFrameType.Right: + renderWindow.Draw(sprite, 5, new Point(400 + 0, 66)); + renderWindow.Draw(sprite, 6, new Point(400 + 145, 256)); + renderWindow.Draw(sprite, 7, new Point(400 + 145 + 169, 256 + 231)); + renderWindow.Draw(sprite, 8, new Point(400 + 145, 256 + 231 + 66)); + renderWindow.Draw(sprite, 9, new Point(400 + 0, 256 + 231 + 66)); + break; + } + } + + + public void Update() + { + + + } + + public void Render() + { + DrawPanel(); + } + + public void Dispose() + { + sprite.Dispose(); + } + } +} diff --git a/OpenDiablo2.Scenes/Game.cs b/OpenDiablo2.Scenes/Game.cs index d8b22ca0..80a95667 100644 --- a/OpenDiablo2.Scenes/Game.cs +++ b/OpenDiablo2.Scenes/Game.cs @@ -23,6 +23,9 @@ namespace OpenDiablo2.Scenes private ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite; private IMiniPanel minipanel; + private ICharacterPanel characterpanel; + private IInventoryPanel inventorypanel; + private bool showMinipanel = false; private IButton runButton, menuButton; @@ -33,7 +36,9 @@ namespace OpenDiablo2.Scenes IGameState gameState, IKeyboardInfoProvider keyboardInfoProvider, Func createButton, - Func createMiniPanel + Func createMiniPanel, + Func createCharacterPanel, + Func createInventoryPanel ) { this.renderWindow = renderWindow; @@ -51,6 +56,9 @@ namespace OpenDiablo2.Scenes // Maybe? Not sure. // miniPanel.OnMenuActivate(); + characterpanel = createCharacterPanel(); + inventorypanel = createInventoryPanel(); + runButton = createButton(eButtonType.Run); runButton.Location = new Point(256, 570); runButton.OnToggle = OnRunToggle; @@ -86,6 +94,16 @@ namespace OpenDiablo2.Scenes private void DrawPanel() { + if(gameState.ShowInventoryPanel) + { + inventorypanel.Render(); + } + + if (gameState.ShowCharacterPanel) + { + characterpanel.Render(); + } + // Render the background bottom bar renderWindow.Draw(panelSprite, 0, new Point(0, 600)); renderWindow.Draw(panelSprite, 1, new Point(166, 600)); @@ -106,6 +124,8 @@ namespace OpenDiablo2.Scenes { minipanel.Render(); } + + runButton.Render(); menuButton.Render(); @@ -117,7 +137,9 @@ namespace OpenDiablo2.Scenes { minipanel.Update(); } - + + characterpanel.Update(); + runButton.Update(); menuButton.Update(); diff --git a/OpenDiablo2/Program.cs b/OpenDiablo2/Program.cs index 100712ec..4d9a559c 100644 --- a/OpenDiablo2/Program.cs +++ b/OpenDiablo2/Program.cs @@ -68,6 +68,12 @@ namespace OpenDiablo2 return (buttonType) => componentContext.Resolve(new NamedParameter("buttonLayout", ButtonLayout.Values[buttonType])); }); + containerBuilder.Register>(c => + { + var componentContext = c.Resolve(); + return (panelFrameType) => componentContext.Resolve(new NamedParameter("panelFrameType", panelFrameType)); + }); + /* Uncomment the below if we support multiple textbox types containerBuilder.Register>(c => {