From fcc3293aadd9a323901383fae8eef43969f86712 Mon Sep 17 00:00:00 2001 From: Tim Sarbin Date: Thu, 22 Nov 2018 20:23:00 -0500 Subject: [PATCH] Started work on character select screen. Disabled audio to prevent crashes. --- .../Interfaces/ISceneManager.cs | 13 ++++ OpenDiablo2.Common/Models/ImageSet.cs | 4 +- OpenDiablo2.Common/OpenDiablo2.Common.csproj | 4 + OpenDiablo2.Common/ResourcePaths.cs | 4 + OpenDiablo2.Common/packages.config | 1 + OpenDiablo2.Core/GameEngine.cs | 15 +++- OpenDiablo2.SDL2/SDL2Label.cs | 3 +- OpenDiablo2.SDL2/SDL2RenderWindow.cs | 1 + OpenDiablo2.SDL2/SDL2Sprite.cs | 5 +- OpenDiablo2.Scenes/MainMenu.cs | 9 ++- OpenDiablo2.Scenes/OpenDiablo2.Scenes.csproj | 1 + OpenDiablo2.Scenes/SelectHeroClass.cs | 76 +++++++++++++++++++ OpenDiablo2/log4net.config | 6 ++ 13 files changed, 133 insertions(+), 9 deletions(-) create mode 100644 OpenDiablo2.Common/Interfaces/ISceneManager.cs create mode 100644 OpenDiablo2.Scenes/SelectHeroClass.cs diff --git a/OpenDiablo2.Common/Interfaces/ISceneManager.cs b/OpenDiablo2.Common/Interfaces/ISceneManager.cs new file mode 100644 index 00000000..643eef4a --- /dev/null +++ b/OpenDiablo2.Common/Interfaces/ISceneManager.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OpenDiablo2.Common.Interfaces +{ + public interface ISceneManager + { + void ChangeScene(string sceneName); + } +} diff --git a/OpenDiablo2.Common/Models/ImageSet.cs b/OpenDiablo2.Common/Models/ImageSet.cs index c6349c98..b937ee1b 100644 --- a/OpenDiablo2.Common/Models/ImageSet.cs +++ b/OpenDiablo2.Common/Models/ImageSet.cs @@ -35,6 +35,8 @@ namespace OpenDiablo2.Common.Models public sealed class ImageSet { + static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private UInt32 version; private UInt32 unknown1; // 01 00 00 00 ??? private UInt32 unknown2; // 00 00 00 00 ??? @@ -118,8 +120,6 @@ namespace OpenDiablo2.Common.Models } } - - return result; } } diff --git a/OpenDiablo2.Common/OpenDiablo2.Common.csproj b/OpenDiablo2.Common/OpenDiablo2.Common.csproj index bc99de4b..c403c499 100644 --- a/OpenDiablo2.Common/OpenDiablo2.Common.csproj +++ b/OpenDiablo2.Common/OpenDiablo2.Common.csproj @@ -55,6 +55,9 @@ ..\packages\NetSword.Common.ICSharpCode.SharpZipLib.0.84.0\lib\ICSharpCode.SharpZipLib.dll + + ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll + @@ -77,6 +80,7 @@ + diff --git a/OpenDiablo2.Common/ResourcePaths.cs b/OpenDiablo2.Common/ResourcePaths.cs index aa7a1924..237c9c17 100644 --- a/OpenDiablo2.Common/ResourcePaths.cs +++ b/OpenDiablo2.Common/ResourcePaths.cs @@ -18,6 +18,10 @@ namespace OpenDiablo2.Common public static string Diablo2LogoBlackLeft = "data\\global\\ui\\FrontEnd\\D2logoBlackLeft.DC6"; public static string Diablo2LogoBlackRight = "data\\global\\ui\\FrontEnd\\D2logoBlackRight.DC6"; + // --- Character Select Screen --- + public static string CharacterSelectBackground = "data\\global\\ui\\FrontEnd\\charactercreationscreenEXP.dc6"; + public static string CharacterSelectCampfire = "data\\global\\ui\\FrontEnd\\fire.DC6"; + // --- Mouse Pointers --- public static string CursorDefault = "data\\global\\ui\\CURSOR\\ohand.DC6"; diff --git a/OpenDiablo2.Common/packages.config b/OpenDiablo2.Common/packages.config index 72fad29a..37e4e453 100644 --- a/OpenDiablo2.Common/packages.config +++ b/OpenDiablo2.Common/packages.config @@ -1,6 +1,7 @@  + \ No newline at end of file diff --git a/OpenDiablo2.Core/GameEngine.cs b/OpenDiablo2.Core/GameEngine.cs index 12882f2a..e1c91fba 100644 --- a/OpenDiablo2.Core/GameEngine.cs +++ b/OpenDiablo2.Core/GameEngine.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace OpenDiablo2.Core { - public sealed class GameEngine : IGameEngine, IPaletteProvider + public sealed class GameEngine : IGameEngine, IPaletteProvider, ISceneManager { static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -21,6 +21,7 @@ namespace OpenDiablo2.Core private readonly Func getMouseInfoProvider; private readonly Func getScene; private IScene currentScene; + private IScene nextScene = null; private ISprite mouseSprite; private readonly MPQ[] MPQs; @@ -98,6 +99,13 @@ namespace OpenDiablo2.Core sw.Restart(); getRenderWindow().Update(); currentScene.Update(ms); + if (nextScene!= null) + { + currentScene.Dispose(); + currentScene = nextScene; + nextScene = null; + continue; + } renderWindow.Clear(); currentScene.Render(); @@ -111,7 +119,10 @@ namespace OpenDiablo2.Core public void Dispose() { - + currentScene?.Dispose(); } + + public void ChangeScene(string sceneName) + => nextScene = getScene(sceneName); } } diff --git a/OpenDiablo2.SDL2/SDL2Label.cs b/OpenDiablo2.SDL2/SDL2Label.cs index 896c353e..9a9f6cfa 100644 --- a/OpenDiablo2.SDL2/SDL2Label.cs +++ b/OpenDiablo2.SDL2/SDL2Label.cs @@ -45,7 +45,7 @@ namespace OpenDiablo2.SDL2_ { this.renderer = renderer; this.font = font as SDL2Font; - texture = IntPtr.Zero; + this.texture = IntPtr.Zero; } internal Size CalculateSize() @@ -118,6 +118,7 @@ namespace OpenDiablo2.SDL2_ { if (texture != IntPtr.Zero) SDL.SDL_DestroyTexture(texture); + texture = IntPtr.Zero; } } } diff --git a/OpenDiablo2.SDL2/SDL2RenderWindow.cs b/OpenDiablo2.SDL2/SDL2RenderWindow.cs index 7c637160..f4288441 100644 --- a/OpenDiablo2.SDL2/SDL2RenderWindow.cs +++ b/OpenDiablo2.SDL2/SDL2RenderWindow.cs @@ -159,6 +159,7 @@ namespace OpenDiablo2.SDL2_ for (var x = 0; x < xSegments; x++) { var textureIndex = x + (y * xSegments) + (offset * xSegments * ySegments); + textureIndex = Math.Min(spr.textures.Count() - 1, Math.Max(0, textureIndex)); if (textureIndex >= spr.textures.Count()) continue; diff --git a/OpenDiablo2.SDL2/SDL2Sprite.cs b/OpenDiablo2.SDL2/SDL2Sprite.cs index 11cd27cf..6d24bd18 100644 --- a/OpenDiablo2.SDL2/SDL2Sprite.cs +++ b/OpenDiablo2.SDL2/SDL2Sprite.cs @@ -14,6 +14,8 @@ namespace OpenDiablo2.SDL2_ { internal sealed class SDL2Sprite : ISprite { + static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + public Point Location { get; set; } = new Point(); public Size FrameSize { get; set; } = new Size(); public int Frame { get; set; } @@ -26,6 +28,7 @@ namespace OpenDiablo2.SDL2_ set { blend = value; + foreach (var texture in textures) SDL.SDL_SetTextureBlendMode(texture, blend ? SDL.SDL_BlendMode.SDL_BLENDMODE_ADD : SDL.SDL_BlendMode.SDL_BLENDMODE_BLEND); } @@ -130,8 +133,8 @@ namespace OpenDiablo2.SDL2_ foreach (var texture in textures) { SDL.SDL_DestroyTexture(texture); - } + textures = new IntPtr[0]; } } } diff --git a/OpenDiablo2.Scenes/MainMenu.cs b/OpenDiablo2.Scenes/MainMenu.cs index 45747189..2076bd20 100644 --- a/OpenDiablo2.Scenes/MainMenu.cs +++ b/OpenDiablo2.Scenes/MainMenu.cs @@ -23,6 +23,7 @@ namespace OpenDiablo2.Scenes private readonly IMPQProvider mpqProvider; private readonly IMouseInfoProvider mouseInfoProvider; private readonly IMusicProvider musicProvider; + private readonly ISceneManager sceneManager; private float logoFrame; private ISprite backgroundSprite, diabloLogoLeft, diabloLogoRight, diabloLogoLeftBlack, diabloLogoRightBlack; @@ -36,6 +37,7 @@ namespace OpenDiablo2.Scenes IMPQProvider mpqProvider, IMouseInfoProvider mouseInfoProvider, IMusicProvider musicProvider, + ISceneManager sceneManager, Func createWideButton ) { @@ -43,6 +45,7 @@ namespace OpenDiablo2.Scenes this.paletteProvider = paletteProvider; this.mpqProvider = mpqProvider; this.mouseInfoProvider = mouseInfoProvider; + this.sceneManager = sceneManager; backgroundSprite = renderWindow.LoadSprite(ResourcePaths.GameSelectScreen, Palettes.Sky); diabloLogoLeft = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoFireLeft, Palettes.Units, new Point(400, 120)); @@ -78,6 +81,7 @@ namespace OpenDiablo2.Scenes renderWindow.Draw(loadingSprite); renderWindow.Sync(); + /* musicProvider.LoadSong(mpqProvider.GetStream("data\\global\\music\\introedit.wav")); // TODO: Fake loading for now, this should be in its own scene as we start loading real stuff @@ -93,6 +97,7 @@ namespace OpenDiablo2.Scenes } musicProvider.PlaySong(); + */ } private void OnVisitWebsiteClicked() @@ -141,9 +146,7 @@ namespace OpenDiablo2.Scenes } private void OnSinglePlayerClicked() - { - - } + => sceneManager.ChangeScene("Select Hero Class"); private void OnExitClicked() { diff --git a/OpenDiablo2.Scenes/OpenDiablo2.Scenes.csproj b/OpenDiablo2.Scenes/OpenDiablo2.Scenes.csproj index 6b336914..93cd222d 100644 --- a/OpenDiablo2.Scenes/OpenDiablo2.Scenes.csproj +++ b/OpenDiablo2.Scenes/OpenDiablo2.Scenes.csproj @@ -52,6 +52,7 @@ + diff --git a/OpenDiablo2.Scenes/SelectHeroClass.cs b/OpenDiablo2.Scenes/SelectHeroClass.cs new file mode 100644 index 00000000..965db726 --- /dev/null +++ b/OpenDiablo2.Scenes/SelectHeroClass.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenDiablo2.Common; +using OpenDiablo2.Common.Attributes; +using OpenDiablo2.Common.Interfaces; + +namespace OpenDiablo2.Scenes +{ + [Scene("Select Hero Class")] + public sealed class SelectHeroClass : IScene + { + static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + private readonly IRenderWindow renderWindow; + private readonly IPaletteProvider paletteProvider; + private readonly IMPQProvider mpqProvider; + private readonly IMouseInfoProvider mouseInfoProvider; + private readonly IMusicProvider musicProvider; + private readonly ISceneManager sceneManager; + + private float secondTimer; + private ISprite backgroundSprite, campfireSprite; + private IFont headingFont; + private ILabel headingLabel; + + public SelectHeroClass( + IRenderWindow renderWindow, + IPaletteProvider paletteProvider, + IMPQProvider mpqProvider, + IMouseInfoProvider mouseInfoProvider, + IMusicProvider musicProvider, + ISceneManager sceneManager + ) + { + this.renderWindow = renderWindow; + this.paletteProvider = paletteProvider; + this.mpqProvider = mpqProvider; + this.mouseInfoProvider = mouseInfoProvider; + this.sceneManager = sceneManager; + + backgroundSprite = renderWindow.LoadSprite(ResourcePaths.CharacterSelectBackground, Palettes.Fechar); + campfireSprite = renderWindow.LoadSprite(ResourcePaths.CharacterSelectCampfire, Palettes.Fechar, new System.Drawing.Point(380, 335)); + + headingFont = renderWindow.LoadFont(ResourcePaths.Font30, Palettes.Units); + headingLabel = renderWindow.CreateLabel(headingFont); + headingLabel.Text = "Select Hero Class"; + headingLabel.Location = new System.Drawing.Point(400 - (headingLabel.TextArea.Width / 2), 20); + + + } + + public void Render() + { + renderWindow.Draw(backgroundSprite, 4, 3, 0); + renderWindow.Draw(campfireSprite, (int)(campfireSprite.TotalFrames * secondTimer)); + //renderWindow.Draw(headingLabel); + } + + public void Update(long ms) + { + float seconds = ((float)ms / 1000f); + secondTimer += seconds; + while (secondTimer >= 1f) + secondTimer -= 1f; + + } + + public void Dispose() + { + + } + } +} diff --git a/OpenDiablo2/log4net.config b/OpenDiablo2/log4net.config index 4bf2bd96..ad290044 100644 --- a/OpenDiablo2/log4net.config +++ b/OpenDiablo2/log4net.config @@ -3,6 +3,7 @@ + @@ -20,4 +21,9 @@ + + + + + \ No newline at end of file