#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); m_labelHTMLSellText.init(L" "); m_labelPriceTag.init(L" "); 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; 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); } #endif break; } #endif } int UIScene_DLCOffersMenu::ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::EMessageResult result) { UIScene_DLCOffersMenu* pClass = (UIScene_DLCOffersMenu*)pParam; #if defined __ORBIS__ || defined __PSVITA__ app.GetCommerce()->HidePsStoreIcon(); #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ée.

1-4 joueurs
2-8 joueurs en réseau

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é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échargez pas ce produit. Cet article peut être utilisé avec un maximum de deux systèmes PlayStation®3 activés associés à ce compte Sony Entertainment Network. 

'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.

1-4 jugadores
2-8 jugadores en red

Sony Computer Entertainment America le concede la licencia o sublicencia de este artículo, que está sujeto a los términos de servicio y al acuerdo de usuario de la red. Las restricciones de uso de este artículo, así 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ículo. Este artículo puede usarse en hasta dos sistemas PlayStation®3 activados asociados con esta cuenta de Sony Entertainment Network. 

'Minecraft' es una marca comercial de Notch Development AB."); break; case 2: m_labelHTMLSellText.init("Este é um incrível pacote com 24 capas para personalizar seu personagem no Minecraft e entrar no clima de final de ano.

1-4 Jogadores
Jogadores em rede 2-8

Este item está sendo licenciado ou sublicenciado para você pela Sony Computer Entertainment America e está sujeito aos Termos de Serviço da Rede e Acordo do Usuário, as restrições de uso deste item e outros termos aplicáveis estã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é 2 sistemas PlayStation®3 ativados associados a esta Conta de Rede Sony Entertainment. 

'Minecraft' é 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::iterator it = m_pvProductInfo->begin(); string teststring; for(int i=0;i-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::iterator it = m_pvProductInfo->begin(); string teststring; for(int i=0;isize(); } vector::iterator it = m_pvProductInfo->begin(); string teststring; bool bFirstItemSet=false; for(int i=0;idwImageBytes!=0) { 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::iterator it = m_pvProductInfo->begin(); for(int i=0;i 0) { vector::iterator it = m_pvProductInfo->begin(); string teststring; for(int i=0;idwImageBytes!=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); 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. } } 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"", 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