From 281ade83c2da3b03445584e1ef27de35ac396359 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 17 Feb 2019 23:22:44 +0100 Subject: [PATCH] Move select game logic to UiSelectGame() --- CMakeLists.txt | 3 +- Stub/DiabloUI/diabloui.cpp | 7 - Stub/DiabloUI/dialogs.cpp | 7 - Stub/DiabloUI/selconn.cpp | 12 +- Stub/DiabloUI/selgame.cpp | 134 +++++++++++++++ Stub/DiabloUI/selgame.h | 9 + Stub/DiabloUI/selhero.cpp | 335 ++++++++++--------------------------- Stub/DiabloUI/selhero.h | 13 +- 8 files changed, 248 insertions(+), 272 deletions(-) create mode 100644 Stub/DiabloUI/selgame.cpp create mode 100644 Stub/DiabloUI/selgame.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e46a2de8..0685acb9a 100644 --- a/CMakeLists.txt +++ b/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 diff --git a/Stub/DiabloUI/diabloui.cpp b/Stub/DiabloUI/diabloui.cpp index ece4bac2e..1371b0890 100644 --- a/Stub/DiabloUI/diabloui.cpp +++ b/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] = ""; diff --git a/Stub/DiabloUI/dialogs.cpp b/Stub/DiabloUI/dialogs.cpp index 27ab59a6b..fc3bd40ae 100644 --- a/Stub/DiabloUI/dialogs.cpp +++ b/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 diff --git a/Stub/DiabloUI/selconn.cpp b/Stub/DiabloUI/selconn.cpp index 8ebaaab41..e0ebb03d5 100644 --- a/Stub/DiabloUI/selconn.cpp +++ b/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 }, }; diff --git a/Stub/DiabloUI/selgame.cpp b/Stub/DiabloUI/selgame.cpp new file mode 100644 index 000000000..d335e14f4 --- /dev/null +++ b/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; +} diff --git a/Stub/DiabloUI/selgame.h b/Stub/DiabloUI/selgame.h new file mode 100644 index 000000000..d31885eac --- /dev/null +++ b/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); diff --git a/Stub/DiabloUI/selhero.cpp b/Stub/DiabloUI/selhero.cpp index d491aea83..0719c8c88 100644 --- a/Stub/DiabloUI/selhero.cpp +++ b/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); } diff --git a/Stub/DiabloUI/selhero.h b/Stub/DiabloUI/selhero.h index 2613872d2..50e623c97 100644 --- a/Stub/DiabloUI/selhero.h +++ b/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);