1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-09-27 21:56:19 -04:00

Skill Tree Panel Added (#50)

* Added attribute/skill buttons to the HUD
* adjusted how movement works
* Skills Panel added
This commit is contained in:
Kacper Drobny 2018-12-14 00:36:29 +01:00 committed by Tim Sarbin
parent 842153c241
commit 68f95b8b5b
16 changed files with 924 additions and 752 deletions

View File

@ -1,26 +1,26 @@
namespace OpenDiablo2.Common.Enums namespace OpenDiablo2.Common.Enums
{ {
public enum eButtonType public enum eButtonType
{ {
Wide, Wide,
Medium, Medium,
Narrow, Narrow,
Cancel, Cancel,
Tall, Tall,
Short, Short,
// Game UI // Game UI
Skill, Skill,
Run, Run,
Menu, Menu,
GoldCoin, GoldCoin,
Close, Close,
SecondaryInvHand, SecondaryInvHand,
MinipanelCharacter, MinipanelCharacter,
MinipanelInventory, MinipanelInventory,
MinipanelSkill, MinipanelSkill,
MinipanelAutomap, MinipanelAutomap,
MinipanelMessage, MinipanelMessage,
MinipanelQuest, MinipanelQuest,
MinipanelMenu MinipanelMenu
} }
} }

View File

@ -40,16 +40,6 @@ namespace OpenDiablo2.Common.Interfaces
/// </summary> /// </summary>
Point Location { get; set; } Point Location { get; set; }
/// <summary>
/// Area from upper left corner that reacts to clicking
/// </summary>
Size ClickableRect { get; set; }
/// <summary>
/// Indicates if button sprite should react to Toggle and Activate on hover
/// </summary>
bool AllowFrameChange { get; set; }
/// <summary> /// <summary>
/// Assigning a function to this property will cause that function to be called /// Assigning a function to this property will cause that function to be called
/// when the button is toggled on or off. /// when the button is toggled on or off.

View File

@ -0,0 +1,23 @@
/* 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/>.
*/
namespace OpenDiablo2.Common.Interfaces.UI
{
public interface ISkillsPanel : IPanel
{
int ActivePanelIndex { get; }
}
}

View File

@ -1,46 +1,66 @@
using System.Collections.Generic; /* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C#
using System.Collections.Immutable; *
using System.Drawing; * This program is free software: you can redistribute it and/or modify
using OpenDiablo2.Common.Enums; * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
namespace OpenDiablo2.Common.Models * (at your option) any later version.
{ *
public class ButtonLayout * This program is distributed in the hope that it will be useful,
{ * but WITHOUT ANY WARRANTY; without even the implied warranty of
public int XSegments { get; internal set; } * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
public string ResourceName { get; internal set; } * GNU General Public License for more details.
public string PaletteName { get; internal set; } *
public bool Toggleable { get; internal set; } = false; * You should have received a copy of the GNU General Public License
public int BaseFrame { get; internal set; } = 0; * along with this program. If not, see <https://www.gnu.org/licenses/>.
public int DisabledFrame { get; internal set; } = -1; */
public string FontPath { get; internal set; } = ResourcePaths.FontExocet10;
using OpenDiablo2.Common.Enums;
public bool IsDarkenedWhenDisabled => DisabledFrame == -1; using System.Collections.Generic;
using System.Collections.Immutable;
public static ImmutableDictionary<eButtonType, ButtonLayout> Values { get; } = new Dictionary<eButtonType, ButtonLayout> using System.Drawing;
{
{eButtonType.Wide, new ButtonLayout { XSegments = 2, ResourceName = ResourcePaths.WideButtonBlank, PaletteName = Palettes.Units } }, namespace OpenDiablo2.Common.Models
{eButtonType.Medium, new ButtonLayout{ XSegments = 1, ResourceName=ResourcePaths.MediumButtonBlank, PaletteName = Palettes.Units } }, {
{eButtonType.Narrow, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.NarrowButtonBlank,PaletteName = Palettes.Units } }, public class ButtonLayout
{eButtonType.Tall, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.TallButtonBlank, PaletteName = Palettes.Units } }, {
{eButtonType.Short, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.ShortButtonBlank, PaletteName = Palettes.Units, FontPath = ResourcePaths.FontExocet10 } }, public int XSegments { get; set; } = 1;
{eButtonType.Cancel, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.CancelButton,PaletteName = Palettes.Units } }, public int YSegments { get; set; } = 1;
// Minipanel public string ResourceName { get; set; }
{eButtonType.MinipanelCharacter, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 0 } }, public string PaletteName { get; set; }
{eButtonType.MinipanelInventory, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 2 } }, public bool Toggleable { get; set; } = false;
{eButtonType.MinipanelSkill, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 4 } }, public int BaseFrame { get; set; } = 0;
{eButtonType.MinipanelAutomap, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 8 } }, public int DisabledFrame { get; set; } = -1;
{eButtonType.MinipanelMessage, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 10 } }, public string FontPath { get; set; } = ResourcePaths.FontExocet10;
{eButtonType.MinipanelQuest, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 12 } }, public Rectangle ClickableRect { get; set; }
{eButtonType.MinipanelMenu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 14 } }, public bool AllowFrameChange { get; set; } = true;
{eButtonType.SecondaryInvHand, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.InventoryWeaponsTab, PaletteName = Palettes.Units } }, public bool IsDarkenedWhenDisabled => DisabledFrame == -1;
{eButtonType.Run, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.RunButton,PaletteName = Palettes.Units, Toggleable = true } },
{eButtonType.Menu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MenuButton,PaletteName = Palettes.Units, Toggleable = true } }, public static ImmutableDictionary<eButtonType, ButtonLayout> Values { get; } = new Dictionary<eButtonType, ButtonLayout>
{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.Wide, new ButtonLayout { XSegments = 2, ResourceName = ResourcePaths.WideButtonBlank, PaletteName = Palettes.Units } },
{eButtonType.Skill, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.AddSkillButton, PaletteName = Palettes.Units, DisabledFrame = 2 } }, {eButtonType.Medium, new ButtonLayout{ ResourceName = ResourcePaths.MediumButtonBlank, PaletteName = Palettes.Units } },
}.ToImmutableDictionary(); {eButtonType.Narrow, new ButtonLayout { ResourceName = ResourcePaths.NarrowButtonBlank, PaletteName = Palettes.Units } },
} {eButtonType.Tall, new ButtonLayout { ResourceName = ResourcePaths.TallButtonBlank, PaletteName = Palettes.Units } },
{eButtonType.Short, new ButtonLayout { ResourceName = ResourcePaths.ShortButtonBlank, PaletteName = Palettes.Units, FontPath = ResourcePaths.FontExocet10 } },
} {eButtonType.Cancel, new ButtonLayout { ResourceName = ResourcePaths.CancelButton, PaletteName = Palettes.Units } },
// Minipanel
{eButtonType.MinipanelCharacter, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 0 } },
{eButtonType.MinipanelInventory, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 2 } },
{eButtonType.MinipanelSkill, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 4 } },
{eButtonType.MinipanelAutomap, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 8 } },
{eButtonType.MinipanelMessage, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 10 } },
{eButtonType.MinipanelQuest, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 12 } },
{eButtonType.MinipanelMenu, new ButtonLayout { ResourceName = ResourcePaths.MinipanelButton, PaletteName = Palettes.Units, BaseFrame = 14 } },
{eButtonType.SecondaryInvHand, new ButtonLayout { ResourceName = ResourcePaths.InventoryWeaponsTab, PaletteName = Palettes.Units,
ClickableRect = new Rectangle(0, 0, 0, 20), AllowFrameChange = false } },
{eButtonType.Run, new ButtonLayout { ResourceName = ResourcePaths.RunButton, PaletteName = Palettes.Units, Toggleable = true } },
{eButtonType.Menu, new ButtonLayout { ResourceName = ResourcePaths.MenuButton, PaletteName = Palettes.Units, Toggleable = true } },
{eButtonType.GoldCoin, new ButtonLayout { ResourceName = ResourcePaths.GoldCoinButton, PaletteName = Palettes.Units } },
{eButtonType.Close, new ButtonLayout { ResourceName = ResourcePaths.SquareButton, PaletteName = Palettes.Units, BaseFrame = 10 } },
{eButtonType.Skill, new ButtonLayout { ResourceName = ResourcePaths.AddSkillButton, PaletteName = Palettes.Units, DisabledFrame = 2 } },
}.ToImmutableDictionary();
}
}

View File

@ -103,6 +103,7 @@
<Compile Include="Interfaces\Mobs\IEnemyTypeCombatConfig.cs" /> <Compile Include="Interfaces\Mobs\IEnemyTypeCombatConfig.cs" />
<Compile Include="Interfaces\Mobs\IEnemyTypeConfig.cs" /> <Compile Include="Interfaces\Mobs\IEnemyTypeConfig.cs" />
<Compile Include="Interfaces\Mobs\IEnemyTypeDifficultyConfig.cs" /> <Compile Include="Interfaces\Mobs\IEnemyTypeDifficultyConfig.cs" />
<Compile Include="Interfaces\UI\ISkillsPanel.cs" />
<Compile Include="Models\Mobs\EnemyTypeAppearanceConfig.cs" /> <Compile Include="Models\Mobs\EnemyTypeAppearanceConfig.cs" />
<Compile Include="Models\Mobs\EnemyTypeCombatConfig.cs" /> <Compile Include="Models\Mobs\EnemyTypeCombatConfig.cs" />
<Compile Include="Models\Mobs\EnemyTypeConfig.cs" /> <Compile Include="Models\Mobs\EnemyTypeConfig.cs" />

View File

@ -1,314 +1,345 @@
/* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C# /* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C#
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; using OpenDiablo2.Common.Enums;
using System;
namespace OpenDiablo2.Common
{ namespace OpenDiablo2.Common
public static class ResourcePaths {
{ public static class ResourcePaths
// --- Loading Screen --- {
public const string LoadingScreen = @"data\global\ui\Loading\loadingscreen.dc6"; // --- Loading Screen ---
public const string LoadingScreen = @"data\global\ui\Loading\loadingscreen.dc6";
// --- Main Menu ---
public const string GameSelectScreen = @"data\global\ui\FrontEnd\gameselectscreenEXP.dc6"; // --- Main Menu ---
public const string Diablo2LogoFireLeft = @"data\global\ui\FrontEnd\D2logoFireLeft.DC6"; public const string GameSelectScreen = @"data\global\ui\FrontEnd\gameselectscreenEXP.dc6";
public const string Diablo2LogoFireRight = @"data\global\ui\FrontEnd\D2logoFireRight.DC6"; public const string Diablo2LogoFireLeft = @"data\global\ui\FrontEnd\D2logoFireLeft.DC6";
public const string Diablo2LogoBlackLeft = @"data\global\ui\FrontEnd\D2logoBlackLeft.DC6"; public const string Diablo2LogoFireRight = @"data\global\ui\FrontEnd\D2logoFireRight.DC6";
public const string Diablo2LogoBlackRight = @"data\global\ui\FrontEnd\D2logoBlackRight.DC6"; public const string Diablo2LogoBlackLeft = @"data\global\ui\FrontEnd\D2logoBlackLeft.DC6";
public const string Diablo2LogoBlackRight = @"data\global\ui\FrontEnd\D2logoBlackRight.DC6";
// --- Credits ---
public const string CreditsBackground = @"data\global\ui\CharSelect\creditsbckgexpand.dc6"; // --- Credits ---
public const string CreditsText = @"data\local\ui\eng\ExpansionCredits.txt"; public const string CreditsBackground = @"data\global\ui\CharSelect\creditsbckgexpand.dc6";
// --- Character Select Screen --- public const string CreditsText = @"data\local\ui\eng\ExpansionCredits.txt";
public const string CharacterSelectBackground = @"data\global\ui\FrontEnd\charactercreationscreenEXP.dc6"; // --- Character Select Screen ---
public const string CharacterSelectCampfire = @"data\global\ui\FrontEnd\fire.DC6"; public const string CharacterSelectBackground = @"data\global\ui\FrontEnd\charactercreationscreenEXP.dc6";
public const string CharacterSelectCampfire = @"data\global\ui\FrontEnd\fire.DC6";
public const string CharacterSelectBarbarianUnselected = @"data\global\ui\FrontEnd\barbarian\banu1.DC6";
public const string CharacterSelectBarbarianUnselectedH = @"data\global\ui\FrontEnd\barbarian\banu2.DC6"; public const string CharacterSelectBarbarianUnselected = @"data\global\ui\FrontEnd\barbarian\banu1.DC6";
public const string CharacterSelectBarbarianSelected = @"data\global\ui\FrontEnd\barbarian\banu3.DC6"; public const string CharacterSelectBarbarianUnselectedH = @"data\global\ui\FrontEnd\barbarian\banu2.DC6";
public const string CharacterSelectBarbarianForwardWalk = @"data\global\ui\FrontEnd\barbarian\bafw.DC6"; public const string CharacterSelectBarbarianSelected = @"data\global\ui\FrontEnd\barbarian\banu3.DC6";
public const string CharacterSelectBarbarianForwardWalkOverlay = @"data\global\ui\FrontEnd\barbarian\BAFWs.DC6"; public const string CharacterSelectBarbarianForwardWalk = @"data\global\ui\FrontEnd\barbarian\bafw.DC6";
public const string CharacterSelectBarbarianBackWalk = @"data\global\ui\FrontEnd\barbarian\babw.DC6"; public const string CharacterSelectBarbarianForwardWalkOverlay = @"data\global\ui\FrontEnd\barbarian\BAFWs.DC6";
public const string CharacterSelectBarbarianBackWalk = @"data\global\ui\FrontEnd\barbarian\babw.DC6";
public const string CharacterSelecSorceressUnselected = @"data\global\ui\FrontEnd\sorceress\SONU1.DC6";
public const string CharacterSelecSorceressUnselectedH = @"data\global\ui\FrontEnd\sorceress\SONU2.DC6"; public const string CharacterSelecSorceressUnselected = @"data\global\ui\FrontEnd\sorceress\SONU1.DC6";
public const string CharacterSelecSorceressSelected = @"data\global\ui\FrontEnd\sorceress\SONU3.DC6"; public const string CharacterSelecSorceressUnselectedH = @"data\global\ui\FrontEnd\sorceress\SONU2.DC6";
public const string CharacterSelecSorceressSelectedOverlay = @"data\global\ui\FrontEnd\sorceress\SONU3s.DC6"; public const string CharacterSelecSorceressSelected = @"data\global\ui\FrontEnd\sorceress\SONU3.DC6";
public const string CharacterSelecSorceressForwardWalk = @"data\global\ui\FrontEnd\sorceress\SOFW.DC6"; public const string CharacterSelecSorceressSelectedOverlay = @"data\global\ui\FrontEnd\sorceress\SONU3s.DC6";
public const string CharacterSelecSorceressForwardWalkOverlay = @"data\global\ui\FrontEnd\sorceress\SOFWs.DC6"; public const string CharacterSelecSorceressForwardWalk = @"data\global\ui\FrontEnd\sorceress\SOFW.DC6";
public const string CharacterSelecSorceressBackWalk = @"data\global\ui\FrontEnd\sorceress\SOBW.DC6"; public const string CharacterSelecSorceressForwardWalkOverlay = @"data\global\ui\FrontEnd\sorceress\SOFWs.DC6";
public const string CharacterSelecSorceressBackWalkOverlay = @"data\global\ui\FrontEnd\sorceress\SOBWs.DC6"; public const string CharacterSelecSorceressBackWalk = @"data\global\ui\FrontEnd\sorceress\SOBW.DC6";
public const string CharacterSelecSorceressBackWalkOverlay = @"data\global\ui\FrontEnd\sorceress\SOBWs.DC6";
public const string CharacterSelectNecromancerUnselected = @"data\global\ui\FrontEnd\necromancer\NENU1.DC6";
public const string CharacterSelectNecromancerUnselectedH = @"data\global\ui\FrontEnd\necromancer\NENU2.DC6"; public const string CharacterSelectNecromancerUnselected = @"data\global\ui\FrontEnd\necromancer\NENU1.DC6";
public const string CharacterSelecNecromancerSelected = @"data\global\ui\FrontEnd\necromancer\NENU3.DC6"; public const string CharacterSelectNecromancerUnselectedH = @"data\global\ui\FrontEnd\necromancer\NENU2.DC6";
public const string CharacterSelecNecromancerSelectedOverlay = @"data\global\ui\FrontEnd\necromancer\NENU3s.DC6"; public const string CharacterSelecNecromancerSelected = @"data\global\ui\FrontEnd\necromancer\NENU3.DC6";
public const string CharacterSelecNecromancerForwardWalk = @"data\global\ui\FrontEnd\necromancer\NEFW.DC6"; public const string CharacterSelecNecromancerSelectedOverlay = @"data\global\ui\FrontEnd\necromancer\NENU3s.DC6";
public const string CharacterSelecNecromancerForwardWalkOverlay = @"data\global\ui\FrontEnd\necromancer\NEFWs.DC6"; public const string CharacterSelecNecromancerForwardWalk = @"data\global\ui\FrontEnd\necromancer\NEFW.DC6";
public const string CharacterSelecNecromancerBackWalk = @"data\global\ui\FrontEnd\necromancer\NEBW.DC6"; public const string CharacterSelecNecromancerForwardWalkOverlay = @"data\global\ui\FrontEnd\necromancer\NEFWs.DC6";
public const string CharacterSelecNecromancerBackWalkOverlay = @"data\global\ui\FrontEnd\necromancer\NEBWs.DC6"; public const string CharacterSelecNecromancerBackWalk = @"data\global\ui\FrontEnd\necromancer\NEBW.DC6";
public const string CharacterSelecNecromancerBackWalkOverlay = @"data\global\ui\FrontEnd\necromancer\NEBWs.DC6";
public const string CharacterSelectPaladinUnselected = @"data\global\ui\FrontEnd\paladin\PANU1.DC6";
public const string CharacterSelectPaladinUnselectedH = @"data\global\ui\FrontEnd\paladin\PANU2.DC6"; public const string CharacterSelectPaladinUnselected = @"data\global\ui\FrontEnd\paladin\PANU1.DC6";
public const string CharacterSelecPaladinSelected = @"data\global\ui\FrontEnd\paladin\PANU3.DC6"; public const string CharacterSelectPaladinUnselectedH = @"data\global\ui\FrontEnd\paladin\PANU2.DC6";
public const string CharacterSelecPaladinForwardWalk = @"data\global\ui\FrontEnd\paladin\PAFW.DC6"; public const string CharacterSelecPaladinSelected = @"data\global\ui\FrontEnd\paladin\PANU3.DC6";
public const string CharacterSelecPaladinForwardWalkOverlay = @"data\global\ui\FrontEnd\paladin\PAFWs.DC6"; public const string CharacterSelecPaladinForwardWalk = @"data\global\ui\FrontEnd\paladin\PAFW.DC6";
public const string CharacterSelecPaladinBackWalk = @"data\global\ui\FrontEnd\paladin\PABW.DC6"; public const string CharacterSelecPaladinForwardWalkOverlay = @"data\global\ui\FrontEnd\paladin\PAFWs.DC6";
public const string CharacterSelecPaladinBackWalk = @"data\global\ui\FrontEnd\paladin\PABW.DC6";
public const string CharacterSelectAmazonUnselected = @"data\global\ui\FrontEnd\amazon\AMNU1.DC6";
public const string CharacterSelectAmazonUnselectedH = @"data\global\ui\FrontEnd\amazon\AMNU2.DC6"; public const string CharacterSelectAmazonUnselected = @"data\global\ui\FrontEnd\amazon\AMNU1.DC6";
public const string CharacterSelecAmazonSelected = @"data\global\ui\FrontEnd\amazon\AMNU3.DC6"; public const string CharacterSelectAmazonUnselectedH = @"data\global\ui\FrontEnd\amazon\AMNU2.DC6";
public const string CharacterSelecAmazonForwardWalk = @"data\global\ui\FrontEnd\amazon\AMFW.DC6"; public const string CharacterSelecAmazonSelected = @"data\global\ui\FrontEnd\amazon\AMNU3.DC6";
public const string CharacterSelecAmazonForwardWalkOverlay = @"data\global\ui\FrontEnd\amazon\AMFWs.DC6"; public const string CharacterSelecAmazonForwardWalk = @"data\global\ui\FrontEnd\amazon\AMFW.DC6";
public const string CharacterSelecAmazonBackWalk = @"data\global\ui\FrontEnd\amazon\AMBW.DC6"; public const string CharacterSelecAmazonForwardWalkOverlay = @"data\global\ui\FrontEnd\amazon\AMFWs.DC6";
public const string CharacterSelecAmazonBackWalk = @"data\global\ui\FrontEnd\amazon\AMBW.DC6";
public const string CharacterSelectAssassinUnselected = @"data\global\ui\FrontEnd\assassin\ASNU1.DC6";
public const string CharacterSelectAssassinUnselectedH = @"data\global\ui\FrontEnd\assassin\ASNU2.DC6"; public const string CharacterSelectAssassinUnselected = @"data\global\ui\FrontEnd\assassin\ASNU1.DC6";
public const string CharacterSelectAssassinSelected = @"data\global\ui\FrontEnd\assassin\ASNU3.DC6"; public const string CharacterSelectAssassinUnselectedH = @"data\global\ui\FrontEnd\assassin\ASNU2.DC6";
public const string CharacterSelectAssassinForwardWalk = @"data\global\ui\FrontEnd\assassin\ASFW.DC6"; public const string CharacterSelectAssassinSelected = @"data\global\ui\FrontEnd\assassin\ASNU3.DC6";
public const string CharacterSelectAssassinBackWalk = @"data\global\ui\FrontEnd\assassin\ASBW.DC6"; public const string CharacterSelectAssassinForwardWalk = @"data\global\ui\FrontEnd\assassin\ASFW.DC6";
public const string CharacterSelectAssassinBackWalk = @"data\global\ui\FrontEnd\assassin\ASBW.DC6";
public const string CharacterSelectDruidUnselected = @"data\global\ui\FrontEnd\druid\DZNU1.dc6";
public const string CharacterSelectDruidUnselectedH = @"data\global\ui\FrontEnd\druid\DZNU2.dc6"; public const string CharacterSelectDruidUnselected = @"data\global\ui\FrontEnd\druid\DZNU1.dc6";
public const string CharacterSelectDruidSelected = @"data\global\ui\FrontEnd\druid\DZNU3.DC6"; public const string CharacterSelectDruidUnselectedH = @"data\global\ui\FrontEnd\druid\DZNU2.dc6";
public const string CharacterSelectDruidForwardWalk = @"data\global\ui\FrontEnd\druid\DZFW.DC6"; public const string CharacterSelectDruidSelected = @"data\global\ui\FrontEnd\druid\DZNU3.DC6";
public const string CharacterSelectDruidBackWalk = @"data\global\ui\FrontEnd\druid\DZBW.DC6"; public const string CharacterSelectDruidForwardWalk = @"data\global\ui\FrontEnd\druid\DZFW.DC6";
public const string CharacterSelectDruidBackWalk = @"data\global\ui\FrontEnd\druid\DZBW.DC6";
// -- Character Selection
public const string CharacterSelectionBackground = @"data\global\ui\CharSelect\characterselectscreenEXP.dc6"; // -- Character Selection
public const string CharacterSelectionBackground = @"data\global\ui\CharSelect\characterselectscreenEXP.dc6";
// --- Game ---
public const string GamePanels = @"data\global\ui\PANEL\800ctrlpnl7.dc6"; // --- Game ---
public const string GameGlobeOverlap = @"data\global\ui\PANEL\overlap.DC6"; public const string GamePanels = @"data\global\ui\PANEL\800ctrlpnl7.dc6";
public const string HealthMana = @"data\global\ui\PANEL\hlthmana.DC6"; public const string GameGlobeOverlap = @"data\global\ui\PANEL\overlap.DC6";
public const string GameSmallMenuButton = @"data\global\ui\PANEL\menubutton.DC6"; // TODO: Used for inventory popout public const string HealthMana = @"data\global\ui\PANEL\hlthmana.DC6";
public const string SkillIcon = @"data\global\ui\PANEL\Skillicon.DC6"; // TODO: Used for skill icon button public const string GameSmallMenuButton = @"data\global\ui\PANEL\menubutton.DC6"; // TODO: Used for inventory popout
public const string AddSkillButton = @"data\global\ui\PANEL\level.DC6"; 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 ---
public const string CursorDefault = @"data\global\ui\CURSOR\ohand.DC6"; // --- Mouse Pointers ---
public const string CursorDefault = @"data\global\ui\CURSOR\ohand.DC6";
// --- Fonts ---
public const string Font6 = @"data\local\font\latin\font6"; // --- Fonts ---
public const string Font8 = @"data\local\font\latin\font8"; public const string Font6 = @"data\local\font\latin\font6";
public const string Font16 = @"data\local\font\latin\font16"; public const string Font8 = @"data\local\font\latin\font8";
public const string Font24 = @"data\local\font\latin\font24"; public const string Font16 = @"data\local\font\latin\font16";
public const string Font30 = @"data\local\font\latin\font30"; public const string Font24 = @"data\local\font\latin\font24";
public const string FontFormal12 = @"data\local\font\latin\fontformal12"; public const string Font30 = @"data\local\font\latin\font30";
public const string FontFormal11 = @"data\local\font\latin\fontformal11"; public const string FontFormal12 = @"data\local\font\latin\fontformal12";
public const string FontFormal10 = @"data\local\font\latin\fontformal10"; public const string FontFormal11 = @"data\local\font\latin\fontformal11";
public const string FontExocet10 = @"data\local\font\latin\fontexocet10"; public const string FontFormal10 = @"data\local\font\latin\fontformal10";
public const string FontExocet8 = @"data\local\font\latin\fontexocet8"; public const string FontExocet10 = @"data\local\font\latin\fontexocet10";
public const string FontExocet8 = @"data\local\font\latin\fontexocet8";
// --- UI ---
public const string WideButtonBlank = @"data\global\ui\FrontEnd\WideButtonBlank.dc6"; // --- UI ---
public const string MediumButtonBlank = @"data\global\ui\FrontEnd\MediumButtonBlank.dc6"; public const string WideButtonBlank = @"data\global\ui\FrontEnd\WideButtonBlank.dc6";
public const string CancelButton = @"data\global\ui\FrontEnd\CancelButtonBlank.dc6"; public const string MediumButtonBlank = @"data\global\ui\FrontEnd\MediumButtonBlank.dc6";
public const string NarrowButtonBlank = @"data\global\ui\FrontEnd\NarrowButtonBlank.dc6"; public const string CancelButton = @"data\global\ui\FrontEnd\CancelButtonBlank.dc6";
public const string ShortButtonBlank = @"data\global\ui\CharSelect\ShortButtonBlank.dc6"; public const string NarrowButtonBlank = @"data\global\ui\FrontEnd\NarrowButtonBlank.dc6";
public const string TextBox2 = @"data\global\ui\FrontEnd\textbox2.dc6"; public const string ShortButtonBlank = @"data\global\ui\CharSelect\ShortButtonBlank.dc6";
public const string TallButtonBlank = @"data\global\ui\CharSelect\TallButtonBlank.dc6"; public const string TextBox2 = @"data\global\ui\FrontEnd\textbox2.dc6";
public const string TallButtonBlank = @"data\global\ui\CharSelect\TallButtonBlank.dc6";
// --- GAME UI ---
public const string MinipanelSmall = @"data\global\ui\PANEL\minipanel_s.dc6"; // --- GAME UI ---
public const string MinipanelButton = @"data\global\ui\PANEL\minipanelbtn.DC6"; public const string MinipanelSmall = @"data\global\ui\PANEL\minipanel_s.dc6";
public const string MinipanelButton = @"data\global\ui\PANEL\minipanelbtn.DC6";
public const string Frame = @"data\global\ui\PANEL\800borderframe.dc6";
public const string InventoryCharacterPanel = @"data\global\ui\PANEL\invchar6.DC6"; public const string Frame = @"data\global\ui\PANEL\800borderframe.dc6";
public const string InventoryWeaponsTab = @"data\global\ui\PANEL\invchar6Tab.DC6"; public const string InventoryCharacterPanel = @"data\global\ui\PANEL\invchar6.DC6";
public const string InventoryWeaponsTab = @"data\global\ui\PANEL\invchar6Tab.DC6";
public const string RunButton = @"data\global\ui\PANEL\runbutton.dc6"; public const string SkillsPanelAmazon = @"data\global\ui\SPELLS\skltree_a_back.DC6";
public const string MenuButton = @"data\global\ui\PANEL\menubutton.DC6"; public const string SkillsPanelBarbarian = @"data\global\ui\SPELLS\skltree_b_back.DC6";
public const string GoldCoinButton = @"data\global\ui\panel\goldcoinbtn.dc6"; public const string SkillsPanelDruid = @"data\global\ui\SPELLS\skltree_d_back.DC6";
public const string SquareButton = @"data\global\ui\panel\buysellbtn.dc6"; public const string SkillsPanelAssassin = @"data\global\ui\SPELLS\skltree_i_back.DC6";
public const string SkillsPanelNecromancer = @"data\global\ui\SPELLS\skltree_n_back.DC6";
public const string ArmorPlaceholder = @"data\global\ui\PANEL\inv_armor.DC6"; public const string SkillsPanelPaladin = @"data\global\ui\SPELLS\skltree_p_back.DC6";
public const string BeltPlaceholder = @"data\global\ui\PANEL\inv_belt.DC6"; public const string SkillsPanelSorcerer = @"data\global\ui\SPELLS\skltree_s_back.DC6";
public const string BootsPlaceholder = @"data\global\ui\PANEL\inv_boots.DC6";
public const string HelmGlovePlaceholder = @"data\global\ui\PANEL\inv_helm_glove.DC6"; public const string RunButton = @"data\global\ui\PANEL\runbutton.dc6";
public const string RingAmuletPlaceholder = @"data\global\ui\PANEL\inv_ring_amulet.DC6"; public const string MenuButton = @"data\global\ui\PANEL\menubutton.DC6";
public const string WeaponsPlaceholder = @"data\global\ui\PANEL\inv_weapons.DC6"; public const string GoldCoinButton = @"data\global\ui\panel\goldcoinbtn.dc6";
public const string SquareButton = @"data\global\ui\panel\buysellbtn.dc6";
// --- Data ---
// TODO: Doesn't sound right :) public const string ArmorPlaceholder = @"data\global\ui\PANEL\inv_armor.DC6";
public const string EnglishTable = @"data\local\lng\eng\English.txt"; public const string BeltPlaceholder = @"data\global\ui\PANEL\inv_belt.DC6";
public const string ExpansionStringTable = @"data\local\lng\eng\expansionstring.tbl"; public const string BootsPlaceholder = @"data\global\ui\PANEL\inv_boots.DC6";
public const string LevelPreset = @"data\global\excel\LvlPrest.txt"; public const string HelmGlovePlaceholder = @"data\global\ui\PANEL\inv_helm_glove.DC6";
public const string LevelType = @"data\global\excel\LvlTypes.txt"; public const string RingAmuletPlaceholder = @"data\global\ui\PANEL\inv_ring_amulet.DC6";
public const string LevelDetails = @"data\global\excel\Levels.txt"; public const string WeaponsPlaceholder = @"data\global\ui\PANEL\inv_weapons.DC6";
// --- Animations --- // --- Data ---
public const string ObjectData = @"data\global\objects"; // TODO: Doesn't sound right :)
public const string AnimationData = @"data\global\animdata.d2"; public const string EnglishTable = @"data\local\lng\eng\English.txt";
public const string PlayerAnimationBase = @"data\global\CHARS"; public const string ExpansionStringTable = @"data\local\lng\eng\expansionstring.tbl";
public const string LevelPreset = @"data\global\excel\LvlPrest.txt";
// --- Inventory Data --- public const string LevelType = @"data\global\excel\LvlTypes.txt";
public const string Weapons = @"data\global\excel\weapons.txt"; public const string LevelDetails = @"data\global\excel\Levels.txt";
public const string Armor = @"data\global\excel\armor.txt";
public const string Misc = @"data\global\excel\misc.txt"; // --- Animations ---
public const string ObjectData = @"data\global\objects";
// --- Character Data --- public const string AnimationData = @"data\global\animdata.d2";
public const string Experience = @"data\global\excel\experience.txt"; public const string PlayerAnimationBase = @"data\global\CHARS";
public const string CharStats = @"data\global\excel\charstats.txt";
// --- Inventory Data ---
// --- Music --- public const string Weapons = @"data\global\excel\weapons.txt";
public const string BGMTitle = @"data\global\music\introedit.wav"; public const string Armor = @"data\global\excel\armor.txt";
public const string BGMOptions = @"data\global\music\Common\options.wav"; public const string Misc = @"data\global\excel\misc.txt";
public const string BGMAct1AndarielAction = @"data\global\music\Act1\andarielaction.wav";
public const string BGMAct1BloodRavenResolution = @"data\global\music\Act1\bloodravenresolution.wav"; // --- Character Data ---
public const string BGMAct1Caves = @"data\global\music\Act1\caves.wav"; public const string Experience = @"data\global\excel\experience.txt";
public const string BGMAct1Crypt = @"data\global\music\Act1\crypt.wav"; public const string CharStats = @"data\global\excel\charstats.txt";
public const string BGMAct1DenOfEvilAction = @"data\global\music\Act1\denofevilaction.wav";
public const string BGMAct1Monastery = @"data\global\music\Act1\monastery.wav"; // --- Music ---
public const string BGMAct1Town1 = @"data\global\music\Act1\town1.wav"; public const string BGMTitle = @"data\global\music\introedit.wav";
public const string BGMAct1Tristram = @"data\global\music\Act1\tristram.wav"; public const string BGMOptions = @"data\global\music\Common\options.wav";
public const string BGMAct1Wild = @"data\global\music\Act1\wild.wav"; public const string BGMAct1AndarielAction = @"data\global\music\Act1\andarielaction.wav";
public const string BGMAct2Desert = @"data\global\music\Act2\desert.wav"; public const string BGMAct1BloodRavenResolution = @"data\global\music\Act1\bloodravenresolution.wav";
public const string BGMAct2Harem = @"data\global\music\Act2\harem.wav"; public const string BGMAct1Caves = @"data\global\music\Act1\caves.wav";
public const string BGMAct2HoradricAction = @"data\global\music\Act2\horadricaction.wav"; public const string BGMAct1Crypt = @"data\global\music\Act1\crypt.wav";
public const string BGMAct2Lair = @"data\global\music\Act2\lair.wav"; public const string BGMAct1DenOfEvilAction = @"data\global\music\Act1\denofevilaction.wav";
public const string BGMAct2RadamentResolution = @"data\global\music\Act2\radamentresolution.wav"; public const string BGMAct1Monastery = @"data\global\music\Act1\monastery.wav";
public const string BGMAct2Sanctuary = @"data\global\music\Act2\sanctuary.wav"; public const string BGMAct1Town1 = @"data\global\music\Act1\town1.wav";
public const string BGMAct2Sewer = @"data\global\music\Act2\sewer.wav"; public const string BGMAct1Tristram = @"data\global\music\Act1\tristram.wav";
public const string BGMAct2TaintedSunAction = @"data\global\music\Act2\taintedsunaction.wav"; public const string BGMAct1Wild = @"data\global\music\Act1\wild.wav";
public const string BGMAct2Tombs = @"data\global\music\Act2\tombs.wav"; public const string BGMAct2Desert = @"data\global\music\Act2\desert.wav";
public const string BGMAct2Town2 = @"data\global\music\Act2\town2.wav"; public const string BGMAct2Harem = @"data\global\music\Act2\harem.wav";
public const string BGMAct2Valley = @"data\global\music\Act2\valley.wav"; public const string BGMAct2HoradricAction = @"data\global\music\Act2\horadricaction.wav";
public const string BGMAct3Jungle = @"data\global\music\Act3\jungle.wav"; public const string BGMAct2Lair = @"data\global\music\Act2\lair.wav";
public const string BGMAct3Kurast = @"data\global\music\Act3\kurast.wav"; public const string BGMAct2RadamentResolution = @"data\global\music\Act2\radamentresolution.wav";
public const string BGMAct3KurastSewer = @"data\global\music\Act3\kurastsewer.wav"; public const string BGMAct2Sanctuary = @"data\global\music\Act2\sanctuary.wav";
public const string BGMAct3MefDeathAction = @"data\global\music\Act3\mefdeathaction.wav"; public const string BGMAct2Sewer = @"data\global\music\Act2\sewer.wav";
public const string BGMAct3OrbAction = @"data\global\music\Act3\orbaction.wav"; public const string BGMAct2TaintedSunAction = @"data\global\music\Act2\taintedsunaction.wav";
public const string BGMAct3Spider = @"data\global\music\Act3\spider.wav"; public const string BGMAct2Tombs = @"data\global\music\Act2\tombs.wav";
public const string BGMAct3Town3 = @"data\global\music\Act3\town3.wav"; public const string BGMAct2Town2 = @"data\global\music\Act2\town2.wav";
public const string BGMAct4Diablo = @"data\global\music\Act4\diablo.wav"; public const string BGMAct2Valley = @"data\global\music\Act2\valley.wav";
public const string BGMAct4DiabloAction = @"data\global\music\Act4\diabloaction.wav"; public const string BGMAct3Jungle = @"data\global\music\Act3\jungle.wav";
public const string BGMAct4ForgeAction = @"data\global\music\Act4\forgeaction.wav"; public const string BGMAct3Kurast = @"data\global\music\Act3\kurast.wav";
public const string BGMAct4IzualAction = @"data\global\music\Act4\izualaction.wav"; public const string BGMAct3KurastSewer = @"data\global\music\Act3\kurastsewer.wav";
public const string BGMAct4Mesa = @"data\global\music\Act4\mesa.wav"; public const string BGMAct3MefDeathAction = @"data\global\music\Act3\mefdeathaction.wav";
public const string BGMAct4Town4 = @"data\global\music\Act4\town4.wav"; public const string BGMAct3OrbAction = @"data\global\music\Act3\orbaction.wav";
public const string BGMAct5Baal = @"data\global\music\Act5\baal.wav"; public const string BGMAct3Spider = @"data\global\music\Act3\spider.wav";
public const string BGMAct5XTown = @"data\global\music\Act5\xtown.wav"; public const string BGMAct3Town3 = @"data\global\music\Act3\town3.wav";
public const string BGMAct4Diablo = @"data\global\music\Act4\diablo.wav";
public const string BGMAct4DiabloAction = @"data\global\music\Act4\diabloaction.wav";
// --- Sound Effects --- public const string BGMAct4ForgeAction = @"data\global\music\Act4\forgeaction.wav";
public const string SFXButtonClick = @"data\global\sfx\Cursor\button.wav"; public const string BGMAct4IzualAction = @"data\global\music\Act4\izualaction.wav";
public const string SFXAmazonDeselect = @"data\global\sfx\Cursor\intro\amazon deselect.wav"; public const string BGMAct4Mesa = @"data\global\music\Act4\mesa.wav";
public const string SFXAmazonSelect = @"data\global\sfx\Cursor\intro\amazon select.wav"; public const string BGMAct4Town4 = @"data\global\music\Act4\town4.wav";
public const string SFXAssassinDeselect = @"data\global\sfx\Cursor\intro\assassin deselect.wav"; public const string BGMAct5Baal = @"data\global\music\Act5\baal.wav";
public const string SFXAssassinSelect = @"data\global\sfx\Cursor\intro\assassin select.wav"; public const string BGMAct5XTown = @"data\global\music\Act5\xtown.wav";
public const string SFXBarbarianDeselect = @"data\global\sfx\Cursor\intro\barbarian deselect.wav";
public const string SFXBarbarianSelect = @"data\global\sfx\Cursor\intro\barbarian select.wav";
public const string SFXDruidDeselect = @"data\global\sfx\Cursor\intro\druid deselect.wav"; // --- Sound Effects ---
public const string SFXDruidSelect = @"data\global\sfx\Cursor\intro\druid select.wav"; public const string SFXButtonClick = @"data\global\sfx\Cursor\button.wav";
public const string SFXNecromancerDeselect = @"data\global\sfx\Cursor\intro\necromancer deselect.wav"; public const string SFXAmazonDeselect = @"data\global\sfx\Cursor\intro\amazon deselect.wav";
public const string SFXNecromancerSelect = @"data\global\sfx\Cursor\intro\necromancer select.wav"; public const string SFXAmazonSelect = @"data\global\sfx\Cursor\intro\amazon select.wav";
public const string SFXPaladinDeselect = @"data\global\sfx\Cursor\intro\paladin deselect.wav"; public const string SFXAssassinDeselect = @"data\global\sfx\Cursor\intro\assassin deselect.wav";
public const string SFXPaladinSelect = @"data\global\sfx\Cursor\intro\paladin select.wav"; public const string SFXAssassinSelect = @"data\global\sfx\Cursor\intro\assassin select.wav";
public const string SFXSorceressDeselect = @"data\global\sfx\Cursor\intro\sorceress deselect.wav"; public const string SFXBarbarianDeselect = @"data\global\sfx\Cursor\intro\barbarian deselect.wav";
public const string SFXSorceressSelect = @"data\global\sfx\Cursor\intro\sorceress select.wav"; public const string SFXBarbarianSelect = @"data\global\sfx\Cursor\intro\barbarian select.wav";
public const string SFXDruidDeselect = @"data\global\sfx\Cursor\intro\druid deselect.wav";
// --- Enemy Data --- public const string SFXDruidSelect = @"data\global\sfx\Cursor\intro\druid select.wav";
public static string MonStats = "data\\global\\excel\\monstats.txt"; public const string SFXNecromancerDeselect = @"data\global\sfx\Cursor\intro\necromancer deselect.wav";
public const string SFXNecromancerSelect = @"data\global\sfx\Cursor\intro\necromancer select.wav";
public static string GeneratePathForItem(string spriteName) public const string SFXPaladinDeselect = @"data\global\sfx\Cursor\intro\paladin deselect.wav";
{ public const string SFXPaladinSelect = @"data\global\sfx\Cursor\intro\paladin select.wav";
return $@"data\global\items\{spriteName}.dc6"; public const string SFXSorceressDeselect = @"data\global\sfx\Cursor\intro\sorceress deselect.wav";
} public const string SFXSorceressSelect = @"data\global\sfx\Cursor\intro\sorceress select.wav";
public static string GetMusicPathForLevel(eLevelId levelId) // --- Enemy Data ---
{ public static string MonStats = "data\\global\\excel\\monstats.txt";
switch (levelId)
{ public static string GeneratePathForItem(string spriteName)
case eLevelId.None: {
return string.Empty; return $@"data\global\items\{spriteName}.dc6";
case eLevelId.Act1_Town1: }
return BGMAct1Town1;
case eLevelId.Act1_CaveTreasure2: public static string GetMusicPathForLevel(eLevelId levelId)
return BGMAct1Caves; {
case eLevelId.Act1_CaveTreasure3: switch (levelId)
return BGMAct1Caves; {
case eLevelId.Act1_CaveTreasure4: case eLevelId.None:
return BGMAct1Caves; return string.Empty;
case eLevelId.Act1_CaveTreasure5: case eLevelId.Act1_Town1:
return BGMAct1Caves; return BGMAct1Town1;
case eLevelId.Act1_CryptCountessX: case eLevelId.Act1_CaveTreasure2:
return BGMAct1BloodRavenResolution; // TODO: Verify return BGMAct1Caves;
case eLevelId.Act1_Tower2: case eLevelId.Act1_CaveTreasure3:
return BGMAct1Caves; // TODO: Verify return BGMAct1Caves;
case eLevelId.Act1_MonFront: case eLevelId.Act1_CaveTreasure4:
return BGMAct1DenOfEvilAction; // TODO: Verify return BGMAct1Caves;
case eLevelId.Act1_Courtyard1: case eLevelId.Act1_CaveTreasure5:
return BGMAct1Monastery; // TODO: Verify return BGMAct1Caves;
case eLevelId.Act1_Courtyard2: case eLevelId.Act1_CryptCountessX:
return BGMAct1Monastery; // TODO: Verify return BGMAct1BloodRavenResolution; // TODO: Verify
case eLevelId.Act1_Cathedral: case eLevelId.Act1_Tower2:
return BGMAct1Monastery; // TODO: Verify return BGMAct1Caves; // TODO: Verify
case eLevelId.Act1_Andariel: case eLevelId.Act1_MonFront:
return BGMAct1AndarielAction; return BGMAct1DenOfEvilAction; // TODO: Verify
case eLevelId.Act1_Tristram: case eLevelId.Act1_Courtyard1:
return BGMAct1Tristram; return BGMAct1Monastery; // TODO: Verify
case eLevelId.Act2_Town: case eLevelId.Act1_Courtyard2:
return BGMAct2Town2; return BGMAct1Monastery; // TODO: Verify
case eLevelId.Act2_Harem: case eLevelId.Act1_Cathedral:
return BGMAct2Harem; return BGMAct1Monastery; // TODO: Verify
case eLevelId.Act2_DurielsLair: case eLevelId.Act1_Andariel:
return BGMAct2Lair; return BGMAct1AndarielAction;
case eLevelId.Act3_Town: case eLevelId.Act1_Tristram:
return BGMAct3Town3; return BGMAct1Tristram;
case eLevelId.Act3_DungeonTreasure1: case eLevelId.Act2_Town:
return BGMAct3Kurast; // TODO: Verify return BGMAct2Town2;
case eLevelId.Act3_DungeonTreasure2: case eLevelId.Act2_Harem:
return BGMAct3Kurast; // TODO: Verify return BGMAct2Harem;
case eLevelId.Act3_SewerTreasureX: case eLevelId.Act2_DurielsLair:
return BGMAct3KurastSewer; // TODO: Verify return BGMAct2Lair;
case eLevelId.Act3_Temple1: case eLevelId.Act3_Town:
return BGMAct3Kurast; // TODO: Verify return BGMAct3Town3;
case eLevelId.Act3_Temple2: case eLevelId.Act3_DungeonTreasure1:
return BGMAct3Kurast; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act3_Temple3: case eLevelId.Act3_DungeonTreasure2:
return BGMAct3Kurast; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act3_Temple4: case eLevelId.Act3_SewerTreasureX:
return BGMAct3Kurast; // TODO: Verify return BGMAct3KurastSewer; // TODO: Verify
case eLevelId.Act3_Temple5: case eLevelId.Act3_Temple1:
return BGMAct3Kurast; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act3_Temple6: case eLevelId.Act3_Temple2:
return BGMAct3Kurast; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act3_MephistoComplex: case eLevelId.Act3_Temple3:
return BGMAct3MefDeathAction; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act4_Fortress: case eLevelId.Act3_Temple4:
return BGMAct4Mesa; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act5_Town: case eLevelId.Act3_Temple5:
return BGMAct5XTown; return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act5_TempleFinalRoom: case eLevelId.Act3_Temple6:
return BGMAct2Sanctuary; // TODO: Verify return BGMAct3Kurast; // TODO: Verify
case eLevelId.Act5_ThroneRoom: case eLevelId.Act3_MephistoComplex:
return BGMAct2Sanctuary; // TODO: Verify return BGMAct3MefDeathAction; // TODO: Verify
case eLevelId.Act5_WorldStone: case eLevelId.Act4_Fortress:
return BGMAct4ForgeAction; // TODO: Verify return BGMAct4Mesa; // TODO: Verify
case eLevelId.Act5_TempleEntrance: case eLevelId.Act5_Town:
return BGMAct5Baal; // TODO: Verify return BGMAct5XTown;
case eLevelId.Act5_BaalEntrance: case eLevelId.Act5_TempleFinalRoom:
return BGMAct5Baal; // TODO: Verify return BGMAct2Sanctuary; // TODO: Verify
default: case eLevelId.Act5_ThroneRoom:
return string.Empty; return BGMAct2Sanctuary; // TODO: Verify
} case eLevelId.Act5_WorldStone:
} return BGMAct4ForgeAction; // TODO: Verify
} case eLevelId.Act5_TempleEntrance:
} return BGMAct5Baal; // TODO: Verify
case eLevelId.Act5_BaalEntrance:
return BGMAct5Baal; // TODO: Verify
default:
return string.Empty;
}
}
public static string GetHeroSkillPanel(eHero hero)
{
switch (hero)
{
case eHero.Amazon:
return SkillsPanelAmazon;
case eHero.Assassin:
return SkillsPanelAssassin;
case eHero.Barbarian:
return SkillsPanelBarbarian;
case eHero.Druid:
return SkillsPanelDruid;
case eHero.Necromancer:
return SkillsPanelNecromancer;
case eHero.Paladin:
return SkillsPanelPaladin;
case eHero.Sorceress:
return SkillsPanelSorcerer;
default:
throw new ArgumentException($"Unknown hero type: {hero}");
}
}
}
}

View File

@ -43,6 +43,7 @@ namespace OpenDiablo2.Core
builder.RegisterType<PanelFrame>().As<IPanelFrame>().InstancePerDependency(); builder.RegisterType<PanelFrame>().As<IPanelFrame>().InstancePerDependency();
builder.RegisterType<CharacterPanel>().AsImplementedInterfaces().InstancePerDependency(); builder.RegisterType<CharacterPanel>().AsImplementedInterfaces().InstancePerDependency();
builder.RegisterType<InventoryPanel>().AsImplementedInterfaces().InstancePerDependency(); builder.RegisterType<InventoryPanel>().AsImplementedInterfaces().InstancePerDependency();
builder.RegisterType<SkillsPanel>().AsImplementedInterfaces().InstancePerDependency();
builder.RegisterType<ItemContainer>().As<IItemContainer>().InstancePerDependency(); builder.RegisterType<ItemContainer>().As<IItemContainer>().InstancePerDependency();
builder.RegisterType<MPQProvider>().As<IMPQProvider>().SingleInstance(); builder.RegisterType<MPQProvider>().As<IMPQProvider>().SingleInstance();
builder.RegisterType<ResourceManager>().As<IResourceManager>().SingleInstance(); builder.RegisterType<ResourceManager>().As<IResourceManager>().SingleInstance();

View File

@ -76,10 +76,11 @@
<Compile Include="UI\GameHUD.cs" /> <Compile Include="UI\GameHUD.cs" />
<Compile Include="UI\ItemContainer.cs" /> <Compile Include="UI\ItemContainer.cs" />
<Compile Include="UI\PanelFrame.cs" /> <Compile Include="UI\PanelFrame.cs" />
<Compile Include="UI\InventoryPanel.cs" /> <Compile Include="UI\Panels\InventoryPanel.cs" />
<Compile Include="UI\Panels\SkillsPanel.cs" />
<Compile Include="UI\TextBox.cs" /> <Compile Include="UI\TextBox.cs" />
<Compile Include="UI\MiniPanel.cs" /> <Compile Include="UI\MiniPanel.cs" />
<Compile Include="UI\CharacterPanel.cs" /> <Compile Include="UI\Panels\CharacterPanel.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <None Include="app.config" />

View File

@ -1,232 +1,234 @@
using OpenDiablo2.Common; using OpenDiablo2.Common;
using OpenDiablo2.Common.Interfaces; using OpenDiablo2.Common.Interfaces;
using OpenDiablo2.Common.Models; using OpenDiablo2.Common.Models;
using System; using System.Drawing;
using System.Drawing;
namespace OpenDiablo2.Core.UI
namespace OpenDiablo2.Core.UI {
{ public sealed class Button : IButton
public sealed class Button : IButton {
{ private readonly IMouseInfoProvider mouseInfoProvider;
private readonly IMouseInfoProvider mouseInfoProvider; private readonly IRenderWindow renderWindow;
private readonly IRenderWindow renderWindow; private readonly ISoundProvider musicProvider;
private readonly ISoundProvider musicProvider; private readonly ButtonLayout buttonLayout;
private readonly ButtonLayout buttonLayout; private readonly byte[] sfxButtonClick;
private readonly byte[] sfxButtonClick;
public OnActivateDelegate OnActivate { get; set; }
public OnActivateDelegate OnActivate { get; set; } public OnToggleDelegate OnToggle { get; set; }
public OnToggleDelegate OnToggle { get; set; }
private Point location = new Point();
private Point location = new Point(); public Point Location
public Point Location {
{ get => location;
get => location; set
set {
{ location = value;
location = value; sprite.Location = value;
sprite.Location = value; }
} }
}
private readonly int buttonWidth;
private readonly int buttonWidth; private readonly int buttonHeight;
private readonly int buttonHeight; private readonly ISprite sprite;
private readonly ISprite sprite; private readonly IFont font;
private readonly IFont font; private readonly ILabel label;
private readonly ILabel label; private bool pressed = false;
private bool pressed = false; private bool active = false; // When true, button is actively being focus pressed
private bool active = false; // When true, button is actively being focus pressed private bool activeLock = false; // When true, we have locked the mouse from everything else
private bool activeLock = false; // When true, we have locked the mouse from everything else public bool Toggled { get; private set; } = false;
public bool Toggled { get; private set; } = false;
private Point labelOffset = new Point();
private Point labelOffset = new Point();
private bool enabled = true;
public Size ClickableRect { get; set; } public bool Enabled
public bool AllowFrameChange { get; set; } = true; {
get => enabled;
private bool enabled = true; set
public bool Enabled {
{ if (value == enabled)
get => enabled; return;
set enabled = value;
{
if (value == enabled) if(buttonLayout.IsDarkenedWhenDisabled)
return; sprite.Darken = !enabled;
enabled = value; }
}
if(buttonLayout.IsDarkenedWhenDisabled)
sprite.Darken = !enabled; private string text;
} public string Text
} {
get => text;
private string text; set
public string Text {
{ text = value;
get => text; UpdateText();
set }
{ }
text = value;
UpdateText();
} public Button(
} ButtonLayout buttonLayout,
IRenderWindow renderWindow,
IMouseInfoProvider mouseInfoProvider,
public Button( ISoundProvider soundProvider,
ButtonLayout buttonLayout, IMPQProvider mpqProvider
IRenderWindow renderWindow, )
IMouseInfoProvider mouseInfoProvider, {
ISoundProvider soundProvider, this.buttonLayout = buttonLayout;
IMPQProvider mpqProvider this.renderWindow = renderWindow;
) this.mouseInfoProvider = mouseInfoProvider;
{ this.musicProvider = soundProvider;
this.buttonLayout = buttonLayout;
this.renderWindow = renderWindow; font = renderWindow.LoadFont(buttonLayout.FontPath, Palettes.Units);
this.mouseInfoProvider = mouseInfoProvider; label = renderWindow.CreateLabel(font);
this.musicProvider = soundProvider;
sprite = renderWindow.LoadSprite(buttonLayout.ResourceName, buttonLayout.PaletteName, true);
font = renderWindow.LoadFont(buttonLayout.FontPath, Palettes.Units);
label = renderWindow.CreateLabel(font); // TODO: Less stupid way of doing this would be super nice
buttonWidth = 0;
sprite = renderWindow.LoadSprite(buttonLayout.ResourceName, buttonLayout.PaletteName, true); buttonHeight = 0;
for (int i = 0; i < buttonLayout.XSegments; i++)
// TODO: Less stupid way of doing this would be nice {
buttonWidth = 0; sprite.Frame = i;
buttonHeight = 0; buttonWidth += sprite.LocalFrameSize.Width;
for (int i = 0; i < buttonLayout.XSegments; i++) }
{ for(int i = 0; i < buttonLayout.YSegments; i++)
sprite.Frame = i; {
buttonWidth += sprite.LocalFrameSize.Width; sprite.Frame = i * buttonLayout.YSegments;
buttonHeight = Math.Max(buttonHeight, sprite.LocalFrameSize.Height); buttonHeight += sprite.LocalFrameSize.Height;
} }
label.MaxWidth = buttonWidth - 8; label.MaxWidth = buttonWidth - 8;
label.Alignment = Common.Enums.eTextAlign.Centered; label.Alignment = Common.Enums.eTextAlign.Centered;
sfxButtonClick = mpqProvider.GetBytes(ResourcePaths.SFXButtonClick); sfxButtonClick = mpqProvider.GetBytes(ResourcePaths.SFXButtonClick);
} }
public bool Toggle() public bool Toggle()
{ {
Toggled = !Toggled; Toggled = !Toggled;
OnToggle?.Invoke(Toggled); OnToggle?.Invoke(Toggled);
return Toggled; return Toggled;
} }
public bool Toggle(bool isToggled) public bool Toggle(bool isToggled)
{ {
if(Toggled != isToggled) if(Toggled != isToggled)
{ {
OnToggle?.Invoke(isToggled); OnToggle?.Invoke(isToggled);
Toggled = isToggled; Toggled = isToggled;
} }
return isToggled; return isToggled;
} }
public void Update() public void Update()
{ {
if (!enabled) if (!enabled)
{ {
// Prevent sticky locks // Prevent sticky locks
if (activeLock && mouseInfoProvider.ReserveMouse) if (activeLock && mouseInfoProvider.ReserveMouse)
{ {
activeLock = false; activeLock = false;
mouseInfoProvider.ReserveMouse = false; mouseInfoProvider.ReserveMouse = false;
} }
active = false; active = false;
return; return;
} }
int clickWidth = ClickableRect.Width > 0 ? ClickableRect.Width : buttonWidth; int clickWidth = buttonLayout.ClickableRect.Width > 0 ? buttonLayout.ClickableRect.Width : buttonWidth;
int clickHeight = ClickableRect.Height > 0 ? ClickableRect.Height : buttonHeight; int clickHeight = buttonLayout.ClickableRect.Height > 0 ? buttonLayout.ClickableRect.Height : buttonHeight;
var hovered = mouseInfoProvider.MouseX >= location.X && mouseInfoProvider.MouseX < (location.X + clickWidth)
&& mouseInfoProvider.MouseY >= location.Y && mouseInfoProvider.MouseY < (location.Y + clickHeight); var hovered = mouseInfoProvider.MouseX >= location.X + buttonLayout.ClickableRect.X
&& mouseInfoProvider.MouseY >= location.Y + buttonLayout.ClickableRect.Y
&& mouseInfoProvider.MouseX < location.X + clickWidth + buttonLayout.ClickableRect.X
if (!activeLock && hovered && mouseInfoProvider.LeftMouseDown && !mouseInfoProvider.ReserveMouse) && mouseInfoProvider.MouseY < location.Y + clickHeight + buttonLayout.ClickableRect.Y;
{
// The button is being pressed down if (!activeLock && hovered && mouseInfoProvider.LeftMouseDown && !mouseInfoProvider.ReserveMouse)
mouseInfoProvider.ReserveMouse = true; {
active = true; // The button is being pressed down
musicProvider.PlaySfx(sfxButtonClick); mouseInfoProvider.ReserveMouse = true;
} active = true;
else if (active && !mouseInfoProvider.LeftMouseDown) musicProvider.PlaySfx(sfxButtonClick);
{ }
mouseInfoProvider.ReserveMouse = false; else if (active && !mouseInfoProvider.LeftMouseDown)
active = false; {
mouseInfoProvider.ReserveMouse = false;
if (hovered) active = false;
{
OnActivate?.Invoke(); if (hovered)
{
if (buttonLayout.Toggleable) OnActivate?.Invoke();
{
Toggle(); if (buttonLayout.Toggleable)
} {
} Toggle();
}
} }
else if (!active && mouseInfoProvider.LeftMouseDown)
{ }
activeLock = true; else if (!active && mouseInfoProvider.LeftMouseDown)
} {
else if (activeLock && !mouseInfoProvider.LeftMouseDown) activeLock = true;
{ }
activeLock = false; else if (activeLock && !mouseInfoProvider.LeftMouseDown)
} {
activeLock = false;
pressed = hovered && mouseInfoProvider.LeftMouseDown && active; }
}
pressed = hovered && mouseInfoProvider.LeftMouseDown && active;
public void Render() }
{
var frame = buttonLayout.BaseFrame; public void Render()
{
if (AllowFrameChange) var frame = buttonLayout.BaseFrame;
{
if(!Enabled && buttonLayout.DisabledFrame >= 0) if (buttonLayout.AllowFrameChange)
{ {
frame = buttonLayout.DisabledFrame; if(!Enabled && buttonLayout.DisabledFrame >= 0)
} {
else if (Toggled && pressed) frame = buttonLayout.DisabledFrame;
{ }
frame = buttonLayout.BaseFrame + 3; else if (Toggled && pressed)
} {
else if (pressed) frame = buttonLayout.BaseFrame + 3;
{ }
frame = buttonLayout.BaseFrame + 1; else if (pressed)
} {
else if (Toggled) frame = buttonLayout.BaseFrame + 1;
{ }
frame = buttonLayout.BaseFrame + 2; else if (Toggled)
} {
} frame = buttonLayout.BaseFrame + 2;
}
renderWindow.Draw(sprite, buttonLayout.XSegments, 1, frame); }
var offset = pressed ? -2 : 0;
renderWindow.Draw(sprite, buttonLayout.XSegments, buttonLayout.YSegments, frame);
label.Location = new Point(location.X + offset + labelOffset.X, location.Y - offset + labelOffset.Y); var offset = pressed ? -2 : 0;
renderWindow.Draw(label);
} label.Location = new Point(location.X + offset + labelOffset.X, location.Y - offset + labelOffset.Y);
renderWindow.Draw(label);
private void UpdateText() }
{
label.Text = text; private void UpdateText()
label.TextColor = Color.FromArgb(75, 75, 75); {
label.Text = text;
var offsetX = (buttonWidth / 2) - (label.TextArea.Width / 2); label.TextColor = Color.FromArgb(75, 75, 75);
var offsetY = (buttonHeight / 2) - (label.TextArea.Height / 2);
labelOffset = new Point(offsetX, offsetY - 5); var offsetX = (buttonWidth / 2) - (label.TextArea.Width / 2);
} var offsetY = (buttonHeight / 2) - (label.TextArea.Height / 2);
labelOffset = new Point(offsetX, offsetY - 5);
public void Dispose() }
{
sprite.Dispose(); public void Dispose()
font.Dispose(); {
label.Dispose(); sprite.Dispose();
} font.Dispose();
} label.Dispose();
} }
}
}

View File

@ -38,7 +38,7 @@ namespace OpenDiablo2.Core.UI
// Test fields // Test fields
private bool addNewAttribute = true; private bool addNewAttribute = true;
private bool addNewSkill = false; private bool addNewSkill = true;
public GameHUD( public GameHUD(
IRenderWindow renderWindow, IRenderWindow renderWindow,
@ -74,6 +74,7 @@ namespace OpenDiablo2.Core.UI
addSkillButton = createButton(eButtonType.Skill); addSkillButton = createButton(eButtonType.Skill);
addSkillButton.Location = new Point(564, 562); addSkillButton.Location = new Point(564, 562);
addSkillButton.Enabled = addNewSkill; addSkillButton.Enabled = addNewSkill;
addSkillButton.OnActivate = () => TogglePanel(ePanelType.Skill);
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);

View File

@ -55,14 +55,10 @@ namespace OpenDiablo2.Core.UI
secondaryLeftButton = createButton(eButtonType.SecondaryInvHand); secondaryLeftButton = createButton(eButtonType.SecondaryInvHand);
secondaryLeftButton.Location = panelSprite.Location + new Size(15, 22); secondaryLeftButton.Location = panelSprite.Location + new Size(15, 22);
secondaryLeftButton.OnActivate = ToggleWeaponsSlot; secondaryLeftButton.OnActivate = ToggleWeaponsSlot;
secondaryLeftButton.ClickableRect = new Size(0, 20);
secondaryLeftButton.AllowFrameChange = false;
secondaryRightButton = createButton(eButtonType.SecondaryInvHand); secondaryRightButton = createButton(eButtonType.SecondaryInvHand);
secondaryRightButton.Location = panelSprite.Location + new Size(246, 22); secondaryRightButton.Location = panelSprite.Location + new Size(246, 22);
secondaryRightButton.OnActivate = ToggleWeaponsSlot; secondaryRightButton.OnActivate = ToggleWeaponsSlot;
secondaryRightButton.ClickableRect = new Size(0, 20);
secondaryRightButton.AllowFrameChange = false;
goldButton = createButton(eButtonType.GoldCoin); goldButton = createButton(eButtonType.GoldCoin);
goldButton.Location = panelSprite.Location + new Size(84, 391); goldButton.Location = panelSprite.Location + new Size(84, 391);

View File

@ -0,0 +1,83 @@
/* 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.Extensions;
using OpenDiablo2.Common.Interfaces;
using OpenDiablo2.Common.Interfaces.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenDiablo2.Core.UI
{
public class SkillsPanel : ISkillsPanel
{
private readonly IRenderWindow renderWindow;
private readonly ISprite panelSprite;
private readonly IButton[] treeButtons;
public event OnPanelClosedEvent OnPanelClosed;
// Test fields
private readonly eHero hero = eHero.Barbarian;
public SkillsPanel(
IRenderWindow renderWindow,
Func<eHero, int, IButton> createTreeButton,
Func<eButtonType, IButton> createButton)
{
this.renderWindow = renderWindow;
panelSprite = renderWindow.LoadSprite(ResourcePaths.GetHeroSkillPanel(hero), Palettes.Act1, FrameType.GetOffset(), true);
treeButtons = Enumerable.Range(0, 3).Select(o =>
{
var btn = createTreeButton(hero, o);
btn.Location = FrameType.GetOffset();
btn.OnActivate = () => { ActivePanelIndex = o; };
return btn;
}).ToArray();
}
public ePanelType PanelType => ePanelType.Skill;
public ePanelFrameType FrameType => ePanelFrameType.Right;
public int ActivePanelIndex { get; private set; }
public void Update()
{
foreach (var button in treeButtons)
button.Update();
}
public void Render()
{
renderWindow.Draw(panelSprite, 2, 2, 0);
treeButtons[ActivePanelIndex].Render();
}
public void Dispose()
{
panelSprite.Dispose();
}
}
}

View File

@ -1,117 +1,122 @@
/* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C# /* OpenDiablo 2 - An open source re-implementation of Diablo 2 in C#
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* 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; using OpenDiablo2.Common;
using OpenDiablo2.Common.Attributes; using OpenDiablo2.Common.Attributes;
using OpenDiablo2.Common.Enums; using OpenDiablo2.Common.Enums;
using OpenDiablo2.Common.Interfaces; using OpenDiablo2.Common.Interfaces;
using System; using System;
namespace OpenDiablo2.Scenes namespace OpenDiablo2.Scenes
{ {
[Scene(eSceneType.Game)] [Scene(eSceneType.Game)]
public sealed class Game : IScene public sealed class Game : IScene
{ {
private readonly IRenderWindow renderWindow; private readonly IRenderWindow renderWindow;
private readonly IMapEngine mapEngine; private readonly IMapEngine mapEngine;
private readonly IMouseInfoProvider mouseInfoProvider; private readonly IMouseInfoProvider mouseInfoProvider;
private readonly IGameState gameState; private readonly IGameState gameState;
private readonly ISessionManager sessionManager; private readonly ISessionManager sessionManager;
private readonly IGameHUD gameHUD; private readonly IGameHUD gameHUD;
private eMovementType lastMovementType = eMovementType.Stopped; private eMovementType lastMovementType = eMovementType.Stopped;
private byte lastDirection = 255; private byte lastDirection = 255;
private bool clickedOnHud = false;
const double Rad2Deg = 180.0 / Math.PI;
const double Rad2Deg = 180.0 / Math.PI;
public Game(
IRenderWindow renderWindow, public Game(
IMapEngine mapEngine, IRenderWindow renderWindow,
IGameState gameState, IMapEngine mapEngine,
IMouseInfoProvider mouseInfoProvider, IGameState gameState,
IItemManager itemManager, IMouseInfoProvider mouseInfoProvider,
ISessionManager sessionManager, IItemManager itemManager,
ISoundProvider soundProvider, ISessionManager sessionManager,
IMPQProvider mpqProvider, ISoundProvider soundProvider,
IGameHUD gameHUD IMPQProvider mpqProvider,
) IGameHUD gameHUD
{ )
this.renderWindow = renderWindow; {
this.mapEngine = mapEngine; this.renderWindow = renderWindow;
this.gameState = gameState; this.mapEngine = mapEngine;
this.mouseInfoProvider = mouseInfoProvider; this.gameState = gameState;
this.sessionManager = sessionManager; this.mouseInfoProvider = mouseInfoProvider;
this.gameHUD = gameHUD; this.sessionManager = sessionManager;
this.gameHUD = gameHUD;
//var item = itemManager.getItem("hdm");
} //var item = itemManager.getItem("hdm");
}
public void Render()
{ public void Render()
// TODO: Maybe show some sort of connecting/loading message? {
if (mapEngine.FocusedPlayerId == 0) // TODO: Maybe show some sort of connecting/loading message?
return; if (mapEngine.FocusedPlayerId == 0)
return;
mapEngine.Render();
gameHUD.Render(); mapEngine.Render();
} gameHUD.Render();
}
public void Update(long ms)
{ public void Update(long ms)
HandleMovement(); {
HandleMovement();
mapEngine.Update(ms);
gameHUD.Update(); mapEngine.Update(ms);
} gameHUD.Update();
}
private void HandleMovement()
{ private void HandleMovement()
// todo; if clicked on hud, then we don't move. But when clicked on map and move cursor over hud, then it's fine {
if (gameHUD.IsMouseOver()) if(gameHUD.IsMouseOver() && lastMovementType == eMovementType.Stopped)
return; clickedOnHud = true;
else if (!mouseInfoProvider.LeftMouseDown)
var mx = mouseInfoProvider.MouseX - 400 - gameState.CameraOffset; clickedOnHud = false;
var my = mouseInfoProvider.MouseY - 300;
if (clickedOnHud)
var tx = (mx / 60f + my / 40f) / 2f; return;
var ty = (my / 40f - (mx / 60f)) / 2f;
var cursorDirection = (int)Math.Round(Math.Atan2(ty, tx) * Rad2Deg); var mx = mouseInfoProvider.MouseX - 400 - gameState.CameraOffset;
if (cursorDirection < 0) var my = mouseInfoProvider.MouseY - 300;
cursorDirection += 360;
var actualDirection = (byte)(cursorDirection / 22); var tx = (mx / 60f + my / 40f) / 2f;
if (actualDirection >= 16) var ty = (my / 40f - (mx / 60f)) / 2f;
actualDirection -= 16; var cursorDirection = (int)Math.Round(Math.Atan2(ty, tx) * Rad2Deg);
if (cursorDirection < 0)
if (mouseInfoProvider.LeftMouseDown && (lastMovementType == eMovementType.Stopped || lastDirection != actualDirection)) cursorDirection += 360;
{ var actualDirection = (byte)(cursorDirection / 22);
lastDirection = actualDirection; if (actualDirection >= 16)
lastMovementType = gameHUD.IsRunningEnabled ? eMovementType.Running : eMovementType.Walking; actualDirection -= 16;
sessionManager.MoveRequest(actualDirection, lastMovementType);
} if (mouseInfoProvider.LeftMouseDown && (lastMovementType == eMovementType.Stopped || lastDirection != actualDirection))
else if (!mouseInfoProvider.LeftMouseDown && lastMovementType != eMovementType.Stopped) {
{ lastDirection = actualDirection;
lastDirection = actualDirection; lastMovementType = gameHUD.IsRunningEnabled ? eMovementType.Running : eMovementType.Walking;
lastMovementType = eMovementType.Stopped; sessionManager.MoveRequest(actualDirection, lastMovementType);
sessionManager.MoveRequest(actualDirection, lastMovementType); }
} else if (!mouseInfoProvider.LeftMouseDown && lastMovementType != eMovementType.Stopped)
} {
lastDirection = actualDirection;
public void Dispose() lastMovementType = eMovementType.Stopped;
{ sessionManager.MoveRequest(actualDirection, lastMovementType);
}
} }
}
} public void Dispose()
{
}
}
}

View File

@ -71,6 +71,7 @@
<HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath> <HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Reflection.TypeExtensions, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Reflection.TypeExtensions, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Reflection.TypeExtensions.4.5.1\lib\net461\System.Reflection.TypeExtensions.dll</HintPath> <HintPath>..\packages\System.Reflection.TypeExtensions.4.5.1\lib\net461\System.Reflection.TypeExtensions.dll</HintPath>
</Reference> </Reference>

View File

@ -15,11 +15,13 @@
*/ */
using System; using System;
using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Autofac; using Autofac;
using CommandLine; using CommandLine;
using OpenDiablo2.Common;
using OpenDiablo2.Common.Enums; using OpenDiablo2.Common.Enums;
using OpenDiablo2.Common.Interfaces; using OpenDiablo2.Common.Interfaces;
using OpenDiablo2.Common.Models; using OpenDiablo2.Common.Models;
@ -106,6 +108,21 @@ namespace OpenDiablo2
return (buttonType) => componentContext.Resolve<IButton>(new NamedParameter("buttonLayout", ButtonLayout.Values[buttonType])); return (buttonType) => componentContext.Resolve<IButton>(new NamedParameter("buttonLayout", ButtonLayout.Values[buttonType]));
}); });
containerBuilder.Register<Func<eHero, int, IButton>>(c =>
{
var componentContext = c.Resolve<IComponentContext>();
return (hero, tabIndex) => componentContext.Resolve<IButton>(new NamedParameter("buttonLayout", new ButtonLayout()
{
XSegments = 2,
YSegments = 2,
BaseFrame = 3 - tabIndex, // tabs are ordered from the bottom in the files
PaletteName = Palettes.Units,
ResourceName = ResourcePaths.GetHeroSkillPanel(hero),
ClickableRect = new Rectangle(227, (tabIndex + 1) * 107, 95, 108), // todo; verify clickable rectangle
AllowFrameChange = false
}));
});
containerBuilder.Register<Func<ePanelFrameType, IPanelFrame>>(c => containerBuilder.Register<Func<ePanelFrameType, IPanelFrame>>(c =>
{ {
var componentContext = c.Resolve<IComponentContext>(); var componentContext = c.Resolve<IComponentContext>();