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