1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-12 10:40:42 +00:00

Started work on character select screen. Disabled audio to prevent crashes.

This commit is contained in:
Tim Sarbin 2018-11-22 20:23:00 -05:00
parent 9749fc7b75
commit fcc3293aad
13 changed files with 133 additions and 9 deletions

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -55,6 +55,9 @@
<Reference Include="ICSharpCode.SharpZipLib, Version=0.84.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73">
<HintPath>..\packages\NetSword.Common.ICSharpCode.SharpZipLib.0.84.0\lib\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.8\lib\net45-full\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
@ -77,6 +80,7 @@
<Compile Include="Interfaces\IRenderTarget.cs" />
<Compile Include="Interfaces\IRenderWindow.cs" />
<Compile Include="Interfaces\IScene.cs" />
<Compile Include="Interfaces\ISceneManager.cs" />
<Compile Include="Interfaces\ISprite.cs" />
<Compile Include="Interfaces\IMouseInfoProvider.cs" />
<Compile Include="Interfaces\ITextLabel.cs" />

View File

@ -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";

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="DotNetZip" version="1.12.0" targetFramework="net461" />
<package id="log4net" version="2.0.8" targetFramework="net461" />
<package id="NetSword.Common.ICSharpCode.SharpZipLib" version="0.84.0" targetFramework="net461" developmentDependency="true" />
<package id="SharpZipLib" version="1.0.0" targetFramework="net461" />
</packages>

View File

@ -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<IMouseInfoProvider> getMouseInfoProvider;
private readonly Func<string, IScene> 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);
}
}

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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];
}
}
}

View File

@ -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<WideButton> 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()
{

View File

@ -52,6 +52,7 @@
<Compile Include="AutofacModule.cs" />
<Compile Include="MainMenu.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SelectHeroClass.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenDiablo2.Common\OpenDiablo2.Common.csproj">

View File

@ -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()
{
}
}
}

View File

@ -3,6 +3,7 @@
<level value="ALL" />
<appender-ref ref="console" />
<appender-ref ref="file" />
<appender-ref ref="TraceAppender"/>
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
@ -20,4 +21,9 @@
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c %m%n"/>
</layout>
</appender>
</log4net>