mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-25 14:33:35 +00:00
i noticed that the exit game button on the menu screen wasn't working, so i went ahead and enabled it and added the behavior to close the game. i added a Close method in the 4J_Render class and made a tweak to the _xbox check. the catch is that it uses the xbox text for the confirmation button, so i’m not sure if it’s the best approach, but it does work fine for me Signed-off-by: ViniciusCruzMoura <contato.cruz.moura@gmail.com>
2073 lines
62 KiB
C++
2073 lines
62 KiB
C++
#include "../../Minecraft.World/Platform/stdafx.h"
|
|
#include "../../Minecraft.World/Util/Mth.h"
|
|
#include "../../Minecraft.World/Util/StringHelpers.h"
|
|
#include "../../Minecraft.World/Util/Random.h"
|
|
#include "../../Minecraft.Client/Player/User.h"
|
|
#include "../../Minecraft.Client/MinecraftServer.h"
|
|
#include "UI.h"
|
|
#include "UIScene_MainMenu.h"
|
|
#ifdef __ORBIS__
|
|
#include <error_dialog.h>
|
|
#endif
|
|
|
|
Random *UIScene_MainMenu::random = new Random();
|
|
|
|
UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
|
|
{
|
|
#ifdef __ORBIS
|
|
//m_ePatchCheckState=ePatchCheck_Idle;
|
|
m_bRunGameChosen=false;
|
|
m_bErrorDialogRunning=false;
|
|
#endif
|
|
|
|
|
|
// Setup all the Iggy references we need for this scene
|
|
initialiseMovie();
|
|
|
|
parentLayer->addComponent(iPad,eUIComponent_Panorama);
|
|
parentLayer->addComponent(iPad,eUIComponent_Logo);
|
|
|
|
m_eAction=eAction_None;
|
|
m_bIgnorePress=false;
|
|
|
|
|
|
m_buttons[(int)eControl_PlayGame].init(app.GetString(IDS_PLAY_GAME),eControl_PlayGame);
|
|
|
|
#ifdef _XBOX_ONE
|
|
if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(app.GetString(IDS_PLAY_TRIAL_GAME));
|
|
app.SetReachedMainMenu();
|
|
#endif
|
|
|
|
m_buttons[(int)eControl_Leaderboards].init(app.GetString(IDS_LEADERBOARDS),eControl_Leaderboards);
|
|
m_buttons[(int)eControl_Achievements].init(app.GetString(IDS_ACHIEVEMENTS),eControl_Achievements);
|
|
m_buttons[(int)eControl_HelpAndOptions].init(app.GetString(IDS_HELP_AND_OPTIONS),eControl_HelpAndOptions);
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
m_bTrialVersion=false;
|
|
m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC);
|
|
}
|
|
else
|
|
{
|
|
m_bTrialVersion=true;
|
|
m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_UNLOCK_FULL_GAME),eControl_UnlockOrDLC);
|
|
}
|
|
|
|
#ifndef _DURANGO
|
|
m_buttons[(int)eControl_Exit].init(app.GetString(IDS_EXIT_GAME),eControl_Exit);
|
|
#else
|
|
m_buttons[(int)eControl_XboxHelp].init(app.GetString(IDS_XBOX_HELP_APP), eControl_XboxHelp);
|
|
#endif
|
|
|
|
#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
|
|
// Not allowed to exit from a PS3 game from the game - have to use the PS button
|
|
removeControl( &m_buttons[(int)eControl_Exit], false );
|
|
// We don't have a way to display trophies/achievements, so remove the button
|
|
removeControl( &m_buttons[(int)eControl_Achievements], false );
|
|
m_bLaunchFullVersionPurchase=false;
|
|
#endif
|
|
#ifdef _DURANGO
|
|
// Allowed to not have achievements in the menu
|
|
removeControl( &m_buttons[(int)eControl_Achievements], false );
|
|
// Not allowed to exit from a Xbox One game from the game - have to use the Home button
|
|
//removeControl( &m_buttons[(int)eControl_Exit], false );
|
|
m_bWaitingForDLCInfo=false;
|
|
#endif
|
|
|
|
doHorizontalResizeCheck();
|
|
|
|
m_splash = L"";
|
|
|
|
std::wstring filename = L"splashes.txt";
|
|
if( app.hasArchiveFile(filename) )
|
|
{
|
|
byteArray splashesArray = app.getArchiveFile(filename);
|
|
ByteArrayInputStream bais(splashesArray);
|
|
InputStreamReader isr( &bais );
|
|
BufferedReader br( &isr );
|
|
|
|
std::wstring line = L"";
|
|
while ( !(line = br.readLine()).empty() )
|
|
{
|
|
line = trimString( line );
|
|
if (line.length() > 0)
|
|
{
|
|
m_splashes.push_back(line);
|
|
}
|
|
}
|
|
|
|
br.close();
|
|
}
|
|
|
|
m_bIgnorePress=false;
|
|
m_bLoadTrialOnNetworkManagerReady = false;
|
|
|
|
// 4J Stu - Clear out any loaded game rules
|
|
app.setLevelGenerationOptions(NULL);
|
|
|
|
// 4J Stu - Reset the leaving game flag so that we correctly handle signouts while in the menus
|
|
g_NetworkManager.ResetLeavingGame();
|
|
|
|
#if TO_BE_IMPLEMENTED
|
|
// Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer
|
|
XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW);
|
|
#endif
|
|
}
|
|
|
|
UIScene_MainMenu::~UIScene_MainMenu()
|
|
{
|
|
m_parentLayer->removeComponent(eUIComponent_Panorama);
|
|
m_parentLayer->removeComponent(eUIComponent_Logo);
|
|
}
|
|
|
|
void UIScene_MainMenu::updateTooltips()
|
|
{
|
|
int iX = -1;
|
|
int iA = -1;
|
|
if(!m_bIgnorePress)
|
|
{
|
|
iA = IDS_TOOLTIPS_SELECT;
|
|
|
|
#ifdef _XBOX_ONE
|
|
iX = IDS_TOOLTIPS_CHOOSE_USER;
|
|
#elif defined __PSVITA__
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
iX = IDS_TOOLTIP_CHANGE_NETWORK_MODE;
|
|
}
|
|
#endif
|
|
}
|
|
ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA, -1, iX);
|
|
}
|
|
|
|
void UIScene_MainMenu::updateComponents()
|
|
{
|
|
m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true);
|
|
m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true);
|
|
}
|
|
|
|
void UIScene_MainMenu::handleGainFocus(bool navBack)
|
|
{
|
|
UIScene::handleGainFocus(navBack);
|
|
ui.ShowPlayerDisplayname(false);
|
|
m_bIgnorePress=false;
|
|
|
|
// 4J-JEV: This needs to come before SetLockedProfile(-1) as it wipes the XbLive contexts.
|
|
if (!navBack)
|
|
{
|
|
for (int iPad = 0; iPad < MAX_LOCAL_PLAYERS; iPad++)
|
|
{
|
|
// For returning to menus after exiting a game.
|
|
if (ProfileManager.IsSignedIn(iPad) )
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
}
|
|
}
|
|
}
|
|
ProfileManager.SetLockedProfile(-1);
|
|
|
|
m_bIgnorePress = false;
|
|
updateTooltips();
|
|
|
|
#ifdef _DURANGO
|
|
ProfileManager.ClearGameUsers();
|
|
#endif
|
|
|
|
if(navBack && ProfileManager.IsFullVersion())
|
|
{
|
|
// Replace the Unlock Full Game with Downloadable Content
|
|
m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT));
|
|
}
|
|
|
|
#if TO_BE_IMPLEMENTED
|
|
// Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer
|
|
XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW);
|
|
m_Timer.SetShow(FALSE);
|
|
#endif
|
|
m_controlTimer.setVisible( false );
|
|
|
|
// 4J-PB - remove the "hobo humping" message legal say we can't have, and the 1080p one for Vita
|
|
#ifdef __PSVITA__
|
|
int splashIndex = eSplashRandomStart + 2 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 2) );
|
|
#else
|
|
int splashIndex = eSplashRandomStart + 1 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 1) );
|
|
#endif
|
|
|
|
// Override splash text on certain dates
|
|
SYSTEMTIME LocalSysTime;
|
|
GetLocalTime( &LocalSysTime );
|
|
if (LocalSysTime.wMonth == 11 && LocalSysTime.wDay == 9)
|
|
{
|
|
splashIndex = eSplashHappyBirthdayEx;
|
|
}
|
|
else if (LocalSysTime.wMonth == 6 && LocalSysTime.wDay == 1)
|
|
{
|
|
splashIndex = eSplashHappyBirthdayNotch;
|
|
}
|
|
else if (LocalSysTime.wMonth == 12 && LocalSysTime.wDay == 24) // the Java game shows this on Christmas Eve, so we will too
|
|
{
|
|
splashIndex = eSplashMerryXmas;
|
|
}
|
|
else if (LocalSysTime.wMonth == 1 && LocalSysTime.wDay == 1)
|
|
{
|
|
splashIndex = eSplashHappyNewYear;
|
|
}
|
|
//splashIndex = 47; // Very short string
|
|
//splashIndex = 194; // Very long string
|
|
//splashIndex = 295; // Coloured
|
|
//splashIndex = 296; // Noise
|
|
m_splash = m_splashes.at( splashIndex );
|
|
}
|
|
|
|
std::wstring UIScene_MainMenu::getMoviePath()
|
|
{
|
|
return L"MainMenu";
|
|
}
|
|
|
|
void UIScene_MainMenu::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");
|
|
|
|
if(m_bIgnorePress) return;
|
|
|
|
#if defined (__ORBIS__) || defined (__PSVITA__)
|
|
// ignore all players except player 0 - it's their profile that is currently being used
|
|
if(iPad!=0) return;
|
|
#endif
|
|
|
|
ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
|
|
|
|
switch(key)
|
|
{
|
|
case ACTION_MENU_OK:
|
|
#ifdef __ORBIS__
|
|
case ACTION_MENU_TOUCHPAD_PRESS:
|
|
#endif
|
|
if(pressed)
|
|
{
|
|
ProfileManager.SetPrimaryPad(iPad);
|
|
ProfileManager.SetLockedProfile(-1);
|
|
sendInputToMovie(key, repeat, pressed, released);
|
|
}
|
|
break;
|
|
#ifdef _XBOX_ONE
|
|
case ACTION_MENU_X:
|
|
if(pressed)
|
|
{
|
|
m_bIgnorePress = true;
|
|
ProfileManager.RequestSignInUI(false, false, false, false, false, ChooseUser_SignInReturned, this, iPad);
|
|
}
|
|
break;
|
|
#endif
|
|
#ifdef __PSVITA__
|
|
case ACTION_MENU_X:
|
|
if(pressed && ProfileManager.IsFullVersion())
|
|
{
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS__NETWORK_PSN;
|
|
uiIDA[1]=IDS_NETWORK_ADHOC;
|
|
ui.RequestMessageBox(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case ACTION_MENU_UP:
|
|
case ACTION_MENU_DOWN:
|
|
sendInputToMovie(key, repeat, pressed, released);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::handlePress(F64 controlId, F64 childId)
|
|
{
|
|
int primaryPad = ProfileManager.GetPrimaryPad();
|
|
|
|
int (*signInReturnedFunc) (void *,const bool, const int iPad) = NULL;
|
|
|
|
switch((int)controlId)
|
|
{
|
|
case eControl_PlayGame:
|
|
#ifdef __ORBIS__
|
|
{
|
|
m_bIgnorePress=true;
|
|
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_PlayGame, this);
|
|
}
|
|
#else
|
|
m_eAction=eAction_RunGame;
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned;
|
|
app.DebugPrintf("UIScene_MainMenu::handlePress AFTER &UIScene_MainMenu::CreateLoad_SignInReturned\n");
|
|
#endif
|
|
app.DebugPrintf("UIScene_MainMenu::handlePress FINISH eControl_PlayGame \n");
|
|
break;
|
|
case eControl_Leaderboards:
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
#ifdef __ORBIS__
|
|
ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_Leaderboards, this);
|
|
#else
|
|
m_eAction=eAction_RunLeaderboards;
|
|
signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned;
|
|
#endif
|
|
break;
|
|
case eControl_Achievements:
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
m_eAction=eAction_RunAchievements;
|
|
signInReturnedFunc = &UIScene_MainMenu::Achievements_SignInReturned;
|
|
break;
|
|
case eControl_HelpAndOptions:
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
m_eAction=eAction_RunHelpAndOptions;
|
|
signInReturnedFunc = &UIScene_MainMenu::HelpAndOptions_SignInReturned;
|
|
break;
|
|
case eControl_UnlockOrDLC:
|
|
//CD - Added for audio
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
m_eAction=eAction_RunUnlockOrDLC;
|
|
signInReturnedFunc = &UIScene_MainMenu::UnlockFullGame_SignInReturned;
|
|
break;
|
|
case eControl_Exit:
|
|
if( ProfileManager.IsFullVersion() )
|
|
{
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CANCEL;
|
|
uiIDA[1]=IDS_OK;
|
|
ui.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this);
|
|
app.DebugPrintf("UIScene_MainMenu::handlePress AFTER ui.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this) CALL\n");
|
|
}
|
|
#if defined _XBOX //|| _ENABLEIGGY
|
|
else
|
|
{
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(primaryPad,eUIScene_TrialExitUpsell);
|
|
app.DebugPrintf("UIScene_MainMenu::handlePress AFTER ui.NavigateToScene(primaryPad,eUIScene_TrialExitUpsell) CALL\n");
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
#ifdef _DURANGO
|
|
case eControl_XboxHelp:
|
|
ui.PlayUISFX(eSFX_Press);
|
|
|
|
m_eAction=eAction_RunXboxHelp;
|
|
signInReturnedFunc = &UIScene_MainMenu::XboxHelp_SignInReturned;
|
|
break;
|
|
#endif
|
|
|
|
default: __debugbreak();
|
|
}
|
|
|
|
bool confirmUser = false;
|
|
|
|
// Note: if no sign in returned func, assume this isn't required
|
|
if (signInReturnedFunc != NULL)
|
|
{
|
|
if(ProfileManager.IsSignedIn(primaryPad))
|
|
{
|
|
if (confirmUser)
|
|
{
|
|
ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, this, primaryPad);
|
|
}
|
|
else
|
|
{
|
|
RunAction(primaryPad);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Ask user to sign in
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
uiIDA[1]=IDS_CONFIRM_CANCEL;
|
|
ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this, app.GetStringTable());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Run current action
|
|
void UIScene_MainMenu::RunAction(int iPad)
|
|
{
|
|
switch(m_eAction)
|
|
{
|
|
case eAction_RunGame:
|
|
RunPlayGame(iPad);
|
|
break;
|
|
case eAction_RunLeaderboards:
|
|
RunLeaderboards(iPad);
|
|
break;
|
|
case eAction_RunAchievements:
|
|
RunAchievements(iPad);
|
|
break;
|
|
case eAction_RunHelpAndOptions:
|
|
RunHelpAndOptions(iPad);
|
|
break;
|
|
case eAction_RunUnlockOrDLC:
|
|
RunUnlockOrDLC(iPad);
|
|
break;
|
|
#ifdef _DURANGO
|
|
case eAction_RunXboxHelp:
|
|
// 4J: Launch the dummy xbox help application.
|
|
WXS::User^ user = ProfileManager.GetUser(ProfileManager.GetPrimaryPad());
|
|
Windows::Xbox::ApplicationModel::Help::Show(user);
|
|
break;
|
|
#endif
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::customDraw(IggyCustomDrawCallbackRegion *region)
|
|
{
|
|
if(std::char_traits<char16_t>::compare(region->name, u"Splash", 6) == 0)
|
|
{
|
|
PIXBeginNamedEvent(0,"Custom draw splash");
|
|
customDrawSplash(region);
|
|
PIXEndNamedEvent();
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::customDrawSplash(IggyCustomDrawCallbackRegion *region)
|
|
{
|
|
Minecraft *pMinecraft = Minecraft::GetInstance();
|
|
|
|
// 4J Stu - Move this to the ctor when the main menu is not the first scene we navigate to
|
|
ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys);
|
|
m_fScreenWidth=(float)pMinecraft->width_phys;
|
|
m_fRawWidth=(float)ssc.rawWidth;
|
|
m_fScreenHeight=(float)pMinecraft->height_phys;
|
|
m_fRawHeight=(float)ssc.rawHeight;
|
|
|
|
|
|
// Setup GDraw, normal game render states and matrices
|
|
CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region);
|
|
delete customDrawRegion;
|
|
|
|
|
|
Font *font = pMinecraft->font;
|
|
|
|
// build and render with the game call
|
|
glDisable(GL_CULL_FACE);
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
glPushMatrix();
|
|
|
|
float width = region->x1 - region->x0;
|
|
float height = region->y1 - region->y0;
|
|
float xo = width/2;
|
|
float yo = height;
|
|
|
|
glTranslatef(xo, yo, 0);
|
|
|
|
glRotatef(-17, 0, 0, 1);
|
|
float sss = 1.8f - Mth::abs(Mth::sin(System::currentTimeMillis() % 1000 / 1000.0f * PI * 2) * 0.1f);
|
|
sss*=(m_fScreenWidth/m_fRawWidth);
|
|
|
|
sss = sss * 100 / (font->width(m_splash) + 8 * 4);
|
|
glScalef(sss, sss, sss);
|
|
//drawCenteredString(font, splash, 0, -8, 0xffff00);
|
|
font->drawShadow(m_splash, 0 - (font->width(m_splash)) / 2, -8, 0xffff00);
|
|
glPopMatrix();
|
|
|
|
glDisable(GL_RESCALE_NORMAL);
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
|
// Finish GDraw and anything else that needs to be finalised
|
|
ui.endCustomDraw(region);
|
|
}
|
|
|
|
int UIScene_MainMenu::MustSignInReturned(void *pParam, int iPad, C4JStorage::EMessageResult result)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
// we need to specify local game here to display local and LIVE profiles in the list
|
|
switch(pClass->m_eAction)
|
|
{
|
|
case eAction_RunGame: ProfileManager.RequestSignInUI(false, true, false, false, true, &UIScene_MainMenu::CreateLoad_SignInReturned, pClass, iPad ); break;
|
|
case eAction_RunHelpAndOptions: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::HelpAndOptions_SignInReturned, pClass, iPad ); break;
|
|
case eAction_RunLeaderboards: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Leaderboards_SignInReturned, pClass, iPad ); break;
|
|
case eAction_RunAchievements: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Achievements_SignInReturned, pClass, iPad ); break;
|
|
case eAction_RunUnlockOrDLC: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, iPad ); break;
|
|
#ifdef _DURANGO
|
|
case eAction_RunXboxHelp: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::XboxHelp_SignInReturned, pClass, iPad ); break;
|
|
#endif
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i, CONTEXT_PRESENCE_MENUS, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__)
|
|
int UIScene_MainMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
#ifdef __PS3__
|
|
// we need to specify local game here to display local and LIVE profiles in the list
|
|
switch(pClass->m_eAction)
|
|
{
|
|
case eAction_RunLeaderboardsPSN:
|
|
SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass);
|
|
break;
|
|
case eAction_RunGamePSN:
|
|
SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass);
|
|
break;
|
|
case eAction_RunUnlockOrDLCPSN:
|
|
SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass);
|
|
break;
|
|
}
|
|
#elif defined __PSVITA__
|
|
switch(pClass->m_eAction)
|
|
{
|
|
case eAction_RunLeaderboardsPSN:
|
|
//CD - Must force Ad-Hoc off if they want leaderboard PSN sign-in
|
|
//Save settings change
|
|
app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0);
|
|
//Force off
|
|
CGameNetworkManager::setAdhocMode(false);
|
|
//Now Sign-in
|
|
SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass);
|
|
break;
|
|
case eAction_RunGamePSN:
|
|
SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass);
|
|
break;
|
|
case eAction_RunUnlockOrDLCPSN:
|
|
//CD - Must force Ad-Hoc off if they want commerce PSN sign-in
|
|
//Save settings change
|
|
app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0);
|
|
//Force off
|
|
CGameNetworkManager::setAdhocMode(false);
|
|
//Now Sign-in
|
|
SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass);
|
|
break;
|
|
}
|
|
#else
|
|
switch(pClass->m_eAction)
|
|
{
|
|
case eAction_RunLeaderboardsPSN:
|
|
SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass, true, iPad);
|
|
break;
|
|
case eAction_RunGamePSN:
|
|
SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass, true, iPad);
|
|
break;
|
|
case eAction_RunUnlockOrDLCPSN:
|
|
SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, true, iPad);
|
|
break;
|
|
}
|
|
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
if( pClass->m_eAction == eAction_RunGamePSN )
|
|
{
|
|
if( result == C4JStorage::EMessage_Cancelled)
|
|
CreateLoad_SignInReturned(pClass, false, 0);
|
|
else
|
|
CreateLoad_SignInReturned(pClass, true, 0);
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad)
|
|
{
|
|
UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam;
|
|
|
|
if(bContinue)
|
|
{
|
|
// 4J-JEV: Don't we only need to update rich-presence if the sign-in status changes.
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
|
|
#if TO_BE_IMPLEMENTED
|
|
if(app.GetTMSDLCInfoRead())
|
|
#endif
|
|
{
|
|
ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad());
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu);
|
|
}
|
|
#if TO_BE_IMPLEMENTED
|
|
else
|
|
{
|
|
// Changing to async TMS calls
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions);
|
|
|
|
// block all input
|
|
pClass->m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
for(int i=0;i<BUTTONS_MAX;i++)
|
|
{
|
|
pClass->m_Buttons[i].SetShow(FALSE);
|
|
}
|
|
|
|
pClass->updateTooltips();
|
|
|
|
pClass->m_Timer.SetShow(TRUE);
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef _XBOX_ONE
|
|
int UIScene_MainMenu::ChooseUser_SignInReturned(void *pParam, bool bContinue, int iPad)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
pClass->m_bIgnorePress = false;
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if(bContinue)
|
|
{
|
|
// 4J-JEV: We only need to update rich-presence if the sign-in status changes.
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
|
|
unsigned int uiIDA[1] = { IDS_OK };
|
|
|
|
if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad()))
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad());
|
|
|
|
|
|
// change the minecraft player name
|
|
Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
bool bSignedInLive = ProfileManager.IsSignedInLive(iPad);
|
|
#ifdef __PSVITA__
|
|
if(CGameNetworkManager::usingAdhocMode())
|
|
{
|
|
if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())
|
|
{
|
|
bSignedInLive = true;
|
|
}
|
|
else
|
|
{
|
|
// adhoc mode, but we didn't make the connection, turn off adhoc mode, and just go with whatever the regular online status is
|
|
CGameNetworkManager::setAdhocMode(false);
|
|
bSignedInLive = ProfileManager.IsSignedInLive(iPad);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// Check if we're signed in to LIVE
|
|
if(bSignedInLive)
|
|
{
|
|
// 4J-PB - Need to check for installed DLC
|
|
if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad);
|
|
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
// 4J Stu - Not relevant to PS3
|
|
#ifdef _XBOX_ONE
|
|
// if(app.GetTMSDLCInfoRead() && app.GetBanListRead(iPad))
|
|
if(app.GetBanListRead(iPad))
|
|
{
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
// ensure we've applied this player's settings
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu);
|
|
}
|
|
else
|
|
{
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame);
|
|
|
|
// block all input
|
|
pClass->m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
// for(int i=0;i<eControl_Count;i++)
|
|
// {
|
|
// m_buttons[i].set(false);
|
|
// }
|
|
|
|
pClass->updateTooltips();
|
|
|
|
pClass->m_controlTimer.setVisible( true );
|
|
}
|
|
#endif
|
|
#if TO_BE_IMPLEMENTED
|
|
// check if all the TMS files are loaded
|
|
if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad))
|
|
{
|
|
if(StorageManager.SetSaveDevice(&UIScene_MainMenu::DeviceSelectReturned,pClass)==true)
|
|
{
|
|
// save device already selected
|
|
|
|
// ensure we've applied this player's settings
|
|
app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad());
|
|
// check for DLC
|
|
// start timer to track DLC check finished
|
|
pClass->m_Timer.SetShow(TRUE);
|
|
XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME);
|
|
//app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Changing to async TMS calls
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame);
|
|
|
|
// block all input
|
|
pClass->m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
for(int i=0;i<BUTTONS_MAX;i++)
|
|
{
|
|
pClass->m_Buttons[i].SetShow(FALSE);
|
|
}
|
|
|
|
updateTooltips();
|
|
|
|
pClass->m_Timer.SetShow(TRUE);
|
|
}
|
|
#else
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
// ensure we've applied this player's settings
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu);
|
|
#endif
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#if TO_BE_IMPLEMENTED
|
|
// offline
|
|
ProfileManager.DisplayOfflineProfile(&CScene_Main::CreateLoad_OfflineProfileReturned,pClass, ProfileManager.GetPrimaryPad() );
|
|
#else
|
|
app.DebugPrintf("Offline Profile returned not implemented\n");
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu);
|
|
#endif
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 4J-PB - if this is the trial game, we can't have any networking
|
|
// Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet.
|
|
// Need to let them action in the main loop when they come in
|
|
// ensure we've applied this player's settings
|
|
//app.ApplyGameSettingsChanged(iPad);
|
|
|
|
#if defined(__PS3__) || defined(__ORBIS__) || defined( __PSVITA__)
|
|
// ensure we've applied this player's settings - we do have them on PS3
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
#endif
|
|
|
|
#ifdef __ORBIS__
|
|
if(!g_NetworkManager.IsReadyToPlayOrIdle())
|
|
{
|
|
pClass->m_bLoadTrialOnNetworkManagerReady = true;
|
|
ui.NavigateToScene(iPad, eUIScene_Timer);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
// go straight in to the trial level
|
|
LoadTrial();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,int iPad)
|
|
{
|
|
UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam;
|
|
|
|
if(bContinue)
|
|
{
|
|
// 4J-JEV: We only need to update rich-presence if the sign-in status changes.
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
|
|
unsigned int uiIDA[1] = { IDS_OK };
|
|
|
|
// guests can't look at leaderboards
|
|
if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad()))
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()))
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
bool bContentRestricted=false;
|
|
#if defined(__PS3__) || defined(__PSVITA__)
|
|
ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL);
|
|
#endif
|
|
if(bContentRestricted)
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms
|
|
// you can't see leaderboards
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad());
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LeaderboardsMenu);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,int iPad)
|
|
{
|
|
UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam;
|
|
|
|
if (bContinue)
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// 4J-JEV: We only need to update rich-presence if the sign-in status changes.
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
|
|
XShowAchievementsUI( ProfileManager.GetPrimaryPad() );
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if (bContinue)
|
|
{
|
|
// 4J-JEV: We only need to update rich-presence if the sign-in status changes.
|
|
ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false);
|
|
|
|
pClass->RunUnlockOrDLC(iPad);
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef _DURANGO
|
|
int UIScene_MainMenu::XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if (bContinue)
|
|
{
|
|
// 4J: Launch the dummy xbox help application.
|
|
WXS::User^ user = ProfileManager.GetUser(ProfileManager.GetPrimaryPad());
|
|
Windows::Xbox::ApplicationModel::Help::Show(user);
|
|
}
|
|
else
|
|
{
|
|
// unlock the profile
|
|
ProfileManager.SetLockedProfile(-1);
|
|
for(int i=0;i<XUSER_MAX_COUNT;i++)
|
|
{
|
|
// if the user is valid, we should set the presence
|
|
if(ProfileManager.IsSignedIn(i))
|
|
{
|
|
ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MENUS,false);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int UIScene_MainMenu::ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
//UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
// buttons reversed on this
|
|
if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
//XLaunchNewImage(XLAUNCH_KEYWORD_DASH_ARCADE, 0);
|
|
app.ExitGame();
|
|
app.DebugPrintf("UIScene_MainMenu::ExitGameReturned AFTER app.ExitGame() CALL\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef __ORBIS__
|
|
void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void *pParam)
|
|
{
|
|
int primaryPad = ProfileManager.GetPrimaryPad();
|
|
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
int (*signInReturnedFunc) (void *,const bool, const int iPad) = NULL;
|
|
|
|
// 4J-PB - Check if there is a patch for the game
|
|
pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad());
|
|
|
|
bool bPatchAvailable;
|
|
switch(pClass->m_errorCode)
|
|
{
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST:
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED:
|
|
bPatchAvailable=true;
|
|
break;
|
|
default:
|
|
bPatchAvailable=false;
|
|
break;
|
|
}
|
|
|
|
if(!bPatchAvailable)
|
|
{
|
|
pClass->m_eAction=eAction_RunGame;
|
|
signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned;
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bRunGameChosen=true;
|
|
pClass->m_bErrorDialogRunning=true;
|
|
int32_t ret=sceErrorDialogInitialize();
|
|
if ( ret==SCE_OK )
|
|
{
|
|
SceErrorDialogParam param;
|
|
sceErrorDialogParamInitialize( ¶m );
|
|
// 4J-PB - We want to display the option to get the patch now
|
|
param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode;
|
|
ret = sceUserServiceGetInitialUser( ¶m.userId );
|
|
if ( ret == SCE_OK )
|
|
{
|
|
ret=sceErrorDialogOpen( ¶m );
|
|
}
|
|
return;
|
|
}
|
|
|
|
// unsigned int uiIDA[1];
|
|
// uiIDA[0]=IDS_OK;
|
|
// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass);
|
|
}
|
|
|
|
// Check if PSN is unavailable because of age restriction
|
|
if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass, app.GetStringTable());
|
|
|
|
return;
|
|
}
|
|
|
|
bool confirmUser = false;
|
|
|
|
// Note: if no sign in returned func, assume this isn't required
|
|
if (signInReturnedFunc != NULL)
|
|
{
|
|
if(ProfileManager.IsSignedIn(primaryPad))
|
|
{
|
|
if (confirmUser)
|
|
{
|
|
ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad);
|
|
}
|
|
else
|
|
{
|
|
pClass->RunAction(primaryPad);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Ask user to sign in
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
uiIDA[1]=IDS_CONFIRM_CANCEL;
|
|
ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable());
|
|
}
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(void *pParam)
|
|
{
|
|
int primaryPad = ProfileManager.GetPrimaryPad();
|
|
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
int (*signInReturnedFunc) (void *,const bool, const int iPad) = NULL;
|
|
|
|
// 4J-PB - Check if there is a patch for the game
|
|
pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad());
|
|
|
|
bool bPatchAvailable;
|
|
switch(pClass->m_errorCode)
|
|
{
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST:
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED:
|
|
bPatchAvailable=true;
|
|
break;
|
|
default:
|
|
bPatchAvailable=false;
|
|
break;
|
|
}
|
|
|
|
if(!bPatchAvailable)
|
|
{
|
|
pClass->m_eAction=eAction_RunLeaderboards;
|
|
signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned;
|
|
}
|
|
else
|
|
{
|
|
int32_t ret=sceErrorDialogInitialize();
|
|
pClass->m_bErrorDialogRunning=true;
|
|
if ( ret==SCE_OK )
|
|
{
|
|
SceErrorDialogParam param;
|
|
sceErrorDialogParamInitialize( ¶m );
|
|
// 4J-PB - We want to display the option to get the patch now
|
|
param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode;
|
|
ret = sceUserServiceGetInitialUser( ¶m.userId );
|
|
if ( ret == SCE_OK )
|
|
{
|
|
ret=sceErrorDialogOpen( ¶m );
|
|
}
|
|
}
|
|
|
|
// unsigned int uiIDA[1];
|
|
// uiIDA[0]=IDS_OK;
|
|
// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass);
|
|
}
|
|
|
|
bool confirmUser = false;
|
|
|
|
// Update error code
|
|
pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad());
|
|
|
|
// Check if PSN is unavailable because of age restriction
|
|
if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass, app.GetStringTable());
|
|
|
|
return;
|
|
}
|
|
|
|
// Note: if no sign in returned func, assume this isn't required
|
|
if (signInReturnedFunc != NULL)
|
|
{
|
|
if(ProfileManager.IsSignedIn(primaryPad))
|
|
{
|
|
if (confirmUser)
|
|
{
|
|
ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad);
|
|
}
|
|
else
|
|
{
|
|
pClass->RunAction(primaryPad);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Ask user to sign in
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
uiIDA[1]=IDS_CONFIRM_CANCEL;
|
|
ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable());
|
|
}
|
|
}
|
|
}
|
|
|
|
int UIScene_MainMenu::PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
if (pClass->m_eAction == eAction_RunGame)
|
|
{
|
|
CreateLoad_SignInReturned(pClass, true, 0);
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pClass->m_bIgnorePress=false;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
void UIScene_MainMenu::RunPlayGame(int iPad)
|
|
{
|
|
Minecraft *pMinecraft=Minecraft::GetInstance();
|
|
|
|
// clear the remembered signed in users so their profiles get read again
|
|
app.ClearSignInChangeUsersMask();
|
|
|
|
app.ReleaseSaveThumbnail();
|
|
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
|
|
m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
ProfileManager.SetLockedProfile(iPad);
|
|
|
|
// If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen
|
|
ProfileManager.QuerySigninStatus();
|
|
|
|
// 4J-PB - Need to check for installed DLC
|
|
if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad);
|
|
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
// are we offline?
|
|
bool bSignedInLive = ProfileManager.IsSignedInLive(iPad);
|
|
#ifdef __PSVITA__
|
|
if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_PSVita_NetworkModeAdhoc) == true)
|
|
{
|
|
CGameNetworkManager::setAdhocMode(true);
|
|
bSignedInLive = SQRNetworkManager_AdHoc_Vita::GetAdhocStatus();
|
|
app.DebugPrintf("Adhoc mode signed in : %s\n", bSignedInLive ? "true" : "false");
|
|
}
|
|
else
|
|
{
|
|
CGameNetworkManager::setAdhocMode(false);
|
|
app.DebugPrintf("PSN mode signed in : %s\n", bSignedInLive ? "true" : "false");
|
|
}
|
|
|
|
#endif //__PSVITA__
|
|
|
|
if(!bSignedInLive)
|
|
{
|
|
#if defined(__PS3__) || defined __PSVITA__
|
|
// enable input again
|
|
m_bIgnorePress=false;
|
|
|
|
// Not sure why 360 doesn't need this, but leaving as __PS3__ only for now until we see that it does. Without this, on a PS3 offline game, the primary player just gets the default Player1234 type name
|
|
pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
m_eAction=eAction_RunGamePSN;
|
|
// get them to sign in to online
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT;
|
|
uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE;
|
|
|
|
#ifdef __PSVITA__
|
|
if(CGameNetworkManager::usingAdhocMode())
|
|
{
|
|
uiIDA[0]=IDS_NETWORK_ADHOC;
|
|
// this should be "Connect to adhoc network"
|
|
ui.RequestMessageBox(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
/* 4J-PB - Add this after release
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.IsSignedInPSN(iPad))
|
|
{
|
|
m_eAction=eAction_RunGame;
|
|
// Signed in to PSN but not connected (no internet access)
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
m_eAction=eAction_RunGamePSN;
|
|
// Not signed in to PSN
|
|
ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
return;
|
|
} */
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable());
|
|
|
|
}
|
|
#else
|
|
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
#endif
|
|
|
|
#elif defined __ORBIS__
|
|
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.isSignedInPSN(iPad))
|
|
{
|
|
m_eAction=eAction_RunGame;
|
|
// Signed in to PSN but not connected (no internet access)
|
|
assert(!ProfileManager.isConnectedToPSN(iPad));
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
m_eAction=eAction_RunGamePSN;
|
|
// Not signed in to PSN
|
|
unsigned int uiIDA[2];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
uiIDA[1] = IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false);
|
|
return;
|
|
}
|
|
#else
|
|
ProfileManager.SetLockedProfile(iPad);
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#ifdef _XBOX_ONE
|
|
if(!app.GetBanListRead(iPad))
|
|
{
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame);
|
|
|
|
// block all input
|
|
m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
// for(int i=0;i<eControl_Count;i++)
|
|
// {
|
|
// m_buttons[i].set(false);
|
|
// }
|
|
|
|
updateTooltips();
|
|
|
|
m_controlTimer.setVisible( true );
|
|
}
|
|
#endif
|
|
#if TO_BE_IMPLEMENTED
|
|
// Check if there is any new DLC
|
|
app.ClearNewDLCAvailable();
|
|
StorageManager.GetAvailableDLCCount(iPad);
|
|
|
|
// check if all the TMS files are loaded
|
|
if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad))
|
|
{
|
|
if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,this)==true)
|
|
{
|
|
// change the minecraft player name
|
|
pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
// save device already selected
|
|
|
|
// ensure we've applied this player's settings
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
// check for DLC
|
|
// start timer to track DLC check finished
|
|
m_Timer.SetShow(TRUE);
|
|
XuiSetTimer(m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME);
|
|
//app.NavigateToScene(iPad,eUIScene_MultiGameJoinLoad);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Changing to async TMS calls
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame);
|
|
|
|
// block all input
|
|
m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
for(int i=0;i<BUTTONS_MAX;i++)
|
|
{
|
|
m_Buttons[i].SetShow(FALSE);
|
|
}
|
|
|
|
updateTooltips();
|
|
|
|
m_Timer.SetShow(TRUE);
|
|
}
|
|
#else
|
|
pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
// ensure we've applied this player's settings
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu);
|
|
#endif
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 4J-PB - if this is the trial game, we can't have any networking
|
|
// go straight in to the trial level
|
|
// change the minecraft player name
|
|
Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad()));
|
|
|
|
// Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet.
|
|
// Need to let them action in the main loop when they come in
|
|
// ensure we've applied this player's settings
|
|
//app.ApplyGameSettingsChanged(iPad);
|
|
|
|
#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
|
|
// ensure we've applied this player's settings - we do have them on PS3
|
|
app.ApplyGameSettingsChanged(iPad);
|
|
#endif
|
|
|
|
#ifdef __ORBIS__
|
|
if(!g_NetworkManager.IsReadyToPlayOrIdle())
|
|
{
|
|
m_bLoadTrialOnNetworkManagerReady = true;
|
|
ui.NavigateToScene(iPad, eUIScene_Timer);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
LoadTrial();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::RunLeaderboards(int iPad)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
|
|
// guests can't look at leaderboards
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else if(!ProfileManager.IsSignedInLive(iPad))
|
|
{
|
|
#if defined __PS3__ || defined __PSVITA__
|
|
m_eAction=eAction_RunLeaderboardsPSN;
|
|
// get them to sign in to online
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable());
|
|
|
|
/* 4J-PB - Add this after release
|
|
#elif defined __PSVITA__
|
|
m_eAction=eAction_RunLeaderboardsPSN;
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.IsSignedInPSN(iPad))
|
|
{
|
|
// Signed in to PSN but not connected (no internet access)
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
// Not signed in to PSN
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
return;
|
|
}*/
|
|
#elif defined __ORBIS__
|
|
m_eAction=eAction_RunLeaderboardsPSN;
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.isSignedInPSN(iPad))
|
|
{
|
|
// Signed in to PSN but not connected (no internet access)
|
|
assert(!ProfileManager.isConnectedToPSN(iPad));
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_OK;
|
|
ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
// Not signed in to PSN
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
return;
|
|
}
|
|
#else
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
// we're supposed to check for parental control restrictions before showing leaderboards
|
|
// The title enforces the user's NP parental control setting for age-based content
|
|
//restriction in network communications.
|
|
// If age restrictions are in place and the user's age does not meet
|
|
// the age restriction of the title's online service content rating (CERO, ESRB, PEGI, etc.), then the title must
|
|
//display a message such as the following and disallow online service for this user.
|
|
|
|
bool bContentRestricted=false;
|
|
#if defined(__PS3__) || defined(__PSVITA__)
|
|
ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL);
|
|
#endif
|
|
if(bContentRestricted)
|
|
{
|
|
#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms
|
|
// you can't see leaderboards
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable());
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
ProfileManager.SetLockedProfile(iPad);
|
|
// If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen
|
|
ProfileManager.QuerySigninStatus();
|
|
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(iPad, eUIScene_LeaderboardsMenu);
|
|
}
|
|
}
|
|
}
|
|
void UIScene_MainMenu::RunUnlockOrDLC(int iPad)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
|
|
// Check if this means downloadable content
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
#ifdef __ORBIS__
|
|
// 4J-PB - Check if there is a patch for the game
|
|
m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad());
|
|
|
|
bool bPatchAvailable;
|
|
switch(m_errorCode)
|
|
{
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST:
|
|
case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED:
|
|
bPatchAvailable=true;
|
|
break;
|
|
default:
|
|
bPatchAvailable=false;
|
|
break;
|
|
}
|
|
|
|
if(bPatchAvailable)
|
|
{
|
|
m_bIgnorePress=false;
|
|
|
|
int32_t ret=sceErrorDialogInitialize();
|
|
m_bErrorDialogRunning=true;
|
|
if ( ret==SCE_OK )
|
|
{
|
|
SceErrorDialogParam param;
|
|
sceErrorDialogParamInitialize( ¶m );
|
|
// 4J-PB - We want to display the option to get the patch now
|
|
param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode;
|
|
ret = sceUserServiceGetInitialUser( ¶m.userId );
|
|
if ( ret == SCE_OK )
|
|
{
|
|
ret=sceErrorDialogOpen( ¶m );
|
|
}
|
|
}
|
|
|
|
// unsigned int uiIDA[1];
|
|
// uiIDA[0]=IDS_OK;
|
|
// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,this);
|
|
return;
|
|
}
|
|
|
|
// Check if PSN is unavailable because of age restriction
|
|
if (m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION)
|
|
{
|
|
m_bIgnorePress=false;
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this, app.GetStringTable());
|
|
|
|
return;
|
|
}
|
|
#endif
|
|
// downloadable content
|
|
if(ProfileManager.IsSignedInLive(iPad))
|
|
{
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
|
|
// If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen
|
|
ProfileManager.QuerySigninStatus();
|
|
|
|
#if defined _XBOX_ONE
|
|
if(app.GetTMSDLCInfoRead())
|
|
#endif
|
|
{
|
|
bool bContentRestricted=false;
|
|
#if defined(__PS3__) || defined(__PSVITA__)
|
|
ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL);
|
|
#endif
|
|
if(bContentRestricted)
|
|
{
|
|
m_bIgnorePress=false;
|
|
#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms
|
|
// you can't see the store
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable());
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
ProfileManager.SetLockedProfile(iPad);
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu);
|
|
}
|
|
}
|
|
#if defined _XBOX_ONE
|
|
else
|
|
{
|
|
// Changing to async TMS calls
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_DLCMain);
|
|
|
|
// block all input
|
|
m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
// for(int i=0;i<BUTTONS_MAX;i++)
|
|
// {
|
|
// m_Buttons[i].SetShow(FALSE);
|
|
// }
|
|
|
|
updateTooltips();
|
|
|
|
m_controlTimer.setVisible( true );
|
|
m_bWaitingForDLCInfo=true;
|
|
}
|
|
#endif
|
|
|
|
// read the DLC info from TMS
|
|
/*app.ReadDLCFileFromTMS(iPad);*/
|
|
|
|
// We want to navigate to the DLC scene, but block input until we get the DLC file in from TMS
|
|
// Don't navigate - we might have an uplink disconnect
|
|
//app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu);
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#if defined(__PS3__) || defined(__PSVITA__)
|
|
m_eAction=eAction_RunUnlockOrDLCPSN;
|
|
// get them to sign in to online
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT;
|
|
//uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable());
|
|
#elif defined __ORBIS__
|
|
m_eAction=eAction_RunUnlockOrDLCPSN;
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.isSignedInPSN(iPad))
|
|
{
|
|
m_bIgnorePress=false;
|
|
// Signed in to PSN but not connected (no internet access)
|
|
assert(!ProfileManager.isConnectedToPSN(iPad));
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_OK;
|
|
ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
// Not signed in to PSN
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
return;
|
|
}
|
|
#else
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1);
|
|
#endif
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// guests can't buy the game
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
m_bIgnorePress=false;
|
|
ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_GUEST_TEXT, uiIDA, 1,iPad);
|
|
}
|
|
else if(!ProfileManager.IsSignedInLive(iPad))
|
|
{
|
|
#if defined(__PS3__) || defined(__PSVITA__)
|
|
m_eAction=eAction_RunUnlockOrDLCPSN;
|
|
// get them to sign in to online
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable());
|
|
#elif defined __ORBIS__
|
|
m_eAction=eAction_RunUnlockOrDLCPSN;
|
|
// Determine why they're not "signed in live"
|
|
if (ProfileManager.isSignedInPSN(iPad))
|
|
{
|
|
m_bIgnorePress=false;
|
|
// Signed in to PSN but not connected (no internet access)
|
|
assert(!ProfileManager.isConnectedToPSN(iPad));
|
|
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_OK;
|
|
ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
// Not signed in to PSN
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable());
|
|
return;
|
|
}
|
|
#else
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1);
|
|
#endif
|
|
|
|
}
|
|
else
|
|
{
|
|
// If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen
|
|
ProfileManager.QuerySigninStatus();
|
|
|
|
// check that the commerce is in the right state to be able to display the full version purchase - if the user is fast with the trial version, it can still be retrieving the product list
|
|
#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
|
|
m_bIgnorePress=true;
|
|
m_bLaunchFullVersionPurchase=true;
|
|
|
|
#else
|
|
TelemetryManager->RecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID);
|
|
ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game);
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::tick()
|
|
{
|
|
UIScene::tick();
|
|
|
|
#if !defined(_ENABLEIGGY) && !defined(ENABLE_JAVA_GUIS)
|
|
{
|
|
static int s_mainMenuTickCount = 0;
|
|
s_mainMenuTickCount++;
|
|
if(s_mainMenuTickCount % 60 == 1) { fprintf(stderr, "[MM] tick %d\n", s_mainMenuTickCount); fflush(stderr); }
|
|
if(s_mainMenuTickCount == 90) // ~3 seconds at 30fps
|
|
{
|
|
fprintf(stderr, "[Linux] Auto-starting trial world from MainMenu after %d ticks\n", s_mainMenuTickCount);
|
|
LoadTrial();
|
|
return;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(__PS3__) || defined (__ORBIS__) || defined(__PSVITA__)
|
|
if(m_bLaunchFullVersionPurchase)
|
|
{
|
|
int iCommerceState=app.GetCommerceState();
|
|
// 4J-PB - if there's a commerce error - store down, player can't access store - let the DisplayFullVersionPurchase show the error
|
|
if((iCommerceState==CConsoleMinecraftApp::eCommerce_State_Online) || (iCommerceState==CConsoleMinecraftApp::eCommerce_State_Error))
|
|
{
|
|
m_bLaunchFullVersionPurchase=false;
|
|
m_bIgnorePress=false;
|
|
updateTooltips();
|
|
|
|
// 4J-PB - need to check this user can access the store
|
|
bool bContentRestricted=false;
|
|
ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL);
|
|
if(bContentRestricted)
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable());
|
|
}
|
|
else
|
|
{
|
|
TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID);
|
|
ProfileManager.DisplayFullVersionPurchase(false,ProfileManager.GetPrimaryPad(),eSen_UpsellID_Full_Version_Of_Game);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 4J-PB - check for a trial version changing to a full version
|
|
if(m_bTrialVersion)
|
|
{
|
|
if(ProfileManager.IsFullVersion())
|
|
{
|
|
m_bTrialVersion=false;
|
|
m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined _XBOX_ONE
|
|
if(m_bWaitingForDLCInfo)
|
|
{
|
|
if(app.GetTMSDLCInfoRead())
|
|
{
|
|
m_bWaitingForDLCInfo=false;
|
|
ProfileManager.SetLockedProfile(m_iPad);
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu);
|
|
}
|
|
}
|
|
|
|
if(g_NetworkManager.ShouldMessageForFullSession())
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_CONFIRM_OK;
|
|
ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable());
|
|
}
|
|
#endif
|
|
|
|
#ifdef __ORBIS__
|
|
|
|
// process the error dialog (for a patch being available)
|
|
// SQRNetworkManager_Orbis::tickErrorDialog also runs the error dialog, so wrap this so this doesn't terminate a signin dialog
|
|
if(m_bErrorDialogRunning)
|
|
{
|
|
SceErrorDialogStatus stat = sceErrorDialogUpdateStatus();
|
|
if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED )
|
|
{
|
|
sceErrorDialogTerminate();
|
|
// if m_bRunGameChosen is true, we're here after selecting play game, and we should let the user continue with an offline game
|
|
if(m_bRunGameChosen)
|
|
{
|
|
m_bRunGameChosen=false;
|
|
m_eAction = eAction_RunGame;
|
|
|
|
// give the option of continuing offline
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE;
|
|
ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable());
|
|
|
|
}
|
|
m_bErrorDialogRunning=false;
|
|
}
|
|
}
|
|
|
|
if(m_bLoadTrialOnNetworkManagerReady && g_NetworkManager.IsReadyToPlayOrIdle())
|
|
{
|
|
m_bLoadTrialOnNetworkManagerReady = false;
|
|
LoadTrial();
|
|
}
|
|
|
|
#endif
|
|
}
|
|
|
|
void UIScene_MainMenu::RunAchievements(int iPad)
|
|
{
|
|
#if TO_BE_IMPLEMENTED
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
|
|
// guests can't look at achievements
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
XShowAchievementsUI( iPad );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void UIScene_MainMenu::RunHelpAndOptions(int iPad)
|
|
{
|
|
if(ProfileManager.IsGuest(iPad))
|
|
{
|
|
unsigned int uiIDA[1];
|
|
uiIDA[0]=IDS_OK;
|
|
ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1);
|
|
}
|
|
else
|
|
{
|
|
// If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen
|
|
ProfileManager.QuerySigninStatus();
|
|
|
|
#if TO_BE_IMPLEMENTED
|
|
// 4J-PB - You can be offline and still can go into help and options
|
|
if(app.GetTMSDLCInfoRead() || !ProfileManager.IsSignedInLive(iPad))
|
|
#endif
|
|
{
|
|
ProfileManager.SetLockedProfile(iPad);
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu);
|
|
}
|
|
#if TO_BE_IMPLEMENTED
|
|
else
|
|
{
|
|
// Changing to async TMS calls
|
|
app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions);
|
|
|
|
// block all input
|
|
m_bIgnorePress=true;
|
|
// We want to hide everything in this scene and display a timer until we get a completion for the TMS files
|
|
for(int i=0;i<BUTTONS_MAX;i++)
|
|
{
|
|
m_Buttons[i].SetShow(FALSE);
|
|
}
|
|
|
|
updateTooltips();
|
|
|
|
m_Timer.SetShow(TRUE);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void UIScene_MainMenu::LoadTrial(void)
|
|
{
|
|
app.SetTutorialMode( true );
|
|
|
|
// clear out the app's terrain features list
|
|
app.ClearTerrainFeaturePosition();
|
|
|
|
StorageManager.ResetSaveData();
|
|
|
|
// Need to set the mode as trial
|
|
ProfileManager.StartTrialGame();
|
|
|
|
// No saving in the trial
|
|
StorageManager.SetSaveDisabled(true);
|
|
|
|
// Set the global flag, so that we don't disable saving again once the save is complete
|
|
app.SetGameHostOption(eGameHostOption_DisableSaving, 1);
|
|
|
|
StorageManager.SetSaveTitle(L"Tutorial");
|
|
|
|
// Reset the autosave time
|
|
app.SetAutosaveTimerTime();
|
|
|
|
// not online for the trial game
|
|
g_NetworkManager.HostGame(0,false,true,MINECRAFT_NET_MAX_PLAYERS,0);
|
|
|
|
#ifndef _XBOX
|
|
g_NetworkManager.FakeLocalPlayerJoined();
|
|
#endif
|
|
|
|
NetworkGameInitData *param = new NetworkGameInitData();
|
|
param->seed = 0;
|
|
param->saveData = NULL;
|
|
param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ) | app.GetGameHostOption(eGameHostOption_DisableSaving);
|
|
|
|
std::vector<LevelGenerationOptions *> *generators = app.getLevelGenerators();
|
|
if (generators->empty())
|
|
{
|
|
app.DebugPrintf("LoadTrial: no level generators available, cannot start tutorial\n");
|
|
delete param;
|
|
return;
|
|
}
|
|
param->levelGen = generators->at(0);
|
|
|
|
LoadingInputParams *loadingParams = new LoadingInputParams();
|
|
loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc;
|
|
loadingParams->lpParam = param;
|
|
|
|
UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData();
|
|
completionData->bShowBackground=TRUE;
|
|
completionData->bShowLogo=TRUE;
|
|
completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes;
|
|
completionData->iPad = ProfileManager.GetPrimaryPad();
|
|
loadingParams->completionData = completionData;
|
|
|
|
ui.ShowTrialTimer(true);
|
|
|
|
#ifdef _XBOX_ONE
|
|
ui.ShowPlayerDisplayname(true);
|
|
#endif
|
|
ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams);
|
|
}
|
|
|
|
void UIScene_MainMenu::handleUnlockFullVersion()
|
|
{
|
|
m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT),true);
|
|
}
|
|
|
|
|
|
#ifdef __PSVITA__
|
|
int UIScene_MainMenu::SelectNetworkModeReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
|
|
{
|
|
UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam;
|
|
|
|
if(result==C4JStorage::EMessage_ResultAccept)
|
|
{
|
|
app.DebugPrintf("Setting network mode to PSN\n");
|
|
app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0);
|
|
}
|
|
else if(result==C4JStorage::EMessage_ResultDecline)
|
|
{
|
|
app.DebugPrintf("Setting network mode to Adhoc\n");
|
|
app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 1);
|
|
}
|
|
pClass->updateTooltips();
|
|
return 0;
|
|
}
|
|
#endif //__PSVITA__
|