@ -14,10 +14,11 @@
namespace dvl {
const char * selhero_GenerateName ( uint8_t hero_class ) ;
std : : size_t selhero_SaveCount = 0 ;
_uiheroinfo selhero_heros [ MAX_CHARACTERS ] ;
_uiheroinfo selhero_heroInfo ;
std : : size_t listOffset = 0 ;
const size_t kMaxViewportItems = 6 ;
char textStats [ 5 ] [ 4 ] ;
char title [ 32 ] ;
@ -29,7 +30,7 @@ bool selhero_isMultiPlayer;
bool selhero_navigateYesNo ;
bool selhero_deleteEnabled ;
BOOL ( * gfnHeroInfo )
BOOL ( * gfnHeroInfo )
( BOOL ( * fninfofunc ) ( _uiheroinfo * ) ) ;
BOOL ( * gfnHeroCreate )
( _uiheroinfo * ) ;
@ -38,83 +39,58 @@ BOOL(*gfnHeroStats)
namespace {
UiItem SELHERO_DIALOG [ ] = {
MAINMENU_BACKGROUND ,
MAINMENU_LOGO ,
UiArtText ( title , { PANEL_LEFT + 24 , 161 , 590 , 35 } , UIS_CENTER | UIS_BIG ) ,
UiImage ( & ArtHero , UI_NUM_CLASSES , { PANEL_LEFT + 30 , 211 , 180 , 76 } ) ,
UiArtText ( " Level: " , { PANEL_LEFT + 39 , 323 , 110 , 21 } , UIS_RIGHT ) ,
UiArtText ( textStats [ 0 ] , { PANEL_LEFT + 159 , 323 , 40 , 21 } , UIS_CENTER ) ,
UiArtText ( " Strength: " , { PANEL_LEFT + 39 , 358 , 110 , 21 } , UIS_RIGHT ) ,
UiArtText ( textStats [ 1 ] , { PANEL_LEFT + 159 , 358 , 40 , 21 } , UIS_CENTER ) ,
UiArtText ( " Magic: " , { PANEL_LEFT + 39 , 380 , 110 , 21 } , UIS_RIGHT ) ,
UiArtText ( textStats [ 2 ] , { PANEL_LEFT + 159 , 380 , 40 , 21 } , UIS_CENTER ) ,
UiArtText ( " Dexterity: " , { PANEL_LEFT + 39 , 401 , 110 , 21 } , UIS_RIGHT ) ,
UiArtText ( textStats [ 3 ] , { PANEL_LEFT + 159 , 401 , 40 , 21 } , UIS_CENTER ) ,
UiArtText ( " Vitality: " , { PANEL_LEFT + 39 , 422 , 110 , 21 } , UIS_RIGHT ) ,
UiArtText ( textStats [ 4 ] , { PANEL_LEFT + 159 , 422 , 40 , 21 } , UIS_CENTER ) ,
} ;
UiImage * SELHERO_DIALOG_HERO_IMG = & SELHERO_DIALOG [ 3 ] . image ;
UiListItem SELLIST_DIALOG_ITEMS [ kMaxViewportItems ] ;
UiItem SELLIST_DIALOG [ ] = {
UiArtText ( " Select Hero " , { PANEL_LEFT + 264 , 211 , 320 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiList ( SELLIST_DIALOG_ITEMS , PANEL_LEFT + 265 , 256 , 320 , 26 , UIS_CENTER | UIS_MED | UIS_GOLD ) ,
MakeScrollBar ( { PANEL_LEFT + 585 , 244 , 25 , 178 } ) ,
UiArtTextButton ( " OK " , & UiFocusNavigationSelect , { PANEL_LEFT + 239 , 429 , 120 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD ) ,
UiArtTextButton ( " Delete " , & selhero_UiFocusNavigationYesNo , { PANEL_LEFT + 364 , 429 , 120 , 35 } , UIS_CENTER | UIS_BIG | UIS_DISABLED ) ,
UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , { PANEL_LEFT + 489 , 429 , 120 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD )
} ;
UiList * SELLIST_DIALOG_LIST = & SELLIST_DIALOG [ 1 ] . list ;
UiScrollBar * SELLIST_SCROLLBAR = & SELLIST_DIALOG [ 2 ] . scrollbar ;
UiArtTextButton * SELLIST_DIALOG_DELETE_BUTTON = & SELLIST_DIALOG [ 4 ] . art_text_button ;
UiListItem SELCLAS_DIALOG_ITEMS [ ] = {
{ " Warrior " , UI_WARRIOR } ,
{ " Rogue " , UI_ROGUE } ,
{ " Sorcerer " , UI_SORCERER }
} ;
UiItem SELCLASS_DIALOG [ ] = {
UiArtText ( " Choose Class " , { PANEL_LEFT + 264 , 211 , 320 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiList ( SELCLAS_DIALOG_ITEMS , PANEL_LEFT + 264 , 285 , 320 , 33 , UIS_CENTER | UIS_MED | UIS_GOLD ) ,
UiArtTextButton ( " OK " , & UiFocusNavigationSelect , { PANEL_LEFT + 279 , 429 , 140 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD ) ,
UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , { PANEL_LEFT + 429 , 429 , 140 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD )
} ;
UiItem ENTERNAME_DIALOG [ ] = {
UiArtText ( " Enter Name " , { PANEL_LEFT + 264 , 211 , 320 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiEdit ( selhero_heroInfo . name , 15 , { PANEL_LEFT + 265 , 317 , 320 , 33 } , UIS_MED | UIS_GOLD ) ,
UiArtTextButton ( " OK " , & UiFocusNavigationSelect , { PANEL_LEFT + 279 , 429 , 140 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD ) ,
UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , { PANEL_LEFT + 429 , 429 , 140 , 35 } , UIS_CENTER | UIS_BIG | UIS_GOLD )
} ;
UiListItem SELLOAD_DIALOG_ITEMS [ ] = {
{ " Load Game " , 0 } ,
{ " New Game " , 1 }
} ;
UiItem SELLOAD_DIALOG [ ] = {
UiArtText ( " Save File Exists " , { PANEL_LEFT + 264 , 211 , 320 , 33 } , UIS_CENTER | UIS_BIG ) ,
UiList ( SELLOAD_DIALOG_ITEMS , PANEL_LEFT + 265 , 285 , 320 , 33 , UIS_CENTER | UIS_MED | UIS_GOLD ) ,
UiArtTextButton ( " OK " , & UiFocusNavigationSelect , { PANEL_LEFT + 279 , 427 , 140 , 35 } , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD ) ,
UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , { PANEL_LEFT + 429 , 427 , 140 , 35 } , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD )
} ;
std : : vector < UiItemBase * > vecSelHeroDialog ;
std : : vector < UiListItem * > vecSelHeroDlgItems ;
std : : vector < UiItemBase * > vecSelDlgItems ;
UiImage * SELHERO_DIALOG_HERO_IMG ;
} // namespace
bool bUIElementsLoaded = false ;
void selhero_UiFocusNavigationYesNo ( )
{
if ( selhero_deleteEnabled )
UiFocusNavigationYesNo ( ) ;
}
void selhero_FreeListItems ( )
{
for ( std : : size_t i = 0 ; i < vecSelHeroDlgItems . size ( ) ; i + + ) {
UiListItem * pUIItem = vecSelHeroDlgItems [ i ] ;
delete pUIItem ;
}
vecSelHeroDlgItems . clear ( ) ;
}
void selhero_FreeDlgItems ( )
{
for ( std : : size_t i = 0 ; i < vecSelDlgItems . size ( ) ; i + + ) {
UiItemBase * pUIItem = vecSelDlgItems [ i ] ;
delete pUIItem ;
}
vecSelDlgItems . clear ( ) ;
}
void selhero_Free ( )
{
ArtBackground . Unload ( ) ;
for ( std : : size_t i = 0 ; i < vecSelHeroDialog . size ( ) ; i + + ) {
UiItemBase * pUIItem = vecSelHeroDialog [ i ] ;
delete pUIItem ;
}
vecSelHeroDialog . clear ( ) ;
selhero_FreeDlgItems ( ) ;
selhero_FreeListItems ( ) ;
bUIElementsLoaded = false ;
}
void selhero_SetStats ( )
{
SELHERO_DIALOG_HERO_IMG - > frame = selhero_heroInfo . heroclass ;
SELHERO_DIALOG_HERO_IMG - > m_frame = selhero_heroInfo . heroclass ;
sprintf ( textStats [ 0 ] , " %d " , selhero_heroInfo . level ) ;
sprintf ( textStats [ 1 ] , " %d " , selhero_heroInfo . strength ) ;
sprintf ( textStats [ 2 ] , " %d " , selhero_heroInfo . magic ) ;
@ -124,17 +100,20 @@ void selhero_SetStats()
namespace {
std : : size_t listOffset = 0 ;
UiArtTextButton * SELLIST_DIALOG_DELETE_BUTTON ;
void selhero_UpdateViewportItems ( )
{
const std : : size_t num_viewport_heroes = std : : min ( selhero_SaveCount - listOffset , kMaxViewportItems ) ;
SELLIST_DIALOG_LIST - > length = num_viewport_heroes ;
for ( std : : size_t i = 0 ; i < num_viewport_heroes ; i + + ) {
const std : : size_t index = i + listOffset ;
SELLIST_DIALOG_ITEMS [ i ] = { selhero_heros [ index ] . name , static_cast < int > ( index ) } ;
vecSelHeroDlgItems [ i ] - > m_text = selhero_heros [ index ] . name ;
vecSelHeroDlgItems [ i ] - > m_value = static_cast < int > ( index ) ;
}
if ( num_viewport_heroes < kMaxViewportItems ) {
SELLIST_DIALOG_ITEMS [ num_viewport_heroes ] = { " New Hero " , static_cast < int > ( selhero_SaveCount ) } ;
+ + SELLIST_DIALOG_LIST - > lengt h ;
vecSelHeroDlgItems [ num_viewport_heroes ] - > m_text = " New Hero " ;
vecSelHeroDlgItems [ num_viewport_heroes ] - > m_va lu e = static_cast < int > ( sel hero_SaveCount ) ;
}
}
@ -156,9 +135,36 @@ void selhero_ScrollIntoView(std::size_t index)
void selhero_List_Init ( )
{
listOffset = 0 ;
selhero_FreeDlgItems ( ) ;
SDL_Rect rect1 = { PANEL_LEFT + 264 , 211 , 320 , 33 } ;
vecSelDlgItems . push_back ( new UiArtText ( " Select Hero " , rect1 , UIS_CENTER | UIS_BIG ) ) ;
selhero_FreeListItems ( ) ;
const size_t num_viewport_heroes = std : : min ( selhero_SaveCount + 1 , kMaxViewportItems ) ;
for ( std : : size_t i = 0 ; i < num_viewport_heroes ; i + + ) {
vecSelHeroDlgItems . push_back ( new UiListItem ( " " , - 1 ) ) ;
}
selhero_UpdateViewportItems ( ) ;
UiInitList ( 0 , selhero_SaveCount , selhero_List_Focus , selhero_List_Select , selhero_List_Esc , SELLIST_DIALOG , size ( SELLIST_DIALOG ) , false , selhero_List_DeleteYesNo ) ;
UiInitScrollBar ( SELLIST_SCROLLBAR , kMaxViewportItems , & listOffset ) ;
vecSelDlgItems . push_back ( new UiList ( vecSelHeroDlgItems , PANEL_LEFT + 265 , 256 , 320 , 26 , UIS_CENTER | UIS_MED | UIS_GOLD ) ) ;
SDL_Rect rect2 = { PANEL_LEFT + 585 , 244 , 25 , 178 } ;
UiScrollBar * scrollBar = new UiScrollBar ( & ArtScrollBarBackground , & ArtScrollBarThumb , & ArtScrollBarArrow , rect2 ) ;
vecSelDlgItems . push_back ( scrollBar ) ;
SDL_Rect rect3 = { PANEL_LEFT + 239 , 429 , 120 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " OK " , & UiFocusNavigationSelect , rect3 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
SDL_Rect rect4 = { PANEL_LEFT + 364 , 429 , 120 , 35 } ;
SELLIST_DIALOG_DELETE_BUTTON = new UiArtTextButton ( " Delete " , & selhero_UiFocusNavigationYesNo , rect4 , UIS_CENTER | UIS_BIG | UIS_DISABLED ) ;
vecSelDlgItems . push_back ( SELLIST_DIALOG_DELETE_BUTTON ) ;
SDL_Rect rect5 = { PANEL_LEFT + 489 , 429 , 120 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , rect5 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
UiInitList ( 0 , selhero_SaveCount , selhero_List_Focus , selhero_List_Select , selhero_List_Esc , vecSelDlgItems , false , selhero_List_DeleteYesNo ) ;
UiInitScrollBar ( scrollBar , kMaxViewportItems , & listOffset ) ;
if ( selhero_isMultiPlayer ) {
strcpy ( title , " Multi Player Characters " ) ;
} else {
@ -174,18 +180,18 @@ void selhero_List_Focus(int value)
if ( selhero_SaveCount & & index < selhero_SaveCount ) {
memcpy ( & selhero_heroInfo , & selhero_heros [ index ] , sizeof ( selhero_heroInfo ) ) ;
selhero_SetStats ( ) ;
SELLIST_DIALOG_DELETE_BUTTON - > f lags = baseFlags | UIS_GOLD ;
SELLIST_DIALOG_DELETE_BUTTON - > m_iF lags = baseFlags | UIS_GOLD ;
selhero_deleteEnabled = true ;
return ;
}
SELHERO_DIALOG_HERO_IMG - > frame = UI_NUM_CLASSES ;
SELHERO_DIALOG_HERO_IMG - > m_ frame = UI_NUM_CLASSES ;
strcpy ( textStats [ 0 ] , " -- " ) ;
strcpy ( textStats [ 1 ] , " -- " ) ;
strcpy ( textStats [ 2 ] , " -- " ) ;
strcpy ( textStats [ 3 ] , " -- " ) ;
strcpy ( textStats [ 4 ] , " -- " ) ;
SELLIST_DIALOG_DELETE_BUTTON - > f lags = baseFlags | UIS_DISABLED ;
SELLIST_DIALOG_DELETE_BUTTON - > m_iF lags = baseFlags | UIS_DISABLED ;
selhero_deleteEnabled = false ;
}
@ -199,26 +205,62 @@ bool selhero_List_DeleteYesNo()
void selhero_List_Select ( int value )
{
if ( static_cast < std : : size_t > ( value ) = = selhero_SaveCount ) {
UiInitList ( 0 , 2 , selhero_ClassSelector_Focus , selhero_ClassSelector_Select , selhero_ClassSelector_Esc , SELCLASS_DIALOG , size ( SELCLASS_DIALOG ) ) ;
selhero_FreeDlgItems ( ) ;
SDL_Rect rect1 = { PANEL_LEFT + 264 , 211 , 320 , 33 } ;
vecSelDlgItems . push_back ( new UiArtText ( " Choose Class " , rect1 , UIS_CENTER | UIS_BIG ) ) ;
selhero_FreeListItems ( ) ;
vecSelHeroDlgItems . push_back ( new UiListItem ( " Warrior " , UI_WARRIOR ) ) ;
vecSelHeroDlgItems . push_back ( new UiListItem ( " Rogue " , UI_ROGUE ) ) ;
vecSelHeroDlgItems . push_back ( new UiListItem ( " Sorcerer " , UI_SORCERER ) ) ;
vecSelDlgItems . push_back ( new UiList ( vecSelHeroDlgItems , PANEL_LEFT + 264 , 285 , 320 , 33 , UIS_CENTER | UIS_MED | UIS_GOLD ) ) ;
SDL_Rect rect2 = { PANEL_LEFT + 279 , 429 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " OK " , & UiFocusNavigationSelect , rect2 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
SDL_Rect rect3 = { PANEL_LEFT + 429 , 429 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , rect3 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
UiInitList ( 0 , 2 , selhero_ClassSelector_Focus , selhero_ClassSelector_Select , selhero_ClassSelector_Esc , vecSelDlgItems ) ;
memset ( & selhero_heroInfo . name , 0 , sizeof ( selhero_heroInfo . name ) ) ;
strcpy ( title , " New Single Player Hero " ) ;
if ( selhero_isMultiPlayer ) {
strcpy ( title , " New Multi Player Hero " ) ;
}
return ;
} else if ( selhero_heroInfo . hassaved ) {
UiInitList ( 0 , 1 , selhero_Load_Focus , selhero_Load_Select , selhero_List_Init , SELLOAD_DIALOG , size ( SELLOAD_DIALOG ) , true ) ;
}
if ( selhero_heroInfo . hassaved ) {
selhero_FreeDlgItems ( ) ;
SDL_Rect rect1 = { PANEL_LEFT + 264 , 211 , 320 , 33 } ;
vecSelDlgItems . push_back ( new UiArtText ( " Save File Exists " , rect1 , UIS_CENTER | UIS_BIG ) ) ;
selhero_FreeListItems ( ) ;
vecSelHeroDlgItems . push_back ( new UiListItem ( " Load Game " , 0 ) ) ;
vecSelHeroDlgItems . push_back ( new UiListItem ( " New Game " , 1 ) ) ;
vecSelDlgItems . push_back ( new UiList ( vecSelHeroDlgItems , PANEL_LEFT + 265 , 285 , 320 , 33 , UIS_CENTER | UIS_MED | UIS_GOLD ) ) ;
SDL_Rect rect2 = { PANEL_LEFT + 279 , 427 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " OK " , & UiFocusNavigationSelect , rect2 , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD ) ) ;
SDL_Rect rect3 = { PANEL_LEFT + 429 , 427 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , rect3 , UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD ) ) ;
UiInitList ( 0 , 1 , selhero_Load_Focus , selhero_Load_Select , selhero_List_Init , vecSelDlgItems , true ) ;
strcpy ( title , " Single Player Characters " ) ;
return ;
}
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
UiInitList_clear ( ) ;
selhero_endMenu = true ;
}
void selhero_List_Esc ( )
{
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
UiInitList_clear ( ) ;
selhero_endMenu = true ;
selhero_result = SELHERO_PREVIOUS ;
}
@ -241,7 +283,7 @@ void selhero_ClassSelector_Focus(int value)
void selhero_ClassSelector_Select ( int value )
{
if ( gbSpawned & & ( value = = 1 | | value = = 2 ) ) {
selhero_Free ( ) ;
ArtBackground . Unload ( ) ;
UiSelOkDialog ( NULL , " The Rogue and Sorcerer are only available in the full retail version of Diablo. Visit https://www.gog.com/game/diablo to purchase. " , false ) ;
LoadBackgroundArt ( " ui_art \\ selhero.pcx " ) ;
selhero_List_Select ( selhero_SaveCount ) ;
@ -256,11 +298,27 @@ void selhero_ClassSelector_Select(int value)
# ifdef PREFILL_PLAYER_NAME
strcpy ( selhero_heroInfo . name , selhero_GenerateName ( selhero_heroInfo . heroclass ) ) ;
# endif
UiInitList ( 0 , 0 , NULL , selhero_Name_Select , selhero_Name_Esc , ENTERNAME_DIALOG , size ( ENTERNAME_DIALOG ) ) ;
selhero_FreeDlgItems ( ) ;
SDL_Rect rect1 = { PANEL_LEFT + 264 , 211 , 320 , 33 } ;
vecSelDlgItems . push_back ( new UiArtText ( " Enter Name " , rect1 , UIS_CENTER | UIS_BIG ) ) ;
SDL_Rect rect2 = { PANEL_LEFT + 265 , 317 , 320 , 33 } ;
vecSelDlgItems . push_back ( new UiEdit ( selhero_heroInfo . name , 15 , rect2 , UIS_MED | UIS_GOLD ) ) ;
SDL_Rect rect3 = { PANEL_LEFT + 279 , 429 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " OK " , & UiFocusNavigationSelect , rect3 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
SDL_Rect rect4 = { PANEL_LEFT + 429 , 429 , 140 , 35 } ;
vecSelDlgItems . push_back ( new UiArtTextButton ( " Cancel " , & UiFocusNavigationEsc , rect4 , UIS_CENTER | UIS_BIG | UIS_GOLD ) ) ;
UiInitList ( 0 , 0 , NULL , selhero_Name_Select , selhero_Name_Esc , vecSelDlgItems ) ;
}
void selhero_ClassSelector_Esc ( )
{
selhero_FreeDlgItems ( ) ;
selhero_FreeListItems ( ) ;
if ( selhero_SaveCount ) {
selhero_List_Init ( ) ;
return ;
@ -273,14 +331,14 @@ void selhero_Name_Select(int value)
{
if ( ! UiValidPlayerName ( selhero_heroInfo . name ) ) {
selhero_Free ( ) ;
ArtBackground . Unload ( ) ;
UiSelOkDialog ( title , " Invalid name. A name cannot contain spaces, reserved characters, or reserved words. \n " , false ) ;
LoadBackgroundArt ( " ui_art \\ selhero.pcx " ) ;
} else {
bool overwrite = true ;
for ( std : : size_t i = 0 ; i < selhero_SaveCount ; i + + ) {
if ( strcasecmp ( selhero_heros [ i ] . name , selhero_heroInfo . name ) = = 0 ) {
selhero_Free ( ) ;
ArtBackground . Unload ( ) ;
char dialogText [ 256 ] ;
sprintf ( dialogText , " Character already exists. Do you want to overwrite \" %s \" ? " , selhero_heroInfo . name ) ;
overwrite = UiSelHeroYesNoDialog ( title , dialogText ) ;
@ -291,11 +349,11 @@ void selhero_Name_Select(int value)
if ( overwrite ) {
if ( gfnHeroCreate ( & selhero_heroInfo ) ) {
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
UiInitList_clear ( ) ;
selhero_endMenu = true ;
return ;
} else {
UiErrorOkDialog ( " Unable to create character. " , SELHERO_DIALOG , size ( SELHERO_DIALOG ) ) ;
UiErrorOkDialog ( " Unable to create character. " , vecSelDlgItems ) ;
}
}
}
@ -318,7 +376,7 @@ void selhero_Load_Focus(int value)
void selhero_Load_Select ( int value )
{
UiInitList ( 0 , 0 , NULL , NULL , NULL , NULL , 0 ) ;
UiInitList_clear ( ) ;
selhero_endMenu = true ;
if ( value = = 0 ) {
selhero_result = SELHERO_CONTINUE ;
@ -344,10 +402,50 @@ BOOL UiSelHeroDialog(
int * dlgresult ,
char * name )
{
bUIElementsLoaded = true ;
do {
LoadBackgroundArt ( " ui_art \\ selhero.pcx " ) ;
UiAddBackground ( & vecSelHeroDialog ) ;
UiAddLogo ( & vecSelHeroDialog ) ;
LoadScrollBar ( ) ;
selhero_FreeDlgItems ( ) ;
SDL_Rect rect1 = { PANEL_LEFT + 24 , 161 , 590 , 35 } ;
vecSelHeroDialog . push_back ( new UiArtText ( title , rect1 , UIS_CENTER | UIS_BIG ) ) ;
SDL_Rect rect2 = { PANEL_LEFT + 30 , 211 , 180 , 76 } ;
SELHERO_DIALOG_HERO_IMG = new UiImage ( & ArtHero , UI_NUM_CLASSES , rect2 ) ;
vecSelHeroDialog . push_back ( SELHERO_DIALOG_HERO_IMG ) ;
SDL_Rect rect3 = { PANEL_LEFT + 39 , 323 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Level: " , rect3 , UIS_RIGHT ) ) ;
SDL_Rect rect4 = { PANEL_LEFT + 39 , 323 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Level: " , rect4 , UIS_RIGHT ) ) ;
SDL_Rect rect5 = { PANEL_LEFT + 159 , 323 , 40 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( textStats [ 0 ] , rect5 , UIS_CENTER ) ) ;
SDL_Rect rect6 = { PANEL_LEFT + 39 , 358 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Strength: " , rect6 , UIS_RIGHT ) ) ;
SDL_Rect rect7 = { PANEL_LEFT + 159 , 358 , 40 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( textStats [ 1 ] , rect7 , UIS_CENTER ) ) ;
SDL_Rect rect8 = { PANEL_LEFT + 39 , 380 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Magic: " , rect8 , UIS_RIGHT ) ) ;
SDL_Rect rect9 = { PANEL_LEFT + 159 , 380 , 40 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( textStats [ 2 ] , rect9 , UIS_CENTER ) ) ;
SDL_Rect rect10 = { PANEL_LEFT + 39 , 401 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Dexterity: " , rect10 , UIS_RIGHT ) ) ;
SDL_Rect rect11 = { PANEL_LEFT + 159 , 401 , 40 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( textStats [ 3 ] , rect11 , UIS_CENTER ) ) ;
SDL_Rect rect12 = { PANEL_LEFT + 39 , 422 , 110 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( " Vitality: " , rect12 , UIS_RIGHT ) ) ;
SDL_Rect rect13 = { PANEL_LEFT + 159 , 422 , 40 , 21 } ;
vecSelHeroDialog . push_back ( new UiArtText ( textStats [ 4 ] , rect13 , UIS_CENTER ) ) ;
gfnHeroInfo = fninfo ;
gfnHeroCreate = fncreate ;
gfnHeroStats = fnstats ;
@ -368,7 +466,7 @@ BOOL UiSelHeroDialog(
selhero_endMenu = false ;
while ( ! selhero_endMenu & & ! selhero_navigateYesNo ) {
UiClearScreen ( ) ;
UiRenderItems ( SELHERO_DIALOG , size ( SELHERO_DIALOG ) ) ;
UiRenderItems ( vecSelHeroDialog ) ;
UiPollAndRender ( ) ;
}
selhero_Free ( ) ;
@ -421,7 +519,7 @@ BOOL UiSelHeroMultDialog(
return UiSelHeroDialog ( fninfo , fncreate , fnstats , fnremove , dlgresult , name ) ;
}
const char * selhero_GenerateName ( std : : uint8_t hero_class )
const char * selhero_GenerateName ( uint8_t hero_class )
{
static const char * const kNames [ 3 ] [ 10 ] = {
{
@ -461,10 +559,10 @@ const char *selhero_GenerateName(std::uint8_t hero_class)
" Horazon " ,
}
} ;
const int seed = std : : chrono : : system_clock : : now ( ) . time_since_epoch ( ) . count ( ) ;
std : : default_random_engine generator ( seed ) ;
std : : uniform_int_distribution < std : : size_t > dist ( 0 , sizeof ( kNames [ 0 ] ) / sizeof ( kNames [ 0 ] [ 0 ] ) - 1 ) ;
return kNames [ hero_class ] [ dist ( generator ) ] ;
int iRand = rand ( ) % 9 ;
return kNames [ hero_class ] [ iRand ] ;
}
} // namespace dvl