You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
4.6 KiB

#include "DiabloUI/diabloui.h"
#include "DiabloUI/text.h"
#include "stores.h"
#include "storm/storm.h"
namespace devilution {
int provider;
namespace {
char selconn_MaxPlayers[21];
char selconn_Description[64];
char selconn_Gateway[129];
bool selconn_ReturnValue = false;
bool selconn_EndMenu = false;
GameData *selconn_GameData;
std::vector<UiListItem *> vecConnItems;
std::vector<UiItemBase *> vecSelConnDlg;
#define DESCRIPTION_WIDTH 205
void selconn_Esc();
void selconn_Focus(int value);
void selconn_Select(int value);
void selconn_Load()
{
LoadBackgroundArt("ui_art\\selconn.pcx");
#ifndef NONET
vecConnItems.push_back(new UiListItem("Zerotier", SELCONN_ZT));
vecConnItems.push_back(new UiListItem("Client-Server (TCP)", SELCONN_TCP));
#endif
vecConnItems.push_back(new UiListItem("Loopback", SELCONN_LOOPBACK));
UiAddBackground(&vecSelConnDlg);
UiAddLogo(&vecSelConnDlg);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelConnDlg.push_back(new UiArtText("Multi Player Game", rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 218), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText(selconn_MaxPlayers, rect2));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText("Requirements:", rect3));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 275), DESCRIPTION_WIDTH, 66 };
vecSelConnDlg.push_back(new UiArtText(selconn_Description, rect4));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 356), 220, 31 };
vecSelConnDlg.push_back(new UiArtText("no gateway needed", rect5, UIS_CENTER | UIS_MED));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 393), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText(selconn_Gateway, rect6, UIS_CENTER));
SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 };
vecSelConnDlg.push_back(new UiArtText("Select Connection", rect7, UIS_CENTER | UIS_BIG));
SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 16), (Sint16)(UI_OFFSET_Y + 427), 250, 35 };
vecSelConnDlg.push_back(new UiArtTextButton("Change Gateway", nullptr, rect8, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD | UIS_HIDDEN));
vecSelConnDlg.push_back(new UiList(vecConnItems, PANEL_LEFT + 305, (UI_OFFSET_Y + 256), 285, 26, UIS_CENTER | UIS_VCENTER | UIS_GOLD));
SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelConnDlg.push_back(new UiArtTextButton("OK", &UiFocusNavigationSelect, rect9, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 454), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelConnDlg.push_back(new UiArtTextButton("Cancel", &UiFocusNavigationEsc, rect10, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecConnItems.size(), selconn_Focus, selconn_Select, selconn_Esc, vecSelConnDlg);
}
void selconn_Free()
{
ArtBackground.Unload();
for (auto pUIItem : vecConnItems) {
delete pUIItem;
}
vecConnItems.clear();
for (auto pUIMenuItem : vecSelConnDlg) {
delete pUIMenuItem;
}
vecSelConnDlg.clear();
}
void selconn_Esc()
{
selconn_ReturnValue = false;
selconn_EndMenu = true;
}
void selconn_Focus(int value)
{
int players = MAX_PLRS;
switch (vecConnItems[value]->m_value) {
case SELCONN_TCP:
strncpy(selconn_Description, "All computers must be connected to a TCP-compatible network.", sizeof(selconn_Description) - 1);
players = MAX_PLRS;
break;
case SELCONN_ZT:
strncpy(selconn_Description, "All computers must be connected to the internet.", sizeof(selconn_Description) - 1);
players = MAX_PLRS;
break;
case SELCONN_LOOPBACK:
strncpy(selconn_Description, "Play by yourself with no network exposure.", sizeof(selconn_Description) - 1);
players = 1;
break;
}
snprintf(selconn_MaxPlayers, sizeof(selconn_MaxPlayers), "Players Supported: %d", players);
WordWrapArtStr(selconn_Description, DESCRIPTION_WIDTH);
}
void selconn_Select(int value)
{
provider = vecConnItems[value]->m_value;
selconn_Free();
selconn_EndMenu = SNetInitializeProvider(provider, selconn_GameData);
selconn_Load();
}
} // namespace
int UiSelectProvider(GameData *gameData)
{
selconn_GameData = gameData;
selconn_Load();
selconn_ReturnValue = true;
selconn_EndMenu = false;
while (!selconn_EndMenu) {
UiClearScreen();
UiPollAndRender();
}
selconn_Free();
return selconn_ReturnValue;
}
} // namespace devilution