#include "../../Minecraft.World/Platform/stdafx.h" #include #include "../../Minecraft.Client/Level/MultiPlayerLevel.h" #include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" #include "../../Minecraft.Client/GameState/StatsCounter.h" #include "../../Minecraft.World/Util/StringHelpers.h" #include "../../Minecraft.World/Headers/net.minecraft.stats.h" #include "../../Minecraft.Client/Minecraft.h" #include "../../Minecraft.World/Headers/net.minecraft.world.level.h" #include "../../Minecraft.World/Level/LevelData.h" #include "XUI_CustomMessages.h" #include "../../Minecraft.World/Level/Dimensions/Dimension.h" #include "../../Minecraft.World/Util/SharedConstants.h" #include "../../Minecraft.Client/GameState/GameMode.h" #include "../../Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.h" #include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" #include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" #include "../../Minecraft.Client/Textures/Packs/TexturePack.h" #include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" #define PRESS_START_TIMER 0 CXuiSceneBase* CXuiSceneBase::Instance = NULL; unsigned int CXuiSceneBase::m_trialTimerLimitSecs = DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; //---------------------------------------------------------------------------------- // Performs initialization tasks - retrieves controls. //---------------------------------------------------------------------------------- HRESULT CXuiSceneBase::OnInit(XUIMessageInit* pInitData, BOOL& bHandled) { ASSERT(CXuiSceneBase::Instance == NULL); CXuiSceneBase::Instance = this; m_iWrongTexturePackTickC = 20 * 5; // default 5 seconds before bringing up the upsell for not // having the texture pack MapChildControls(); // Display the tooltips HRESULT hr = S_OK; CXuiElement xuiElement = m_hObj; HXUIOBJ hTemp; m_hEmptyQuadrantLogo = NULL; XuiElementGetChildById(m_hObj, L"EmptyQuadrantLogo", &m_hEmptyQuadrantLogo); D3DXVECTOR3 lastPos; for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { for (unsigned int i = 0; i < BUTTONS_TOOLTIP_MAX; ++i) { m_visible[idx][i] = false; m_iCurrentTooltipTextID[idx][i] = -1; hTooltipText[idx][i] = NULL; hTooltipTextSmall[idx][i] = NULL; // set all tooltips to shown FALSE by default m_Buttons[idx][i].SetShow(FALSE); m_ButtonsSmall[idx][i].SetShow(FALSE); } XuiElementGetPosition(m_bottomLeftAnchorPoint[idx].m_hObj, &lastPos); lastPos.y -= 110; m_bCrouching[idx] = false; m_uiSelectedItemOpacityCountDown[idx] = 0; m_bossHealthVisible[idx] = false; switch (idx) { case 0: XuiElementGetChildById(m_hObj, L"BasePlayer0", &hTemp); XuiElementGetChildById(hTemp, L"XuiGamertag", &m_hGamerTagA[0]); break; case 1: XuiElementGetChildById(m_hObj, L"BasePlayer1", &hTemp); XuiElementGetChildById(hTemp, L"XuiGamertag", &m_hGamerTagA[1]); break; case 2: XuiElementGetChildById(m_hObj, L"BasePlayer2", &hTemp); XuiElementGetChildById(hTemp, L"XuiGamertag", &m_hGamerTagA[2]); break; case 3: XuiElementGetChildById(m_hObj, L"BasePlayer3", &hTemp); XuiElementGetChildById(hTemp, L"XuiGamertag", &m_hGamerTagA[3]); break; } } m_ticksWithNoBoss = 0; UpdatePlayerBasePositions(); m_iQuadrantsMask = 0; return S_OK; } HRESULT CXuiSceneBase::OnTimer(XUIMessageTimer* pData, BOOL& rfHandled) { if (pData->nId == PRESS_START_TIMER) { XuiKillTimer(m_hObj, PRESS_START_TIMER); XuiElementStopTimeline(m_hObj, TRUE); m_PressStart.SetShow(FALSE); // clear the quadrants m_iQuadrantsMask = 0; HXUIOBJ hObj = NULL, hQuadrant; HRESULT hr = XuiControlGetVisual(m_PressStart.m_hObj, &hObj); for (int i = 0; i < XUSER_MAX_COUNT; i++) { switch (i) { case 0: hr = XuiElementGetChildById(hObj, L"Quadrant1", &hQuadrant); XuiElementSetShow(hQuadrant, FALSE); break; case 1: hr = XuiElementGetChildById(hObj, L"Quadrant2", &hQuadrant); XuiElementSetShow(hQuadrant, FALSE); break; case 2: hr = XuiElementGetChildById(hObj, L"Quadrant3", &hQuadrant); XuiElementSetShow(hQuadrant, FALSE); break; case 3: hr = XuiElementGetChildById(hObj, L"Quadrant4", &hQuadrant); XuiElementSetShow(hQuadrant, FALSE); break; } } } return S_OK; } HRESULT CXuiSceneBase::OnSkinChanged(BOOL& bHandled) { // Clear visuals held for tooltips for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { for (unsigned int i = 0; i < BUTTONS_TOOLTIP_MAX; ++i) { hTooltipText[idx][i] = NULL; hTooltipTextSmall[idx][i] = NULL; } } // Don't set to handled return S_OK; } void CXuiSceneBase::_TickAllBaseScenes() { Minecraft* pMinecraft = Minecraft::GetInstance(); // 4J-PB - added to upsell the texture pack if you join from invite and // don't have it what texture pack are we using? bool bCheckTexturePack = false; for (int i = 0; i < XUSER_MAX_COUNT; i++) { bCheckTexturePack = app.GetGameStarted() && (ui.GetMenuDisplayed(0) == false) && (app.GetXuiAction(i) == eAppAction_Idle); } // make sure there's not a mount going on before using the textures if (bCheckTexturePack && app.DLCInstallProcessCompleted()) { TexturePack* tPack = pMinecraft->skins->getSelected(); if (tPack->getId() != app.GetRequiredTexturePackID()) { // we're not using the texture pack we need // Is it available? TexturePack* pRequiredTPack = pMinecraft->skins->getTexturePackById( app.GetRequiredTexturePackID()); if (pRequiredTPack != NULL) { // we can switch to the required pack // reset the timer m_iWrongTexturePackTickC = 20 * 60 * 5; // reset to 5 minutes pMinecraft->skins->selectTexturePackById( app.GetRequiredTexturePackID()); // probably had background downloads enabled, so turn them off XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); } else { // decrement the counter m_iWrongTexturePackTickC--; if (m_iWrongTexturePackTickC == 0) { // action app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_TexturePackRequired); // reset the timer m_iWrongTexturePackTickC = 20 * 60 * 5; // reset to 5 minutes } } } } if (EnderDragonRenderer::bossInstance == NULL) { if (m_ticksWithNoBoss <= 20) { ++m_ticksWithNoBoss; } } else { std::shared_ptr boss = EnderDragonRenderer::bossInstance; EnderDragonRenderer::bossInstance = nullptr; m_ticksWithNoBoss = 0; for (unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { if (pMinecraft->localplayers[i] != NULL && pMinecraft->localplayers[i]->dimension == 1 && !ui.GetMenuDisplayed(i) && app.GetGameSettings(i, eGameSetting_DisplayHUD)) { int iGuiScale; if (pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { iGuiScale = app.GetGameSettings(i, eGameSetting_UISize); } else { iGuiScale = app.GetGameSettings(i, eGameSetting_UISizeSplitscreen); } m_BossHealthGroup[i].SetShow(TRUE); m_BossHealthText[i].SetText( app.GetString(IDS_BOSS_ENDERDRAGON_HEALTH)); if (pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { switch (iGuiScale) { case 0: m_pBossHealthProgress = m_BossHealthProgress1; m_BossHealthProgress1[i].SetShow(TRUE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(FALSE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow(FALSE); m_BossHealthProgress2_small[i].SetShow(FALSE); m_BossHealthProgress3_small[i].SetShow(FALSE); } break; case 1: m_pBossHealthProgress = m_BossHealthProgress2; m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(TRUE); m_BossHealthProgress3[i].SetShow(FALSE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow(FALSE); m_BossHealthProgress2_small[i].SetShow(FALSE); m_BossHealthProgress3_small[i].SetShow(FALSE); } break; case 2: m_pBossHealthProgress = m_BossHealthProgress3; m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(TRUE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow(FALSE); m_BossHealthProgress2_small[i].SetShow(FALSE); m_BossHealthProgress3_small[i].SetShow(FALSE); } break; } } else { // if we have 2 player top & bottom, we can use the // fullscreen bar if ((pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_TOP) || (pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM)) { switch (iGuiScale) { case 0: m_pBossHealthProgress = m_BossHealthProgress1; m_BossHealthProgress1[i].SetShow(TRUE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(FALSE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow( FALSE); m_BossHealthProgress2_small[i].SetShow( FALSE); m_BossHealthProgress3_small[i].SetShow( FALSE); } break; case 1: m_pBossHealthProgress = m_BossHealthProgress2; m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(TRUE); m_BossHealthProgress3[i].SetShow(FALSE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow( FALSE); m_BossHealthProgress2_small[i].SetShow( FALSE); m_BossHealthProgress3_small[i].SetShow( FALSE); } break; case 2: m_pBossHealthProgress = m_BossHealthProgress3; m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(TRUE); if (m_BossHealthProgress1_small[i] != NULL) { m_BossHealthProgress1_small[i].SetShow( FALSE); m_BossHealthProgress2_small[i].SetShow( FALSE); m_BossHealthProgress3_small[i].SetShow( FALSE); } break; } } else { // use the small versions switch (iGuiScale) { case 0: m_pBossHealthProgress = m_BossHealthProgress1_small; m_BossHealthProgress1_small[i].SetShow(TRUE); m_BossHealthProgress2_small[i].SetShow(FALSE); m_BossHealthProgress3_small[i].SetShow(FALSE); m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(FALSE); break; case 1: m_pBossHealthProgress = m_BossHealthProgress2_small; m_BossHealthProgress1_small[i].SetShow(FALSE); m_BossHealthProgress2_small[i].SetShow(TRUE); m_BossHealthProgress3_small[i].SetShow(FALSE); m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(FALSE); break; case 2: m_pBossHealthProgress = m_BossHealthProgress3_small; m_BossHealthProgress1_small[i].SetShow(FALSE); m_BossHealthProgress2_small[i].SetShow(FALSE); m_BossHealthProgress3_small[i].SetShow(TRUE); m_BossHealthProgress1[i].SetShow(FALSE); m_BossHealthProgress2[i].SetShow(FALSE); m_BossHealthProgress3[i].SetShow(FALSE); break; } } } m_pBossHealthProgress[i].SetRange(0, boss->getMaxHealth()); m_pBossHealthProgress[i].SetValue(boss->getSynchedHealth()); m_bossHealthVisible[i] = true; _UpdateSelectedItemPos(i); } else if (m_bossHealthVisible[i]) { m_BossHealthGroup[i].SetShow(FALSE); m_bossHealthVisible[i] = false; _UpdateSelectedItemPos(i); } } } for (int i = 0; i < XUSER_MAX_COUNT; i++) { if (m_uiSelectedItemOpacityCountDown[i] > 0) --m_uiSelectedItemOpacityCountDown[i]; if (m_ticksWithNoBoss > 20) { m_BossHealthGroup[i].SetShow(FALSE); m_bossHealthVisible[i] = false; _UpdateSelectedItemPos(i); } // check if we have the timer running for the opacity unsigned int uiOpacityTimer = m_uiSelectedItemOpacityCountDown[i]; if (uiOpacityTimer > 0 && !ui.GetMenuDisplayed(i) && app.GetGameStarted()) { if (uiOpacityTimer < (SharedConstants::TICKS_PER_SECOND * 1)) { float fStep = (80.0f) / 10.0f; float fVal = 0.01f * (80.0f - ((10.0f - (float)uiOpacityTimer) * fStep)); XuiElementSetOpacity(m_selectedItemA[i], fVal); XuiElementSetOpacity(m_selectedItemSmallA[i], fVal); } if (m_playerBaseScenePosition[i] == e_BaseScene_Fullscreen) { m_selectedItemA[i].SetShow(TRUE); m_selectedItemSmallA[i].SetShow(FALSE); } else { m_selectedItemA[i].SetShow(FALSE); m_selectedItemSmallA[i].SetShow(TRUE); } } else { m_selectedItemA[i].SetShow(FALSE); m_selectedItemSmallA[i].SetShow(FALSE); } unsigned char ucAlpha = app.GetGameSettings( ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); float fVal; if (ucAlpha < 80) { // if we are in a menu, set the minimum opacity for tooltips to 15% if (ui.GetMenuDisplayed(i) && (ucAlpha < 15)) { ucAlpha = 15; } // check if we have the timer running for the opacity unsigned int uiOpacityTimer = app.GetOpacityTimer(i); if (uiOpacityTimer != 0) { if (uiOpacityTimer < 10) { float fStep = (80.0f - (float)ucAlpha) / 10.0f; fVal = 0.01f * (80.0f - ((10.0f - (float)uiOpacityTimer) * fStep)); } else { fVal = 0.01f * 80.0f; } } else { fVal = 0.01f * (float)ucAlpha; } } else { // if we are in a menu, set the minimum opacity for tooltips to 15% if (ui.GetMenuDisplayed(i) && (ucAlpha < 15)) { ucAlpha = 15; } fVal = 0.01f * (float)ucAlpha; } XuiElementSetOpacity(app.GetCurrentHUDScene(i), fVal); XUIMessage xuiMsg; CustomMessage_TickScene(&xuiMsg); XuiSendMessage(app.GetCurrentHUDScene(i), &xuiMsg); bool bDisplayGui = app.GetGameStarted() && !ui.GetMenuDisplayed(i) && !(app.GetXuiAction(i) == eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(i, eGameSetting_DisplayHUD) != 0; if (bDisplayGui && pMinecraft->localplayers[i] != NULL) { XuiElementSetShow(app.GetCurrentHUDScene(i), TRUE); } else { XuiElementSetShow(app.GetCurrentHUDScene(i), FALSE); } } } HRESULT CXuiSceneBase::_SetEnableTooltips(unsigned int iPad, bool enabled) { for (int i = 0; i < BUTTONS_TOOLTIP_MAX; i++) { // XuiElementSetShow(m_Buttons[iPad][i].m_hObj,enabled); XuiControlSetEnable(m_Buttons[iPad][i].m_hObj, enabled); } return S_OK; } HRESULT CXuiSceneBase::_SetTooltipText(unsigned int iPad, unsigned int uiTooltip, int iTextID) { ASSERT(uiTooltip < BUTTONS_TOOLTIP_MAX); XUIRect xuiRect, xuiRectSmall; HRESULT hr = S_OK; LPCWSTR pString = NULL; float fWidth, fHeight; // Want to be able to show just a button (for RB LB) if (iTextID >= 0) { pString = app.GetString(iTextID); } if (hTooltipText[iPad][uiTooltip] == NULL) { HXUIOBJ hObj = NULL; hr = XuiControlGetVisual(m_Buttons[iPad][uiTooltip].m_hObj, &hObj); hr = XuiElementGetChildById(hObj, L"text_ButtonText", &hTooltipText[iPad][uiTooltip]); hr = XuiElementGetPosition(hTooltipText[iPad][uiTooltip], &m_vPosTextInTooltip[uiTooltip]); } if (hTooltipTextSmall[iPad][uiTooltip] == NULL) { HXUIOBJ hObj = NULL; hr = XuiControlGetVisual(m_ButtonsSmall[iPad][uiTooltip].m_hObj, &hObj); hr = XuiElementGetChildById(hObj, L"text_ButtonText", &hTooltipTextSmall[iPad][uiTooltip]); hr = XuiElementGetPosition(hTooltipTextSmall[iPad][uiTooltip], &m_vPosTextInTooltipSmall[uiTooltip]); } if (iTextID >= 0) { hr = XuiTextPresenterMeasureText(hTooltipText[iPad][uiTooltip], pString, &xuiRect); // Change the size of the whole button to be the width of the measured // text, plus the position the text element starts in the visual (which // is the offset by the size of the button graphic) XuiElementGetBounds(m_Buttons[iPad][uiTooltip].m_hObj, &fWidth, &fHeight); XuiElementSetBounds( m_Buttons[iPad][uiTooltip].m_hObj, xuiRect.right + 1 + m_vPosTextInTooltip[uiTooltip].x, fHeight); // Change the width of the text element to be the width of the measured // text XuiElementGetBounds(hTooltipText[iPad][uiTooltip], &fWidth, &fHeight); XuiElementSetBounds(hTooltipText[iPad][uiTooltip], xuiRect.right, fHeight); hr = XuiTextPresenterMeasureText(hTooltipTextSmall[iPad][uiTooltip], pString, &xuiRectSmall); // Change the size of the whole button to be the width of the measured // text, plus the position the text element starts in the visual (which // is the offset by the size of the button graphic) XuiElementGetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj, &fWidth, &fHeight); XuiElementSetBounds( m_ButtonsSmall[iPad][uiTooltip].m_hObj, xuiRectSmall.right + 1 + m_vPosTextInTooltipSmall[uiTooltip].x, fHeight); // Change the width of the text element to be the width of the measured // text XuiElementGetBounds(hTooltipTextSmall[iPad][uiTooltip], &fWidth, &fHeight); XuiElementSetBounds(hTooltipTextSmall[iPad][uiTooltip], xuiRectSmall.right, fHeight); m_Buttons[iPad][uiTooltip].SetText(pString); m_ButtonsSmall[iPad][uiTooltip].SetText(pString); } else { m_Buttons[iPad][uiTooltip].SetText(L""); XuiElementGetBounds(m_Buttons[iPad][uiTooltip].m_hObj, &fWidth, &fHeight); XuiElementSetBounds(m_Buttons[iPad][uiTooltip].m_hObj, m_vPosTextInTooltip[uiTooltip].x, fHeight); m_ButtonsSmall[iPad][uiTooltip].SetText(L""); XuiElementGetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj, &fWidth, &fHeight); XuiElementSetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj, m_vPosTextInTooltipSmall[uiTooltip].x, fHeight); } m_iCurrentTooltipTextID[iPad][uiTooltip] = iTextID; ReLayout(iPad); return hr; } HRESULT CXuiSceneBase::_RefreshTooltips(unsigned int iPad) { // if the tooltip is showing, refresh it to update the opacity for (int tooltip = 0; tooltip < BUTTONS_TOOLTIP_MAX; tooltip++) { if (m_Buttons[iPad][tooltip].IsShown() == TRUE) { _ShowTooltip(iPad, tooltip, TRUE); } } return S_OK; } HRESULT CXuiSceneBase::_ShowTooltip(unsigned int iPad, unsigned int tooltip, bool show) { ASSERT(tooltip < BUTTONS_TOOLTIP_MAX); HRESULT hr; if ((ProfileManager.GetLockedProfile() != -1) && app.GetGameSettings(iPad, eGameSetting_DisplayHUD) == 0) { // hr = m_Buttons[iPad][tooltip].SetShow( FALSE ); // hr = m_ButtonsSmall[iPad][tooltip].SetShow( FALSE ); // turn off gamertag display in splitscreens XuiElementSetShow(m_hGamerTagA[iPad], FALSE); // m_visible[iPad][ tooltip ] = false; } // else { // check the app setting first (only if there is a player) if ((ProfileManager.GetLockedProfile() == -1) || ui.GetMenuDisplayed(iPad) || (app.GetGameSettings(iPad, eGameSetting_Tooltips) == 1 && app.GetGameSettings(iPad, eGameSetting_DisplayHUD) != 0)) { hr = m_Buttons[iPad][tooltip].SetShow(show ? TRUE : FALSE); hr = m_ButtonsSmall[iPad][tooltip].SetShow(show ? TRUE : FALSE); m_visible[iPad][tooltip] = show; // if we have a player, use their opacity to set the tooltip if (show && (ProfileManager.GetLockedProfile() != -1)) { // set the opacity of the tooltip items unsigned char ucAlpha = app.GetGameSettings(ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); float fVal; if (ucAlpha < 80) { // if we are in a menu, set the minimum opacity for tooltips // to 15% if (ui.GetMenuDisplayed(iPad) && (ucAlpha < 15)) { ucAlpha = 15; } // check if we have the timer running for the opacity unsigned int uiOpacityTimer = app.GetOpacityTimer(iPad); if (uiOpacityTimer != 0) { if (uiOpacityTimer < 10) { float fStep = (80.0f - (float)ucAlpha) / 10.0f; fVal = 0.01f * (80.0f - ((10.0f - (float)uiOpacityTimer) * fStep)); } else { fVal = 0.01f * 80.0f; } } else { fVal = 0.01f * (float)ucAlpha; } } else { // if we are in a menu, set the minimum opacity for tooltips // to 15% if (ui.GetMenuDisplayed(iPad) && (ucAlpha < 15)) { ucAlpha = 15; } fVal = 0.01f * (float)ucAlpha; } m_Buttons[iPad][tooltip].SetOpacity(fVal); m_ButtonsSmall[iPad][tooltip].SetOpacity(fVal); } } else { hr = m_Buttons[iPad][tooltip].SetShow(FALSE); hr = m_ButtonsSmall[iPad][tooltip].SetShow(FALSE); m_visible[iPad][tooltip] = false; } // also set the gamertags and the 4th quadrant logo if (ProfileManager.GetLockedProfile() != -1) { if (app.GetGameSettings( iPad, eGameSetting_DisplaySplitscreenGamertags) == 1) { unsigned char ucAlpha = app.GetGameSettings(ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); float fVal; if (ucAlpha < 80) { // check if we have the timer running for the opacity unsigned int uiOpacityTimer = app.GetOpacityTimer(iPad); if (uiOpacityTimer != 0) { if (uiOpacityTimer < 10) { float fStep = (80.0f - (float)ucAlpha) / 10.0f; fVal = 0.01f * (80.0f - ((10.0f - (float)uiOpacityTimer) * fStep)); } else { fVal = 0.01f * 80.0f; } } else { fVal = 0.01f * (float)ucAlpha; } } else { fVal = 0.01f * (float)ucAlpha; } XuiElementSetOpacity(m_hGamerTagA[iPad], fVal); } if (iPad == ProfileManager.GetPrimaryPad()) { unsigned char ucAlpha = app.GetGameSettings(ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); XuiElementSetOpacity(m_hEmptyQuadrantLogo, 0.01f * (float)ucAlpha); } } } ReLayout(iPad); return hr; } HRESULT CXuiSceneBase::_ShowSafeArea(bool show) { return m_SafeArea.SetShow(show); } HRESULT CXuiSceneBase::_ShowOtherPlayersBaseScene(int iPad, bool show) { for (int i = 0; i < XUSER_MAX_COUNT; ++i) { if (i == iPad) { m_BasePlayerScene[i].SetShow(TRUE); // Fix for #61051 - TU7: Content: UI: Player specific unresponsive // state may be triggered during the Save Game process in the // splitscreen mode m_BasePlayerScene[i].EnableInput(TRUE); } else { m_BasePlayerScene[i].SetShow(show ? TRUE : FALSE); // Fix for #61051 - TU7: Content: UI: Player specific unresponsive // state may be triggered during the Save Game process in the // splitscreen mode m_BasePlayerScene[i].EnableInput(show ? TRUE : FALSE); } } return S_OK; } HRESULT CXuiSceneBase::_SetTooltipsEnabled(unsigned int iPad, bool bA, bool bB, bool bX, bool bY, bool bLT, bool bRT, bool bLB, bool bRB, bool bLS) { m_Buttons[iPad][BUTTON_TOOLTIP_A].SetEnable(bA); m_Buttons[iPad][BUTTON_TOOLTIP_B].SetEnable(bB); m_Buttons[iPad][BUTTON_TOOLTIP_X].SetEnable(bX); m_Buttons[iPad][BUTTON_TOOLTIP_Y].SetEnable(bY); m_Buttons[iPad][BUTTON_TOOLTIP_LT].SetEnable(bLT); m_Buttons[iPad][BUTTON_TOOLTIP_RT].SetEnable(bRT); m_Buttons[iPad][BUTTON_TOOLTIP_LB].SetEnable(bLB); m_Buttons[iPad][BUTTON_TOOLTIP_RB].SetEnable(bRB); m_Buttons[iPad][BUTTON_TOOLTIP_LS].SetEnable(bLS); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_A].SetEnable(bA); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_B].SetEnable(bB); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_X].SetEnable(bX); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_Y].SetEnable(bY); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_LT].SetEnable(bLT); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_RT].SetEnable(bRT); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_LB].SetEnable(bLB); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_RB].SetEnable(bRB); m_ButtonsSmall[iPad][BUTTON_TOOLTIP_LS].SetEnable(bLS); return S_OK; } HRESULT CXuiSceneBase::_EnableTooltip(unsigned int iPad, unsigned int tooltip, bool enable) { ASSERT(tooltip < BUTTONS_TOOLTIP_MAX); m_Buttons[iPad][tooltip].SetEnable(enable); return S_OK; } HRESULT CXuiSceneBase::_AnimateKeyPress(unsigned int userIndex, unsigned int keyCode) { if (m_playerBaseScenePosition[userIndex] == e_BaseScene_NotSet) { userIndex = DEFAULT_XUI_MENU_USER; } switch (keyCode) { case VK_PAD_A: m_Buttons[userIndex][BUTTON_TOOLTIP_A].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_A].Press(); break; case VK_PAD_B: m_Buttons[userIndex][BUTTON_TOOLTIP_B].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_B].Press(); break; case VK_PAD_X: m_Buttons[userIndex][BUTTON_TOOLTIP_X].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_X].Press(); break; case VK_PAD_Y: m_Buttons[userIndex][BUTTON_TOOLTIP_Y].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_Y].Press(); break; case VK_PAD_LTRIGGER: m_Buttons[userIndex][BUTTON_TOOLTIP_LT].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_LT].Press(); break; case VK_PAD_RTRIGGER: m_Buttons[userIndex][BUTTON_TOOLTIP_RT].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_RT].Press(); break; case VK_PAD_LSHOULDER: m_Buttons[userIndex][BUTTON_TOOLTIP_LB].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_LB].Press(); break; case VK_PAD_RSHOULDER: m_Buttons[userIndex][BUTTON_TOOLTIP_RB].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_RB].Press(); break; case VK_PAD_LTHUMB_UP: case VK_PAD_LTHUMB_DOWN: case VK_PAD_LTHUMB_LEFT: case VK_PAD_LTHUMB_RIGHT: m_Buttons[userIndex][BUTTON_TOOLTIP_LS].Press(); m_ButtonsSmall[userIndex][BUTTON_TOOLTIP_LS].Press(); break; #ifndef _CONTENT_PACKAGE case VK_PAD_LTHUMB_PRESS: app.ToggleFontRenderer(); break; #endif } return S_OK; } HRESULT CXuiSceneBase::_ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) { switch (eVal) { case C4JStorage::ESavingMessage_None: XuiElementSetShow(m_SavingIcon, FALSE); break; case C4JStorage::ESavingMessage_Short: case C4JStorage::ESavingMessage_Long: XuiElementSetShow(m_SavingIcon, TRUE); break; } // Not needed - ReLayout(iPad); return S_OK; } HRESULT CXuiSceneBase::_ShowBackground(unsigned int iPad, bool show) { HRESULT hr; Minecraft* pMinecraft = Minecraft::GetInstance(); // if(app.GetGameSettingsDebugMask(iPad) && // app.GetGameSettingsDebugMask()&(1L<level != NULL) { __int64 i64TimeOfDay = 0; // are we in the Nether? - Leave the time as 0 if we are, so we show // daylight if (pMinecraft->level->dimension->id == 0) { i64TimeOfDay = pMinecraft->level->getLevelData()->getTime() % 24000; } if (i64TimeOfDay > 14000) { hr = XuiElementSetShow(hNight, TRUE); hr = XuiElementSetShow(hDay, FALSE); } else { hr = XuiElementSetShow(hNight, FALSE); hr = XuiElementSetShow(hDay, TRUE); } } else { hr = XuiElementSetShow(hNight, FALSE); hr = XuiElementSetShow(hDay, TRUE); } } hr = XuiElementSetShow(m_Background[iPad], show); return hr; } HRESULT CXuiSceneBase::_ShowDarkOverlay(unsigned int iPad, bool show) { return XuiElementSetShow(m_DarkOverlay[iPad], show); } HRESULT CXuiSceneBase::_ShowLogo(unsigned int iPad, bool show) { return XuiElementSetShow(m_Logo[iPad], show); } HRESULT CXuiSceneBase::_ShowPressStart(unsigned int iPad) { XUIRect xuiRect; LPCWSTR pString = app.GetString(IDS_PRESS_START_TO_JOIN); ; float fWidth, fHeight, fWidthChange; XuiSetTimer(m_hObj, PRESS_START_TIMER, 3000); m_iQuadrantsMask |= 1 << iPad; m_PressStart.SetShow(TRUE); // retrieve the visual for this quadrant HXUIOBJ hObj = NULL, hQuadrant; HRESULT hr = XuiControlGetVisual(m_PressStart.m_hObj, &hObj); hr = XuiElementGetChildById(hObj, L"text_ButtonText", &hQuadrant); memset(&xuiRect, 0, sizeof(xuiRect)); hr = XuiTextPresenterMeasureText(hQuadrant, pString, &xuiRect); XuiElementGetBounds(hQuadrant, &fWidth, &fHeight); fWidthChange = xuiRect.right - fWidth; // get the size of the button, and apply the change in size due to the text // to the whole button XuiElementGetBounds(m_PressStart.m_hObj, &fWidth, &fHeight); XuiElementSetBounds(m_PressStart.m_hObj, fWidth + fWidthChange, fHeight); switch (iPad) { case 0: hr = XuiElementGetChildById(hObj, L"Quadrant1", &hQuadrant); break; case 1: hr = XuiElementGetChildById(hObj, L"Quadrant2", &hQuadrant); break; case 2: hr = XuiElementGetChildById(hObj, L"Quadrant3", &hQuadrant); break; case 3: hr = XuiElementGetChildById(hObj, L"Quadrant4", &hQuadrant); break; } XuiElementSetShow(hQuadrant, TRUE); int nStart, nEnd; // XuiElementFindNamedFrame( m_hObj, L"StartFlash", &nStart ); // XuiElementFindNamedFrame( m_hObj, L"EndFlash", &nEnd ); // XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, TRUE, TRUE ); XuiElementFindNamedFrame(hObj, L"StartFlash", &nStart); XuiElementFindNamedFrame(hObj, L"EndFlash", &nEnd); XuiElementPlayTimeline(hObj, nStart, nStart, nEnd, TRUE, TRUE); return S_OK; } HRESULT CXuiSceneBase::_HidePressStart() { return m_PressStart.SetShow(FALSE); } HRESULT CXuiSceneBase::_UpdateAutosaveCountdownTimer(unsigned int uiSeconds) { WCHAR wcAutosaveCountdown[100]; swprintf(wcAutosaveCountdown, 100, app.GetString(IDS_AUTOSAVE_COUNTDOWN), uiSeconds); m_TrialTimer.SetText(wcAutosaveCountdown); return S_OK; } HRESULT CXuiSceneBase::_ShowAutosaveCountdownTimer(bool show) { m_TrialTimer.SetShow(show); return S_OK; } HRESULT CXuiSceneBase::_UpdateTrialTimer(unsigned int iPad) { WCHAR wcTime[20]; unsigned int trialTimeTicks = static_cast(app.getTrialTimer()); if (trialTimeTicks > m_trialTimerLimitSecs) { trialTimeTicks = m_trialTimerLimitSecs; } trialTimeTicks = m_trialTimerLimitSecs - trialTimeTicks; #ifndef _CONTENT_PACKAGE if (true) #else // display the time - only if there's less than 3 minutes if (trialTimeTicks < 180) #endif { int iMins = trialTimeTicks / 60; int iSeconds = trialTimeTicks % 60; swprintf(wcTime, 20, L"%d:%02d", iMins, iSeconds); m_TrialTimer.SetText(wcTime); } else { m_TrialTimer.SetText(L""); } // are we out of time? if (trialTimeTicks == 0) { // Trial over app.SetAction(iPad, eAppAction_TrialOver); } return S_OK; } void CXuiSceneBase::_ReduceTrialTimerValue() { unsigned int trialTimeTicks = static_cast(app.getTrialTimer()); if (trialTimeTicks > m_trialTimerLimitSecs) { trialTimeTicks = m_trialTimerLimitSecs; } m_trialTimerLimitSecs -= trialTimeTicks; } HRESULT CXuiSceneBase::_ShowTrialTimer(bool show) { m_TrialTimer.SetShow(show); return S_OK; } bool CXuiSceneBase::_PressStartPlaying(unsigned int iPad) { return m_iQuadrantsMask & (1 << iPad) ? true : false; } HRESULT CXuiSceneBase::_SetPlayerBaseScenePosition( unsigned int iPad, EBaseScenePosition position) { // turn off the empty quadrant logo if (m_hEmptyQuadrantLogo != NULL) { XuiElementSetShow(m_hEmptyQuadrantLogo, FALSE); } // No changes if (m_playerBaseScenePosition[iPad] == position) return S_OK; m_selectedItemA[iPad].SetShow(FALSE); m_selectedItemSmallA[iPad].SetShow(FALSE); if (position == e_BaseScene_NotSet) { m_playerBaseScenePosition[iPad] = position; return S_OK; } D3DXVECTOR3 scale, pos; //,currentpos; // Shift the tooltips D3DXVECTOR3 tooltipsPos, crouchIconPos, saveIconPos, vBackPos, vGamertagPos, vBossHealthPos; tooltipsPos.z = crouchIconPos.z = saveIconPos.z = vBackPos.z = vBossHealthPos.z = 0.0f; vBackPos.x = 0.0f; vBackPos.y = 0.0f; m_playerBaseScenePosition[iPad] = position; float fTempWidth, fTooltipHeight, fTooltipHeightSmall, fGamertagWidth, fGamertagHeight, fBossHealthWidth, fBossHealthHeight; float fBackWidth, fBackHeight; // Reset the players base scene before we make any other adjustments pos.x = 0.0f; pos.y = 0.0f; pos.z = 0.0f; XuiElementSetPosition(m_BasePlayerScene[iPad], &pos); XuiElementGetBounds(m_TooltipGroup[iPad].m_hObj, &fTempWidth, &fTooltipHeight); XuiElementGetBounds(m_TooltipGroupSmall[iPad].m_hObj, &fTempWidth, &fTooltipHeightSmall); XuiElementGetBounds(m_Background[iPad].m_hObj, &fBackWidth, &fBackHeight); XuiElementGetBounds(m_hGamerTagA[iPad], &fGamertagWidth, &fGamertagHeight); XuiElementGetBounds(m_BossHealthGroup[iPad], &fBossHealthWidth, &fBossHealthHeight); if (position == e_BaseScene_Fullscreen && (RenderManager.IsHiDef() || RenderManager.IsWidescreen())) { XuiElementSetShow(m_TooltipGroup[iPad].m_hObj, TRUE); XuiElementSetShow(m_TooltipGroupSmall[iPad].m_hObj, FALSE); } else { XuiElementSetShow(m_TooltipGroup[iPad].m_hObj, FALSE); XuiElementSetShow(m_TooltipGroupSmall[iPad].m_hObj, TRUE); } if (!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) { // 640x480 ->1280x720 scale.x = 2.0f; scale.y = 1.5f; scale.z = 1.0f; XuiElementSetScale(m_hObj, &scale); return S_OK; } if (position != e_BaseScene_Fullscreen) { // Scale up the tooltips so we can read them /* scale.x = 0.75f; scale.y = 0.75f; scale.z = 1.0f; XuiElementSetScale(m_TooltipGroup[iPad], &scale); fTooltipHeight*=scale.y; */ fTooltipHeight = fTooltipHeightSmall; scale.x = 0.5f; scale.y = 0.5f; scale.z = 1.0f; XuiElementSetScale(m_CrouchIcon[iPad], &scale); XuiElementSetScale(m_Logo[iPad].m_hObj, &scale); } else { // if we are not in high def mode, then we need to scale the // m_BasePlayerScene scene by 2 (we're using the 640x360 scenes) scale.x = 1.0f; scale.y = 1.0f; scale.z = 1.0f; XuiElementSetScale(m_BasePlayerScene[iPad], &scale); XuiElementSetScale(m_TooltipGroup[iPad], &scale); XuiElementSetScale(m_CrouchIcon[iPad], &scale); XuiElementSetScale(m_Logo[iPad].m_hObj, &scale); } // The move applies to the whole scene, so we'll need to move tooltips back // in some cases switch (position) { // No position adjustment case e_BaseScene_Fullscreen: tooltipsPos.x = SAFEZONE_HALF_WIDTH; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackWidth = XUI_BASE_SCENE_WIDTH; fBackHeight = XUI_BASE_SCENE_HEIGHT; XuiElementGetPosition(m_selectedItemA[iPad], &vBossHealthPos); vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_HALF - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Top_Left: tooltipsPos.x = SAFEZONE_HALF_WIDTH; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - 10.0f; vGamertagPos.y = SAFEZONE_HALF_HEIGHT; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Top: // Top & Bottom - indent by a quarter screen pos.x += XUI_BASE_SCENE_WIDTH_QUARTER; tooltipsPos.x = SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; fBackWidth = XUI_BASE_SCENE_WIDTH; vBackPos.x = -XUI_BASE_SCENE_WIDTH_QUARTER; vBackPos.y = 0.0f; vGamertagPos.x = XUI_BASE_SCENE_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER - fGamertagWidth - SAFEZONE_HALF_WIDTH; vGamertagPos.y = SAFEZONE_HALF_HEIGHT; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Bottom: pos.x += XUI_BASE_SCENE_WIDTH_QUARTER; pos.y += XUI_BASE_SCENE_HEIGHT_HALF; tooltipsPos.x = SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; crouchIconPos.y = 0.0f; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; fBackWidth = XUI_BASE_SCENE_WIDTH; vBackPos.x = -XUI_BASE_SCENE_WIDTH_QUARTER; vBackPos.y = 0.0f; vGamertagPos.x = XUI_BASE_SCENE_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER - fGamertagWidth - SAFEZONE_HALF_WIDTH; vGamertagPos.y = 0.0f; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = 0.0f; break; case e_BaseScene_Bottom_Left: pos.y += XUI_BASE_SCENE_HEIGHT_HALF; tooltipsPos.x = SAFEZONE_HALF_WIDTH; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH; crouchIconPos.y = 0.0f; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - 10.0f; vGamertagPos.y = 0.0f; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = 0.0f; break; case e_BaseScene_Bottom_Right: pos.x += XUI_BASE_SCENE_WIDTH_HALF; pos.y += XUI_BASE_SCENE_HEIGHT_HALF; tooltipsPos.x = 0.0f; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = 0.0f; crouchIconPos.y = 0.0f; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - SAFEZONE_HALF_WIDTH; vGamertagPos.y = 0.0f; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = 0.0f; break; case e_BaseScene_Left: pos.y += XUI_BASE_SCENE_HEIGHT_QUARTER; tooltipsPos.x = SAFEZONE_HALF_WIDTH; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF + XUI_BASE_SCENE_HEIGHT_QUARTER - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = SAFEZONE_HALF_WIDTH; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT; vBackPos.x = 0.0f; vBackPos.y = -XUI_BASE_SCENE_HEIGHT_QUARTER; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - 10.0f; vGamertagPos.y = SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; break; case e_BaseScene_Right: pos.x += XUI_BASE_SCENE_WIDTH_HALF; pos.y += XUI_BASE_SCENE_HEIGHT_QUARTER; tooltipsPos.x = 0.0f; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF + XUI_BASE_SCENE_HEIGHT_QUARTER - SAFEZONE_HALF_HEIGHT - fTooltipHeight; crouchIconPos.x = 0.0f; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT; vBackPos.x = 0.0f; vBackPos.y = -XUI_BASE_SCENE_HEIGHT_QUARTER; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - SAFEZONE_HALF_WIDTH; vGamertagPos.y = SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; break; case e_BaseScene_Top_Right: pos.x += XUI_BASE_SCENE_WIDTH_HALF; tooltipsPos.x = 0.0f; tooltipsPos.y = XUI_BASE_SCENE_HEIGHT_HALF - fTooltipHeight; crouchIconPos.x = 0.0f; crouchIconPos.y = SAFEZONE_HALF_HEIGHT; fBackWidth = XUI_BASE_SCENE_WIDTH_HALF; fBackHeight = XUI_BASE_SCENE_HEIGHT_HALF; vGamertagPos.x = XUI_BASE_SCENE_WIDTH_HALF - fGamertagWidth - SAFEZONE_HALF_WIDTH; vGamertagPos.y = SAFEZONE_HALF_HEIGHT; vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fBossHealthWidth / 2); vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; break; } XuiElementSetPosition(m_BasePlayerScene[iPad], &pos); XuiElementSetPosition(m_TooltipGroup[iPad].m_hObj, &tooltipsPos); XuiElementSetPosition(m_TooltipGroupSmall[iPad].m_hObj, &tooltipsPos); XuiElementSetPosition(m_CrouchIcon[iPad].m_hObj, &crouchIconPos); XuiElementSetPosition(m_DarkOverlay[iPad].m_hObj, &vBackPos); XuiElementSetBounds(m_DarkOverlay[iPad].m_hObj, fBackWidth, fBackHeight); XuiElementSetPosition(m_Background[iPad].m_hObj, &vBackPos); XuiElementSetBounds(m_Background[iPad].m_hObj, fBackWidth, fBackHeight); vGamertagPos.z = 0.0f; XuiElementSetPosition(m_hGamerTagA[iPad], &vGamertagPos); XuiElementSetPosition(m_BossHealthGroup[iPad], &vBossHealthPos); // 4J Stu - If we already have some scenes open, then call this to update // their positions Fix for #10960 - All Lang: UI: Split-screen: Changing // split screen mode (vertical/horizontal) make window layout strange if (Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localplayers[iPad] != NULL) { // 4J-PB - Can only do this once we know what the player's UI settings // are, so we need to have the player game settings read _UpdateSelectedItemPos(iPad); XUIMessage xuiMsg; CustomMessage_Splitscreenplayer_Struct myMsgData; CustomMessage_Splitscreenplayer(&xuiMsg, &myMsgData, false); XuiBroadcastMessage(GetPlayerBaseScene(iPad), &xuiMsg); } // tell the xui scenes that the base position has changed XUIMessage xuiMsg; CustomMessage_BasePositionChanged(&xuiMsg); XuiBroadcastMessage(GetPlayerBaseScene(iPad), &xuiMsg); return S_OK; } // The function uses the game mode to decide the offsets for the select item. It // needs to be called after the game has loaded. void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) { D3DXVECTOR3 selectedItemPos; selectedItemPos.x = selectedItemPos.y = selectedItemPos.z = 0.0f; float fSelectedItemWidth, fSelectedItemHeight; XuiElementGetBounds(m_selectedItemSmallA[iPad], &fSelectedItemWidth, &fSelectedItemHeight); float yOffset = 0.0f; if (m_bossHealthVisible[iPad] == TRUE) { float tempWidth; XuiElementGetBounds(m_BossHealthGroup[iPad], &tempWidth, &yOffset); } // Only adjust if fullscreen for now, leaving code to move others if // required, but it's too far up the screen when on the bottom quadrants if ((m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) && (RenderManager.IsHiDef() || RenderManager.IsWidescreen())) { D3DXVECTOR3 selectedItemPos; selectedItemPos.z = 0.0f; float scale, fTempWidth, fTooltipHeight, fTooltipHeightSmall, fSelectedItemWidth, fSelectedItemHeight, fSelectedItemSmallWidth, fSelectedItemSmallHeight; XuiElementGetBounds(m_TooltipGroup[iPad].m_hObj, &fTempWidth, &fTooltipHeight); XuiElementGetBounds(m_TooltipGroupSmall[iPad].m_hObj, &fTempWidth, &fTooltipHeightSmall); XuiElementGetBounds(m_selectedItemA[iPad], &fSelectedItemWidth, &fSelectedItemHeight); XuiElementGetBounds(m_selectedItemSmallA[iPad], &fSelectedItemSmallWidth, &fSelectedItemSmallHeight); if (m_playerBaseScenePosition[iPad] != e_BaseScene_Fullscreen) { fTooltipHeight = fTooltipHeightSmall; fSelectedItemHeight = fSelectedItemSmallHeight; scale = 0.5f; } else { // if we are not in high def mode, then we need to scale the // m_BasePlayerScene scene by 2 (we're using the 640x360 scenes) scale = 1.0f; } // The move applies to the whole scene, so we'll need to move tooltips // back in some cases selectedItemPos.y = XUI_BASE_SCENE_HEIGHT - SAFEZONE_HALF_HEIGHT - fTooltipHeight - fSelectedItemHeight; selectedItemPos.x = XUI_BASE_SCENE_WIDTH_HALF - (fSelectedItemWidth / 2.0f); // Adjust selectedItemPos based on what gui is displayed // 4J-PB - selected the gui scale based on the slider settings, and on // whether we're in Creative or Survival float fYOffset = 0.0f; unsigned char ucGuiScale = app.GetGameSettings(iPad, eGameSetting_UISize) + 2; if (Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance()->localgameModes[iPad]->canHurtPlayer()) { // SURVIVAL MODE - Move up further because of hearts, shield and xp switch (ucGuiScale) { case 3: fYOffset = -130.0f; break; case 4: fYOffset = -168.0f; break; default: // 2 fYOffset = -94.0f; break; } } else { switch (ucGuiScale) { case 3: fYOffset = -83.0f; break; case 4: fYOffset = -114.0f; break; default: // 2 fYOffset = -58.0f; break; } } selectedItemPos.y += fYOffset - 40.0f; // 40 for the XP display XuiElementSetPosition(m_selectedItemA[iPad].m_hObj, &selectedItemPos); // XuiElementSetPosition( m_selectedItemSmallA[iPad].m_hObj, // &selectedItemPos ); } else { // The move applies to the whole scene, so we'll need to move tooltips // back in some cases switch (m_playerBaseScenePosition[iPad]) { case e_BaseScene_Fullscreen: // 480 non-widescreen selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; break; case e_BaseScene_Top_Left: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; break; case e_BaseScene_Top: // Top & Bottom - indent by a quarter screen selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; break; case e_BaseScene_Bottom: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = 0.0f + yOffset; break; case e_BaseScene_Bottom_Left: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = 0.0f + yOffset; break; case e_BaseScene_Bottom_Right: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = 0.0f + yOffset; break; case e_BaseScene_Left: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = XUI_BASE_SCENE_HEIGHT_HALF; // + yOffset; - don't need the // offset for the boss health // since we're displaying the // item at the bottom of the // screen, not the top break; case e_BaseScene_Right: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = XUI_BASE_SCENE_HEIGHT_HALF; // + yOffset; - don't need the // offset for the boss health // since we're displaying the // item at the bottom of the // screen, not the top break; case e_BaseScene_Top_Right: selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth / 2.0f); selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; break; } // 4J-PB - If it's in split screen vertical, adjust the position // Adjust selectedItemPos based on what gui is displayed if ((m_playerBaseScenePosition[iPad] == e_BaseScene_Left) || (m_playerBaseScenePosition[iPad] == e_BaseScene_Right)) { float scale = 0.5f; selectedItemPos.y -= (scale * 88.0f); if (Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance() ->localgameModes[iPad] ->canHurtPlayer()) { selectedItemPos.y -= (scale * 80.0f); } // 4J-PB - selected the gui scale based on the slider settings unsigned char ucGuiScale; float fYOffset = 0.0f; if (m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) { ucGuiScale = app.GetGameSettings(iPad, eGameSetting_UISize) + 2; } else { ucGuiScale = app.GetGameSettings(iPad, eGameSetting_UISizeSplitscreen) + 2; } switch (ucGuiScale) { case 3: fYOffset = 55.0f; break; case 4: fYOffset = 45.0f; break; default: // 2 fYOffset = 85.0f; break; } selectedItemPos.y += fYOffset; } XuiElementSetPosition(m_selectedItemSmallA[iPad].m_hObj, &selectedItemPos); XuiElementSetPosition(m_selectedItemA[iPad].m_hObj, &selectedItemPos); } } CXuiSceneBase::EBaseScenePosition CXuiSceneBase::_GetPlayerBasePosition( int iPad) { return m_playerBaseScenePosition[iPad]; } void CXuiSceneBase::_SetEmptyQuadrantLogo(int iPad, EBaseScenePosition ePos) { if (m_hEmptyQuadrantLogo != NULL) { for (unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { if (m_playerBaseScenePosition[i] == e_BaseScene_Fullscreen) { // Someone is fullscreen, so don't show this XuiElementSetShow(m_hEmptyQuadrantLogo, FALSE); return; } } D3DXVECTOR3 pos; // get the bounds of the logo pos.z = 0.0f; switch (ePos) { case e_BaseScene_Top_Left: pos.x = 64.0f; pos.y = 36.0f; break; case e_BaseScene_Top_Right: pos.x = 640.0 + 64.0f; pos.y = 36.0f; break; case e_BaseScene_Bottom_Left: pos.x = 64.0f; pos.y = 360.0f + 36.0f; break; case e_BaseScene_Bottom_Right: pos.x = 640.0 + 64.0f; pos.y = 360.0f + 36.0f; break; } // set the opacity of the logo if (ProfileManager.GetLockedProfile() != -1) { unsigned char ucAlpha = app.GetGameSettings( ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); XuiElementSetOpacity(m_hEmptyQuadrantLogo, 0.01f * (float)ucAlpha); } XuiElementSetPosition(m_hEmptyQuadrantLogo, &pos); XuiElementSetShow(m_hEmptyQuadrantLogo, TRUE); } } HRESULT CXuiSceneBase::_PlayUISFX(ESoundEffect eSound) { HRESULT hr; bool bUsingTexturepackWithAudio = false; // are we using a mash-up pack? if (!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) { TexturePack* tPack = Minecraft::GetInstance()->skins->getSelected(); if (tPack->hasAudio()) { bUsingTexturepackWithAudio = true; } } /*if(bUsingTexturepackWithAudio) { switch(eSound) { case eSFX_Back: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_Craft: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_CraftFail: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_Focus: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_Press: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_Scroll: hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); break; default: hr=S_OK; break; } } else*/ { switch (eSound) { case eSFX_Back: hr = XuiSoundPlay(m_SFXA[eSFX_Back]); break; case eSFX_Craft: hr = XuiSoundPlay(m_SFXA[eSFX_Craft]); break; case eSFX_CraftFail: hr = XuiSoundPlay(m_SFXA[eSFX_CraftFail]); break; case eSFX_Focus: hr = XuiSoundPlay(m_SFXA[eSFX_Focus]); break; case eSFX_Press: hr = XuiSoundPlay(m_SFXA[eSFX_Press]); break; case eSFX_Scroll: hr = XuiSoundPlay(m_SFXA[eSFX_Scroll]); break; default: hr = S_OK; break; } } return hr; } HRESULT CXuiSceneBase::_DisplayGamertag(unsigned int iPad, bool display) { if (app.DebugSettingsOn() && (app.GetGameSettingsDebugMask() & (1L << eDebugSetting_DebugLeaderboards))) { XuiControlSetText(m_hGamerTagA[iPad], L"WWWWWWWWWWWWWWWW"); } else { // The host decides whether these are on or off if (app.GetGameSettings(ProfileManager.GetPrimaryPad(), eGameSetting_DisplaySplitscreenGamertags) != 0) { if (Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localplayers[iPad] != NULL) { std::wstring wsGamertag = convStringToWstring(ProfileManager.GetGamertag(iPad)); XuiControlSetText(m_hGamerTagA[iPad], wsGamertag.c_str()); } else { XuiControlSetText(m_hGamerTagA[iPad], L""); } } } // The host decides whether these are on or off if (app.GetGameSettings(ProfileManager.GetPrimaryPad(), eGameSetting_DisplaySplitscreenGamertags) != 0) { XuiElementSetShow(m_hGamerTagA[iPad], display); // set the opacity of the gamertag if (display && (ProfileManager.GetLockedProfile() != -1)) { unsigned char ucAlpha = app.GetGameSettings( ProfileManager.GetPrimaryPad(), eGameSetting_InterfaceOpacity); float fVal; if (ucAlpha < 80) { // check if we have the timer running for the opacity unsigned int uiOpacityTimer = app.GetOpacityTimer(ProfileManager.GetPrimaryPad()); if (uiOpacityTimer != 0) { if (uiOpacityTimer < 10) { float fStep = (80.0f - (float)ucAlpha) / 10.0f; fVal = 0.01f * (80.0f - ((10.0f - (float)uiOpacityTimer) * fStep)); } else { fVal = 0.01f * 80.0f; } } else { fVal = 0.01f * (float)ucAlpha; } } else { fVal = 0.01f * (float)ucAlpha; } XuiElementSetOpacity(m_hGamerTagA[iPad], 0.01f * fVal); } } else { XuiElementSetShow(m_hGamerTagA[iPad], FALSE); } return S_OK; } void CXuiSceneBase::_SetSelectedItem(unsigned int iPad, const std::wstring& name) { if (app.GetGameSettings(eGameSetting_Hints) == 0 || name.empty()) { m_selectedItemA[iPad].SetShow(FALSE); m_selectedItemSmallA[iPad].SetShow(FALSE); } else { m_uiSelectedItemOpacityCountDown[iPad] = SharedConstants::TICKS_PER_SECOND * 3; if (m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) { m_selectedItemSmallA[iPad].SetShow(FALSE); m_selectedItemA[iPad].SetShow(TRUE); m_selectedItemA[iPad].SetText(name.c_str()); // D3DXVECTOR3 vPos; // XuiElementGetPosition( // m_selectedItemA[iPad].m_hObj, &vPos ); XuiElementSetPosition( // m_selectedItemA[iPad].m_hObj, &vPos ); float fVal = 0.8f; // 0.01f*(float)80; XuiElementSetOpacity(m_selectedItemA[iPad].m_hObj, fVal); } else { m_selectedItemA[iPad].SetShow(FALSE); m_selectedItemSmallA[iPad].SetShow(TRUE); m_selectedItemSmallA[iPad].SetText(name.c_str()); // D3DXVECTOR3 vPos; // XuiElementGetPosition( // m_selectedItemSmallA[iPad].m_hObj, &vPos ); // XuiElementSetPosition( // m_selectedItemSmallA[iPad].m_hObj, &vPos ); float fVal = 0.8f; // 0.01f*(float)80; XuiElementSetOpacity(m_selectedItemSmallA[iPad].m_hObj, fVal); } } } void CXuiSceneBase::_HideAllGameUIElements() { for (int i = 0; i < XUSER_MAX_COUNT; i++) { m_uiSelectedItemOpacityCountDown[i] = 0; m_selectedItemA[i].SetShow(FALSE); m_selectedItemSmallA[i].SetShow(FALSE); m_BossHealthGroup[i].SetShow(FALSE); m_bossHealthVisible[i] = FALSE; XuiElementSetShow(app.GetCurrentHUDScene(i), FALSE); _DisplayGamertag(i, FALSE); } } bool CXuiSceneBase::_GetBaseSceneSafeZone(unsigned int iPad, D3DXVECTOR2& origin, float& width, float& height) { if (m_playerBaseScenePosition[iPad] == e_BaseScene_NotSet) return false; D3DXMATRIX baseSceneMatrix; XuiElementGetFullXForm(m_BasePlayerScene[iPad], &baseSceneMatrix); origin.x = baseSceneMatrix._41; origin.y = baseSceneMatrix._42; XuiElementGetBounds(m_BasePlayerScene[iPad], &width, &height); switch (m_playerBaseScenePosition[iPad]) { // No position adjustment case e_BaseScene_Fullscreen: origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH * 2; origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT * 2; break; case e_BaseScene_Top_Left: width = XUI_BASE_SCENE_WIDTH_HALF; height = XUI_BASE_SCENE_HEIGHT_HALF; origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT * 2; break; case e_BaseScene_Top: // Top & Bottom - indent by a quarter screen height = XUI_BASE_SCENE_HEIGHT_HALF; // origin.x += SAFEZONE_HALF_WIDTH; // width -= SAFEZONE_HALF_WIDTH * 2; origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Bottom: height = XUI_BASE_SCENE_HEIGHT_HALF; // origin.x += SAFEZONE_HALF_WIDTH; // width -= SAFEZONE_HALF_WIDTH * 2; // origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Bottom_Left: width = XUI_BASE_SCENE_WIDTH_HALF; height = XUI_BASE_SCENE_HEIGHT_HALF; origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; // origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Bottom_Right: width = XUI_BASE_SCENE_WIDTH_HALF; height = XUI_BASE_SCENE_HEIGHT_HALF; // origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; // origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT; break; case e_BaseScene_Left: width = XUI_BASE_SCENE_WIDTH_HALF; origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; // origin.y += SAFEZONE_HALF_HEIGHT; // height -= SAFEZONE_HALF_HEIGHT * 2; break; case e_BaseScene_Right: width = XUI_BASE_SCENE_WIDTH_HALF; // origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; // origin.y += SAFEZONE_HALF_HEIGHT; // height -= SAFEZONE_HALF_HEIGHT * 2; break; case e_BaseScene_Top_Right: width = XUI_BASE_SCENE_WIDTH_HALF; height = XUI_BASE_SCENE_HEIGHT_HALF; // origin.x += SAFEZONE_HALF_WIDTH; width -= SAFEZONE_HALF_WIDTH; origin.y += SAFEZONE_HALF_HEIGHT; height -= SAFEZONE_HALF_HEIGHT; break; } return true; } void CXuiSceneBase::ReLayout(unsigned int iPad) { D3DXVECTOR3 lastPos, lastPosSmall; int lastVisible = -1; // Buttons are at 0,0 within the tooltip group lastPos.x = 0.0f; lastPos.y = 0.0f; lastPos.z = 0.0f; lastPosSmall.x = 0.0f; lastPosSmall.y = 0.0f; lastPosSmall.z = 0.0f; for (unsigned int i = 0; i < BUTTONS_TOOLTIP_MAX; ++i) { if (m_visible[iPad][i] == TRUE) { if (i > 0 && lastVisible != -1) { float width, height; XuiElementGetBounds(m_Buttons[iPad][lastVisible].m_hObj, &width, &height); // 4J Stu - This is for horizontal layout, will need changed if // we do vertical layout lastPos.x += width + m_iTooltipSpacingGap; XuiElementGetBounds(m_ButtonsSmall[iPad][lastVisible].m_hObj, &width, &height); // 4J Stu - This is for horizontal layout, will need changed if // we do vertical layout lastPosSmall.x += width + m_iTooltipSpacingGapSmall; } XuiElementSetPosition(m_Buttons[iPad][i].m_hObj, &lastPos); XuiElementSetPosition(m_ButtonsSmall[iPad][i].m_hObj, &lastPosSmall); lastVisible = i; } } } void CXuiSceneBase::TickAllBaseScenes() { if (CXuiSceneBase::Instance != NULL) { CXuiSceneBase::Instance->_TickAllBaseScenes(); } } HRESULT CXuiSceneBase::SetEnableTooltips(unsigned int iPad, bool enabled) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_SetEnableTooltips(iPad, enabled); } return S_OK; } HRESULT CXuiSceneBase::SetTooltipText(unsigned int iPad, unsigned int tooltip, int iTextID) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_SetTooltipText(iPad, tooltip, iTextID); } return S_OK; } HRESULT CXuiSceneBase::RefreshTooltips(unsigned int iPad) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_RefreshTooltips(iPad); } return S_OK; } HRESULT CXuiSceneBase::ShowTooltip(unsigned int iPad, unsigned int tooltip, bool show) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_ShowTooltip(iPad, tooltip, show); } return S_OK; } HRESULT CXuiSceneBase::ShowSafeArea(bool show) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_ShowSafeArea(show); } return S_OK; } HRESULT CXuiSceneBase::SetTooltips(unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iRB, int iLB, int iLS, bool forceUpdate /*= false*/) { if (CXuiSceneBase::Instance != NULL) { // Enable all the tooltips. We should disable them in the scenes as // required CXuiSceneBase::Instance->_SetTooltipsEnabled(iPad); int iTooptipsA[BUTTONS_TOOLTIP_MAX]; iTooptipsA[BUTTON_TOOLTIP_A] = iA; iTooptipsA[BUTTON_TOOLTIP_B] = iB; iTooptipsA[BUTTON_TOOLTIP_X] = iX; iTooptipsA[BUTTON_TOOLTIP_Y] = iY; iTooptipsA[BUTTON_TOOLTIP_LT] = iLT; iTooptipsA[BUTTON_TOOLTIP_RT] = iRT; iTooptipsA[BUTTON_TOOLTIP_LB] = iRB; iTooptipsA[BUTTON_TOOLTIP_RB] = iLB; iTooptipsA[BUTTON_TOOLTIP_LS] = iLS; for (int i = 0; i < BUTTONS_TOOLTIP_MAX; i++) { if (iTooptipsA[i] == -1) { CXuiSceneBase::Instance->SetTooltipText(iPad, i, -1); CXuiSceneBase::Instance->_ShowTooltip(iPad, i, false); // CXuiSceneBase::Instance->m_iCurrentTooltipTextID[iPad][i]=-1; } else if (iTooptipsA[i] == -2) { CXuiSceneBase::Instance->_ShowTooltip(iPad, i, true); CXuiSceneBase::Instance->SetTooltipText(iPad, i, -2); } else { // does the tooltip need to change? if (CXuiSceneBase::Instance->m_iCurrentTooltipTextID[iPad][i] != iTooptipsA[i] || forceUpdate) { CXuiSceneBase::Instance->SetTooltipText(iPad, i, iTooptipsA[i]); } CXuiSceneBase::Instance->_ShowTooltip(iPad, i, true); } } } return S_OK; } HRESULT CXuiSceneBase::SetTooltipsEnabled(unsigned int iPad, bool bA, bool bB, bool bX, bool bY, bool bLT, bool bRT, bool bLB, bool bRB, bool bLS) { return CXuiSceneBase::Instance->_SetTooltipsEnabled( iPad, bA, bB, bX, bY, bLT, bRT, bLB, bRB, bLS); } HRESULT CXuiSceneBase::EnableTooltip(unsigned int iPad, unsigned int tooltip, bool enable) { return CXuiSceneBase::Instance->_EnableTooltip(iPad, tooltip, enable); } HRESULT CXuiSceneBase::AnimateKeyPress(unsigned int userIndex, unsigned int keyCode) { return CXuiSceneBase::Instance->_AnimateKeyPress(userIndex, keyCode); } HRESULT CXuiSceneBase::ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) { if (CXuiSceneBase::Instance != NULL) { return CXuiSceneBase::Instance->_ShowSavingMessage(iPad, eVal); } return S_OK; } HRESULT CXuiSceneBase::ShowBackground(unsigned int iPad, bool show) { return CXuiSceneBase::Instance->_ShowBackground(iPad, show); } HRESULT CXuiSceneBase::ShowDarkOverlay(unsigned int iPad, bool show) { return CXuiSceneBase::Instance->_ShowDarkOverlay(iPad, show); } HRESULT CXuiSceneBase::ShowLogo(unsigned int iPad, bool show) { return CXuiSceneBase::Instance->_ShowLogo(iPad, show); } HRESULT CXuiSceneBase::ShowPressStart(unsigned int iPad) { CXuiSceneBase::Instance->_ShowPressStart(iPad); return S_OK; } HRESULT CXuiSceneBase::ShowOtherPlayersBaseScene(int iPad, bool show) { CXuiSceneBase::Instance->_ShowOtherPlayersBaseScene(iPad, show); return S_OK; } HRESULT CXuiSceneBase::UpdateAutosaveCountdownTimer(unsigned int uiSeconds) { CXuiSceneBase::Instance->_UpdateAutosaveCountdownTimer(uiSeconds); return S_OK; } HRESULT CXuiSceneBase::ShowAutosaveCountdownTimer(bool show) { CXuiSceneBase::Instance->_ShowAutosaveCountdownTimer(show); return S_OK; } HRESULT CXuiSceneBase::UpdateTrialTimer(unsigned int iPad) { CXuiSceneBase::Instance->_UpdateTrialTimer(iPad); return S_OK; } HRESULT CXuiSceneBase::ShowTrialTimer(bool show) { CXuiSceneBase::Instance->_ShowTrialTimer(show); return S_OK; } void CXuiSceneBase::ReduceTrialTimerValue() { CXuiSceneBase::Instance->_ReduceTrialTimerValue(); } bool CXuiSceneBase::PressStartPlaying(unsigned int iPad) { return CXuiSceneBase::Instance->_PressStartPlaying(iPad); } HRESULT CXuiSceneBase::HidePressStart() { return CXuiSceneBase::Instance->_HidePressStart(); } HRESULT CXuiSceneBase::SetPlayerBaseScenePosition(unsigned int iPad, EBaseScenePosition position) { return CXuiSceneBase::Instance->_SetPlayerBaseScenePosition(iPad, position); } HRESULT CXuiSceneBase::SetPlayerBasePositions(EBaseScenePosition pad0, EBaseScenePosition pad1, EBaseScenePosition pad2, EBaseScenePosition pad3) { SetPlayerBaseScenePosition(0, pad0); SetPlayerBaseScenePosition(1, pad1); SetPlayerBaseScenePosition(2, pad2); SetPlayerBaseScenePosition(3, pad3); return S_OK; } HRESULT CXuiSceneBase::UpdatePlayerBasePositions() { EBaseScenePosition padPositions[XUSER_MAX_COUNT]; for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { padPositions[idx] = e_BaseScene_NotSet; } Minecraft* pMinecraft = Minecraft::GetInstance(); // If the game is not started (or is being held paused for a bit) then // display all scenes fullscreen if (pMinecraft == NULL) { for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { padPositions[idx] = e_BaseScene_Fullscreen; } } // If the game is not in split-screen, then display the primary pad at // fullscreen else if (app.GetLocalPlayerCount() < 2) { int primaryPad = ProfileManager.GetPrimaryPad(); padPositions[primaryPad] = e_BaseScene_Fullscreen; // May need to turn off the player who just left for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { DisplayGamertag(idx, FALSE); } } // We are in splitscreen so work out where each player should be else { for (unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { if (pMinecraft->localplayers[idx] != NULL) { if (pMinecraft->localplayers[idx]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { DisplayGamertag(idx, FALSE); } else { DisplayGamertag(idx, TRUE); } switch (pMinecraft->localplayers[idx]->m_iScreenSection) { case C4JRender::VIEWPORT_TYPE_FULLSCREEN: padPositions[idx] = e_BaseScene_Fullscreen; break; case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: padPositions[idx] = e_BaseScene_Top; break; case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: padPositions[idx] = e_BaseScene_Bottom; break; case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: padPositions[idx] = e_BaseScene_Left; break; case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: padPositions[idx] = e_BaseScene_Right; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: padPositions[idx] = e_BaseScene_Top_Left; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: padPositions[idx] = e_BaseScene_Top_Right; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: padPositions[idx] = e_BaseScene_Bottom_Left; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: padPositions[idx] = e_BaseScene_Bottom_Right; break; } } else { padPositions[idx] = e_BaseScene_NotSet; DisplayGamertag(idx, FALSE); } } } return SetPlayerBasePositions(padPositions[0], padPositions[1], padPositions[2], padPositions[3]); } CXuiSceneBase::EBaseScenePosition CXuiSceneBase::GetPlayerBasePosition( int iPad) { return CXuiSceneBase::Instance->_GetPlayerBasePosition(iPad); } void CXuiSceneBase::UpdateSelectedItemPos(int iPad) { CXuiSceneBase::Instance->_UpdateSelectedItemPos(iPad); } HXUIOBJ CXuiSceneBase::GetPlayerBaseScene(int iPad) { return CXuiSceneBase::Instance->_GetPlayerBaseScene(iPad); } HRESULT CXuiSceneBase::PlayUISFX(ESoundEffect eSound) { return CXuiSceneBase::Instance->_PlayUISFX(eSound); } void CXuiSceneBase::SetEmptyQuadrantLogo(int iScreenSection) { Minecraft* pMinecraft = Minecraft::GetInstance(); EBaseScenePosition ePos = e_BaseScene_Top_Left; int iPad; // find the empty player for (iPad = 0; iPad < XUSER_MAX_COUNT; ++iPad) { if (pMinecraft->localplayers[iPad] == NULL) { switch (iScreenSection) { case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: ePos = e_BaseScene_Top_Left; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: ePos = e_BaseScene_Top_Right; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: ePos = e_BaseScene_Bottom_Left; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: ePos = e_BaseScene_Bottom_Right; break; } break; } } CXuiSceneBase::Instance->_SetEmptyQuadrantLogo(iPad, ePos); } HRESULT CXuiSceneBase::DisplayGamertag(unsigned int iPad, bool display) { CXuiSceneBase::Instance->_DisplayGamertag(iPad, display); return S_OK; } void CXuiSceneBase::SetSelectedItem(unsigned int iPad, const std::wstring& name) { CXuiSceneBase::Instance->_SetSelectedItem(iPad, name); } void CXuiSceneBase::HideAllGameUIElements() { CXuiSceneBase::Instance->_HideAllGameUIElements(); } bool CXuiSceneBase::GetBaseSceneSafeZone(unsigned int iPad, D3DXVECTOR2& origin, float& width, float& height) { return CXuiSceneBase::Instance->_GetBaseSceneSafeZone(iPad, origin, width, height); } #ifndef _XBOX void CXuiSceneBase::CreateBaseSceneInstance() { CXuiSceneBase* sceneBase = new CXuiSceneBase(); BOOL handled; sceneBase->OnInit(NULL, handled); } #endif