Browse Source

Move select game logic to UiSelectGame()

pull/25/head
Anders Jenbo 7 years ago
parent
commit
281ade83c2
  1. 3
      CMakeLists.txt
  2. 7
      Stub/DiabloUI/diabloui.cpp
  3. 7
      Stub/DiabloUI/dialogs.cpp
  4. 12
      Stub/DiabloUI/selconn.cpp
  5. 134
      Stub/DiabloUI/selgame.cpp
  6. 9
      Stub/DiabloUI/selgame.h
  7. 335
      Stub/DiabloUI/selhero.cpp
  8. 13
      Stub/DiabloUI/selhero.h

3
CMakeLists.txt

@ -146,12 +146,13 @@ set(STUB_SOURCES
Stub/dvlnet/base.cpp
Stub/dvlnet/udp_p2p.cpp
Stub/DiabloUI/dialogs.cpp
Stub/DiabloUI/credits.cpp
Stub/DiabloUI/diabloui.cpp
Stub/DiabloUI/dialogs.cpp
Stub/DiabloUI/mainmenu.cpp
Stub/DiabloUI/progress.cpp
Stub/DiabloUI/selconn.cpp
Stub/DiabloUI/selgame.cpp
Stub/DiabloUI/selhero.cpp
Stub/DiabloUI/title.cpp

7
Stub/DiabloUI/diabloui.cpp

@ -494,13 +494,6 @@ BOOL __stdcall UiArtCallback(int game_type, unsigned int art_code, PALETTEENTRY
UNIMPLEMENTED();
}
int __stdcall UiSelectGame(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info,
_SNETVERSIONDATA *file_info, int *playerId)
{
SNetCreateGame(NULL, NULL, NULL, 0, NULL, 0, MAX_PLRS, NULL, NULL, playerId);
return 1;
}
BOOL __stdcall UiCreatePlayerDescription(_uiheroinfo *info, DWORD mode, char *desc)
{
char format[32] = "";

7
Stub/DiabloUI/dialogs.cpp

@ -1,12 +1,5 @@
#include "../../types.h"
UI_Item ENTERIP_DIALOG[] = {
{ { 305, 210, 285, 33 }, UI_TEXT, UIS_CENTER, 0, "Enter IP" },
{ { 305, 314, 285, 33 }, UI_EDIT, UIS_LIST, 128 }, // input
{ { 300, 426, 140, 35 }, UI_BUTTON, 0, 0, "OK" },
{ { 450, 426, 140, 35 }, UI_BUTTON, 0, 0, "Cancel" },
};
UI_Item OKCANCEL_DIALOG[] = {
{ { 180, 168, 280, 144 }, UI_IMAGE, 0, 0, "ui_art\\spopup.pcx" },
{ { 200, 180, 240, 80 }, UI_TEXT, UIS_CENTER }, // message

12
Stub/DiabloUI/selconn.cpp

@ -13,6 +13,12 @@ _SNETVERSIONDATA *selconn_FileInfo;
UI_Item SELCONNECT_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
{ { 24, 161, 590, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Multi Player Game" },
{ { 35, 218, 205, 21 }, UI_TEXT, 0, 0, selconn_MaxPlayers }, // Max players
{ { 35, 256, 205, 21 }, UI_TEXT, 0, 0, "Requirements:" },
{ { 35, 275, 205, 66 }, UI_TEXT, 0, 0, selconn_Description }, //Description
{ { 30, 356, 220, 31 }, UI_TEXT, UIS_CENTER | UIS_MED, 0, "no gateway needed" },
{ { 35, 393, 205, 21 }, UI_TEXT, UIS_CENTER, 0, selconn_Gateway }, // Gateway
{ { 16, 427, 250, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD | UIS_HIDDEN, 0, "Change Gateway" },
{ { 300, 211, 295, 33 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Select Connection" },
{ { 305, 256, 285, 26 }, UI_LIST, UIS_CENTER | UIS_VCENTER | UIS_GOLD, 0, "Local Area Network (UDP)" },
{ { 305, 282, 285, 26 }, UI_LIST, UIS_CENTER | UIS_VCENTER | UIS_GOLD, 1, "Solo" },
@ -20,12 +26,6 @@ UI_Item SELCONNECT_DIALOG[] = {
{ { 305, 334, 285, 26 }, UI_LIST, UIS_CENTER | UIS_VCENTER | UIS_GOLD },
{ { 305, 360, 285, 26 }, UI_LIST, UIS_CENTER | UIS_VCENTER | UIS_GOLD },
{ { 305, 386, 285, 26 }, UI_LIST, UIS_CENTER | UIS_VCENTER | UIS_GOLD },
{ { 35, 218, 205, 21 }, UI_TEXT, 0, 0, selconn_MaxPlayers }, // Max players
{ { 35, 256, 205, 21 }, UI_TEXT, 0, 0, "Requirements:" },
{ { 35, 275, 205, 66 }, UI_TEXT, 0, 0, selconn_Description }, //Description
{ { 30, 356, 220, 31 }, UI_TEXT, UIS_CENTER | UIS_MED, 0, "no gateway needed" },
{ { 35, 393, 205, 21 }, UI_TEXT, UIS_CENTER, 0, selconn_Gateway }, // Gateway
{ { 16, 427, 250, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD | UIS_HIDDEN, 0, "Change Gateway" },
{ { 299, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "OK", UiFocusNavigationSelect },
{ { 454, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};

134
Stub/DiabloUI/selgame.cpp

@ -0,0 +1,134 @@
#include "selgame.h"
char selgame_Lable[32];
char selgame_Description[256];
bool selgame_start;
bool selgame_endMenu;
UI_Item SELUDPGAME_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
{ { 25, 161, 590, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Join UDP Games" },
{ { 300, 211, 295, 33 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Select Action" },
{ { 305, 255, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 0, "Create Game" },
{ { 305, 281, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 1, "Enter IP" },
{ { 305, 307, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 2, "Localhost" },
{ { 305, 333, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 305, 359, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 305, 385, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 35, 211, 205, 33 }, UI_TEXT, UIS_MED, 0, "Description:" },
{ { 35, 256, 205, 192 }, UI_TEXT, 0, 0, selgame_Description }, // Description
{ { 299, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "OK", UiFocusNavigationSelect },
{ { 449, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};
UI_Item SELDIFF_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
{ { 24, 161, 590, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Create Game" },
{ { 299, 211, 295, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Select Difficulty" },
{ { 300, 282, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_NORMAL, "Normal" },
{ { 300, 308, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_NIGHTMARE, "Nightmare" },
{ { 300, 334, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_HELL, "Hell" },
{ { 34, 211, 205, 33 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, selgame_Lable }, // DIFF
{ { 35, 256, 205, 192 }, UI_TEXT, 0, 0, selgame_Description }, // Description
{ { 299, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "OK", UiFocusNavigationSelect },
{ { 449, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};
UI_Item ENTERIP_DIALOG[] = {
{ { 305, 210, 285, 33 }, UI_TEXT, UIS_CENTER, 0, "Enter IP" },
{ { 305, 314, 285, 33 }, UI_EDIT, UIS_LIST, 128 }, // input
{ { 300, 426, 140, 35 }, UI_BUTTON, 0, 0, "OK" },
{ { 450, 426, 140, 35 }, UI_BUTTON, 0, 0, "Cancel" },
};
void selgame_Free()
{
mem_free_dbg(ArtBackground.data);
ArtBackground.data = NULL;
}
void selgame_GameSelection_Init()
{
UiInitList(0, 2, selgame_GameSelection_Focus, selgame_GameSelection_Select, selgame_GameSelection_Esc, SELUDPGAME_DIALOG, size(SELUDPGAME_DIALOG));
}
void selgame_GameSelection_Focus(int value)
{
switch (value) {
case 0:
sprintf(selgame_Description, "Create a new game with a difficulty setting of your choice.");
break;
case 1:
sprintf(selgame_Description, "Join a game directly via a know host IP.");
break;
default:
sprintf(selgame_Description, "%s.\nCreated by %s, a level %d %s.", "Normal Difficulty", "Localhost", 1, "Warrior");
break;
}
for (auto &item : SELUDPGAME_DIALOG) {
if (item.caption != NULL && !(item.flags & (UIS_VCENTER | UIS_CENTER)))
WordWrap(&item);
}
}
void selgame_GameSelection_Select(int value)
{
UiInitList(0, 2, selgame_Diff_Focus, selgame_Diff_Select, selgame_GameSelection_Init, SELDIFF_DIALOG, size(SELDIFF_DIALOG));
}
void selgame_GameSelection_Esc()
{
selgame_endMenu = true;
selgame_start = false;
}
void selgame_Diff_Focus(int value)
{
switch (value) {
case DIFF_NORMAL:
sprintf(selgame_Lable, "Normal");
sprintf(selgame_Description, "Normal Difficulty\nThis is where a starting character should begin the quest to defeat Diablo.");
break;
case DIFF_NIGHTMARE:
sprintf(selgame_Lable, "Nightmare");
sprintf(selgame_Description, "Nightmare Difficulty\nThe denizens of the Labyrinth have been bolstered and will prove to be a greater challenge. This is recommended for experienced characters only.");
break;
case DIFF_HELL:
sprintf(selgame_Lable, "Hell");
sprintf(selgame_Description, "Hell Difficulty\nThe most powerful of the underworld's creatures lurk at the gateway into Hell. Only the most experienced characters should venture in this realm.");
break;
}
for (auto &item : SELDIFF_DIALOG) {
if (item.caption != NULL && !(item.flags & (UIS_VCENTER | UIS_CENTER)))
WordWrap(&item);
}
}
void selgame_Diff_Select(int value)
{
selgame_endMenu = true;
selgame_start = true;
gnDifficulty = value;
}
int __stdcall UiSelectGame(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info,
_SNETVERSIONDATA *file_info, int *playerId)
{
LoadBackgroundArt("ui_art\\selgame.pcx");
selgame_GameSelection_Init();
selgame_start = false;
selgame_endMenu = false;
while (!selgame_endMenu) {
UiRender();
}
BlackPalette();
selgame_Free();
if (selgame_start)
SNetCreateGame(NULL, NULL, NULL, 0, NULL, 0, MAX_PLRS, NULL, NULL, playerId);
return selgame_start;
}

9
Stub/DiabloUI/selgame.h

@ -0,0 +1,9 @@
#include "../../types.h"
void selgame_GameSelection_Init();
void selgame_GameSelection_Focus(int value);
void selgame_GameSelection_Select(int value);
void selgame_GameSelection_Esc();
void selgame_Diff_Focus(int value);
void selgame_Diff_Select(int value);

335
Stub/DiabloUI/selhero.cpp

@ -9,14 +9,12 @@ char title[32];
char selhero_Lable[32];
char selhero_Description[256];
int selhero_result;
bool selhero_return;
bool selhero_endMenu;
bool selhero_endMenu_Single;
bool isMultiPlayer;
bool heroIsCreated;
BOOL(__stdcall *gfnHeroStats)
(unsigned int, _uidefaultstats *);
BOOL(__stdcall *gfnHeroCreate)(_uiheroinfo *);
UI_Item SELHERO_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
@ -71,34 +69,12 @@ UI_Item SELLOAD_DIALOG[] = {
{ { 429, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};
UI_Item SELUDPGAME_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
{ { 25, 161, 590, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Join UDP Games" },
{ { 300, 211, 295, 33 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Select Action" },
{ { 305, 255, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 0, "Create Game" },
{ { 305, 281, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 1, "Enter IP" },
{ { 305, 307, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, 2, "Localhost" },
{ { 305, 333, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 305, 359, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 305, 385, 285, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD },
{ { 35, 211, 205, 33 }, UI_TEXT, UIS_MED, 0, "Description:" },
{ { 35, 256, 205, 192 }, UI_TEXT, 0, 0, selhero_Description }, // Description
{ { 299, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "OK", UiFocusNavigationSelect },
{ { 449, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};
UI_Item SELDIFF_DIALOG[] = {
{ { 0, 0, 640, 480 }, UI_IMAGE, 0, 0, NULL, &ArtBackground },
{ { 24, 161, 590, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Create Game" },
{ { 299, 211, 295, 35 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, "Select Difficulty" },
{ { 300, 282, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_NORMAL, "Normal" },
{ { 300, 308, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_NIGHTMARE, "Nightmare" },
{ { 300, 334, 295, 26 }, UI_LIST, UIS_CENTER | UIS_MED | UIS_GOLD, DIFF_HELL, "Hell" },
{ { 34, 211, 205, 33 }, UI_TEXT, UIS_CENTER | UIS_BIG, 0, selhero_Lable }, // DIFF
{ { 35, 256, 205, 192 }, UI_TEXT, 0, 0, selhero_Description }, // Description
{ { 299, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "OK", UiFocusNavigationSelect },
{ { 449, 427, 140, 35 }, UI_BUTTON, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD, 0, "Cancel", UiFocusNavigationEsc },
};
void selhero_Free()
{
mem_free_dbg(ArtBackground.data);
ArtBackground.data = NULL;
memset(listItems, 0, sizeof(listItems));
}
void selhero_SetStats()
{
@ -110,15 +86,23 @@ void selhero_SetStats()
sprintf(textStats[4], "%d", heroInfo.vitality);
}
BOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo)
void selhero_List_Init()
{
heros[selhero_SaveCount] = *pInfo;
selhero_SaveCount++;
UiInitList(0, selhero_SaveCount, selhero_List_Focus, selhero_List_Select, selhero_List_Esc, SELLIST_DIALOG, size(SELLIST_DIALOG));
int i;
for (i = 0; i < selhero_SaveCount && i < 6; i++) {
sprintf(listItems[i], heros[i].name);
}
if (i < 6)
sprintf(listItems[i], "New Hero");
return TRUE;
sprintf(title, "Single Player Characters");
if (isMultiPlayer) {
sprintf(title, "Multi Player Characters");
}
}
void selhero_Focus_List(int value)
void selhero_List_Focus(int value)
{
if (selhero_SaveCount && value < selhero_SaveCount) {
memcpy(&heroInfo, &heros[value], sizeof(heroInfo));
@ -134,27 +118,32 @@ void selhero_Focus_List(int value)
sprintf(textStats[4], "--");
}
void selhero_Name_Esc()
void selhero_List_Select(int value)
{
selhero_Select_List(selhero_SaveCount);
}
if (value == selhero_SaveCount) {
UiInitList(0, 2, selhero_ClassSelector_Focus, selhero_ClassSelector_Select, selhero_ClassSelector_Esc, SELCLASS_DIALOG, size(SELCLASS_DIALOG));
memset(&heroInfo.name, 0, sizeof(heroInfo.name));
sprintf(title, "New Single Player Hero");
if (isMultiPlayer) {
sprintf(title, "New Multi Player Hero");
}
return;
} else if (heroInfo.hassaved) {
UiInitList(0, 1, selhero_Load_Focus, selhero_Load_Select, selhero_List_Init, SELLOAD_DIALOG, size(SELLOAD_DIALOG), true);
sprintf(title, "Single Player Characters");
return;
}
void selhero_Select_Name(int value)
{
selhero_endMenu = true;
}
void selhero_Select_ClassSelector(int value)
void selhero_List_Esc()
{
sprintf(title, "New Single Player Hero");
if (isMultiPlayer) {
sprintf(title, "New Multi Player Hero");
}
memset(heroInfo.name, '\0', sizeof(heroInfo.name));
UiInitList(0, 0, NULL, selhero_Select_Name, selhero_Name_Esc, ENTERNAME_DIALOG, size(ENTERNAME_DIALOG));
selhero_endMenu = true;
selhero_result = EXIT_MENU;
}
void selhero_Focus_ClassSelector(int value)
void selhero_ClassSelector_Focus(int value)
{
_uidefaultstats defaults;
gfnHeroStats(value, &defaults);
@ -169,103 +158,44 @@ void selhero_Focus_ClassSelector(int value)
selhero_SetStats();
}
void selhero_Select_List(int value)
{
if (value == selhero_SaveCount) {
UiInitList(0, 2, selhero_Focus_ClassSelector, selhero_Select_ClassSelector, selhero_ClassSelector_Esc, SELCLASS_DIALOG, size(SELCLASS_DIALOG));
memset(&heroInfo.name, 0, sizeof(heroInfo.name));
sprintf(title, "New Single Player Hero");
if (isMultiPlayer) {
sprintf(title, "New Multi Player Hero");
}
return;
}
heroIsCreated = true;
selhero_return = false;
selhero_endMenu = true;
}
void selhero_Load(BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)))
{
LoadBackgroundArt("ui_art\\selhero.pcx");
selhero_SaveCount = 0;
fninfo(SelHero_GetHeroInfo);
}
void selhero_Free()
{
mem_free_dbg(ArtBackground.data);
ArtBackground.data = NULL;
memset(listItems, 0, sizeof(listItems));
}
void selhero_List_Esc()
{
selhero_return = true;
selhero_endMenu = true;
}
void selhero_init_List()
void selhero_ClassSelector_Select(int value)
{
UiInitList(0, selhero_SaveCount, selhero_Focus_List, selhero_Select_List, selhero_List_Esc, SELLIST_DIALOG, size(SELLIST_DIALOG));
int i;
for (i = 0; i < selhero_SaveCount && i < 6; i++) {
sprintf(listItems[i], heros[i].name);
}
if (i < 6)
sprintf(listItems[i], "New Hero");
sprintf(title, "Single Player Characters");
sprintf(title, "New Single Player Hero");
if (isMultiPlayer) {
sprintf(title, "Multi Player Characters");
sprintf(title, "New Multi Player Hero");
}
memset(heroInfo.name, '\0', sizeof(heroInfo.name));
UiInitList(0, 0, NULL, selhero_Name_Select, selhero_Name_Esc, ENTERNAME_DIALOG, size(ENTERNAME_DIALOG));
}
void selhero_ClassSelector_Esc()
{
if (selhero_SaveCount) {
selhero_init_List();
selhero_List_Init();
return;
}
selhero_List_Esc();
}
void selhero_Esc()
void selhero_Name_Select(int value)
{
selhero_endMenu_Single = true;
selhero_result = EXIT_MENU;
gfnHeroCreate(&heroInfo);
selhero_endMenu = true;
}
bool UiSelHeroDialog(BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *))
void selhero_Name_Esc()
{
selhero_return = false;
selhero_endMenu = false;
heroIsCreated = false;
if (selhero_SaveCount) {
selhero_init_List();
} else {
selhero_Select_List(selhero_SaveCount);
}
while (!selhero_endMenu) {
UiRenderItems(SELHERO_DIALOG, size(SELHERO_DIALOG));
UiRender();
}
if (!heroIsCreated) {
fncreate(&heroInfo);
}
selhero_List_Select(selhero_SaveCount);
}
return selhero_return;
void selhero_Load_Focus(int value)
{
}
void selhero_Select_Load(int value)
void selhero_Load_Select(int value)
{
selhero_endMenu_Single = true;
selhero_endMenu = true;
if (value == 0) {
selhero_result = LOAD_GAME;
return;
@ -274,123 +204,60 @@ void selhero_Select_Load(int value)
selhero_result = NEW_GAME;
}
void selhero_Focus_Load(int value)
BOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo)
{
heros[selhero_SaveCount] = *pInfo;
selhero_SaveCount++;
return TRUE;
}
BOOL __stdcall UiSelHeroSingDialog(
BOOL UiSelHeroDialog(
BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)),
BOOL(__stdcall *fncreate)(_uiheroinfo *),
BOOL(__stdcall *fnremove)(_uiheroinfo *),
BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *),
int *dlgresult,
char *name,
int *difficulty)
char *name)
{
selhero_result = *dlgresult;
gfnHeroStats = fnstats;
gfnHeroCreate = fncreate;
LoadBackgroundArt("ui_art\\selhero.pcx");
selhero_Load(fninfo);
isMultiPlayer = false;
if (UiSelHeroDialog(fncreate, fnremove)) {
BlackPalette();
selhero_Free();
*dlgresult = EXIT_MENU;
return TRUE;
}
strcpy(name, heroInfo.name);
if (heroInfo.hassaved) {
UiInitList(0, 1, selhero_Focus_Load, selhero_Select_Load, selhero_Esc, SELLOAD_DIALOG, size(SELLOAD_DIALOG), true);
sprintf(title, "Single Player Characters");
selhero_SaveCount = 0;
fninfo(SelHero_GetHeroInfo);
selhero_endMenu_Single = false;
while (!selhero_endMenu_Single) {
UiRenderItems(SELHERO_DIALOG, size(SELHERO_DIALOG));
UiRender();
}
if (selhero_SaveCount) {
selhero_List_Init();
} else {
selhero_List_Select(selhero_SaveCount);
}
selhero_endMenu = false;
while (!selhero_endMenu) {
UiRenderItems(SELHERO_DIALOG, size(SELHERO_DIALOG));
UiRender();
}
BlackPalette();
selhero_Free();
strcpy(name, heroInfo.name);
*dlgresult = selhero_result;
return TRUE;
}
//////////////////////////////////////////
// MULTI PLAYER //
//////////////////////////////////////////
void selhero_multi_Load()
{
LoadBackgroundArt("ui_art\\selgame.pcx");
}
void selhero_multi_Free()
{
mem_free_dbg(ArtBackground.data);
ArtBackground.data = NULL;
}
void selhero_Select_Diff(int value)
{
selhero_endMenu_Single = true;
selhero_result = NEW_GAME;
gnDifficulty = value;
}
void selhero_Focus_Diff(int value)
{
switch (value) {
case DIFF_NORMAL:
sprintf(selhero_Lable, "Normal");
sprintf(selhero_Description, "Normal Difficulty\nThis is where a starting character should begin the quest to defeat Diablo.");
break;
case DIFF_NIGHTMARE:
sprintf(selhero_Lable, "Nightmare");
sprintf(selhero_Description, "Nightmare Difficulty\nThe denizens of the Labyrinth have been bolstered and will prove to be a greater challenge. This is recommended for experienced characters only.");
break;
case DIFF_HELL:
sprintf(selhero_Lable, "Hell");
sprintf(selhero_Description, "Hell Difficulty\nThe most powerful of the underworld's creatures lurk at the gateway into Hell. Only the most experienced characters should venture in this realm.");
break;
}
for (auto &item : SELDIFF_DIALOG) {
if (item.caption != NULL && !(item.flags & (UIS_VCENTER | UIS_CENTER)))
WordWrap(&item);
}
}
void selhero_Select_GameSelection(int value)
{
UiInitList(0, 2, selhero_Focus_Diff, selhero_Select_Diff, selhero_init_GameSelection, SELDIFF_DIALOG, size(SELDIFF_DIALOG));
}
void selhero_Focus_GameSelection(int value)
{
switch (value) {
case 0:
sprintf(selhero_Description, "Create a new game with a difficulty setting of your choice.");
break;
case 1:
sprintf(selhero_Description, "Join a game directly via a know host IP.");
break;
default:
sprintf(selhero_Description, "%s.\nCreated by %s, a level %d %s.", "Normal Difficulty", "Localhost", 1, "Warrior");
break;
}
for (auto &item : SELUDPGAME_DIALOG) {
if (item.caption != NULL && !(item.flags & (UIS_VCENTER | UIS_CENTER)))
WordWrap(&item);
}
}
void selhero_init_GameSelection()
BOOL __stdcall UiSelHeroSingDialog(
BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)),
BOOL(__stdcall *fncreate)(_uiheroinfo *),
BOOL(__stdcall *fnremove)(_uiheroinfo *),
BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *),
int *dlgresult,
char *name,
int *difficulty)
{
UiInitList(0, 2, selhero_Focus_GameSelection, selhero_Select_GameSelection, selhero_Esc, SELUDPGAME_DIALOG, size(SELUDPGAME_DIALOG));
isMultiPlayer = false;
return UiSelHeroDialog(fninfo, fncreate, fnstats, dlgresult, name);
}
BOOL __stdcall UiSelHeroMultDialog(
@ -402,32 +269,6 @@ BOOL __stdcall UiSelHeroMultDialog(
BOOL *hero_is_created,
char *name)
{
gfnHeroStats = fnstats;
*hero_is_created = false;
selhero_Load(fninfo);
isMultiPlayer = true;
bool abort = UiSelHeroDialog(fncreate, fnremove);
BlackPalette();
selhero_Free();
if (abort) {
*dlgresult = EXIT_MENU;
return TRUE;
}
strcpy(name, heroInfo.name);
selhero_multi_Load();
selhero_init_GameSelection();
selhero_endMenu_Single = false;
while (!selhero_endMenu_Single) {
UiRender();
}
BlackPalette();
selhero_Free();
*dlgresult = selhero_result;
return TRUE;
return UiSelHeroDialog(fninfo, fncreate, fnstats, dlgresult, name);
}

13
Stub/DiabloUI/selhero.h

@ -1,8 +1,13 @@
#include "../../types.h"
void selhero_Select_List(int value);
void selhero_ClassSelector_Esc();
void selhero_init_GameSelection();
void selhero_List_Init();
void selhero_List_Focus(int value);
void selhero_List_Select(int value);
void selhero_List_Esc();
void selhero_Esc();
void selhero_ClassSelector_Focus(int value);
void selhero_ClassSelector_Select(int value);
void selhero_ClassSelector_Esc();
void selhero_Name_Select(int value);
void selhero_Name_Esc();
void selhero_Load_Focus(int value);
void selhero_Load_Select(int value);

Loading…
Cancel
Save