# include "selgame.h"
# include "devilution.h"
# include "config.h"
# include "DiabloUI/diabloui.h"
# include "DiabloUI/text.h"
# include "DiabloUI/dialogs.h"
namespace dvl {
char selgame_Label [ 32 ] ;
char selgame_Ip [ 129 ] = " " ;
char selgame_Password [ 16 ] = " " ;
char selgame_Description [ 256 ] ;
bool selgame_enteringGame ;
int selgame_selectedGame ;
bool selgame_endMenu ;
int * gdwPlayerId ;
int gbDifficulty ;
static _SNETPROGRAMDATA * m_client_info ;
extern DWORD provider ;
constexpr UiArtTextButton SELGAME_OK = UiArtTextButton ( " OK " , & UiFocusNavigationSelect , { 299 , 427 , 140 , 35 } , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD ) ;
constexpr UiArtTextButton SELGAME_CANCEL = UiArtTextButton ( " CANCEL " , & UiFocusNavigationEsc , { 449 , 427 , 140 , 35 } , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD ) ;
UiArtText SELGAME_DESCRIPTION ( selgame_Description , { 35 , 256 , 205 , 192 } ) ;
UiListItem SELDIFF_DIALOG_ITEMS [ ] = {
{ " Normal " , DIFF_NORMAL } ,
{ " Nightmare " , DIFF_NIGHTMARE } ,
{ " Hell " , DIFF_HELL }
} ;
UiItem SELDIFF_DIALOG [ ] = {
MAINMENU_BACKGROUND ,
MAINMENU_LOGO ,
UiArtText ( " Create Game " , { 24 , 161 , 590 , 35 } , UIS_CENTER | UIS_BIG ) ,
UiArtText ( selgame_Label , { 34 , 211 , 205 , 33 } , UIS_CENTER | UIS_BIG ) , // DIFF
SELGAME_DESCRIPTION ,
UiArtText ( " Select Difficulty " , { 299 , 211 , 295 , 35 } , UIS_CENTER | UIS_BIG ) ,
UiList ( SELDIFF_DIALOG_ITEMS , 300 , 282 , 295 , 26 , UIS_CENTER | UIS_MED | UIS_GOLD ) ,
SELGAME_OK ,
SELGAME_CANCEL ,
} ;
constexpr UiArtText SELUDPGAME_TITLE = UiArtText ( " Join TCP/UDP Games " , { 24 , 161 , 590 , 35 } , UIS_CENTER | UIS_BIG ) ;
constexpr UiArtText SELUDPGAME_DESCRIPTION_LABEL = UiArtText ( " Description: " , { 35 , 211 , 205 , 192 } , UIS_MED ) ;
UiListItem SELUDPGAME_DIALOG_ITEMS [ ] = {
{ " Create Game " , 0 } ,
{ " Enter IP " , 1 } ,
} ;
UiItem SELUDPGAME_DIALOG [ ] = {
MAINMENU_BACKGROUND ,
MAINMENU_LOGO ,
SELUDPGAME_TITLE ,
SELUDPGAME_DESCRIPTION_LABEL ,
SELGAME_DESCRIPTION ,
UiArtText ( " Select Action " , { 300 , 211 , 295 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiList ( SELUDPGAME_DIALOG_ITEMS , 305 , 255 , 285 , 26 , UIS_CENTER | UIS_MED | UIS_GOLD ) ,
SELGAME_OK ,
SELGAME_CANCEL ,
} ;
UiItem ENTERIP_DIALOG [ ] = {
MAINMENU_BACKGROUND ,
MAINMENU_LOGO ,
SELUDPGAME_TITLE ,
SELUDPGAME_DESCRIPTION_LABEL ,
SELGAME_DESCRIPTION ,
UiArtText ( " Enter IP " , { 305 , 211 , 285 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiEdit ( selgame_Ip , 128 , { 305 , 314 , 285 , 33 } , UIS_MED | UIS_GOLD ) ,
SELGAME_OK ,
SELGAME_CANCEL ,
} ;
UiItem ENTERPASSWORD_DIALOG [ ] = {
MAINMENU_BACKGROUND ,
MAINMENU_LOGO ,
SELUDPGAME_TITLE ,
SELUDPGAME_DESCRIPTION_LABEL ,
SELGAME_DESCRIPTION ,
UiArtText ( " Enter Password " , { 305 , 211 , 285 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiEdit ( selgame_Password , 15 , { 305 , 314 , 285 , 33 } , UIS_MED | UIS_GOLD ) ,
SELGAME_OK ,
SELGAME_CANCEL ,
} ;
void selgame_Free ( )
{
ArtBackground . Unload ( ) ;
}
void selgame_GameSelection_Init ( )
{
selgame_enteringGame = false ;
selgame_selectedGame = 0 ;
if ( provider = = ' SCBL ' ) {
selgame_enteringGame = true ;
selgame_GameSelection_Select ( 0 ) ;
return ;
}
SRegLoadString ( " Phone Book " , " Entry1 " , 0 , selgame_Ip , 128 ) ;
UiInitList ( 0 , 1 , selgame_GameSelection_Focus , selgame_GameSelection_Select , selgame_GameSelection_Esc , SELUDPGAME_DIALOG , size ( SELUDPGAME_DIALOG ) ) ;
}
void selgame_GameSelection_Focus ( int value )
{
switch ( value ) {
case 0 :
strcpy ( selgame_Description , " Create a new game with a difficulty setting of your choice. " ) ;
break ;
case 1 :
strcpy ( selgame_Description , " Enter an IP and join a game already in progress at that address. " ) ;
break ;
}
WordWrapArtStr ( selgame_Description , SELGAME_DESCRIPTION . rect . w ) ;
}
void selgame_GameSelection_Select ( int value )
{
selgame_enteringGame = true ;
selgame_selectedGame = value ;
switch ( value ) {
case 0 :
UiInitList ( 0 , NUM_DIFFICULTIES - 1 , selgame_Diff_Focus , selgame_Diff_Select , selgame_Diff_Esc , SELDIFF_DIALOG , size ( SELDIFF_DIALOG ) ) ;
break ;
case 1 :
UiInitList ( 0 , 0 , NULL , selgame_Password_Init , selgame_GameSelection_Init , ENTERIP_DIALOG , size ( ENTERIP_DIALOG ) ) ;
break ;
}
}
void selgame_GameSelection_Esc ( )
{
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
selgame_enteringGame = false ;
selgame_endMenu = true ;
}
void selgame_Diff_Focus ( int value )
{
switch ( value ) {
case DIFF_NORMAL :
strcpy ( selgame_Label , " Normal " ) ;
strcpy ( selgame_Description , " Normal Difficulty \n This is where a starting character should begin the quest to defeat Diablo. " ) ;
break ;
case DIFF_NIGHTMARE :
strcpy ( selgame_Label , " Nightmare " ) ;
strcpy ( selgame_Description , " Nightmare Difficulty \n The 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 :
strcpy ( selgame_Label , " Hell " ) ;
strcpy ( selgame_Description , " Hell Difficulty \n The most powerful of the underworld's creatures lurk at the gateway into Hell. Only the most experienced characters should venture in this realm. " ) ;
break ;
}
WordWrapArtStr ( selgame_Description , SELGAME_DESCRIPTION . rect . w ) ;
}
void selgame_Diff_Select ( int value )
{
gbDifficulty = value ;
if ( provider = = ' SCBL ' ) {
selgame_Password_Select ( 0 ) ;
return ;
}
selgame_Password_Init ( 0 ) ;
}
void selgame_Diff_Esc ( )
{
if ( provider = = ' SCBL ' ) {
selgame_GameSelection_Esc ( ) ;
return ;
}
selgame_GameSelection_Init ( ) ;
}
void selgame_Password_Init ( int value )
{
memset ( & selgame_Password , 0 , sizeof ( selgame_Password ) ) ;
UiInitList ( 0 , 0 , NULL , selgame_Password_Select , selgame_Password_Esc , ENTERPASSWORD_DIALOG , size ( ENTERPASSWORD_DIALOG ) ) ;
}
void selgame_Password_Select ( int value )
{
if ( selgame_selectedGame ) {
SRegSaveString ( " Phone Book " , " Entry1 " , 0 , selgame_Ip ) ;
if ( SNetJoinGame ( selgame_selectedGame , selgame_Ip , selgame_Password , NULL , NULL , gdwPlayerId ) ) {
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
selgame_endMenu = true ;
} else {
UiErrorOkDialog (
" Unable to establish a connection. " ,
PROJECT_NAME " v " PROJECT_VERSION " game not found or password invalid. " ,
ENTERPASSWORD_DIALOG , size ( ENTERPASSWORD_DIALOG ) ) ;
selgame_Password_Init ( selgame_selectedGame ) ;
}
return ;
}
_gamedata * info = m_client_info - > initdata ;
info - > bDiff = gbDifficulty ;
if ( SNetCreateGame ( NULL , selgame_Password , NULL , 0 , ( char * ) info , sizeof ( _gamedata ) , MAX_PLRS , NULL , NULL , gdwPlayerId ) ) {
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
selgame_endMenu = true ;
} else {
UiErrorOkDialog ( " Unable to create game. " , ENTERPASSWORD_DIALOG , size ( ENTERPASSWORD_DIALOG ) ) ;
selgame_Password_Init ( 0 ) ;
}
}
void selgame_Password_Esc ( )
{
selgame_GameSelection_Select ( selgame_selectedGame ) ;
}
int UiSelectGame ( int a1 , _SNETPROGRAMDATA * client_info , _SNETPLAYERDATA * user_info , _SNETUIDATA * ui_info ,
_SNETVERSIONDATA * file_info , int * playerId )
{
gdwPlayerId = playerId ;
m_client_info = client_info ;
LoadBackgroundArt ( " ui_art \\ selgame.pcx " ) ;
selgame_GameSelection_Init ( ) ;
selgame_endMenu = false ;
while ( ! selgame_endMenu ) {
UiPollAndRender ( ) ;
}
BlackPalette ( ) ;
selgame_Free ( ) ;
return selgame_enteringGame ;
}
}