@ -22,6 +22,8 @@
# include "qol/stash.h"
# include "towners.h"
# include "utils/language.h"
# include "utils/stdcompat/string_view.hpp"
# include "utils/utf8.hpp"
namespace devilution {
@ -201,11 +203,11 @@ void AddSTextVal(int y, int val)
stext [ y ] . _sval = val ;
}
void AddSText ( int x , int y , const char * str , UiFlags flags , bool sel )
void AddSText ( int x , int y , string_view text , UiFlags flags , bool sel )
{
stext [ y ] . _sx = x ;
stext [ y ] . _syoff = 0 ;
strcpy ( stext [ y ] . _sstr , str ) ;
CopyUtf8 ( stext [ y ] . _sstr , text , sizeof ( stext [ y ] . _s str) ) ;
stext [ y ] . flags = flags ;
stext [ y ] . _sline = 0 ;
stext [ y ] . _ssel = sel ;
@ -233,60 +235,58 @@ void AddItemListBackButton(bool selectable = false)
void PrintStoreItem ( const Item & item , int l , UiFlags flags )
{
char sstr [ 128 ] ;
std : : string productLine = " " ;
sstr [ 0 ] = ' \0 ' ;
if ( item . _iIdentified ) {
if ( item . _iMagical ! = ITEM_QUALITY_UNIQUE ) {
if ( item . _iPrePower ! = - 1 ) {
strcat ( sstr , PrintItemPower ( item . _iPrePower , item ) . c_str ( ) ) ;
productLine . append ( PrintItemPower ( item . _iPrePower , item ) ) ;
}
}
if ( item . _iSufPower ! = - 1 ) {
if ( sstr [ 0 ] ! = ' \0 ' )
strcat ( sstr , _ ( " , " ) ) ;
strcat ( sstr , PrintItemPower ( item . _iSufPower , item ) . c_str ( ) ) ;
if ( ! productLine . empty ( ) )
productLine . append ( _ ( " , " ) ) ;
productLine . append ( PrintItemPower ( item . _iSufPower , item ) ) ;
}
}
if ( item . _iMiscId = = IMISC_STAFF & & item . _iMaxCharges ! = 0 ) {
strcpy ( tempstr , fmt : : format ( _ ( " Charges: {:d}/{:d} " ) , item . _iCharges , item . _iMaxCharges ) . c_str ( ) ) ;
if ( sstr [ 0 ] ! = ' \0 ' )
strcat ( sstr , _ ( " , " ) ) ;
strcat ( sstr , tempstr ) ;
if ( ! productLine . empty ( ) )
productLine . append ( _ ( " , " ) ) ;
productLine . append ( fmt : : format ( _ ( " Charges: {:d}/{:d} " ) , item . _iCharges , item . _iMaxCharges ) ) ;
}
if ( sstr [ 0 ] ! = ' \0 ' ) {
AddSText ( 40 , l , sstr , flags , false ) ;
if ( ! productLine . empty ( ) ) {
AddSText ( 40 , l , productLine , flags , false ) ;
l + + ;
productLine = " " ;
}
sstr [ 0 ] = ' \0 ' ;
if ( item . _iClass = = ICLASS_WEAPON )
strcpy ( sstr , fmt : : format ( _ ( " Damage: {:d}-{:d} " ) , item . _iMinDam , item . _iMaxDam ) . c_str ( ) ) ;
if ( item . _iClass = = ICLASS_ARMOR )
strcpy ( sstr , fmt : : format ( _ ( " Armor: {:d} " ) , item . _iAC ) . c_str ( ) ) ;
if ( item . _iMaxDur ! = DUR_INDESTRUCTIBLE & & item . _iMaxDur ! = 0 ) {
strcpy ( tempstr , fmt : : format ( _ ( " Dur: {:d}/{:d}, " ) , item . _iDurability , item . _iMaxDur ) . c_str ( ) ) ;
strcat ( sstr , tempst r) ;
} else {
strcat ( sstr , _ ( " Indestructible, " ) ) ;
if ( item . _itype ! = ItemType : : Misc ) {
if ( item . _iClass = = ICLASS_WEAPON )
productLine = fmt : : format ( _ ( " Damage: {:d}-{:d} " ) , item . _iMinDam , item . _iMaxDam ) ;
else if ( item . _iClass = = ICLASS_ARMOR )
productLine = fmt : : format ( _ ( " Armor: {:d} " ) , item . _iAC ) ;
else if ( item . _iMaxDur ! = DUR_INDESTRUCTIBLE & & item . _iMaxDur ! = 0 )
productLine = fmt : : format ( _ ( " Dur: {:d}/{:d}, " ) , item . _iDurability , item . _iMaxDu r ) ;
else
productLine = _ ( " Indestructible, " ) ;
}
if ( item . _itype = = ItemType : : Misc )
sstr [ 0 ] = ' \0 ' ;
int8_t str = item . _iMinStr ;
uint8_t mag = item . _iMinMag ;
int8_t dex = item . _iMinDex ;
if ( str = = 0 & & mag = = 0 & & dex = = 0 ) {
strcat ( sstr , _ ( " No required attributes " ) ) ;
productLine . append ( _ ( " No required attributes " ) ) ;
} else {
strcpy ( tempstr , _ ( " Required: " ) ) ;
productLine . append ( _ ( " Required: " ) ) ;
if ( str ! = 0 )
strcpy ( tempstr + strlen ( tempstr ) , fmt : : format ( _ ( " {:d} Str " ) , str ) . c_str ( ) ) ;
productLine . append ( fmt : : format ( _ ( " {:d} Str " ) , str ) ) ;
if ( mag ! = 0 )
strcpy ( tempstr + strlen ( tempstr ) , fmt : : format ( _ ( " {:d} Mag " ) , mag ) . c_str ( ) ) ;
productLine . append ( fmt : : format ( _ ( " {:d} Mag " ) , mag ) ) ;
if ( dex ! = 0 )
strcpy ( tempstr + strlen ( tempstr ) , fmt : : format ( _ ( " {:d} Dex " ) , dex ) . c_str ( ) ) ;
strcat ( sstr , tempstr ) ;
productLine . append ( fmt : : format ( _ ( " {:d} Dex " ) , dex ) ) ;
}
AddSText ( 40 , l + + , sstr , flags , false ) ;
AddSText ( 40 , l + + , productLine , flags , false ) ;
}
void StoreAutoPlace ( )
@ -354,9 +354,7 @@ void StartSmithBuy()
stextsval = 0 ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithBuy ( stextsval ) ;
AddItemListBackButton ( ) ;
@ -421,9 +419,7 @@ bool StartSmithPremiumBuy()
stextsval = 0 ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " I have these premium items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " I have these premium items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( ) ;
@ -542,9 +538,7 @@ void StartSmithSell()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " You have nothing I want. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " You have nothing I want. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( /*selectable=*/ true ) ;
return ;
@ -555,9 +549,7 @@ void StartSmithSell()
stextsmax = myPlayer . _pNumInv ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " Which item is for sale? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " Which item is for sale? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithSell ( stextsval ) ;
AddItemListBackButton ( ) ;
@ -628,9 +620,7 @@ void StartSmithRepair()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " You have nothing to repair. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " You have nothing to repair. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( /*selectable=*/ true ) ;
return ;
@ -641,9 +631,7 @@ void StartSmithRepair()
stextsmax = myPlayer . _pNumInv ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " Repair which item? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " Repair which item? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithSell ( stextsval ) ;
@ -731,9 +719,7 @@ void StartWitchBuy()
stextsmax = 20 ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollWitchBuy ( stextsval ) ;
AddItemListBackButton ( ) ;
@ -826,9 +812,7 @@ void StartWitchSell()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " You have nothing I want. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " You have nothing I want. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( /*selectable=*/ true ) ;
return ;
@ -839,9 +823,7 @@ void StartWitchSell()
stextsmax = myPlayer . _pNumInv ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " Which item is for sale? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " Which item is for sale? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithSell ( stextsval ) ;
AddItemListBackButton ( ) ;
@ -903,9 +885,7 @@ void StartWitchRecharge()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " You have nothing to recharge. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " You have nothing to recharge. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( /*selectable=*/ true ) ;
return ;
@ -916,9 +896,7 @@ void StartWitchRecharge()
stextsmax = myPlayer . _pNumInv ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " Recharge which item? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " Recharge which item? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithSell ( stextsval ) ;
AddItemListBackButton ( ) ;
@ -973,33 +951,35 @@ void StoreConfirm()
AddSTextVal ( 8 , item . _iIvalue ) ;
PrintStoreItem ( item , 9 , itemColor ) ;
string_view prompt ;
switch ( stextshold ) {
case STORE_BBOY :
strcpy ( tempstr , _ ( " Do we have a deal? " ) ) ;
prompt = _ ( " Do we have a deal? " ) ;
break ;
case STORE_SIDENTIFY :
strcpy ( tempstr , _ ( " Are you sure you want to identify this item? " ) ) ;
prompt = _ ( " Are you sure you want to identify this item? " ) ;
break ;
case STORE_HBUY :
case STORE_SPBUY :
case STORE_WBUY :
case STORE_SBUY :
strcpy ( tempstr , _ ( " Are you sure you want to buy this item? " ) ) ;
prompt = _ ( " Are you sure you want to buy this item? " ) ;
break ;
case STORE_WRECHARGE :
strcpy ( tempstr , _ ( " Are you sure you want to recharge this item? " ) ) ;
prompt = _ ( " Are you sure you want to recharge this item? " ) ;
break ;
case STORE_SSELL :
case STORE_WSELL :
strcpy ( tempstr , _ ( " Are you sure you want to sell this item? " ) ) ;
prompt = _ ( " Are you sure you want to sell this item? " ) ;
break ;
case STORE_SREPAIR :
strcpy ( tempstr , _ ( " Are you sure you want to repair this item? " ) ) ;
prompt = _ ( " Are you sure you want to repair this item? " ) ;
break ;
default :
app_fatal ( " Unknown store dialog %i " , stextshold ) ;
}
AddSText ( 0 , 15 , tempstr , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 15 , prompt , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 18 , _ ( " Yes " ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , true ) ;
AddSText ( 0 , 20 , _ ( " No " ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , true ) ;
}
@ -1029,9 +1009,7 @@ void SStartBoyBuy()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " I have this item for sale: Your gold: {:d} " ) , MyPlayer - > _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " I have this item for sale: Your gold: {:d} " ) , MyPlayer - > _pGold ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
UiFlags itemColor = boyitem . getTextColorWithStatCheck ( ) ;
@ -1112,9 +1090,7 @@ void StartHealerBuy()
stextsval = 0 ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " I have these items for sale: Your gold: {:d} " ) , Players [ MyPlayerId ] . _pGold ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollHealerBuy ( stextsval ) ;
@ -1232,9 +1208,7 @@ void StartStorytellerIdentify()
stextscrl = false ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " You have nothing to identify. Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " You have nothing to identify. Your gold: {:d} " ) , myPlayer . _pGold ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
AddItemListBackButton ( /*selectable=*/ true ) ;
return ;
@ -1245,9 +1219,7 @@ void StartStorytellerIdentify()
stextsmax = myPlayer . _pNumInv ;
/* TRANSLATORS: This text is white space sensitive. Check for correct alignment! */
strcpy ( tempstr , fmt : : format ( _ ( " Identify which item? Your gold: {:d} " ) , myPlayer . _pGold ) . c_str ( ) ) ;
AddSText ( 0 , 1 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 1 , fmt : : format ( _ ( " Identify which item? Your gold: {:d} " ) , myPlayer . _pGold ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 3 ) ;
ScrollSmithSell ( stextsval ) ;
@ -1276,12 +1248,10 @@ void StartTalk()
stextsize = false ;
stextscrl = false ;
strcpy ( tempstr , fmt : : format ( _ ( " Talk to {:s} " ) , _ ( TownerNames [ talker ] ) ) . c_str ( ) ) ;
AddSText ( 0 , 2 , tempstr , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 2 , fmt : : format ( _ ( " Talk to {:s} " ) , _ ( TownerNames [ talker ] ) ) , UiFlags : : ColorWhitegold | UiFlags : : AlignCenter , false ) ;
AddSLine ( 5 ) ;
if ( gbIsSpawn ) {
strcpy ( tempstr , fmt : : format ( _ ( " Talking to {:s} " ) , _ ( TownerNames [ talker ] ) ) . c_str ( ) ) ;
AddSText ( 0 , 10 , tempstr , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 10 , fmt : : format ( _ ( " Talking to {:s} " ) , _ ( TownerNames [ talker ] ) ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 12 , _ ( " is not available " ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 14 , _ ( " in the shareware " ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;
AddSText ( 0 , 16 , _ ( " version " ) , UiFlags : : ColorWhite | UiFlags : : AlignCenter , false ) ;