2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "UI.h"
# include "UIScene_DLCOffersMenu.h"
# include "..\..\..\Minecraft.World\StringHelpers.h"
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
# include "Common\Network\Sony\SonyHttp.h"
# endif
# ifdef __PSVITA__
# include "PSVita\Network\SonyCommerce_Vita.h"
# endif
# define PLAYER_ONLINE_TIMER_ID 0
# define PLAYER_ONLINE_TIMER_TIME 100
UIScene_DLCOffersMenu : : UIScene_DLCOffersMenu ( int iPad , void * initData , UILayer * parentLayer ) : UIScene ( iPad , parentLayer )
{
m_bProductInfoShown = false ;
DLCOffersParam * param = ( DLCOffersParam * ) initData ;
m_iProductInfoIndex = param - > iType ;
m_iCurrentDLC = 0 ;
m_iTotalDLC = 0 ;
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
m_pvProductInfo = NULL ;
# endif
m_bAddAllDLCButtons = true ;
// Setup all the Iggy references we need for this scene
initialiseMovie ( ) ;
// Alert the app the we want to be informed of ethernet connections
app . SetLiveLinkRequired ( true ) ;
m_bIsSD = ! RenderManager . IsHiDef ( ) & & ! RenderManager . IsWidescreen ( ) ;
m_labelOffers . init ( app . GetString ( IDS_DOWNLOADABLE_CONTENT_OFFERS ) ) ;
m_buttonListOffers . init ( eControl_OffersList ) ;
2026-03-03 03:04:10 +08:00
m_labelHTMLSellText . init ( L " " ) ;
m_labelPriceTag . init ( L " " ) ;
2026-03-01 12:16:08 +08:00
TelemetryManager - > RecordMenuShown ( m_iPad , eUIScene_DLCOffersMenu , 0 ) ;
m_bHasPurchased = false ;
m_bIsSelected = false ;
if ( m_loadedResolution = = eSceneResolution_1080 )
{
# ifdef _DURANGO
m_labelXboxStore . init ( app . GetString ( IDS_XBOX_STORE ) ) ;
# else
m_labelXboxStore . init ( L " " ) ;
# endif
}
# ifdef _DURANGO
m_pNoImageFor_DLC = NULL ;
// If we don't yet have this DLC, we need to display a timer
m_bDLCRequiredIsRetrieved = false ;
m_bIgnorePress = true ;
m_bSelectionChanged = true ;
// display a timer
m_Timer . setVisible ( true ) ;
# endif
# ifdef __ORBIS__
//sceNpCommerceShowPsStoreIcon(SCE_NP_COMMERCE_PS_STORE_ICON_CENTER);
# endif
# if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ )
addTimer ( PLAYER_ONLINE_TIMER_ID , PLAYER_ONLINE_TIMER_TIME ) ;
# endif
# ifdef __PSVITA__
ui . TouchBoxRebuild ( this ) ;
# endif
}
UIScene_DLCOffersMenu : : ~ UIScene_DLCOffersMenu ( )
{
// Alert the app the we no longer want to be informed of ethernet connections
app . SetLiveLinkRequired ( false ) ;
}
void UIScene_DLCOffersMenu : : handleTimerComplete ( int id )
{
# if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__)
switch ( id )
{
case PLAYER_ONLINE_TIMER_ID :
# ifndef _WINDOWS64
if ( ProfileManager . IsSignedInLive ( ProfileManager . GetPrimaryPad ( ) ) = = false )
{
// check the player hasn't gone offline
// If they have, bring up the PSN warning and exit from the DLC menu
unsigned int uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_OK ;
2026-03-03 03:04:10 +08:00
C4JStorage : : EMessageResult result = ui . RequestErrorMessage ( IDS_CONNECTION_LOST , g_NetworkManager . CorrectErrorIDS ( IDS_CONNECTION_LOST_LIVE_NO_EXIT ) , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) , UIScene_DLCOffersMenu : : ExitDLCOffersMenu , this ) ;
2026-03-01 12:16:08 +08:00
}
# endif
break ;
}
# endif
}
int UIScene_DLCOffersMenu : : ExitDLCOffersMenu ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
UIScene_DLCOffersMenu * pClass = ( UIScene_DLCOffersMenu * ) pParam ;
2026-03-03 03:04:10 +08:00
# if defined __ORBIS__ || defined __PSVITA__
app . GetCommerce ( ) - > HidePsStoreIcon ( ) ;
2026-03-01 12:16:08 +08:00
# endif
ui . NavigateToHomeMenu ( ) ; //iPad,eUIScene_MainMenu);
return 0 ;
}
wstring UIScene_DLCOffersMenu : : getMoviePath ( )
{
return L " DLCOffersMenu " ;
}
void UIScene_DLCOffersMenu : : updateTooltips ( )
{
int iA = - 1 ;
if ( m_bIsSelected )
{
if ( ! m_bHasPurchased )
{
iA = IDS_TOOLTIPS_INSTALL ;
}
else
{
iA = IDS_TOOLTIPS_REINSTALL ;
}
}
ui . SetTooltips ( m_iPad , iA , IDS_TOOLTIPS_BACK ) ;
}
void UIScene_DLCOffersMenu : : handleInput ( int iPad , int key , bool repeat , bool pressed , bool released , bool & handled )
{
//app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE");
ui . AnimateKeyPress ( m_iPad , key , repeat , pressed , released ) ;
switch ( key )
{
case ACTION_MENU_CANCEL :
if ( pressed )
{
navigateBack ( ) ;
}
break ;
case ACTION_MENU_OK :
# ifdef __ORBIS__
case ACTION_MENU_TOUCHPAD_PRESS :
# endif
sendInputToMovie ( key , repeat , pressed , released ) ;
break ;
case ACTION_MENU_UP :
if ( pressed )
{
// 4J - TomK don't proceed if there is no DLC to navigate through
if ( m_iTotalDLC > 0 )
{
if ( m_iCurrentDLC > 0 )
m_iCurrentDLC - - ;
m_bProductInfoShown = false ;
}
}
sendInputToMovie ( key , repeat , pressed , released ) ;
break ;
case ACTION_MENU_DOWN :
if ( pressed )
{
// 4J - TomK don't proceed if there is no DLC to navigate through
if ( m_iTotalDLC > 0 )
{
if ( m_iCurrentDLC < ( m_iTotalDLC - 1 ) )
m_iCurrentDLC + + ;
m_bProductInfoShown = false ;
}
}
sendInputToMovie ( key , repeat , pressed , released ) ;
break ;
case ACTION_MENU_LEFT :
/*
# ifdef _DEBUG
static int iTextC = 0 ;
switch ( iTextC )
{
case 0 :
m_labelHTMLSellText . init ( " Voici un fantastique mini-pack de 24 apparences pour personnaliser votre personnage Minecraft et vous mettre dans l'ambiance des f<> tes de fin d'ann<6E> e.<br><br>1-4 joueurs<br>2-8 joueurs en r<> seau<br><br> Cet article fait l<> objet d<> une licence ou d<> une sous-licence de Sony Computer Entertainment America, et est soumis aux conditions g<> n<EFBFBD> rales du service du r<> seau, au contrat d<> utilisateur, aux restrictions d<> utilisation de cet article et aux autres conditions applicables, disponibles sur le site www.us.playstation.com/support/useragreements. Si vous ne souhaitez pas accepter ces conditions, ne t<> l<EFBFBD> chargez pas ce produit. Cet article peut <20> tre utilis<69> avec un maximum de deux syst<73> mes PlayStation<6F> 3 activ<69> s associ<63> s <20> ce compte Sony Entertainment Network.<2E> <br><br>'Minecraft' est une marque commerciale de Notch Development AB. " ) ;
break ;
case 1 :
m_labelHTMLSellText . init ( " Un fabuloso minipack de 24 aspectos para personalizar tu personaje de Minecraft y ponerte a tono con las fiestas.<br><br>1-4 jugadores<br>2-8 jugadores en red<br><br> Sony Computer Entertainment America le concede la licencia o sublicencia de este art<72> culo, que est<73> sujeto a los t<> rminos de servicio y al acuerdo de usuario de la red. Las restricciones de uso de este art<72> culo, as<61> como otros t<> rminos aplicables, se encuentran en www.us.playstation.com/support/useragreements. Si no desea aceptar todos estos t<> rminos, no descargue este art<72> culo. Este art<72> culo puede usarse en hasta dos sistemas PlayStation<6F> 3 activados asociados con esta cuenta de Sony Entertainment Network.<2E> <br><br>'Minecraft' es una marca comercial de Notch Development AB. " ) ;
break ;
case 2 :
m_labelHTMLSellText . init ( " Este <20> um incr<63> vel pacote com 24 capas para personalizar seu personagem no Minecraft e entrar no clima de final de ano.<br><br>1-4 Jogadores<br>Jogadores em rede 2-8<br><br> Este item est<73> sendo licenciado ou sublicenciado para voc<6F> pela Sony Computer Entertainment America e est<73> sujeito aos Termos de Servi<76> o da Rede e Acordo do Usu<73> rio, as restri<72> <69> es de uso deste item e outros termos aplic<69> veis est<73> o localizados em www.us.playstation.com/support/useragreements. Caso n<> o queira aceitar todos esses termos, n<> o baixe este item. Este item pode ser usado com at<61> 2 sistemas PlayStation<6F> 3 ativados associados a esta Conta de Rede Sony Entertainment.<2E> <br><br>'Minecraft' <20> uma marca registrada da Notch Development AB " ) ;
break ;
}
iTextC + + ;
if ( iTextC > 2 ) iTextC = 0 ;
# endif
*/
case ACTION_MENU_RIGHT :
case ACTION_MENU_OTHER_STICK_DOWN :
case ACTION_MENU_OTHER_STICK_UP :
// don't pass down PageUp or PageDown because this will cause conflicts between the buttonlist and scrollable html text component
//case ACTION_MENU_PAGEUP:
//case ACTION_MENU_PAGEDOWN:
sendInputToMovie ( key , repeat , pressed , released ) ;
break ;
}
}
void UIScene_DLCOffersMenu : : handlePress ( F64 controlId , F64 childId )
{
switch ( ( int ) controlId )
{
case eControl_OffersList :
{
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
// buy the DLC
vector < SonyCommerce : : ProductInfo > : : iterator it = m_pvProductInfo - > begin ( ) ;
string teststring ;
for ( int i = 0 ; i < childId ; i + + )
{
it + + ;
}
SonyCommerce : : ProductInfo info = * it ;
# ifdef __PS3__
// is the item purchasable?
if ( info . purchasabilityFlag = = 1 )
{
// can be bought
app . Checkout ( info . skuId ) ;
}
else
{
if ( ( info . annotation & ( SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CANNOT_PURCHASE_AGAIN | SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CAN_PURCHASE_AGAIN ) ) ! = 0 )
{
app . DownloadAlreadyPurchased ( info . skuId ) ;
}
}
# else // __ORBIS__
// is the item purchasable?
if ( info . purchasabilityFlag = = SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED )
{
// can be bought
app . Checkout ( info . skuId ) ;
}
else
{
app . DownloadAlreadyPurchased ( info . skuId ) ;
}
# endif // __PS3__
# elif defined _XBOX_ONE
int iIndex = ( int ) childId ;
StorageManager . InstallOffer ( 1 , StorageManager . GetOffer ( iIndex ) . wszProductID , NULL , NULL ) ;
# else
int iIndex = ( int ) childId ;
ULONGLONG ullIndexA [ 1 ] ;
ullIndexA [ 0 ] = StorageManager . GetOffer ( iIndex ) . qwOfferID ;
StorageManager . InstallOffer ( 1 , ullIndexA , NULL , NULL ) ;
# endif
}
break ;
}
}
void UIScene_DLCOffersMenu : : handleSelectionChanged ( F64 selectedId )
{
}
void UIScene_DLCOffersMenu : : handleFocusChange ( F64 controlId , F64 childId )
{
app . DebugPrintf ( " UIScene_DLCOffersMenu::handleFocusChange \n " ) ;
# ifdef __PSVITA__
// set this here on Vita, in case we've came from a touch screen press. Fixes bug #5794
if ( ( int ) controlId = = eControl_OffersList )
{
m_bProductInfoShown = false ;
m_iCurrentDLC = ( int ) childId ;
}
# endif
# ifdef _DURANGO
m_bSelectionChanged = true ; // to tell the tick to update the display
// 4J-PB can't call settexturename from a callback
/*if(m_buttonListOffers.hasFocus() && (childId>-1))
{
int iIndex = ( int ) childId ;
MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager . GetOffer ( iIndex ) ;
UpdateDisplay ( xOffer ) ;
} */
# endif
# if defined __PSVITA__ || defined __ORBIS__
if ( m_pvProductInfo )
{
m_bIsSelected = true ;
vector < SonyCommerce : : ProductInfo > : : iterator it = m_pvProductInfo - > begin ( ) ;
string teststring ;
for ( int i = 0 ; i < childId ; i + + )
{
it + + ;
}
SonyCommerce : : ProductInfo info = * it ;
if ( info . purchasabilityFlag = = SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED )
{
m_bHasPurchased = false ;
}
else
{
m_bHasPurchased = true ;
}
updateTooltips ( ) ;
}
# endif
}
void UIScene_DLCOffersMenu : : tick ( )
{
UIScene : : tick ( ) ;
# if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__)
if ( m_bAddAllDLCButtons )
{
// need to fill out all the dlc buttons
if ( ( m_bProductInfoShown = = false ) & & app . GetCommerceProductListRetrieved ( ) & & app . GetCommerceProductListInfoRetrieved ( ) )
{
m_bAddAllDLCButtons = false ;
// add the categories to the list box
if ( m_pvProductInfo = = NULL )
{
m_pvProductInfo = app . GetProductList ( m_iProductInfoIndex ) ;
if ( m_pvProductInfo = = NULL )
{
m_iTotalDLC = 0 ;
// need to display text to say no downloadable content available yet
m_labelOffers . setLabel ( app . GetString ( IDS_NO_DLCCATEGORIES ) ) ;
m_bProductInfoShown = true ;
return ;
}
else m_iTotalDLC = m_pvProductInfo - > size ( ) ;
}
vector < SonyCommerce : : ProductInfo > : : iterator it = m_pvProductInfo - > begin ( ) ;
string teststring ;
bool bFirstItemSet = false ;
for ( int i = 0 ; i < m_iTotalDLC ; i + + )
{
SonyCommerce : : ProductInfo info = * it ;
if ( strncmp ( info . productName , " Minecraft " , 10 ) = = 0 )
{
teststring = & info . productName [ 10 ] ;
}
else
{
teststring = info . productName ;
}
bool bDLCIsAvailable = false ;
# ifdef __PS3__
// is the item purchasable?
if ( info . purchasabilityFlag = = 1 )
{
// can be bought
app . DebugPrintf ( " Adding DLC (%s) - not bought \n " , teststring . c_str ( ) ) ;
m_buttonListOffers . addItem ( teststring , false , i ) ;
bDLCIsAvailable = true ;
}
else
{
if ( ( info . annotation & ( SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CANNOT_PURCHASE_AGAIN | SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CAN_PURCHASE_AGAIN ) ) ! = 0 )
{
app . DebugPrintf ( " Adding DLC (%s) - bought \n " , teststring . c_str ( ) ) ;
m_buttonListOffers . addItem ( teststring , true , i ) ;
bDLCIsAvailable = true ;
}
}
# else // __ORBIS__
// is the item purchasable?
if ( info . purchasabilityFlag = = SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED )
{
// can be bought
m_buttonListOffers . addItem ( teststring , false , i ) ;
bDLCIsAvailable = true ;
}
else
{
m_buttonListOffers . addItem ( teststring , true , i ) ;
bDLCIsAvailable = true ;
}
# endif // __PS3__
// set the other details for the first item
if ( bDLCIsAvailable & & ( bFirstItemSet = = false ) )
{
bFirstItemSet = true ;
// 4J-PB - info.longDescription isn't null terminated
char chLongDescription [ SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN + 1 ] ;
memcpy ( chLongDescription , info . longDescription , SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN ) ;
chLongDescription [ SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN ] = 0 ;
m_labelHTMLSellText . setLabel ( chLongDescription ) ;
if ( info . ui32Price = = 0 )
{
m_labelPriceTag . setLabel ( app . GetString ( IDS_DLC_PRICE_FREE ) ) ;
}
else
{
teststring = info . price ;
m_labelPriceTag . setLabel ( teststring ) ;
}
// get the image - if we haven't already
wstring textureName = filenametowstring ( info . imageUrl ) ;
if ( hasRegisteredSubstitutionTexture ( textureName ) = = false )
{
PBYTE pbImageData ;
int iImageDataBytes = 0 ;
bool bDeleteData ;
# ifdef __ORBIS__
// check the local files first
SONYDLC * pSONYDLCInfo = app . GetSONYDLCInfoFromKeyname ( info . productId ) ;
// does the DLC info have an image?
2026-03-03 03:04:10 +08:00
if ( pSONYDLCInfo & & pSONYDLCInfo - > dwImageBytes ! = 0 )
2026-03-01 12:16:08 +08:00
{
pbImageData = pSONYDLCInfo - > pbImageData ;
iImageDataBytes = pSONYDLCInfo - > dwImageBytes ;
bDeleteData = false ; // we'll clean up the local LDC images
}
else
# endif
if ( info . imageUrl [ 0 ] ! = 0 )
{
SonyHttp : : getDataFromURL ( info . imageUrl , ( void * * ) & pbImageData , & iImageDataBytes ) ;
bDeleteData = true ;
}
if ( iImageDataBytes ! = 0 )
{
// set the image
registerSubstitutionTexture ( textureName , pbImageData , iImageDataBytes , bDeleteData ) ;
m_bitmapIconOfferImage . setTextureName ( textureName ) ;
// 4J Stu - Don't delete this
//delete [] pbImageData;
}
else
{
m_bitmapIconOfferImage . setTextureName ( L " " ) ;
}
}
else
{
m_bitmapIconOfferImage . setTextureName ( textureName ) ;
}
}
it + + ;
}
if ( bFirstItemSet = = false )
{
// we were not able to add any items to the list
m_labelOffers . setLabel ( app . GetString ( IDS_NO_DLCCATEGORIES ) ) ;
}
else
{
// set the focus to the first thing in the categories if there are any
if ( m_pvProductInfo - > size ( ) > 0 )
{
m_buttonListOffers . setFocus ( true ) ;
}
else
{
// need to display text to say no downloadable content available yet
m_labelOffers . setLabel ( app . GetString ( IDS_NO_DLCCATEGORIES ) ) ;
}
}
m_Timer . setVisible ( false ) ;
m_bProductInfoShown = true ;
}
}
else
{
# ifdef __PSVITA__
// MGH - fixes bug 5768 on Vita - should be extended properly to work for other platforms
if ( ( SonyCommerce_Vita : : getPurchasabilityUpdated ( ) ) & & app . GetCommerceProductListRetrieved ( ) & & app . GetCommerceProductListInfoRetrieved ( ) & & m_iTotalDLC > 0 )
{
{
vector < SonyCommerce : : ProductInfo > : : iterator it = m_pvProductInfo - > begin ( ) ;
for ( int i = 0 ; i < m_iTotalDLC ; i + + )
{
SonyCommerce : : ProductInfo info = * it ;
// is the item purchasable?
if ( info . purchasabilityFlag = = SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED )
{
// can be bought
m_buttonListOffers . showTick ( i , false ) ;
}
else
{
m_buttonListOffers . showTick ( i , true ) ;
}
it + + ;
}
}
}
# endif
// just update the details based on what the current selection is / TomK-4J - don't proceed if total DLC is 0 (bug 4757)
if ( ( m_bProductInfoShown = = false ) & & app . GetCommerceProductListRetrieved ( ) & & app . GetCommerceProductListInfoRetrieved ( ) & & m_iTotalDLC > 0 )
{
vector < SonyCommerce : : ProductInfo > : : iterator it = m_pvProductInfo - > begin ( ) ;
string teststring ;
for ( int i = 0 ; i < m_iCurrentDLC ; i + + )
{
it + + ;
}
SonyCommerce : : ProductInfo info = * it ;
// 4J-PB - info.longDescription isn't null terminated
char chLongDescription [ SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN + 1 ] ;
memcpy ( chLongDescription , info . longDescription , SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN ) ;
chLongDescription [ SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN ] = 0 ;
m_labelHTMLSellText . setLabel ( chLongDescription ) ;
if ( info . ui32Price = = 0 )
{
m_labelPriceTag . setLabel ( app . GetString ( IDS_DLC_PRICE_FREE ) ) ;
}
else
{
teststring = info . price ;
m_labelPriceTag . setLabel ( teststring ) ;
}
// get the image
// then retrieve from the web
wstring textureName = filenametowstring ( info . imageUrl ) ;
if ( hasRegisteredSubstitutionTexture ( textureName ) = = false )
{
PBYTE pbImageData ;
int iImageDataBytes = 0 ;
bool bDeleteData ;
# ifdef __ORBIS__
// check the local files first
SONYDLC * pSONYDLCInfo = app . GetSONYDLCInfoFromKeyname ( info . productId ) ;
// does the DLC info have an image?
if ( pSONYDLCInfo - > dwImageBytes ! = 0 )
{
pbImageData = pSONYDLCInfo - > pbImageData ;
iImageDataBytes = pSONYDLCInfo - > dwImageBytes ;
bDeleteData = false ; // we'll clean up the local LDC images
}
else
# endif
{
SonyHttp : : getDataFromURL ( info . imageUrl , ( void * * ) & pbImageData , & iImageDataBytes ) ;
bDeleteData = true ;
}
if ( iImageDataBytes ! = 0 )
{
// set the image
registerSubstitutionTexture ( textureName , pbImageData , iImageDataBytes , bDeleteData ) ;
m_bitmapIconOfferImage . setTextureName ( textureName ) ;
// 4J Stu - Don't delete this
//delete [] pbImageData;
}
else
{
m_bitmapIconOfferImage . setTextureName ( L " " ) ;
}
}
else
{
m_bitmapIconOfferImage . setTextureName ( textureName ) ;
}
m_bProductInfoShown = true ;
m_Timer . setVisible ( false ) ;
}
}
# elif defined _XBOX_ONE
if ( m_bAddAllDLCButtons )
{
// Is the DLC we're looking for available?
if ( ! m_bDLCRequiredIsRetrieved )
{
// DLCContentRetrieved is to see if the type of content has been retrieved - and on Durango there is only type 0 - XMARKETPLACE_OFFERING_TYPE_CONTENT
if ( app . DLCContentRetrieved ( e_Marketplace_Content ) )
{
m_bDLCRequiredIsRetrieved = true ;
// Retrieve the info
GetDLCInfo ( app . GetDLCOffersCount ( ) , false ) ;
m_bIgnorePress = false ;
m_bAddAllDLCButtons = false ;
// hide the timer
m_Timer . setVisible ( false ) ;
}
}
}
// have to wait until we have the offers
if ( m_bSelectionChanged & & m_bDLCRequiredIsRetrieved )
{
// need to update text and icon
if ( m_buttonListOffers . hasFocus ( ) & & ( getControlChildFocus ( ) > - 1 ) )
{
int iIndex = getControlChildFocus ( ) ;
MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager . GetOffer ( iIndex ) ;
2026-03-03 03:04:10 +08:00
if ( ! ui . UsingBitmapFont ( ) ) // 4J-JEV: Replace characters we don't have.
{
for ( int i = 0 ; xOffer . wszCurrencyPrice [ i ] ! = 0 ; i + + )
{
WCHAR * c = & xOffer . wszCurrencyPrice [ i ] ;
if ( * c = = L ' \ u20A9 ' ) * c = L ' \ uFFE6 ' ; // Korean Won.
else if ( * c = = L ' \ u00A5 ' ) * c = L ' \ uFFE5 ' ; // Japanese Yen.
}
}
2026-03-01 12:16:08 +08:00
if ( UpdateDisplay ( xOffer ) )
{
// image was available
m_bSelectionChanged = false ;
}
}
}
// if(m_bBitmapOfferIconDisplayed==false)
// {
// // do we have it yet?
// if
// }
// retrieve the icons for the DLC
// if(m_vIconRetrieval.size()>0)
// {
// // for each icon, request it, and remove it from the list
// // the callback for the retrieval will update the display if needed
//
// AUTO_VAR(itEnd, m_vIconRetrieval.end());
// for (AUTO_VAR(it, m_vIconRetrieval.begin()); it != itEnd; it++)
// {
//
// }
//
// }
# endif
}
# if defined _XBOX_ONE
void UIScene_DLCOffersMenu : : GetDLCInfo ( int iOfferC , bool bUpdateOnly )
{
MARKETPLACE_CONTENTOFFER_INFO xOffer ;
int iCount = 0 ;
bool bNoDLCToDisplay = true ;
unsigned int uiDLCCount = 0 ;
if ( bUpdateOnly ) // Just update the info on the current list
{
}
else
{
// clear out the list
m_buttonListOffers . clearList ( ) ;
// need to reorder the DLC display according to dlc uiSortIndex
SORTINDEXSTRUCT * OrderA = new SORTINDEXSTRUCT [ iOfferC ] ;
for ( int i = 0 ; i < iOfferC ; i + + )
{
xOffer = StorageManager . GetOffer ( i ) ;
// Check that this is in the list of known DLC
DLC_INFO * pDLC = app . GetDLCInfoForFullOfferID ( xOffer . wszProductID ) ;
if ( pDLC ! = NULL )
{
OrderA [ uiDLCCount ] . uiContentIndex = i ;
OrderA [ uiDLCCount + + ] . uiSortIndex = pDLC - > uiSortIndex ;
}
else
{
app . DebugPrintf ( " Unknown offer - %ls \n " , xOffer . wszOfferName ) ;
}
}
qsort ( OrderA , uiDLCCount , sizeof ( SORTINDEXSTRUCT ) , OrderSortFunction ) ;
for ( int i = 0 ; i < uiDLCCount ; i + + )
{
xOffer = StorageManager . GetOffer ( OrderA [ i ] . uiContentIndex ) ;
// Check that this is in the list of known DLC
DLC_INFO * pDLC = app . GetDLCInfoForFullOfferID ( xOffer . wszProductID ) ;
if ( pDLC = = NULL )
{
// skip this one
app . DebugPrintf ( " Unknown offer - %ls \n " , xOffer . wszOfferName ) ;
continue ;
}
if ( pDLC - > eDLCType = = ( eDLCContentType ) m_iProductInfoIndex )
{
wstring wstrTemp = xOffer . wszOfferName ;
// 4J-PB - Rog requested we remove the Minecraft at the start of the name. It's required for the Bing search, but gets in the way here
app . DebugPrintf ( " Adding %ls at %d \n " , wstrTemp . c_str ( ) , i ) ;
if ( wcsncmp ( L " Minecraft " , wstrTemp . c_str ( ) , 10 ) = = 0 )
{
app . DebugPrintf ( " Removing Minecraft from name \n " ) ;
WCHAR * pwchNewName = ( WCHAR * ) wstrTemp . c_str ( ) ;
wstrTemp = & pwchNewName [ 10 ] ;
}
# ifdef _XBOX_ONE
// 4J-PB - the hasPurchased comes from the local installed package info
// find the DLC in the installed packages
XCONTENT_DATA * pContentData = StorageManager . GetInstalledDLC ( xOffer . wszProductID ) ;
if ( pContentData ! = NULL )
{
m_buttonListOffers . addItem ( wstrTemp , ! pContentData - > bTrialLicense , OrderA [ i ] . uiContentIndex ) ;
}
else
{
m_buttonListOffers . addItem ( wstrTemp , false , OrderA [ i ] . uiContentIndex ) ;
}
# else
m_buttonListOffers . addItem ( wstrTemp , xOffer . fUserHasPurchased , OrderA [ i ] . uiContentIndex ) ;
# endif
// add the required image to the retrieval queue
m_vIconRetrieval . push_back ( pDLC - > wchBanner ) ;
/** 4J JEV:
* We ' ve filtered results out from the list , need to keep track
* of the ' actual ' list index .
*/
iCount + + ;
}
}
// Check if there is nothing to display, and display the default "nothing available at this time"
if ( iCount > 0 )
{
bNoDLCToDisplay = false ;
xOffer = StorageManager . GetOffer ( OrderA [ 0 ] . uiContentIndex ) ;
//m_buttonListOffers.setCurrentSelection(0);
UpdateDisplay ( xOffer ) ;
}
delete OrderA ;
}
// turn off the timer display
//m_Timer.SetShow(FALSE);
if ( bNoDLCToDisplay )
{
// set the default text
wchar_t formatting [ 40 ] ;
wstring wstrTemp = app . GetString ( IDS_NO_DLCOFFERS ) ;
// swprintf(formatting, 40, L"<font size=\"%d\">", m_bIsSD?12:14);
// wstrTemp = formatting + wstrTemp;
m_labelHTMLSellText . setLabel ( wstrTemp ) ;
m_labelPriceTag . setVisible ( false ) ;
}
}
int UIScene_DLCOffersMenu : : OrderSortFunction ( const void * a , const void * b )
{
return ( ( SORTINDEXSTRUCT * ) b ) - > uiSortIndex - ( ( SORTINDEXSTRUCT * ) a ) - > uiSortIndex ;
}
void UIScene_DLCOffersMenu : : UpdateTooltips ( MARKETPLACE_CONTENTOFFER_INFO & xOffer )
{
m_bHasPurchased = xOffer . fUserHasPurchased ;
m_bIsSelected = true ;
updateTooltips ( ) ;
}
bool UIScene_DLCOffersMenu : : UpdateDisplay ( MARKETPLACE_CONTENTOFFER_INFO & xOffer )
{
bool bImageAvailable = false ;
# ifdef _XBOX_ONE
DLC_INFO * dlc = app . GetDLCInfoForFullOfferID ( xOffer . wszProductID ) ;
# else
DLC_INFO * dlc = app . GetDLCInfoForFullOfferID ( xOffer . wszOfferName ) ;
# endif
if ( dlc ! = NULL )
{
WCHAR * cString = dlc - > wchBanner ;
// is the file in the local DLC images?
// is the file in the TMS XZP?
//int iIndex = app.GetLocalTMSFileIndex(cString, true);
if ( dlc - > dwImageBytes ! = 0 )
{
//app.LoadLocalTMSFile(cString);
// set the image - no delete
registerSubstitutionTexture ( cString , dlc - > pbImageData , dlc - > dwImageBytes , false ) ;
m_bitmapIconOfferImage . setTextureName ( cString ) ;
bImageAvailable = true ;
}
else
{
bool bPresent = app . IsFileInMemoryTextures ( cString ) ;
if ( ! bPresent )
{
// Image has not come in yet
// Set the item monitored in the timer, so we can set the image when it comes in
m_pNoImageFor_DLC = dlc ;
app . AddTMSPPFileTypeRequest ( dlc - > eDLCType , true ) ;
bImageAvailable = false ;
//m_bitmapIconOfferImage.setTextureName(L"");
}
else
{
if ( hasRegisteredSubstitutionTexture ( cString ) = = false )
{
BYTE * pData = NULL ;
DWORD dwSize = 0 ;
app . GetMemFileDetails ( cString , & pData , & dwSize ) ;
// set the image
# ifdef _XBOX_ONE
registerSubstitutionTexture ( cString , pData , dwSize ) ;
# else
registerSubstitutionTexture ( cString , pData , dwSize , true ) ;
# endif
m_bitmapIconOfferImage . setTextureName ( cString ) ;
}
else
{
m_bitmapIconOfferImage . setTextureName ( cString ) ;
}
bImageAvailable = true ;
}
}
m_labelHTMLSellText . setLabel ( xOffer . wszSellText ) ;
// set the price info
m_labelPriceTag . setVisible ( true ) ;
m_labelPriceTag . setLabel ( xOffer . wszCurrencyPrice ) ;
UpdateTooltips ( xOffer ) ;
}
else
{
wchar_t formatting [ 40 ] ;
wstring wstrTemp = app . GetString ( IDS_NO_DLCOFFERS ) ;
m_labelHTMLSellText . setLabel ( wstrTemp . c_str ( ) ) ;
m_labelPriceTag . setVisible ( false ) ;
}
return bImageAvailable ;
}
# endif
# ifdef _XBOX_ONE
void UIScene_DLCOffersMenu : : HandleDLCLicenseChange ( )
{
// flag an update of the display
int iOfferC = app . GetDLCOffersCount ( ) ;
GetDLCInfo ( iOfferC , false ) ;
}
# endif // _XBOX_ONE
# ifdef __PS3__
void UIScene_DLCOffersMenu : : HandleDLCInstalled ( )
{
app . DebugPrintf ( 4 , " UIScene_DLCOffersMenu::HandleDLCInstalled \n " ) ;
// m_buttonListOffers.clearList();
// m_bAddAllDLCButtons=true;
// m_bProductInfoShown=false;
}
// void UIScene_DLCOffersMenu::HandleDLCMountingComplete()
// {
// app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCMountingComplete\n");
//}
# endif